Android多渠道生成APK
众所周知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 的渠道 valuezipalign -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。