发布时间:2015-08-05 00:00 来源:github
gradle-packer-plugin 是Android多渠道打包工具Gradle插件,可方便的于自动化构建系统集成,通过很少的配置可实现如下功能 :
支持自动替换AndroidManifest文件中的meta-data字段实现多渠道打包 支持自定义多渠道打包输出的存放目录和最终APK文件名 支持自动修改versionName中的build版本号,实现版本号自动增长gradle-packer-plugin 库路径:com.mcxiaoke.gradle:packer:1.0.+简短名:packer,可以在项目的build.gradle中指定使用
buildscript { repositories { mavenCentral() } dependencies{ classpath 'com.mcxiaoke.gradle:packer:1.0.+' } }
apply plugin: 'packer'
需要在命令行指定 -Pmarket=yourMarketFileName属性,market是你的渠道名列表文件名,market文件是基于项目根目录的相对路径,假设你的项目位于~/github/myapp你的market文件位于~/github/myapp/config/markets.txt那么参数应该是-Pmarket=config/markets.txt,一般建议直接放在项目根目录,假如market文件参数错误或者文件不存在会抛出异常
渠道名列表文件是纯文本文件,每行一个渠道号,列表解析的时候会自动忽略空白行,但是格式不规范会报错,渠道名和注释之间用#号分割开,行示例:
Google_Play#play store market Gradle_Test#test SomeMarket#some market
渠道打包的命令行参数格式示例(在项目根目录执行):
./gradlew -Pmarket=markets.txt clean archiveApkRelease
可以使用archiveNameFormat自定义渠道打包输出的APK文件名格式,默认格式是
${appPkg}-${flavorName}-${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
版本号自动会自动在在vesionName尾部增加.buildNumer该字段会自动增长,举例:假如App本来的版本号是 1.2.3,那么使用版本号自动后会是1.2.3.11.2.3.2…1.2.3.25末尾的build版本号会随构建次数自动增长。注意:假如在命令行使用-PbuildNum=123这种形式指定了build版本号,那么自增版本号不会生肖
packer { // 指定渠道打包输出目录 // archiveOutput = file(new File(project.rootProject.buildDir.path, "archives")) // 指定渠道打包输出文件名格式 // archiveNameFormat = '' // 指定渠道打包需要修改的AndroidManifest文件项 manifestMatcher = ['UMENG_CHANNEL','Promotion_Market'] }假设渠道列表文件位于项目根目录,文件名为markets.txt,在项目根目录打开shell运行命令:
./gradlew -Pmarket=markets.txt clean archiveApkRelease // Windows系统下替换为: gradle.bat -Pmarket=markets.txt clean archiveApkRelease // 或 gradlew.bat -Pmarket=markets.txt clean archiveApkRelease
假如没有错误,打包完成后你可以在${项目根目录}/build/archives/目录找到最终的渠道包。说明:渠道打包的Gradle Task名字是archiveApk${buildType}buildType一般是release,也可以是你自己指定的beta或者someOtherType,使用时首字母需要大写,例如release的渠道包任务名是archiveApkRelease,beta的渠道包任务名是archiveApkBeta,其它的以此类推
packer { // 指定是否使用build版本号自增 buildNumberAuto = true // 指定使用版本号自增的buildType,默认是全部 buildNumberTypeMatcher = ['release', 'beta'] }在项目根目录打开shell运行命令:./gradlew clean assembleRelease假如没有错误,你可以安装apk查看versionName自增是否生效, 也可以运行./gradlew -PbuildNum=123 clean assembleRelease从命令行指定build版本号,该方法多用于自动化构建系统
项目的samples目录包含一个完整的项目示例,可以查看其中的build.gradle
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' // `添加packer插件依赖` classpath 'com.mcxiaoke.gradle:packer:1.0.0' } } repositories { mavenCentral() } apply plugin: 'com.android.application' // 建议放在 `com.android.application` 下面 // `使用 apply plugin使用packer插件` apply plugin: 'packer' packer { // 指定渠道打包输出目录 archiveOutput = file(new File(project.rootProject.buildDir.path, "apks")) // 指定渠道打包输出文件名格式 archiveNameFormat = '' // 指定渠道打包需要修改的AndroidManifest文件项 manifestMatcher = ['UMENG_CHANNEL','Promotion_Market'] // 指定是否使用build版本号自增 buildNumberAuto = true // 指定使用版本号自增的buildType,默认是全部 buildNumberTypeMatcher = ['release', 'beta'] } android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { applicationId "com.mcxiaoke.packer.sample" minSdkVersion 15 targetSdkVersion 21 versionCode 12345 versionName "1.2.3" } signingConfigs { release { storeFile file("android.keystore") storePassword "android" keyAlias "android" keyPassword "android" } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false } beta { signingConfig signingConfigs.release minifyEnabled false debuggable true } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:21.0.2' }
plugin目录是插件的源代码,用Groovy语言编写,项目sample目录是一个完整的Andoid项目示例,在项目根目录有几个脚本可以用于测试:
deploy-local.sh 部署插件到本地的/tmp/repo/目录,方便即时测试 test-build.sh 部署并测试插件是否有错误,测试build版本号自增功能 test-market.sh 部署并测试插件是否有错误,测试多渠道打包功能本项目参考了公司内部Android项目使用的多渠道打包工具,最初作者是 googolmo,文件名模板自定义部分的代码修改自此项目 android-appversion-gradle-plugin