@ltlovezh
2017-10-15T16:53:46.000000Z
字数 2527
阅读 1522
APKChannelPackage
APKChannelPackage是一个多渠道打包插件,该插件会自动检测基础包是V1签名还是V2签名,并使用不同的多渠道打包方式。
目前Gradle Plugin 2.2以上默认开启V2签名,所以如果想关闭V2签名,可将下面的v2SigningEnabled
设置为false。
signingConfigs {
release {
...
v1SigningEnabled true
v2SigningEnabled false
}
debug {
...
v1SigningEnabled true
v2SigningEnabled false
}
}
build.gradle
中,添加对打包Plugin的依赖:
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
classpath 'com.leon.channel:plugin:1.0.2'
}
build.gradle
中,添加对ApkChannelPackage Plugin的引用:
apply plugin: 'channel'
build.gradle
中,添加读取渠道信息的helper类库依赖:
dependencies {
compile 'com.leon.channel:helper:1.0.2'
}
channel_file=channel.txt
其中channel.txt即为包含渠道信息的文件,需放置在根工程目录下,一行一个渠道信息。
若是直接编译生成多渠道包,则通过channel
标签配置:
channel{
//多渠道包的输出目录,默认为new File(project.buildDir,"channel")
baseOutputDir = new File(project.buildDir,"xxx")
//多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}
apkNameFormat ='${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}'
}
其中,多渠道包的命名规则中,可使用以下字段:
若是根据已有基础包生成多渠道包,则通过rebuildChannel
标签配置:
rebuildChannel {
baseDebugApk = 已有Debug APK
baseReleaseApk = 已有Release APK
//默认为new File(project.buildDir, "rebuildChannel/debug")
debugOutputDir = Debug渠道包输出目录
//默认为new File(project.buildDir, "rebuildChannel/release")
releaseOutputDir = Release渠道包输出目录
}
这里要注意一下,已有APK的名字必须包含base
字符串,这样插件生成多渠道包时,会用当前的渠道替换base
字符串,形成新的渠道包。
若没有通过Gradle Plugin的 productFlavors
配置多渠道,那么通过以下Task
channelDebug
、channelRelease
分别负责生成Debug和Release的多渠道包。
若是配置了productFlavors
,那么对应的Task则是channelFlavorXDebug
、channelFlavorXRelease
,FlavorX表示在productFlavors
中配置的渠道名称。
除此之外,如果是根据已有基础包生成多渠道包,那么对应的Task则是reBuildChannel
。
通过helper类库中的ChannelReaderUtil
类读取渠道信息。
String channel = ChannelReaderUtil.getChannel(getApplicationContext());
如果没有渠道信息,那么这里返回null
,开发者需要自己判断。
build.gradle
中。
//把RDM上的渠道信息写入本地market属性指定的文件,一定要在apply plugin: 'channel'之前写入
if (project.hasProperty("channel_file") && project.configuration.marketList != null) {
def marketFlavors = new JsonSlurper().parseText(project.configuration.marketList)
BufferedWriter writer = project.rootProject.file("${channel_file}").newWriter('UTF-8')
marketFlavors.each { marketName ->
println "channel = " + marketName
writer.writeLine(marketName)
}
writer.close()
}
buildRDM.sh
中的编译Task需要换成第6步当中的相应Task。
编译完成后,需要从第5步配置的多渠道包目录下,把渠道包复制到bin/
目录下,才能在RDM上显示出来。