Android多渠道打包工具Gradle插件

特别说明

渠道包数量很大(300个以上),对打包速度有很高要求的可以使用新版极速打包工具 Packer-Ng,5秒钟可以打1000个渠道包,详细说明见README。

最新版本

Maven Central

项目介绍

gradle-packer-plugin 是Android多渠道打包工具Gradle插件,可方便的于自动化构建系统集成,通过很少的配置可实现如下功能 :

gradle-packer-plugin 库路径: com.mcxiaoke.gradle:packer:1.0.+ 简短名:packer,可以在项目的 build.gradle 中指定使用

使用方法

修改项目根目录的 build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies{
        classpath 'com.mcxiaoke.gradle:packer:1.0.+'
    }
}  

修改Android项目的 build.gradle :

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

Windows系统

文件名格式

可以使用 archiveNameFormat 自定义渠道打包输出的APK文件名格式,默认格式是

${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}

举例:假如你的App包名是 com.your.company ,渠道名是 Google_PlaybuildTypereleaseversionName2.1.15versionCode200115 ,那么生成的APK的文件名是

com.your.company-Google_Player-release-2.1.15-20015.apk

版本号自增

版本号自动会自动在在 vesionName 尾部增加 .buildNumer 该字段会自动增长,举例:如果App本来的版本号是 1.2.3,那么使用版本号自动后会是 1.2.3.1 1.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']

}
./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']

}

完整示例:

项目的 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项目示例,在项目根目录有几个脚本可以用于测试:

感谢

本项目参考了公司内部Android项目使用的多渠道打包工具,最初作者是 googolmo,文件名模板自定义部分的代码修改自此项目 android-appversion-gradle-plugin


关于作者

联系方式

开源项目


License

Copyright 2014 - 2015 Xiaoke Zhang

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.