defaultConfig——安卓gradle

目錄
1、前言
2、defaultConfig
一、搞清楚幾個問題
二、defaultConfig 的存在形式
三、defaultConfig 中屬性的意義
四、defaultConfig 中方法的意義
3、寫在最後
html

1、前言

咱們在安卓開發中,編譯的任務是由 gradle 來負責的。但不少時候咱們進入 build.gradle 文件中,有種似懂非懂的感受,因此小盆友總結並分享本身學習到的點滴。java

話很少說,今天分享的是在咱們的每一個模塊下(應用級)build.gradle 文件中,android 下的 defaultConfig 屬性android

2、defaultConfig

一、搞清楚幾個問題

在分享 defaultConfig 前,咱們須要先弄清楚幾個問題,這幾問題以前一直困擾着小盆友,因此順便記錄和分享下。git

(1)build.gradle 最終是以什麼形式存在。 (2)爲何 每一個模塊下的 build.gradle 文件的最開始都有 apply plugin: 'com.android.library' 這樣一行代碼。程序員

自動生成完的 build.gradle 格式以下所示github

apply plugin: 'com.android.library'

android {
	// 省略一些配置
}

dependencies {
	// 省略依賴
}
複製代碼

這個文件最終會被轉換爲 org.gradle.api.Project 類(其類的關係以下圖)。api

  • 第一行代碼的 apply 會調用 PluginAwarevoid apply(Map<String, ?> options); 方法,進行設置插件;
  • 接下來的 android,並非 gradle 中所帶的,而是第一行代碼插件所帶來。具體會映射爲 com.android.build.gradle.AppExtension 類;
  • 最後的 dependencies,會調用 Projectvoid dependencies(Closure configureClosure); 方法;

二、defaultConfig 的存在形式

defaultConfig 會被映射爲 DefaultConfig 類,其繼承結構圖以下微信

三、defaultConfig 中屬性的意義

下面是官方給出的文檔,咱們以 3.3 的版本進行講解,其餘版本可能有些許的小改動。架構

defaultConfig官方文檔 傳送門app

3.1 applicationId

  • 類型:String
  • 描述:應用的id,即咱們常說的包名。咱們都知道 android studio 是以 applicationId 做爲包名,之前使用 eclipse 時,則另當別論了。
  • 使用方法:
defaultConfig {
    // applicationId 應用的包名
    // applicationId 會替換 AndroidManifest.xml 中的 manifest 標籤下 package 的 value
    applicationId "com.zinc.gradlestudy"
	......省略其餘配置
}
複製代碼

3.2 applicationIdSuffix

  • 類型:String
  • 描述:會追加在上面 applicationId 字符串的後面,造成最終的包名
  • 使用方法:
defaultConfig {
	// 若此時 applicationId 爲 com.zinc.gradlestudy,則最終會造成 com.zinc.gradlestudy.debug 的包名
    applicationIdSuffix "debug"
	......省略其餘配置
}
複製代碼

3.3 externalNativeBuild

  • 類型:ExternalNativeBuildOptions
  • 描述:這裏咱們設置 ndk 編譯過程的一些參數。分爲 cmake 和 ndkBuild 兩個參數。
  • 使用方法:
defaultConfig {
    externalNativeBuild {
        ndkBuild {
            // Passes an optional argument to ndk-build.
            arguments "NDK_MODULE_PATH+=../../third_party/modules"
        }
        // For ndk-build, instead use the ndkBuild block.
        cmake {
             // Passes optional arguments to CMake.
             arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

             // Sets a flag to enable format macro constants for the C compiler.
             cFlags "-D__STDC_FORMAT_MACROS"

             // Sets optional flags for the C++ compiler.
             cppFlags "-fexceptions", "-frtti"

             // Specifies the library and executable targets from your CMake project
             // that Gradle should build.
             targets "libexample-one", "my-executible-demo"
         }
   }
}
複製代碼

cmake 具體參數 傳送門
ndkBuild 具體參數 傳送門

3.4 dimension

  • 類型:String
  • 描述:當前的配置所屬的 「風味維度」,這個參數在這裏的並無實際的意義,在打多渠道包的時候,會進行更多的分享。
  • 使用方法:
defaultConfig {
	dimension 'debug'
	......省略其餘配置
}
複製代碼

3.5 consumerProguardFiles

  • 類型:List< File >
  • 描述:這個屬性只做用於咱們建立的 library 中,包括咱們以aar形式導入的 library ,或是直接建立的 library。它的做用是,負責該 library 被進行編譯時的混淆規則,咱們在 主App 的模塊下則能夠不用再管理各個 library 的混淆規則,會直接使用各個 library 的混淆規則文件。
  • 使用方法:
defaultConfig {
	consumerProguardFiles 'consumer-rules.pro'
	......省略其餘配置
}

// 由於該屬性是一個 List<File> 類型,若是須要多個文件配置,則以下所示
defaultConfig {
	consumerProguardFiles 'consumer-rules.pro','zincPower-rules.pro'
	......省略其餘配置
}
複製代碼

3.6 javaCompileOptions

  • 類型:JavaCompileOptions
  • 描述:配置編譯時 java 的一些參數,例如咱們使用 annotationProcessor 時所須要的參數。
  • 使用方法:
defaultConfig {
	javaCompileOptions {
        annotationProcessorOptions{
			arguments = []
			classNames ''
			....
		}
	}
	......省略其餘配置
}
複製代碼

JavaCompileOptions 能夠配置的具體參數,請進傳送門

3.7 manifestPlaceholders

  • 類型:Map<String, Object>
  • 描述:配置能夠在 AndroidManifest.xml 中替換的參數,通常用於多渠道中使用,不會在 defaultConfig 中使用。
  • 使用方法:

這裏想配置咱們應用的logo,則能夠在 gradle 中使用下面這段

defaultConfig {
	manifestPlaceholders = [APP_LOGO_ICON: "@mipmap/ic_logo"]
}
複製代碼

而後在 AndroidManifest.xml 中使用,使用 ${你配置的變量名}

// 在 application 中使用替換,還須要多添加 tools:replace 這一標籤,將咱們須要替換的名稱寫上,例如這裏的 android:icon
<application android:allowBackup="true" android:icon="${APP_LOGO_ICON}" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="android:icon">
......
複製代碼

3.8 multiDexEnabled

64K 引用限制問題官方文檔 傳送門

  • 類型:Boolean
  • 描述:是否開啓分包。由於安卓中方法索引值爲兩個字節,四位十六進制的一個數值,即[0, 0xffff],因此最大方法數爲65536個。一旦超出了,就須要進行分包,因此咱們就須要開啓這個參數。
  • 使用方法:
defaultConfig {
	multiDexEnabled true
	...
}

// 添加依賴
dependencies {
	// 若是使用的爲 AndroidX,則使用下面這個導入
	// implementation 'androidx.multidex:multidex:2.0.1'
	// 若是不使用 AndroidX,則使用下面這段
    compile 'com.android.support:multidex:1.0.3'
}
複製代碼

有兩種開啓 MultiDex 方法:

// 第一種:讓你應用的 Application 繼承 MultiDexApplication。
public class MyApplication extends MultiDexApplication {

}

// 第二種:重寫應用的 Application 方法 attachBaseContext
public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
複製代碼

最後別忘了在 AndroidManifest.xml 中使用咱們在上面的 Application。

3.9 multiDexKeepFile

  • 類型:File
  • 描述:將咱們須要的類打包進主包,即 classs.dex。咱們在第 3.8 小點,分享到使用了多包處理,有時咱們須要將一些主要的類打包進主包,則可使用該屬性。
  • 使用方法:
defaultConfig {
	multiDexKeepFile file('multidex-config.txt')
	...
}
複製代碼

multidex-config.txt 中的書寫則以下,每個文件則爲一行

com/example/MyClass.class
com/example/TestClass.class
複製代碼

3.10 multiDexKeepProguard

  • 類型:File
  • 描述:將咱們須要的類打包進主包,和第 3.9 點的功能相同,區別在於寫法。
  • 使用方法:
defaultConfig {
	multiDexKeepFile file('multidex-config.pro')
	...
}
複製代碼

multidex-config.pro 中的寫法以下

// 將會保留全部的在com.example package的類
 -keep class com.example.** { *; }
複製代碼

3.11 ndk

  • 類型:NdkOptions
  • 描述:用於abi過濾
  • 使用方法: 進行以下配置,編譯出來的 Apk包只包含armeabi-v7a,不會包含其餘的架構,例如 "X86"。
defaultConfig {
	// ndk中,目前只有 abiFilter 一個屬性,因此 ndk 目前來講只用於 abi 的過濾
	ndk {
        abiFilter 'armeabi-v7a'
    }
	...
}
複製代碼

NdkOptions的具體可配參數見官方文檔 傳送門

3.12 proguardFiles

  • 類型:List
  • 描述:配置混淆規則文件,但咱們通常不會在這裏使用該配置,而會在 buildTypes 中結合 minifyEnabled 一塊兒使用。

3.12 signingConfig

  • 類型:SigningConfig
  • 描述:配置簽名配置,但通常不會在這裏進行配置,而會在 buildTypes 中進行配置,這裏先不過多解釋。

3.13 vectorDrawables

  • 類型:VectorDrawablesOptions
  • 描述:配置矢量圖的參數
  • 使用方法: VectorDrawablesOptions 中只有兩個參數,爲 generatedDensitiesuseSupportLibrary。分別的用處以下
defaultConfig {
    vectorDrawables {
        // 若是 minSdkVersion 小於 21,只生成mdpi的png
        generatedDensities 'mdpi'

        // 設置爲 true,會忽略 generatedDensities ,會加入svg兼容包,不會再產生png
        useSupportLibrary true
    }
}
複製代碼

矢量圖的用法,能夠看小盆友的另外一片文章

3.14 versionCode

  • 類型:Integer
  • 描述:應用當前的版本值。和 versionName 的區別在小盆友看來,versionCode 是給程序員看的,versionName 是給產品經理和用戶看的。
  • 使用方法:
defaultConfig {
    versionCode 1000
    ......
}
複製代碼

3.15 versionName

  • 類型:String
  • 描述:應用版本。咱們一般所說的該應用的版本是「1.2.0」,則是由這個值配置的。
  • 使用方法:
defaultConfig {
	versionName "1.0.0"
	.....
}
複製代碼

3.16 versionNameSuffix

  • 類型:String
  • 描述:追加在第 3.15 小點「版本」的後綴
  • 使用方法:
defaultConfig {
	// 若是 versionName "1.0.0" ,則最終的版本名爲 1.0.0.test
	versionNameSuffix ".test"
	.....
}
複製代碼

四、defaultConfig 中方法的意義

4.1 buildConfigField(type, name, value)

  • 描述:咱們能夠在 BuildConfig 類中添加值,最終會在 BuildConfig 中添加以下一行代碼。
// 值的注意的是 value 的值是原樣放置,咱們經過使用方法一節來了解
<type> <name> = <value>
複製代碼
  • 使用方法:
defaultConfig {
    // 能夠經過 BuildConfig 進行獲取
    buildConfigField('String', 'name', '"zinc"')
    buildConfigField('int', 'age', '26')
	.....
}
複製代碼

最終會生成以下圖的配置,咱們能夠經過下面代碼進行獲取

String name = BuildConfig.name;
int age = BuildConfig.age;
複製代碼

值的一提的是,咱們設置 String 類型的參數時,須要加上 "" 雙引號(如例子中的name屬性)。切記!

4.2 consumerProguardFile(proguardFile)

  • 描述:和上面分享的 3.5 小點的屬性 consumerProguardFiles 是同樣的做用。只是這裏只能設置一個 混淆文件。
  • 使用方法:
defaultConfig {
	consumerProguardFile('consumer-rules.pro')
}
複製代碼

4.3 consumerProguardFiles(proguardFiles)

  • 描述:和上面分享的 3.5 小點的屬性 consumerProguardFiles 是同樣的做用,並且也是多個混淆文件。
  • 使用方法:
defaultConfig {
	consumerProguardFile('consumer-rules.pro', 'zincPower-rules.pro',.....)
}
複製代碼

4.4 maxSdkVersion(maxSdkVersion)

  • 描述:設置應用的最高支持版本,通常咱們不會進行設置
  • 使用方法:
defaultConfig {
	// 最高支持28版本
	minSdkVersion 28
}
複製代碼

4.5 minSdkVersion(minSdkVersion)

  • 描述:設置應用的最低支持版本
  • 使用方法:
defaultConfig {
	// 最低支持19版本
	minSdkVersion 19
}
複製代碼

4.6 missingDimensionStrategy(dimension, requestedValue)

  • 類似方法:missingDimensionStrategy(dimension, requestedValues) 區別在於第二個參數能夠設置多個風味。
  • 參數說明: (1)dimension:維度 (2)requestedValue:風味(若是爲 requestedValues 則是風味列表)
  • 描述:忽略在 Library 中的渠道設置,即維度(dimension)和風味(flavor),若是不進行忽略,在進行引入的時候會沒法進行。
  • 使用方法:

咱們的項目結構以下

zinclibrarybuild.gradle 中編寫了以下渠道配置

// 建立 風味維度
flavorDimensions('zinc', 'handsome')
// 建立產品風味
productFlavors {
    minApi13{
        dimension 'zinc'
    }
    minApi23{
        dimension 'zinc'
    }
    x86{
        dimension 'handsome'
    }
    arm64{
        dimension 'handsome'
    }
}
複製代碼

此時若是直接在 appbuild.gradle 中添加依賴,同步時便會出錯

dependencies {
	...忽略其餘依賴
    implementation project(":zinclibrary")
}
複製代碼

因此咱們須要在 appbuild.gradle 中使用這個參數進行忽略 library 中帶來的維度和風味,即便用以下代碼

defaultConfig {
    missingDimensionStrategy 'zinc', 'minApi13', 'minApi23'
    missingDimensionStrategy 'handsome', 'x86', 'arm64'
}
複製代碼

4.7 resConfig(config)

  • 描述:保留的資源配置。
  • 使用用法:
defaultConfig {
	// 這樣咱們編譯出的apk中,只有 「默認」 和 「中文zh」 兩種資源
	resConfig "zh"
}
複製代碼

4.8 resConfigs(config)

  • 描述:保留的資源配置,和 resConfig 的區別在於,resConfigs 保留多個資源。
  • 使用用法:
defaultConfig {
	// 這樣咱們編譯出的apk中,只有 「默認」 、 「中文zh」 和 「英文en」 兩種資源
	resConfigs "zh","en"
}
複製代碼

4.9 resValue(type, name, value)

  • 描述:添加 value 資源
  • 使用用法:
defaultConfig {
	// 添加至 res/value,經過 R.string.age 獲取
    resValue('string', 'age', '12year')
}
複製代碼

4.10 targetSdkVersion(targetSdkVersion)

  • 描述:應用的目標版本。說明咱們已經對指定的版本進行了測試,在開發過程當中可使用至該版本的API,不然會被提示沒法使用。若是不設置,則和 minSdkVersion 的值保持一致。
  • 使用用法:
defaultConfig {
	targetSdkVersion 28
}
複製代碼

3、寫在最後

Gradle 的配置文件看起來好像挺亂,實際上是由於咱們沒有進行總體的梳理,因此這段時間,小盆友會不斷的進行整理並結合在項目中用到的分享出來。若是喜歡的話請給我一個贊,並關注我吧。文章中若有寫的不妥的地方,請評論區或加我微信與我討論吧,共同進步。

歡迎加我微信,進行更多的交流

若是以爲文章有很大的幫助,快來讚揚一次吧😄
相關文章
相關標籤/搜索