[关闭]
@ltlovezh 2017-10-15T16:53:46.000000Z 字数 2527 阅读 1522

APKChannelPackage接入文档

APKChannelPackage


多渠道打包方式选择

APKChannelPackage是一个多渠道打包插件,该插件会自动检测基础包是V1签名还是V2签名,并使用不同的多渠道打包方式。
目前Gradle Plugin 2.2以上默认开启V2签名,所以如果想关闭V2签名,可将下面的v2SigningEnabled设置为false。

  1. signingConfigs {
  2. release {
  3. ...
  4. v1SigningEnabled true
  5. v2SigningEnabled false
  6. }
  7. debug {
  8. ...
  9. v1SigningEnabled true
  10. v2SigningEnabled false
  11. }
  12. }

接入流程

1.在根工程的build.gradle中,添加对打包Plugin的依赖:

  1. dependencies {
  2. classpath 'com.android.tools.build:gradle:2.2.0'
  3. classpath 'com.leon.channel:plugin:1.0.2'
  4. }

2.在主App工程的build.gradle中,添加对ApkChannelPackage Plugin的引用:

  1. apply plugin: 'channel'

3.在主App工程的build.gradle中,添加读取渠道信息的helper类库依赖:

  1. dependencies {
  2. compile 'com.leon.channel:helper:1.0.2'
  3. }

4.在gradle.properties文件中,配置渠道文件名称

  1. channel_file=channel.txt

其中channel.txt即为包含渠道信息的文件,需放置在根工程目录下,一行一个渠道信息。

5.渠道包信息配置

若是直接编译生成多渠道包,则通过channel标签配置:

  1. channel{
  2. //多渠道包的输出目录,默认为new File(project.buildDir,"channel")
  3. baseOutputDir = new File(project.buildDir,"xxx")
  4. //多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}
  5. apkNameFormat ='${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}'
  6. }

其中,多渠道包的命名规则中,可使用以下字段:

若是根据已有基础包生成多渠道包,则通过rebuildChannel标签配置:

  1. rebuildChannel {
  2. baseDebugApk = 已有Debug APK
  3. baseReleaseApk = 已有Release APK
  4. //默认为new File(project.buildDir, "rebuildChannel/debug")
  5. debugOutputDir = Debug渠道包输出目录
  6. //默认为new File(project.buildDir, "rebuildChannel/release")
  7. releaseOutputDir = Release渠道包输出目录
  8. }

这里要注意一下,已有APK的名字必须包含base字符串,这样插件生成多渠道包时,会用当前的渠道替换base字符串,形成新的渠道包。

6.生成多渠道包

若没有通过Gradle Plugin的 productFlavors配置多渠道,那么通过以下Task
channelDebugchannelRelease分别负责生成Debug和Release的多渠道包。

若是配置了productFlavors,那么对应的Task则是channelFlavorXDebugchannelFlavorXRelease,FlavorX表示在productFlavors中配置的渠道名称。

除此之外,如果是根据已有基础包生成多渠道包,那么对应的Task则是reBuildChannel

7.读取渠道信息

通过helper类库中的ChannelReaderUtil类读取渠道信息。

  1. String channel = ChannelReaderUtil.getChannel(getApplicationContext());

如果没有渠道信息,那么这里返回null,开发者需要自己判断。

8.若是在RDM上配置,则首先需要把rdm上的渠道列表,添加到本地的channel_file中,可把以下代码添加到根工程的build.gradle中。

  1. //把RDM上的渠道信息写入本地market属性指定的文件,一定要在apply plugin: 'channel'之前写入
  2. if (project.hasProperty("channel_file") && project.configuration.marketList != null) {
  3. def marketFlavors = new JsonSlurper().parseText(project.configuration.marketList)
  4. BufferedWriter writer = project.rootProject.file("${channel_file}").newWriter('UTF-8')
  5. marketFlavors.each { marketName ->
  6. println "channel = " + marketName
  7. writer.writeLine(marketName)
  8. }
  9. writer.close()
  10. }

buildRDM.sh中的编译Task需要换成第6步当中的相应Task。
编译完成后,需要从第5步配置的多渠道包目录下,把渠道包复制到bin/目录下,才能在RDM上显示出来。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注