Android 多渠道打包两种方式
Android 多渠道打包 productFlavors
- 配置productFlavors
修改AndroidManifest.xml
- 配置productFlavors
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.cuiwei.voice">
<application
android:theme="@style/AppTheme">
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}" />
</application>
</manifest>
- 修改
build.gradle
android {
defaultConfig {
...
//必须要保证所有的flavor 都属于同一个维度
flavorDimensions "default"
}
...
productFlavors {
guanwang {
manifestPlaceholders = [CHANNEL_VALUE: "guanwang"]
}
google {
manifestPlaceholders = [CHANNEL_VALUE: "google"]
}
}
}
- Android 多渠道打包
packer-ng-plugin
packer-ng-plugin 是下一代Android渠道打包工具Gradle插件,支持极速打包,100个渠道包只需要10秒钟,速度是 gradle-packer-plugin 的300倍以上,可方便的用于CI系统集成,同时提供命令行打包脚本,渠道读取提供Python和C语言的实现。
-
修改项目配置
// build.gradle
buildscript {
dependencies{
classpath 'com.mcxiaoke.packer-ng:plugin:2.0.1'
}
}
-
修改模块配置
apply plugin: 'packer'
// build.gradle
dependencies {
compile 'com.mcxiaoke.packer-ng:helper:2.0.1'
}
plugin
和helper
的版本号需要保持一致
-
渠道列表格式
渠道名列表文件是纯文本文件,按行读取,每行一个渠道,行首和行尾的空白会被忽略,如果有注释,渠道名和注释之间用 #
分割。
渠道名建议尽量使用规范的中英文和数字,不要使用特殊字符和不可见字符。示例:channels.txt
-
集成打包
- 项目中没有使用 productFlavors
./gradlew clean apkRelease - 项目中使用了 productFlavors
如果项目中指定了多个 flavor ,需要指定需要打渠道包的 flavor 名字,假设你有 Paid Free 两个 flavor ,打包的时候命令如下:
./gradlew clean apkPaidRelease
./gradlew clean apkFreeRelease
直接使用 ./gradlew clean apkRelease 会输出所有 flavor 的渠道包。
- 通过参数直接指定渠道列表(会覆盖build.gradle中的属性):
./gradlew clean apkRelease -Pchannels=ch1,ch2,douban,google
渠道数目很少时可以使用此种方式。
- 通过参数指定渠道列表文件的位置(会覆盖build.gradle中的属性):
./gradlew clean apkRelease -Pchannels=@channels.txt
使用@符号指定渠道列表文件的位置,使用相对于项目根目录的相对路径。
- 还可以指定输出目录和文件名格式模版:
./gradlew clean apkRelease -Poutput=build/apks
./gradlew clean apkRelease -Pformat=${versionName}-${channel}
这些参数 channels output format 可以组合使用,命令行参数会覆盖 build.gradle 对应的属性。
-
Gradle打包命令说明
渠道打包的Task名字是 apk
{buildType} buildType一般是release,也可以是你自己指定的beta或者someOtherType,如果没有 flavor 可以忽略,使用时首字母需要大写,假设 flavor 是 Paid,release类型对应的任务名是 apkPaidRelease,beta类型对应的任务名是 apkPaidBetaBeta,其它的以此类推。
特别提示
如果你同时使用其它的资源压缩工具或应用加固功能,请使用命令行脚本打包增加渠道信息,增加渠道信息需要放在APK处理过程的最后一步
-
代码中读取渠道
- 如果没有找到渠道信息或遇到错误,默认返回的是""
com.mcxiaoke.packer.helper.PackerNg
String channel = PackerNg.getChannel(Context)
-
文件名格式模版
格式模版使用Groovy字符串模版引擎,默认文件名格式是:
${appPkg}-${channel}-${buildType}-v${versionName}-${versionCode} 。
假如你的App包名是com.your.company
,渠道名是 Google_Play ,
buildType
是 release
,versionName
是 2.1.15 ,versionCode
是 200115 ,那么生成的默认APK的文件名是 com.your.company-Google_Player-release-2.1.15-20015.apk
。
-
可使用以下变量:
projectName - 项目名字
appName - App模块名字
appPkg - applicationId (App包名packageName)
channel - 打包时指定的渠道名
buildType - buildType (release/debug/beta等)
flavor - flavor (flavor名字,如paid/free等)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)