最近研究Android里用ant打多个渠道的apk包,终于搞出头绪!!走了很多错路,希望大家不要这样子!!下面就是个人的几点总结,希望对大家有帮助:
首先说的是我用的ant不是eclipse和android SDk里面自带的ant,而是从这里下载的 -- Ant官网http://ant.apache.org/ , 下载Ant,当然第一步就是安装ant了,步骤如下:
第一步:安装 ant ,解压并配置环境变量
1) 解压Ant,比如解压到D:\ant
2) 我的电脑->属性->高级->环境变量
3) 系统变量新建ANT_HOME,变量值为d:\ant
4) 系统变量新建或修改path,变量值为%ANT_HOME%\bin
大家一定要把ant配置好,否则下面的都是扯淡了,无法顺利完成,测试ant是否成功,你可以在控制台输入Cmd 回车, ant 回车
如果出现
Buildfile: build.xml does not exist!
Build failed
恭喜你已经ant安装完毕了!!
第二步:简单了解Android打包步骤就行了,其他的都是扯淡,咱们直奔主题,打包前的准备
利用Ant批量打包的基本思想是,每次打包后自动替换渠道号,然后再次打包
从而实现多渠道打包的目的
这样带来了一个问题:Ant不支持循环,怎样循环打包?
扩展包Ant-contrib能轻松解决这个问题
可以翻墙的同学可以到http://ant-contrib.sourceforge.net/自行下载,或者去我的blog里的资源里下载,
另外Ant-contrib的<var>标签使用也比原来的变量方便
从而达到仅使用build.xml来实现批量打包
安装方法:直接把ant-contrib-1.0b3.jar放到Ant的lib文件夹即可
第三步:编写build.xml,直接上代码!!
具体操作:
首先,定义渠道名字和号码的固定格式为 渠道名字:渠道号 这样可以利用:做一个正则匹配分别获取渠道名字和渠道号,好处是最后能根据渠道名字来修改打出来的jar包名字 然后利用正则替换来替换渠道号为上面获取的渠道号,再执行一次打包动作。
根据以上的build.xml 读者只需要进行以下修改即可:
1.第一行的 <project name="Test" default="release"> name换成你自己的工程名字
2.SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值),这里的ANDROID_SDK_HOME是你的android SDK的环境变量 因为env.ANT_HOME 调用的就是你配置好的系统的环境变量,我的 ANDROID_SDK_HOME 为:E:\android\android-sdk-windows-1.5_r11\android-sdk-windows-1.5_r11 记住这里的目录一直到你的 android SDK 里很多子目录为止!因为,举个例子说吧 ,你也看到了在build.xml中用到了 ${sdk-folder}/platforms/android-8 这个就是指 在你定义的ANDROID_SDK_HOME对应的目录下去找 platforms 文件夹,所以这个目录层次很重要!!
3.<property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner" /> 这句话 相信大家都知道了吧,因为 android 编译需要 java编译器支持,所以 JAVA_HOME 是定义的java的环境变量 ,我的电脑右键--属性 ---高级里的环境变量---新建环境变量---变量名:JAVA_HOME ,变量值:E:\Program Files\Java\jdk1.6.0_02
4.<!-- 渠道名:渠道号 --> <property name="key" value="UM:aaaaaa,BAI:bbbb" /> 我例子是:友盟和百度的两个渠道的
5.<!-- 版本 --> <property name="version" value="3.0" /> 版本号
6.重点来了 循环打包:它是怎么循环的呢? 这句话:<target name="deploy">
<foreach target="modify_manifest" list="${key}" param="nameandchannel" delimiter=",">
</foreach>
</target>
就是循环了,将 ${key}对应的值(也就是前面定义的<property name="key" value="UM:aaaaaa,BAI:bbbb" />) 按照delimiter="," 来分隔,进行分别打包,在modify_manifest里,这样做的:
<target name="modify_manifest">
<!-- 获取渠道名字 -->
<propertyregex override="true" property="channelname" input="${nameandchannel}" regexp="(.*):" select="\1" />
<!-- 获取渠道号码 -->
<propertyregex override="true" property="channelkey" input="${nameandchannel}" regexp=":(.*)" select="\1" />
<!-- 正则匹配替换渠道号 -->
<replaceregexp flags="g" byline="false" encoding="UTF-8">
<regexp pattern='meta-data android:value="(.*)" android:name="app_key"' />
<substitution expression='meta-data android:value="${channelkey}" android:name="app_key"' />
<fileset dir="" includes="AndroidManifest.xml" />
</replaceregexp>
<antcall target="zipalign" />
</target>
注意:我们还得需要在 AndroidManifest.xml 中默认顶一个meta节点,因为咱们再ant中是不断去替换AndroidManifest.xml中的渠道号来,达到打很多包的,所以我们还必须这样在AndroidManifest.xml中 <meta-data android:value="bbbb" android:name="app_key"></meta-data> 写一个默认的渠道,注意 app_key 这里是渠道号,一般无关紧要不需要改,只要改value="bbbb"值就可以了。
7.到这里 差不多了就,但是呢很多人打包呢,感觉不对啊,呵呵因为很多时候咱们直接运行build.xml是第一个默认运行的target不是咱们需要的,你可以仔细看看这个 build.xml的依赖关系,你就能知道了,咱们这个build.xml需要第一个运行的是 deploy的这个target,所以 需要这么做: build.xml右键,run as , 这时候不是选择运行 而是 最后那个选项: external tools configurations ,然后进去一个界面
然后接着如下图操作:
最后一下:run 搞定!!
最后还要说的就是:不同的渠道生成不同的目录,在同一渠道你会发现有两个apk ,例如:一个是Test-BAI-3.0.apk , Test-BAI-3.0.apk-zipaligned.apk ,我个人认为一个是 没有优化的,另一个是优化过的!!用优化过的吧 也就是Test-BAI-3.0.apk-zipaligned.apk 吧!
就写到这里吧!!希望对大家有些帮助!!谢谢!!
不明白的随时留言!!!祝好!
PS:对于apk的混淆,这里附加加介绍!--->点这里跳转