现在的位置: 首页 > 综合 > 正文

浅谈下Android的多渠道打包

2013年06月02日 ⁄ 综合 ⁄ 共 2934字 ⁄ 字号 评论关闭
文章目录

前言

大吼一声:CSDN的编辑器越来越不好用了!!!再这么搞下去只能移窝了,连个段落起始缩进的效果都没有,还要自己在头部加style,不爽

正题

设置渠道标志

一般方法设置渠道

Android程序比较麻烦的一个地方就是多渠道发布,出于这样那样的原因,需要加个渠道的标记进去,用于统计也好其他原因也好。一般来讲,这个渠道的标记都会放在AndroidManifest.xml的Application的一个MetaData中。然后在Java中就可以通过API去取对应的数据了。

其他方法设置渠道

有些会写到java文件中,比如先搞个java文件,里面定义好对应的渠道,final String的就行,然后打包的时候先用模板替换掉,然后再编译class即可。

如何生成不同渠道的程序

知道放哪里后,就可以考虑如果多渠道打包了,起始中心思想很简单,只要把这个渠道的位置数据给修改掉,重新编译也好,打包也好,能把这个对应的配置文件修改后出一个apk就成。这里其实也有两个办法:

  1. 从Eclipse的Ant脚本开始去做文章生成多个渠道的包
  2. 拿生成好的apk文件,解包,替换,重新打包

第一种方法比较适用于把渠道写在java文件中,然后需要重新编译的类型,第二种方法就比较偷懒了,因为比如是把渠道标志放在配置文件中的话,我们就不需要重新编译了,要做的就是解包替换后重新打包即可。

从Ant开始做这个事情的话,原来还是挺好的(指ADT版本v21之前),现在(v22后)因为把apkbuilder.bat拿掉后,从命令行开始打包就变得扑朔迷离(呃,我还没找到办法,估计得从Eclipse带的ANT脚本那边入手)。现在貌似apkbuiler这个模块被移到了sdk/tools/ant/lib/sdklib.jar中了,反正我没搞明白如何弄,以后抽时间看下Ant和这个估计应该能搞清楚的。所以,我从各个角度都偏向用解包、替换渠道标志、重新打包的方法来整。网上关于多渠道打包的介绍其实也有很多,但是就基本是围绕着这个方法走的。如果有不同的话,最多也就是实现的方式不同、编程语言或者使用的脚本不同罢了,比如我,是使用lua来折腾这东西(os.execute即可方便调用操作系统的shell)。其实用操作系统自带的shell也能搞定,不过这个就是个人喜好了,反正有用bash
shell的(应该是最多的吧),有用Python的,有用Lua的等等等等。下面讲下如何搞。

重新打包程序

解包

首先,要把用Eclipse出的包解开(这里无所谓是debug签名的还是release签名的,无所谓),这里需要用到apktool这个工具(自己去下载吧,网上多了去了,code.google.com上有整个项目)。解开其实很简单,使用一条命令即可:

apktool d -f xxx.apk xxx

稍微解释下,d表示是decode,-f表示如果目标存在是覆盖。前面那个apk就是你要解包的文件,后面是解出来的文件夹名称。

替换

替换的话,一般都是用正则表达式一类的来搞定,因为我是在windows下操作的,所以没有sed这种好用的命令能搞(装个gow或者估计cygwin里面也能用,不过我喜欢写好后双击点一下,比较方便),于是就选了个Lua的shell来折腾这事情,里面的正则虽然是阉割版的,但是对付对付这种是绰绰有余了。

最好是写个配置文件,方便用来循环打包。我的配置文件是这样写的(Lua的一个表):

-- 渠道配置表
channel_tbl =
{
	{channelName = "应用汇", channelValue = "yingyonghui", channelID = "007"},
	{channelName = "通用版", channelValue = "common", channelID = "012"},
	{channelName = "机锋", channelValue = "jifeng", channelID = "006"},
	{channelName = "360", channelValue = "m360", channelID = "013"},
}

channel_tbl_sdk_ydmm = {
	{channelName = "SDK_YDMM", channelValue = "yidong", channelID = "009"},
}

channel_tbl_sdk_91 = {
	{channelName = "SDK_ND91", channelValue = "m91", channelID = "002"},
}

然后起个循环,把配置文件替换下生成输出到临时文件中,再使用apktool打包。

打包

还是用apktool,就是参数替换下:

apktool b xxx xxx_unsigned.apk

略微解释下,b表示build package,xxx就是刚才你释放出来的文件夹,xxx_unsigned.apk就是重新打包的文件,价格unsigned的后缀是为了区分这个是未签名的程序,这个时候生成的是一个没有签名的文件,是装不上的,所以下面要增加签名。

签名

给apk签名的话我们用的是JDK中带的工具jarsigner,反正也是个命令行,不过这个参数有点复杂,当然,之前你得自己生成一个key。

命令行是:jarsigner -keystore %1 -storepass %2 -keypass %3 -sigfile CERT -signedjar %4 %5 %6 -verbose -certs

6个参数分别是:

  1. key的路径
  2. 库的密码
  3. key的密码
  4. 签名后输出的文件名
  5. 需要签名的原文件
  6. key的别名

这里需要注意的是-sigfile这个参数,之前用Eclipse签出来的这个验签的名字已经叫CERT了,后面手动去签名的话,如果不加这个参数会导致生成的验签文件名为key的别名,如果程序已经发布了,会导致平台包指纹不同而不能提交,用这个方法把这个强行指定为CERT,和之前提交的保持一致即可。

其他我就不赘述了,自己去网上搜下好了,文章一大堆。

对齐

对齐的话是使用ADT工具中的zipalign工具,这个最好对齐下,程序装载和执行会快很多,因为是和CPU读取数据有关系,对齐的方式能更好的预判和读取。又是个命令行,这个命令行比较简单,这里罗列下:

zipalign -v 4 signed.apk final.apk

-v是用来指明按多少字节对齐,貌似大家用4字节对齐比较多,如果没有什么特殊的应用需求的话,就4字节好了。后面的两个参数分别是签名后的apk和对齐后输出的apk路径。整到这里,一般来讲,一个替换过渠道的APK就出来了。

输出

剩下要做的就是循环配置列表,看看是不是还有其他的渠道要替换打包,继续这个过程,反正都是机器搞的,你就在边上喝喝茶看看结果即可。

总结

其实这种方法是很简单,的关键就是要知道了解apk如何生成(这里其实也没讲如何生成),然后在恰当的地方切入做点修改就好,有点类似于hook,呵呵。使用自己熟悉的语言去搞定吧。

延伸

呃,其实这样只是最简单的多渠道打包,还有很多的特殊情况没有处理。我在接入移动商城的支付模块的时候,这个方式打包就出现了问题,表现为,用debug版本的程序一切正常,也能支付,但是当多渠道打包后,进入支付就报初始化失败。这个,我还是留到后面文章再讲好了。

抱歉!评论已关闭.