谈谈我的Android多渠道打包方式
谈谈我的Android多渠道打包方式
概述
每当发新版本时,Android客户端会被分发到各个应用市场,比如应用宝,360手机助手,小米应用市场等。为了统计这些市场的效果(活跃数,下单数等),需要有一种方法来唯一标识它们。
给每一个应用市场设置一个channel ID,用来区分不同的应用市场;客户端访问API时会在请求参数中带上渠道号和设备信息,以便后台接下来计算不同渠道的效果。
根据渠道列表,在每次发版时,都会打包相对应的渠道包发布到对应的应用市场,下面是我项目中使用到的方式和一些工具。
gradle自带的productFlavor方式
在AndroidManifest.xml的< application >节点中添加如下< meta-data >元素,用来定义渠道的来源:
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}" />
在app对应的build.gradle中配置productFlavor:
android { defaultConfig { manifestPlaceholders = [CHANNEL_VALUE: "x2"] } productFlavors { x2 {} x3 {} x4 {} x5 {} x6 {} x7 {} x7 {} x8 {} x9 {} x10 {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } }
输出的APK文件名格式(可选项):
android.applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { File outputDirectory = new File(outputFile.parent); def fileName if (variant.buildType.name == "release") { fileName = "lrzm${variant.productFlavors[0].name}.apk" } else { fileName = "lrzm${variant.productFlavors[0].name}_beta.apk" } output.outputFile = new File(outputDirectory, fileName) } } }
app下build.gradle配置截图:
配置就完成了,遍历渠道列表,逐个替换并打包:
程序启动时读取渠道号:
private String getChannel(Context context) { try { PackageManager pm = context.getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("CHANNEL"); } catch (PackageManager.NameNotFoundException ignored) { } return ""; }
Packer-Ng
新一代多渠道打包神器,github 地址
简直就是神器,作者说 【100个渠道包只需10秒】。其实真的有这么快!
- 修改项目根目录的 build.gradle :
buildscript { repositories { mavenCentral() } dependencies{ classpath 'com.mcxiaoke.gradle:packer:1.0.+' }}
- 修改Android项目的 build.gradle :
apply plugin: 'packer'
创建多渠道文件markets.txt
渠道打包的命令行参数格式示例(在项目根目录执行):
./gradlew -Pmarket=markets.txt clean archiveApkRelease
其他配置可参考github上的使用说明。
最后打包运行:
速度就比打包单个apk慢一点点,看下结果:
输出的名字有进行了配置,所以apk的名字很长。
archiveNameFormat = ‘${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}-${fileMD5}’
其他工具
360加固保
腾讯云·乐固
在使用这两个工具加固应用,他们都有多渠道打包这个辅助功能,貌似360加固保多渠道支持的多一些。
总结
对于多渠道打包,如果能直接修改apk的渠道号,而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:
如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
也看来很多相关的文章,目前推荐还是Packer-Ng方式,节省不少的时间,可以玩玩!
更多相关文章
- android 解析服务器数据使用json还是xml方式
- android中的两种打包方式,及多渠道打包
- android内存溢出处理方式之一
- android 加载图片的三种方式
- Android 使用HttpClient方式提交POST请求
- android post方式传递参数并获取返回数据代码
- android 数据存储总结及各种存储方式
- Android 获得屏幕宽高的三种方式