8.5 批量打渠道包
所谓的渠道包,从代码层面讲,就是AndroidManifest中的UMENG_CHANNEL这个key的值,将其替换为相应的渠道号,比如360市场,这个值就是360Android,然后再进行打包。
从商业角度讲,360Android这个渠道号是财务部门用来和360市场做结算的,我们每月会根据友盟上360Android这个渠道有多少下载量(或激活量),来向360公司支付相应的推广费用,于是无线推广部门应运而生,他们的一部分工作就是干这个事情,有的渠道包是手动上传到各大市场,有的渠道包是分发给市场的工作人员,由他们帮忙发布。
除了发布到各大市场,渠道包的另一种出现场景是,外链。比如说公司网站首页上会提供下载;比如说推广活动的Html链接;比如说公交车站、电梯上的二维码(它其实也是一个Html链接)。我们会把这些链接对应的渠道包都放在公司的服务器上,以提供下载。
我们需要建立批量打渠道包的机制。目前,批量打渠道包有两种方式,接下来我会逐一介绍。
8.5.1 基于apk包批量生成渠道包
基于一个apk包,我们将其反编译,然后遍历渠道列表获取每一个渠道号,修改Android-Manfest.xml中的渠道号后,重新进行打包工作,包括签名、混淆和对其操作,如图8-5所示。
对图8-5中的打包流程详细分析如下:
1)反编译apk文件。
apktool.bat d--no-src– f"C:\jianqiang_app.apk""temp"
反编译apk文件后,在temp目录中能看到AndroidManifest.xml文件。
2)for循环渠道列表,逐个打渠道包。
2.1)替换AndroidManifest.xml中的渠道号。
图8-5 基于apk包批量生成渠道包的流程图
2.2)将反编译后的文件重新编译成apk,放到apk_temp目录下:
apktool.bat b "temp" "apk_temp\unsigned-App名称 .apk"
2.3)签名apk文件。
java -jar SignApk.jar "C: \a.b" "123456" "JianqiangApp" "123456" "apk_temp\unsigned-appname.apk" "apk_temp\unzipAligned-appname.apk"
2.4)对要发布的apk文件进行对齐操作。
zipalign.exe -v 4 "apk_temp\unzipAligned-App名称 .apk" "apk_temp\App名称 -渠道号 .apk"
2.5)把打好的渠道包重命名为:App名称_渠道号.apk,然后将其转移到output\App名称\App名称_渠道号.apk。
上述这些操作都有相应的Android SDK命令,我们可以使用任何语言编写一个程序来一次执行这些命令。
这里我们可以使用友盟提供的渠道批量打包工具,它是基于C#来实现的上述批量打包流程。 [1]
8.5.2 基于代码批量生成渠道包
对于基于代码进行打包的方法,我们在前面的章节介绍过build.xml,但是这个脚本每次只能打一个包,我们需要写一个新的脚本batchbuild.xml,它会依次执行以下操作:
1)读取channel.txt文件中的渠道列表。
<target name="foreach_manager"> <loadfile property="listVerText" srcfile="${app.source.path}/${channel.filename}" encoding="GBK" /> <propertyregex override="true" property="apk-channel" input="${listVerText}" regexp="\r\n" replace=";"/> <!— 遍历 ${apk-channel}打包 — > <foreach target="build-apk" param="channelName" list="${apk-channel}" delimiter=";"/> </target>
2)执行for循环语句,执行build.xml脚本文件中build-apk这个target。
2.1)替换AndroidManifest.xml中的渠道号。
2.2)执行build.xml脚本进行打包。
2.3)将打好的包并转移到指定的目录build/1.1.0下面,1.1.0为版本号。
2.4)清理打包过程中生成的临时文件,为打下一个渠道包做准备。
<target name="build-apk"> <echo>build-path:${build-path}, 目录 :${channelName} , 渠道 :${channelName}</echo> <!-- 创建放 APK的目录 (FFFFFF就是为了进行一次字符串的 override操作 ) --> <propertyregex override="true" property="build-path" input="${build-path}/${channelName}FFFFFF" regexp="FFFFFF" replace="" /> <echo>创建目录 :${build-path}</echo> <mkdir dir="${build-path}" /> <!-- 替换 Manifest中的 UMENG_CHANNEL字段 --> <replaceregexp file="AndroidManifest.xml" match="(android:name="UMENG_CHANNEL "\s+android:value=")(.*)(")" replace="\1${channelName}\3" encoding="UTF-8" byline="false"/> <!--开始打包 --> <ant antfile="build.xml" inheritAll="true" target="zipalign" /> <!-- 移动 APK至相应目录 --> <copy file="${basedir}/${output.dir}/${appname}_for_android_ ${android_version}_${temp.dir}.apk" tofile="${build-path}/${appname}_${appversion}_ ${channelName}.apk" /> <!-- 清理生成的临时文件,为 build下一个渠道包做准备 --> <cleanTmpFolder /> </target>
上述流程如图8-6所示。
我们只要执行下述命令,就可以批量打渠道包了:
c:\ProjectForAntBuild>ant – buildfile batch_build.xml
图8-6 基于代码批量生成渠道包的流程图
[1] 该工具下载地址:https://github.com/umeng/umeng-muti-channel-build-tool。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论