Android多渠道打包工具Gradle外掛使用詳解
專案介紹
gradle-packer-plugin 是Android多渠道打包工具Gradle外掛,可方便的於自動化構建系統整合,通過很少的配置可實現如下功能 :
- 支援自動替換AndroidManifest檔案中的meta-data欄位實現多渠道打包
- 支援自定義多渠道打包輸出的存放目錄和最終APK檔名
- 支援自動修改versionName中的build版本號,實現版本號自動增長
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系統
- 如果你是在windows系統下使用,需要下載 Gradle,設定 GRADLE_HOME 環境變數,並且將Gradle的 bin 目錄新增到環境變數PATH,然後將命令列中的./gradlew替換為gradle.bat
- 如果同時還需要使用gradlew,你需要給你的專案配置使用gradle wrapper,在設定好了gradle之後,在你的專案根目錄命令列輸入gradle.bat wrapper然後就可以使用gradlew.bat了
- Windows系統下的命令列參考:
- 使用gradle:gradle.bat clean assembleRelease
- 使用gradle wrapper:gradlew.bat clean assembleRelease
檔名格式
可以使用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版本號,那麼自增版本號不會生肖
配置選項
- archiveOutput 指定渠道打包輸出的APK存放目錄,預設位於${專案根目錄}/build/archives
- archiveNameFormat-Groovy格式字串, 指定渠道打包輸出的APK檔名格式,預設檔名格式是:${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode},可使用以下變數:
- projectName – 專案名字
- appName – App模組名字
- appPkg -applicationId(App包名packageName)
- buildType -buildType(release/debug/beta等)
- flavorName -flavorName(對應渠道打包中的渠道名字)
- versionName -versionName(顯示用的版本號)
- versionCode -versionCode(內部版本號)
- buildTime -buildTime(編譯構建日期時間)
- manifestMatcher 指定渠道打包需要修改的AndroidManifest.xml的meta-data的項名稱,列表型別,舉例:['UMENG_CHANNEL', 'Promotion_Market'],注意:需要同時在命令列使用-Pmarket=yourMarketFileName指定market屬性多渠道打包才會生效,如果沒有配置就使用多渠道打包,將會丟擲異常
- buildNumberAuto – 布林值,是否使用自增版本號功能 設為true為使用外掛提供的自增build版本號功能,該功能會在專案目錄生成一個packer.properties檔案,建議加入到.gitignore中,注意:該功能不會應用於多渠道打包生成的APK,不會影響渠道打包
- buildNumberTypeMatcher – 指定需要使用自增版本號的buildType,列表型別,舉例:['release', 'beta']預設是全部
使用示例:
多渠道打包
- 修改專案根目錄的build.gradle在buildscript.dependencies部分加入classpath ‘com.mcxiaoke.gradle:packer:1.0.0′
- 修改Android專案的build.gradle在apply plugin: ‘com.android.application’下面加入apply plugin: ‘packer’
- 修改Android專案的build.gradle加入如下配置項,manifestMatcher是必須指定的,其它幾項可以使用預設值:
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,其它的以此類推
版本號自增
- 修改專案根目錄的build.gradle在buildscript.dependencies部分加入classpath ‘com.mcxiaoke.gradle:packer:1.0.0′
- 修改Android專案的build.gradle在apply plugin: ‘com.android.application’下面加入apply plugin: ‘packer’
- 修改Android專案的build.gradle加入如下配置項,buildNumberAuto是開關
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
相關文章
- Android 詳解Gradle(3.1.4)實現多渠道打包AndroidGradle
- Android Studio 使用Gradle多渠道打包AndroidGradle
- Android使用Gradle實現多渠道打包AndroidGradle
- android gradle 多渠道打包小結AndroidGradle
- Gradle for Android系列之五 多渠道打包GradleAndroid
- Gradle自定義外掛詳解Gradle
- Gradle For Android(二) 多渠道打包與簽名配置GradleAndroid
- Gradle 實現 Android 多渠道定製化打包GradleAndroid
- Gradle實戰:Android多渠道打包方案彙總GradleAndroid
- Gradle for Android(三)多渠道打包、配置簽名資訊GradleAndroid
- 史上最詳細的Android Studio系列教程六--Gradle多渠道打包AndroidGradle
- 關於Android studio Gradle 實現多渠道打包AndroidGradle
- Android Gradle外掛AndroidGradle
- Android多渠道打包Android
- Gradle模組化配置及多渠道打包Gradle
- Android持續整合:Jenkins+Gradle+360加固+多渠道打包AndroidJenkinsGradle
- Android 多渠道打包配置Android
- Android與Gradle(二):外掛打包上傳到Maven伺服器AndroidGradleMaven伺服器
- Android使用Ant進行apk多渠道打包AndroidAPK
- Android Gradle指令碼解決美團多渠道打包再加固渠道資訊丟失問題AndroidGradle指令碼
- Android與Gradle(一):Gradle外掛開發AndroidGradle
- Walle —— Android多渠道打包神器Android
- Android多渠道打包實踐Android
- android多渠道打包最快方案Android
- Android官方多渠道方案詳解Android
- Android筆記之:App自動化之使用Ant編譯專案多渠道打包的使用詳解Android筆記APP編譯
- 使用 Java 開發 Gradle 外掛JavaGradle
- Android美團多渠道打包Walle整合Android
- Android Studio 使用 Gradle 打包 JarAndroidGradleJAR
- 多渠道打包
- Gradle系列之Gradle外掛Gradle
- Gradle系列(四) Gradle外掛Gradle
- Android 多渠道打包開發記錄Android
- Android多渠道打包相關介紹Android
- android Ant 批量多渠道打包 總結!Android
- Android Studio之Gradle和Gradle外掛的區別AndroidGradle
- 使用新 Android Gradle 外掛加速您的應用構建AndroidGradle
- Android工程gradle詳解AndroidGradle