@ltlovezh
        
        2017-10-15T08:53:46.000000Z
        字数 2527
        阅读 1823
    APKChannelPackage
APKChannelPackage是一个多渠道打包插件,该插件会自动检测基础包是V1签名还是V2签名,并使用不同的多渠道打包方式。 
目前Gradle Plugin 2.2以上默认开启V2签名,所以如果想关闭V2签名,可将下面的v2SigningEnabled设置为false。
signingConfigs {release {...v1SigningEnabled truev2SigningEnabled false}debug {...v1SigningEnabled truev2SigningEnabled 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 APKbaseReleaseApk = 已有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 = " + marketNamewriter.writeLine(marketName)}writer.close()}
buildRDM.sh中的编译Task需要换成第6步当中的相应Task。 
编译完成后,需要从第5步配置的多渠道包目录下,把渠道包复制到bin/目录下,才能在RDM上显示出来。
