谈谈我的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配置截图:
谈谈我的Android多渠道打包方式_第1张图片

配置就完成了,遍历渠道列表,逐个替换并打包:
谈谈我的Android多渠道打包方式_第2张图片

程序启动时读取渠道号:

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
    谈谈我的Android多渠道打包方式_第3张图片

  • 渠道打包的命令行参数格式示例(在项目根目录执行):

./gradlew -Pmarket=markets.txt clean archiveApkRelease

谈谈我的Android多渠道打包方式_第4张图片

其他配置可参考github上的使用说明。

最后打包运行:
谈谈我的Android多渠道打包方式_第5张图片

速度就比打包单个apk慢一点点,看下结果:
谈谈我的Android多渠道打包方式_第6张图片
输出的名字有进行了配置,所以apk的名字很长。
archiveNameFormat = ‘${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}-${fileMD5}’

其他工具

360加固保

腾讯云·乐固

在使用这两个工具加固应用,他们都有多渠道打包这个辅助功能,貌似360加固保多渠道支持的多一些。

总结

对于多渠道打包,如果能直接修改apk的渠道号,而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:

如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。

也看来很多相关的文章,目前推荐还是Packer-Ng方式,节省不少的时间,可以玩玩!

更多相关文章

  1. android 解析服务器数据使用json还是xml方式
  2. android中的两种打包方式,及多渠道打包
  3. android内存溢出处理方式之一
  4. android 加载图片的三种方式
  5. Android 使用HttpClient方式提交POST请求
  6. android post方式传递参数并获取返回数据代码
  7. android 数据存储总结及各种存储方式
  8. Android 获得屏幕宽高的三种方式

随机推荐

  1. Android(安卓)rom开发:app运行异常,报libc:
  2. 一、Android体系及系统架构
  3. 编译XT720 gingerbread
  4. android中BuildConfig.DEBUG的使用
  5. 在layout中直接指定onclick方法
  6. 在Android应用中集成YouTube视频播放功能
  7. android使用html开发软件界面
  8. Android第一行代码学习笔记三----广播
  9. Android布局之LinearLayout weight属性的
  10. Android学习系列(29)--App调试的几个命令