1. 程式人生 > >Gradle中的配置與多版本開發

Gradle中的配置與多版本開發

  最近做的專案牽扯到多版本開發,app要分兩個版本,兩個版本功能基本相同,但是訪問的url不同,顯示的功能有些許不同,同時需要在一個手機能夠同時安裝,於是便研究了一下Gradle的配置:

一.BuildConfig全域性變數的定義:

 android在執行時預設會有一個常量的BuildConfig,預設有個常量DEBUG,在buildtypes為debug和release時分別為true和false我們可以利用這個變數來設定是否列印日誌等功能。

如果想要新增額外的變數我們可以在buildTypes或者productFlavors中新增:

buildConfigField("boolean", "SHOWLOG", "false")//不在列印Log

二.manifest中變數的動態配置:

  有時候我們需要在清單檔案中根據不同的版本使用不同的資源,設定APP不同的名稱,這時就能夠使用manifestPlaceholders來儲存一些會變動的常量:

manifestPlaceholders = [
        'APPLICATION_ID'  : "${APPLICATIONID_YUNYING}",
        'BAIDUMAP_AK'     : "${BAIDMAP_KEY_YUNYING}",
        'APPLICATION_NAME': "${APPNAME_YUNYING}",
        'APP_ICON'        : "@drawable/push",
]
在清單檔案中使用也很簡單,前面加$然後替換就行了。
 <application
        android:name=".base.App"
        android:allowBackup="true"
        android:icon="${APP_ICON}"
        android:label="${APPLICATION_NAME}"
        android:persistent="true"
        android:screenOrientation="portrait"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:label,android:icon">

三.buildtype和productflavors的設定

為了減小apk的大小我一般會在debug的時候支援x86架構的cpu釋出版只支援armeabi-v7a

  buildTypes {
        release {
            buildConfigField("boolean", "SHOWLOG", "false")//不在列印Log
            shrinkResources false
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ndk {
                // 設定支援的SO庫架構
                abiFilters 'armeabi-v7a'//,'x86' ,'armeabi', 'x86_64', 'arm64-v8a'
            }

        }

        debug {
            buildConfigField("boolean", "SHOWLOG", "true")//除錯狀態列印Log
            shrinkResources false
            signingConfig signingConfigs.config

            ndk {
                // 設定支援的SO庫架構
                abiFilters 'armeabi-v7a', 'x86' //,'armeabi', 'x86_64', 'arm64-v8a'
            }
        }
    }

而不同的版本中的productflavors我一般會新增不同的動態常量

四.打包時簽名的設定

  因為我添加了百度地圖,我想在編譯除錯狀態也添加簽名檔案,於是我在debug編譯時也添加了簽名檔案的配置

 signingConfigs {
        config {
            storePassword '123456'
            keyAlias 'test'
            keyPassword '123456'
            storeFile file('/Users/z2wenfa/Downloads/test.jks')
        }
    }

五.打包時apk名稱的自定義:

根據不同的版本自定義不同的apk名稱

 applicationVariants.all { variant ->
            variant.outputs.each { output ->

                // 獲取渠道
                def flavor = variant.productFlavors[0]
                def flavorName
                if (flavor == null) {
                    flavorName = "defaultName"
                } else {
                    flavorName = flavor.name
                }

                def appname
                if (flavorName.equals("yunying")) {
                    appname = APP_LOGIN_SHOW_NAME_YUYING
                } else {
                    appname = APP_LOGIN_SHOW_NAME_YEWUYUAN
                }

                def outputFile = output.outputFile
                def fileName
                if (outputFile != null && outputFile.name.endsWith('.apk')) {

                    fileName =
                            "${appname}-${variant.buildType.name}-v${variant.versionName}.apk";
                    println fileName
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }


六.gradle中的def 定義變數的使用

自定義幾個變數 之後到其他設定處使用 例如新增幾個版本號的設定,減少耦合,版本變化只需要修改變數就行了,減少誤操作

def APPVERSIONCODE = 9; //小版本號

def APPMIDDLEVERSION = 0//中版本號
def APPGENERATION = 1 //大版本號


七.通過productflavors進行多版本開發,多版本使用不同資原始檔

  既然要開發不同的版本那麼程式碼和需要使用的資源就會不同,我們需要在src下與main同級建立幾個資料夾來進行開發,根據不同的版本編寫不同的程式碼,


當我們需要開發指定版本時我們只需要點選修改當前的開發版本就行