Android多渠道打包工具Gradle插件

碼頭工人 9年前發布 | 37K 次閱讀 Gradle Android開發 移動開發

項目介紹

gradle-packer-plugin 是Android多渠道打包工具Gradle插件,可方便的于自動化構建系統集成,通過很少的配置可實現如下功能 :

  • 支持自動替換AndroidManifest文件中的meta-data字段實現多渠道打包
  • 支持自定義多渠道打包輸出的存放目錄和最終APK文件名
  • 支持自動修改versionName中的build版本號,實現版本號自動增長
  • </ul>

    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.+'
    }
    

    } </pre>

    修改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
      • </ul> </li> </ul>

        文件名格式

        可以使用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

          </li>

        • 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(編譯構建日期時間)
          • </ul> </li>

          • manifestMatcher 指定渠道打包需要修改的AndroidManifest.xml的meta-data的項名稱,列表類型,舉例:['UMENG_CHANNEL', 'Promotion_Market'],注意:需要同時在命令行使用-Pmarket=yourMarketFileName指定market屬性多渠道打包才會生效,如果沒有配置就使用多渠道打包,將會拋出異常

            </li>

          • buildNumberAuto - 布爾值,是否使用自增版本號功能 設為true為使用插件提供的自增build版本號功能,該功能會在項目目錄生成一個packer.properties文件,建議加入到.gitignore中,注意:該功能不會應用于多渠道打包生成的APK,不會影響渠道打包

            </li>

          • buildNumberTypeMatcher - 指定需要使用自增版本號的buildType,列表類型,舉例:['release', 'beta']默認是全部

            </li> </ul>

            使用示例:

            多渠道打包

            • 修改項目根目錄的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是必須指定的,其它幾項可以使用默認值:
            • </ul>

              packer {
                  // 指定渠道打包輸出目錄
                  // archiveOutput = file(new File(project.rootProject.buildDir.path, "archives"))
                  // 指定渠道打包輸出文件名格式
                  // archiveNameFormat = ''
                  // 指定渠道打包需要修改的AndroidManifest文件項
                  manifestMatcher = ['UMENG_CHANNEL','Promotion_Market']

              }</pre>

              • 假設渠道列表文件位于項目根目錄,文件名為markets.txt,在項目根目錄打開shell運行命令:
              • </ul>

                ./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是開關
                • </ul>

                  packer {
                      // 指定是否使用build版本號自增
                      buildNumberAuto = true
                      // 指定使用版本號自增的buildType,默認是全部
                      buildNumberTypeMatcher = ['release', 'beta']

                  }</pre>

                  • 在項目根目錄打開shell運行命令:./gradlew clean assembleRelease如果沒有錯誤,你可以安裝apk查看versionName自增是否生效, 也可以運行./gradlew -PbuildNum=123 clean assembleRelease從命令行指定build版本號,該方法多用于自動化構建系統
                  • </ul>

                    完整示例:

                    項目的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' }</pre>

                    參與開發

                    plugin目錄是插件的源代碼,用Groovy語言編寫,項目sample目錄是一個完整的Andoid項目示例,在項目根目錄有幾個腳本可以用于測試:

 本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!