您的位置:首页 > 移动开发 > Android开发

Android 混淆打包 ant

2014-12-11 00:00 295 查看
摘要: Android 混淆打包 Apache Ant

为什么要写,因为真的能用到,并且如果用的时候不会,还要查很多,第一次估计要搞几天(2天,可能我比较笨吧)。写出来分享一下,其实主要是记录一下,方便以后查阅,当然更希望能帮助到一些需要的人。

ant打包好处有什么

在eclipse中当我们的android项目需要打包出来的时候,往往是手动打包,如果有签名文件则需要输密码,选择输出目录等等操作,很麻烦。打包一个apk还好,当需要打包多个apk的时候,比如发布应用时需要打包各个平台的渠道包,几十上百个渠道号,一旦有改动或者版本升级时需要重新打包的时候,手动打包就不是很好的方式了。这时候可以用ant自动打包。
什么是渠道号
android开发后,将项目进行打包,生成apk,这个apk文件可以放到不同的应用市场,如360,应用宝,豌豆荚等。那当发布到这些应用市场上之后,怎么统计哪个市场的下载量比较多,哪个市场的推广效果比较好呢?这就需要在开发中植入不同的渠道号,对应不同的渠道号,打包生成不同的apk,然后将它们放到不同的市场上。这样就可以达到统计不同市场的效果了
下载ANT
百度“ant”,到Apache ant 官网,download。然后下载解压到你的磁盘中。
然后在环境变量中配置ant的路径(在cmd中可以使用ant命令,这个就不说了)。
还有就是还要在环境变量中配置好Android SDK的路径(可以使用adb,andriod等命令就对了,这个也不需要说了,相信大家都已经配置好了)
ant配置好之后在cmd里面输入ant
Buildfile: build.xml does not exist!
Build failed,说明配置完成。

ANT打包
进入自己的工程目录,执行命令:“android update project -p ./ ”参数p表示路径, ./表示当前路径
执行结果如下
Updated local.properties
No project name specified, using Activity name 'MainActivity'.
If you wish to change it, edit the first line of build.xml.
Added file E:\E\eoeandroid\MyDialog\build.xml
Updated file E:\E\eoeandroid\MyDialog\proguard-project.txt
It seems that there are sub-projects. If you want to update them
please use the --subprojects parameter.
在eclipse中刷新项目,可以看到多了以下两个文件



build.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project name="MainActivity" default="help">
<property file="local.properties" />
<property file="ant.properties" />
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>

<import file="custom_rules.xml" optional="true" /> <!-- 这个很重要 下面讲 -->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>
custom_rules.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project name="" >
<!--
change this !!!
set ANDROID_HOME env PATH to SDK HOme
-->
<property
name="keystore"
value="android.keystore" />
<property
name="keystore.password"
value="your password" />
<property
name="key.alias"
value="android.keystore" /><!-- 这里折磨了我很久 -->
<property
name="key.password"
value="your password" />
<!-- //////////////////////////////////////////////////////////////////////////////////////// -->
<target
name="mytest"
depends="release" >
<echo>
signing the unsigned apk to final product apk ...
</echo>
</target>
<!-- build channel macro -->
<macrodef name="bc" >
<!-- must set channel.name param -->
<attribute name="channelName" />
<sequential>
<echo message="*** CHANNEL NAME: @{channelName}" />
<!-- replace channel in AndroidManifest.xml -->
<replaceregexp
byline="true"
file="AndroidManifest.xml"
match="U0(\d)+"
replace="@{channelName}" />
<!-- build apk -->
<antcall target="clean" />
<antcall target="release" />
<!-- sign apk -->
<sign-release />
<zipalign-release />
<mkdir dir="channels/@{channelName}" />
<move
file="bin/${ant.project.name}-release-zipalign.apk"
todir="channels/@{channelName}/" />
</sequential>
</macrodef>
<macrodef name="sign-release" >
<sequential>
<echo message="signing the unsigned apk to final product apk bin/${ant.project.name}-release-unsigned.apk" />
<echo message="jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${key.password} -signedjar bin/${ant.project.name}-release.apk bin/${ant.project.name}-release-unsigned.apk ${key.alias} " />
<exec executable="jarsigner" >
<arg value="-keystore" />
<arg value="${keystore}" />
<arg value="-storepass" />
<arg value="${keystore.password}" />
<!-- 验证密钥完整性的口令,创建时建立的 -->
<arg value="-keypass" />
<arg value="${key.password}" />
<!-- 专用密钥的口令,就是key密码 -->
<arg value="-signedjar" />
<arg value="bin/${ant.project.name}-release.apk" />
<!-- 输出 -->
<arg value="bin/${ant.project.name}-release-unsigned.apk" />
<!-- 未签名的apk -->
<arg value="${key.alias}" />
<!-- 别名,创建时建立的 -->
</exec>
</sequential>
</macrodef>
<macrodef name="zipalign-release" >
<sequential>
<echo message="zipalign the signed apk" />
<exec executable="${sdk.dir}/tools/zipalign" >
<arg value="-v" />
<arg value="4" />
<arg value="bin/${ant.project.name}-release.apk" />
<!-- signed apk -->
<arg value="bin/${ant.project.name}-release-zipalign.apk" />
<!-- zipalign output -->
</exec>
</sequential>
</macrodef>
<target name="buildchannels" >
<bc channelName="U068"/>
</target>
</project>
然后在cmd中输入命令
ant buildchannels
哦对了,再此之前,如果你要生成release版本的, 要准备好你的key(keystore),关于生成keystore的方法,详情请见我的另一篇博文:Android生成keystore方法
然后将生成的android.keystore拷贝到工程根目录地下就行了。
之后,运行上面的命令吧(ant buildchannels)
关于遇到的问题请见我另一篇博文: Android签名问题,jarsigner的问题
OK,这样问题应该就解决了。
关于build.xml custome_rules.xml的语法
这就不说,这个我也是现学现卖,学了一下,也是稀里糊涂,只能说现在看懂了。
这个网上有很多资料。

参考资料:
Android打包混淆实战总结:http://www.eoeandroid.com/thread-538246-1-1.html
简单的ant打包,修改渠道号http://www.cnblogs.com/stay/archive/2013/05/27/3102027.html
Android打包流程:http://www.cnblogs.com/0616--ataozhijia/p/3732370.html
Android打包官网:‍http://developer.android.com/tools/building/index.html‍
Android build.xml编写:http://blog.csdn.net/jariwsz/article/details/6728337(这一篇写的很好)

(貌似混淆的东西还没加,之后再说吧)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息