Android Gradle defaultConfig詳解及實用技巧

實際項目中,都會應用Android Gradle Plugin,根據實際中的項目模塊的職責,能夠具體應用以下四種插件類型。html

1,apply plugin: 'com.android.application'
實際對應的原型是:com.android.build.gradle.AppExtension,表示此項目模塊類型爲Android App Module,對應構建生成的文件爲.apk類型文件。java

2,apply plugin: 'com.android.library'
實際對應的原型是:com.android.build.gradle.LibraryExtension,表示此項目模塊類型爲Android Library Module,對應構建生成的文件爲.arr類型的文件。android

3,apply plugin: 'com.android.test'
實際對應的原型是:com.android.build.gradle.TestExtension,表示此項目模塊類型爲Android test Module,能夠在單個模塊內經過targetProjectPath指定項目,用於對應項目的單元測試。git

4,apply plugin: 'com.android.feature'
實際對應的原型是:com.android.build.gradle.FeatureExtension,表示此項目模塊類型爲Android feature Module,主要用於單個模塊內實現特性,以支持Android Instant Appsgithub

其中,通常項目中最多見的是applicationlibrary插件類型。web

項目模塊內應用了具體的Android Gradle Plugin類型後,能夠開始進行對應的配置,如最多見的以下配置項:bash

apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.happycorn" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ... } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } ... } ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) ... } 複製代碼

此時能夠按住CTRL,經過鼠標懸浮,能夠看到對應的配置原型信息。app

 

不一樣的Android Gradle Plugin插件類型,對應不一樣的實現原型,以及對應可能不一樣的對外配置項。ide

一樣的,跟蹤defaultConfig{}原型信息,能夠進入到以下原型說明。post

/**
     * Specifies defaults for variant properties that the Android plugin applies to all build * variants. * * <p>You can override any <code>defaultConfig</code> property when <a * href="https://developer.android.com/studio/build/build-variants.html#product-flavors"> * configuring product flavors</a>. * * <p>For more information about the properties you can configure in this block, see {@link * ProductFlavor}. */ public void defaultConfig(Action<DefaultConfig> action) { checkWritability(); action.execute(defaultConfig); } 複製代碼

可見,defaultConfig{}所對應的具體職責是:
爲變體屬性,指定默認值,Android plugin 能夠將指定的變體屬性的默認值,應用到全部的變體中。

執行action.execute(defaultConfig);後,將爲DefaultConfig對象指定具體的配置。

實際項目開發中,咱們每每關注此處有哪些配置項,以及每一個配置項對應的含義及做用。

首先能夠在Android Gradle DSL文檔上對應查詢DefaultConfig使用說明。 具體參見: google.github.io/android-gra…

文檔中列出了DefaultConfig對象的對外可配置的屬性、方法,以及對應說明,在具體配置時,可能有些須要注意的事項,文檔中也作了詳盡敘述。

 

 

 

 

但不管是屬性仍是方法,通常在build.gradle中配置defaultConfig{}時,通常都是採用形如 key value形式,固然,實際上也能夠採用對應的方法原型形式配置,效果是等價的,不過有個前提是,此方法原型是確實存在的,不然,Gradle會報錯。 如:

defaultConfig {
    ...
    minSdkVersion 15
    ...
}

等價於
defaultConfig {
    ...
    minSdkVersion(15)
    ...
}
複製代碼

defaultConfig{}中配置的屬性,在構建時,會默認生成對應的變體目錄下的BuildConfig.java文件,此文件中將以前配置的屬性轉變成了對應的JAVA常量形式。

build.gradle中配置以下:

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "com.happycorn" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { } } flavorDimensions "default" productFlavors { demo { applicationIdSuffix "demo" } full { applicationIdSuffix "full" } } } 複製代碼

執行./gradlew assembleFull命令,對應生成的BuildConfig文件爲:

 

 

如其中的buildTypedebug對應的BuildConfig文件內容爲:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com.happycorn;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.happycorn.full"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = "full"; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0"; } 複製代碼

BuildConfig文件爲JAVA源碼級別,構建時也會對應被編譯打包到包中,能夠直接在對應的模塊中使用。

利用此特性,咱們常常能夠在項目中對變體環境進行邏輯判斷,對應的進行邏輯處理。 如:判斷是不是DEBUG,對應的輸出Log等。

if (BuildConfig.DEBUG) { Log.d(TAG, "come here..."); } 複製代碼

另外,DefaultConfig對象中專門對外提供了buildConfigField(type, name, value)方法,用於向構建時生成的BuildConfig.java類中增長新的屬性。

如:defaultConfig{}中經過buildConfigField(type, name, value)添加以下。

defaultConfig {
    ...
    // 是否打對對用戶的內測包
    innerTest = project.hasProperty('innertest') ? innertest : 'false' buildConfigField "boolean", "INNER_TEST", innerTest // 添加模塊對應的模塊名 buildConfigField "String", "MODULE_NAME", "\"${project.name}\"" } 複製代碼

生成的BuildConfig.java中將有對應屬性產生。

public final class BuildConfig {
  ...
  // Fields from default config.
  public static final boolean INNER_TEST = false; public static final String MODULE_NAME = "app"; } 複製代碼

利用此特性,能夠頗有技巧性的去處理項目中的一些特定的問題。參照上例代碼中的兩個追加的屬性。
如:
Gradle構建時,經過命令參數-P傳入對應參數鍵值,能夠將其在defaultConfig{}中添加,以自動在BuildConfig.java中生成對應屬性,而後程序中對應進行一些邏輯的特別處理。

if (BuildConfig.INNER_TEST) { // 用戶內測的一些邏輯處理 ... } 複製代碼

又如:
調用項目日誌系統時,能夠傳入對應的模塊名,以實現對各個模塊的日誌過濾展現等。 此時就能夠經過project.name取到模塊名,追加到BuildConfig.java中。而後調用日誌庫時能夠取用。

CLog.e(BuildConfig.MODULE_NAME, TAG, e)
複製代碼

更進一步,此處對各個模塊經過defaultConfig{}配置向BuildConfig.java中追加屬性能夠寫成:

allprojects {
    ...
    afterEvaluate { project ->
        def android = project.extensions.findByName("android") if(android != null){ def defaultConfig = android["defaultConfig"] defaultConfig.buildConfigField("String", "MODULE_NAME", "\"${project.name}\"") } } } 複製代碼

使得總體用法顯得很是靈活。

除了buildConfigField(type, name, value)方法外,還有一個實用方法resValue(String type, String name, String value)
resValue(String type, String name, String value)等價於向模塊res/values中新增一個資源。

如:在buildTypedebug中新增資源:

buildTypes {
    release {
        minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { resValue("string", "app_name_debug", "HappyCornDebug") resValue("integer", "token", "365") } } 複製代碼

編譯後,對應變體目錄結構下會生成資源文件,及對應的資源鍵值。

 

 

項目中對應須要的此資源的地方也能夠直接取用:

getResources().getString(R.string.app_name_debug);
getResources().getInteger(R.integer.token);
複製代碼

defaultConfig{}中配置的屬性與productFlavors中具體Flavor中配置的屬性重複時,Android Gradle構建時將以productFlavors中的對應配置爲準,能夠理解成將defaultConfig{}中對應的配置覆蓋掉了。但applicationIdSuffix除外(applicationIdSuffix依然是追加的形式)。

在現實的項目需求中,外部傳入的參數鍵值或經過Gradle/Android Gradle腳本獲取的值,結合defaultConfig{}配置,變體,以及對應生成的BuildConfig.java或資源文件,實現一些特定場景下的需求,總體能夠很是靈活,且具備必定的技巧性。

做者:HappyCorn 連接:https://juejin.im/post/5c70a1f56fb9a04a0e2dd008 來源:掘金 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索