Android Studio之Gradle自動化構建打包

來源:互聯網
上載者:User

標籤:variant   custom   等於   欄位   ase   中文   手動   with   font   

  最近一年來的工作最讓我深有感悟的就是測試動不動就是問我要測試包,弄的我實在是叫苦不堪。今天正好有個工作空檔期,也有些意外看到過些類似的博文,正好在這個工作空檔期實現了Window上跑Gradle指令碼自動構建Android項目。

  首先,開發環境:

    系統:Win7

    Gradle版本:4.2

    Android Studio: 2.2.2

  關於Gradle下android{}的配置欄位說明如下:

    defaultConfig{} 預設配置,是ProductFlavor類型。它共用給其他ProductFlavor使用
    sourceSets{ } 源檔案目錄設定,是AndroidSourceSet類型。
    buildTypes{ } BuildType類型
    signingConfigs{ } 簽名配置,SigningConfig類型
    productFlavors{ } 產品風格配置,ProductFlavor類型
    testOptions{ } 測試組態,TestOptions類型
    aaptOptions{ } aapt配置,AaptOptions類型
    lintOptions{ } lint配置,LintOptions類型
    dexOptions{ } dex配置,DexOptions類型
    compileOptions{ } 編譯配置,CompileOptions類型
    packagingOptions{ } PackagingOptions類型
    jacoco{ } JacocoExtension類型。 用於設定 jacoco版本
    splits{ } Splits類型

  指令碼構建工作如下:

    關於Gradle配置編譯Apk相關簽名如下:  

android {    signingConfigs {        release {            storeFile file(‘E:\Gsafty\keystoreName.keystore‘) //絕對路徑            storePassword "12345678"            keyAlias "alias"            keyPassword "12345678"        }    }}

 

  構建類型(開發過程中會不斷的提交測試debug包到測試人員去測試)

    如下代碼僅做參考:

buildTypes {        release {            minifyEnabled false            shrinkResources false            zipAlignEnabled false            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.txt‘        }        debug {            minifyEnabled false            shrinkResources false            zipAlignEnabled false        }        custom {            minifyEnabled false            shrinkResources false            zipAlignEnabled false        }        sourceSets {            main {                jni.srcDirs = []            }        }    }

  多渠道打包構建不同渠道的多個類型apk

    這裡不同的渠道會根據構建類型產生對應的apk,其對應關係為渠道種類數*構建編譯類型數等於編譯出的APK數。

    /*多渠道包*/    productFlavors{        tencent{            applicationId "com.domin.armn"            versionCode "1.0"            versionName "1.2.0"            manifestPlaceholders = [appName: "tencent"]        }                baidu{            applicationId "com.domin.armn"            versionCode "1.0"            versionName "1.2.0"            manifestPlaceholders = [appName: "baidu"]        }    }

  自訂產生的APK包名稱

    例如:module_flavor-version-time-buildtype.apk 

    在APP下的build.gradle根目錄下聲明如下:

//擷取目前時間def getCurrentTime() {    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))} 

    在Android{}目錄下聲明如下:  

/*apk重新命名*/    android.applicationVariants.all { variant ->        variant.outputs.each { output ->            def outputFile = output.outputFile            if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) {                def buildType = variant.buildType.name                //這裡修改apk檔案名稱,格式為 module_flavor-version-time-buildtype.apk                def fileName = "Gsafety_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"                output.outputFile = new File(outputFile.parent, fileName)            }        }    }

 

  進階配置項

    以上所有的設定尚且不能夠完全滿足自動化編譯,仍然需要使用者手動輸入命令去運行編譯APK包,這當然不是我們最想要的結果。

    Gradle執行相關命令如下:     

      註:在使用編譯命令之前請確保gradle已經加入環境變數,如果沒加入可以通過./gradlew替代gradle(只能在項目根目錄下使用)

      1編譯所有productFlavor及對應所有buildType的apk.
        $gradle assemble   //僅僅執行項目打包所必須的任務集
        $gradle build           //執行項目打包所必須的任務集,以及執行自動化測試,所以會較慢
        如果當前Project包含多個Module,在Project根目錄執行gradle assemble會編譯所有的Module

      2編譯指定productFlavor及buildType的apk
        $gradle assemble[productFlavor][buildType]
        如果缺失某參數,則會把該參數的所有配置都進行編譯,即如果運行gradle assembleflavor,則會編譯出flavor所有buildType的apk
        例如:
          $gradle assemble
          $gradle assembleflavorRelease 
          $gradle assembleflavorDebug
        注:gradle支援命令縮寫,上面兩個命令也可以寫成如下格式
          $gradle a
          $gradle ass
          $gradle aR
          $gradle assflavorR
          $gradle aD
          $gradle assflavorD

    在項目根目錄下建立一個指定的檔案夾(用於編譯跑指令碼用),例如.config,然後在該目錄下分辨建立.bat檔案(win7上批處理尾碼檔案)和簽名檔案

      批次檔如下build.bat:

      注意:這裡可能會在CMD視窗出現中文亂碼,這是由於便於問題,不會影響編譯。

#快速編譯打包apk指令碼echo  " **************************打包開始 ************************** "sleep 1#執行打包命令前,需要先定位到項目根目錄cd ..#執行打包命令gradle aecho -e "**************************打包完成************************** "#案頭右上方彈出通知notify-send build.sh "打包完成!"

      建立簽名檔案sign.txt:

      簽名檔案之所以放到外邊這裡是為了更好的保護簽名檔案,盡量少的給其他人知道<安全考慮>。

android {    signingConfigs {        release {            storeFile file(‘E:\Gsafty\keystoreName.keystore‘) //絕對路徑            storePassword "12345678"            keyAlias "alias"            keyPassword "12345678"        }    }}

     將簽名檔案應用到app的build.gradle檔案下的android{}:

//載入簽名資訊    File configFile = file(‘../.config/sign.txt‘)    if (configFile.exists()) {        def signGradlePath = configFile.newReader().readLine().trim()        println ‘lucher, path:‘ + signGradlePath        if (file(signGradlePath).exists()) {            apply from: signGradlePath        }    }

   最後就是開發人員的福利了,在window機器上直接點擊.bat檔案執行批處理命令,即可在項目build目錄下的apk目錄下得到對應的apk包.

    

 

Android Studio之Gradle自動化構建打包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.