众所周知Android的市场实在太多了,所以多渠道自动打包生成 APK 就非常必要了,上个版本没赶上,这次就偷空研究下。

这是在Eclipse上:

过程参考了
http://ant.apache.org/manual/index.html
http://developer.android.com/tools/building/building-cmdline.html
http://www.cnblogs.com/qianxudetianxia/archive/2012/07/04/2573687.html

内容非常详细,而且流程非常清晰,不过繁锁了点。
而且apkbuilder命令在mac上没找到,windows没有去看过,不推荐使用,不过文件能在旧版里复制,也可以自己生成,详细的在

http://stackoverflow.com/questions/19273237/android-build-fails-no-such-file-or-directory-apkbuilder

由于我是个偷赖的人,所以就用了比较简单的办法,自动生成 build.xml

1. 执行命令 android update project -n projectName -t 3 -p projectPath

2. 在目录新建ant.properties指定签名

key.store=./xxxxx.jks
key.alias=xxxx
key.store.password=xxxxxxx
key.alias.password=xxxxxxx

####3. 直接ant debug/release

生成的文件在 bin 中,其中有 Unsigned 就是未签名的 APK, unaligned 就是签名的,但是未 align。

这样只能打包一个渠道,要实现多渠道每次我们还是都要改 AndroidManifest.xml 的渠道。我用的是 UMENG_CHANNEL,具体如下
<meta-data android:value="UMENG_CHANNEL" android:name="UMENG_CHANNEL" />

上面的<meta……/>一定要在一行上

我们可以写个脚本自动化,每次打包一次把文件复制出来,再改 UMENG_CHANNEL 的 value,接着的包.脚本如下:


echo start packing...
markets="AndroidMarket 91Market 360Market"
TheVersion=$1
rm -rf GenerateApk
mkdir GenerateApk
for market in $markets
do
    echo  packing $market...
    sed -i "" "s/\(android:value=\)\"\(.*\)\"\( android:name=\"UMENG_CHANNEL\"\)/\1\"$market\"\3/g" AndroidManifest.xml//替换AndroidManifest.xml的渠道value
    ant clean
    ant release
    zipalign -v -f 4 ./bin/TestPackage-release-unaligned.apk ./GenerateApk/XXXXXX_$TheVersion\_$market.apk     //对生成的apk进行zipalign,并复制到 GenerateApk
done

markets="AndroidMarket 91Market"//渠道,多个用空格分开

TheVersion=$1//传入版本号,每次生成的文件名包含在其中

rm -rf GenerateApk//存放生成的 APK

sed -i "" "s/\(android:value=\)\"\(.*\)\"\( android:name=\"UMENG_CHANNEL\"\)/\1\"$market\"\3/g" AndroidManifest.xml//替换AndroidManifest.xml 的渠道 value
zipalign -v -f 4 ./bin/TestPackage-release-unaligned.apk ./GenerateApk/XXXXXX_$TheVersion\_$market.apk//对生成的 APK 进行 zipalign,并复制到 GenerateApk

这样每次我们打包只需要 ./build.sh 1.11 即可。

如何要进行一些细节修改,可以看看 ${sdk.dir}/tools/ant/build.xml,这样打包就是间接调用它的

如果 subProjects,先在 subProject 里 android update lib-project -p projectPath在 subProject 里生成 build.xml。

Android studio 修改一下之前的脚本,使用 gradle build 打包也一样。

这样打包效率不是最高的,不过符合经济原则:宁花机器一分,不花程序一秒

特别感谢 Mapple 在我遇到问题时的指点!