VasDolly

Project Url: Tencent/VasDolly
Introduction: Android V1 and V2 Signature Channel Package Plugin
More: Author   ReportBugs   
Tags:

license Release Version PRs Welcome

简介

VasDolly 是一种快速多渠道打包工具,同时支持基于 V1 签名和 V2 签名进行多渠道打包。插件本身会自动检测 Apk 使用的签名类别,并选择合适的多渠道打包方式,对使用者来说完全透明。 V1.1.6版本已支持 Android Gradle Plugin 3.0,欢迎使用!

目前 Gradle Plugin 2.2 以上默认开启 V2 签名,所以如果想关闭 V2 签名,可将下面的 v2SigningEnabled 设置为 false。

signingConfigs {
        release {
            ...
            v1SigningEnabled true
            v2SigningEnabled false
        }

        debug {
            ...
            v1SigningEnabled true
            v2SigningEnabled false
        }
    }

接入流程

添加对 VasDolly Plugin 的依赖

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

dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.leon.channel:plugin:2.0.1'
}

引用 VasDolly Plugin

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

apply plugin: 'channel'

添加对 VasDolly helper 类库的依赖

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

dependencies {
    api 'com.leon.channel:helper:2.0.1'
}

配置渠道列表

目前有两种方式配置渠道列表,最终的渠道列表是两者的累加之和:

  1. gradle.properties文件指定渠道文件名称,该渠道文件必须位于根工程目录下,一行一个渠道信息。
    channel_file=channel.txt
    
  2. channel或者rebuildChannel属性中通过channelFile属性指定渠道文件,一行一个渠道信息。

    channel{
     //指定渠道文件
     channelFile = file("/Users/leon/Downloads/testChannel.txt")
    }
    rebuildChannel{
     //指定渠道文件
     channelFile = file("/Users/leon/Downloads/testReChannel.txt")
    }
    

    通过 Gradle 生成多渠道包

    直接编译生成多渠道包

    若是直接编译生成多渠道包,首先要配置渠道文件、渠道包的输出目录和渠道包的命名规则:

    channel{
     //指定渠道文件
     channelFile = file("/Users/leon/Downloads/testChannel.txt")
      //多渠道包的输出目录,默认为 new File(project.buildDir,"channel")
     baseOutputDir = new File(project.buildDir,"xxx")
     //多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}
     apkNameFormat ='${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}'
     //快速模式:生成渠道包时不进行校验(速度可以提升 10 倍以上,默认为 false)
     isFastMode = false
     //buildTime 的时间格式,默认格式:yyyyMMdd-HHmmss
     buildTimeDateFormat = 'yyyyMMdd-HH:mm:ss'
     //低内存模式(仅针对 V2 签名,默认为 false):只把签名块、中央目录和 EOCD 读取到内存,不把最大头的内容块读取到内存,在手机上合成 APK 时,可以使用该模式
     lowMemory = false
    }
    

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

  3. appName : 当前 project 的 name

  4. versionName : 当前 Variant 的 versionName
  5. versionCode : 当前 Variant 的 versionCode
  6. buildType : 当前 Variant 的 buildType,即 debug or release
  7. flavorName : 当前的渠道名称
  8. appId : 当前 Variant 的 applicationId
  9. buildTime : 当前编译构建日期时间,时间格式可以自定义,默认格式:yyyyMMdd-HHmmss

然后,通过gradle channelDebuggradle channelRelease命令分别生成 Debug 和 Release 的多渠道包。

为了方便临时生成渠道包进行测试,我们从v2.0.0开始支持添加渠道参数:gradle channelDebug(channelRelease) -Pchannels=yingyongbao,gamecenter,这里通过属性channels指定的渠道列表拥有更高的优先级,且和原始的文件方式是互斥的。

根据已有基础包重新生成多渠道包

若是根据已有基础包重新生成多渠道包,首先要配置渠道文件、基础包的路径和渠道包的输出目录:

rebuildChannel {
  //指定渠道文件
  channelFile = file("/Users/leon/Downloads/testReChannel.txt")
  baseDebugApk = 已有 Debug APK    
  baseReleaseApk = 已有 Release APK
  //默认为 new File(project.buildDir, "rebuildChannel/debug")
  debugOutputDir = Debug 渠道包输出目录   
  //默认为 new File(project.buildDir, "rebuildChannel/release")
  releaseOutputDir = Release 渠道包输出目录
  //快速模式:生成渠道包时不进行校验(速度可以提升 10 倍以上,默认为 false)
  isFastMode = false
  //低内存模式(仅针对 V2 签名,默认为 false):只把签名块、中央目录和 EOCD 读取到内存,不把最大头的内容块读取到内存,在手机上合成 APK 时,可以使用该模式
  lowMemory = false
}

然后,通过gradle rebuildChannel命令生成多渠道包。

为了方便临时生成渠道包进行测试,我们从v2.0.0开始支持添加渠道参数:gradle rebuildChannel -Pchannels=yingyongbao,gamecenter,这里通过属性channels指定的渠道列表拥有更高的优先级,且和原始的文件方式是互斥的。

通过命令行生成渠道包、读取渠道信息

V1.0.5版本开始支持命令行,具体使用文档可参考command目录下的README

读取渠道信息

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

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

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

Demo 参考

详细的接入范式,可参考Demo

实现原理

具体原理可参考VasDolly 实现原理

问题反馈

遇到任何问题或者有好的建议,欢迎提issues,或者 QQ(1031747903)联系。

TODO

  1. 增加单元测试
  2. 防渠道信息篡改
  3. 提供 Python 脚本

License

VasDolly is under the BSD license. See the LICENSE file for details.

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea