Android使用ant实现自动化打包和多渠道打包
前言
eclipse在Android开发过程中使用起来还是比较方便的,但是在打包时的编译速度确实不敢恭维,那么自动化打包在这时就显得很重要了,这是一个解决程序员宝贵的双手的技术。
正文
一、在开始自动化打包之前我们先要配置好环境变量(包括jdk、Android sdk以及ant的环境变量)
-
配置JDK
1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"JAVA_HOME",“变量值”输入jdk的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%JAVA_HOME%\bin”,注意开头包含一个英文的分号。
2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入“javac -version”然后回车,如果下方出现:javac version "1.6.0_45”,说明配置成功。 -
配置Android SDK
1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"ANDROID_HOME",“变量值”输入sdk的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%ANDROID_HOME%\platform-tools”,注意开头包含一个英文的分号。
2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入:adb回车,如果下方出现:Android Debug Bridge version ...等多行文字,说明配置成功。 -
配置Ant
1.右击“我的电脑”弹出菜单,点击“属性“》“高级“》“环境变量“,在“系统变量”下方点击“新建”,“变量名”输入"ANT_HOME",“变量值”输入ant的安装目录,点击“确认”;在“系统变量”选择变量为“Path”的选项,点击下方的“编辑”,在弹出框中修改“变量值”,在原有值的末尾输入“;%ANT_HOME%\bin”,注意开头包含一个英文的分号。
2.点击“开始”》“运行”,输入“cmd”,在弹出的命令窗口中输入“ant -version”然后回车,如果下方出现:Apache Ant(TM) version 1.9.3,说明配置成功。
二、当环境变量配置完成后,我们就可以开始准备开始实现自动化打包了
1.进入要打包的工程的项目目录。
2.输入命令" android update project --name MyProject -p ./ ",其中-name参数是指定项目名称;-p参数是要打包的地址(./ 表示当前目录)。
这时候我们可以看到在我们的项目根目录下多了build.xml,以及local.properties两个文件。
- 其中local.properties写明了我们的android SDK的目录(其实是环境变量ANDROID_HOME的值,所以如果环境变量中没有这个的,请增加)。
- build.xml则是ant构建的最重要脚本,打开一看,发现里面其实大部分都是写注释,有用的没几行,这是因为生成的这个build.xml引用了android SDK自带的构建脚本,具体目录是{sdk目录}/tools/ant/build.xml 。
到此,我们的项目就支持ant编译打包了
三、项目中引用了其他library项目时,我们还需要让其依赖的项目支持ant编译打包
- 进入到library项目所在的目录,输入命令 android update lib-project -p ./ (注意是 lib-project);
- 在被依赖的library项目也支持ant打包后,我们回到主项目的工程目录下,输入之前的命令,这里要注意的时在最后需要添加一句 --subprojects,命令如下:
android update project --name MyProject -p ./ --subprojects
四、进行项目的编译打包。
- ant debug : 生成一个测试版apk,默认使用 debug key 进行签名,生成的apk(your_project_name-debug.apk)在bin目录下。
- ant release : 生成一个未签名和未aligned的apk包,生成的apk(your_project_name-release-unsigned.apk和your_project_name-release-unaligned.apk)在bin目录下
五、加入签名信息
在项目的根目录下建一个ant.properties文件,输入如下内容,其中keystore密码和alias密码可以不指定(防泄漏),那么在命令执行的过程中会要求你输入。
#keystore的路径,必须使用正斜杠
key.store= "C:\Users\Administrator\Desktop\is\android"
#keystore的密码
#key.store.password=123456
#alias名
key.alias=myAlias
#alias密码
#key.alias.password=abcdef
在项目根目录下运行 ant release 命令就会帮你生成一个经过签名和aligned的apk,生成的apk(your_project_name-release.apk)在bin目录下
六、自动打包渠道包
1、实现批量循环打包需要一个类似于for循环的功能,在Ant的核心包里没有相关的For循环的Task,即不支持for循环,但是ant支持第三方扩展包,以支持更多的其他功能。
于是我们要下载相应的支持for循环的扩展包。可以使用开源的Ant-contrib包。下载地址:http://ant-contrib.sourceforge.net/ ,也可以自行百度搜索资源包 。
下载后的解压得到的jar文件放到ant的lib目录。
接下来我们就可以打包渠道包了。
- 首先在ant.properties文件中增加属性 market_channels (渠道列表,以逗号分割),version(应用程序版本名)
#渠道市场列表
market_channels=yingyongbao,360,wandoujia,baidu
#版本号
version=8.0
3.在我们项目的build.xml中加入如下代码:
<!-- 渠道包打包脚本 ant deploy-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<target name="deploy">
<foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=",">
</foreach>
</target>
<target name="modify_manifest">
<replaceregexp flags="g" byline="false">
<!-- 匹配的内容是 android:value="*****" android:name="UMENG_CHANNEL" -->
<regexp pattern='android:value="(.*)" android:name="UMENG_CHANNEL"' />
<!-- 匹配之后将其替换为 android:value="渠道名" android:name="UMENG_CHANNEL" -->
<substitution expression='android:value="${channel}" android:name="UMENG_CHANNEL"' />
<!-- 正则表达式需要匹配的文件为AndroidManifest.xml -->
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
<property name="out.release.file" location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" />
<!--包 -->
<antcall target="release" />
<!--输出渠道包到bin/out目录下 -->
<copy tofile="${out.absolute.dir}/out/${ant.project.name}v${version}-${channel}.apk" file="bin/${ant.project.name}-release.apk"/>
</target>
在项目根目录下运行 ant deploy 命令就会帮你各个渠道的签名包了(为了全程可以自动执行,ant.properties文件中的keystore的密码可以指定,这样在执行过程中就不需要手动输入密码了),在bin目录的out目录下。
问题
在执行打包时我遇到了一个ant\build.xml:698: null returned: 1的错误,查了一下发现这个问题许多人都遇到了,这里记录一下:
- 这个值主要是打包过程中忽略 res assets目录下 匹配规则的文件 默认忽略 “!.svn:!.git:.:<dir>_:!CVS:!thumbs.db:!picasa.ini:!.scc:~” 这类文件
如果直接设置成 crunch 对其他工程会有影响。
那么可以在自己项目的根目录下build.xml文件中加入:
<property name="aapt.ignore.assets" value="!.svn:!.git:\x3Cdir\x3E_:.:!CVS:!thumbs.db:!picasa.ini:!.scc:~:crunch" />
这样子就只对自己的项目生效!
为什么会有\x3Cdir\x3E这个东西,其实就是<dir>,不过ant build.xml中不允许使用'<'字符,所以要转义一下。
如果没有解决的话可以换成
<property name="aapt.ignore.assets" value="<dir>crunch:!.svn:!.git:.:<dir>_:!CVS:!thumbs.db:!picasa.ini:!.scc:~" />
二者的区别在于<dir>的写法不同
将上面的代码复制到项目目录下的build.xml中,保存,再次打包即可。
总结
自动化打包是一门非常节省程序员开发时间的技术,自此我们宝贵的双手就解放了。233333~