目錄
1、前言
2、defaultConfig
一、搞清楚幾個問題
二、defaultConfig 的存在形式
三、defaultConfig 中屬性的意義
四、defaultConfig 中方法的意義
3、寫在最後
html
咱們在安卓開發中,編譯的任務是由 gradle 來負責的。但不少時候咱們進入 build.gradle
文件中,有種似懂非懂的感受,因此小盆友總結並分享本身學習到的點滴。java
話很少說,今天分享的是在咱們的每一個模塊下(應用級)build.gradle
文件中,android
下的 defaultConfig
屬性android
在分享 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
會調用 PluginAware
的 void apply(Map<String, ?> options);
方法,進行設置插件;android
,並非 gradle 中所帶的,而是第一行代碼插件所帶來。具體會映射爲 com.android.build.gradle.AppExtension
類;dependencies
,會調用 Project
的 void dependencies(Closure configureClosure);
方法;defaultConfig 會被映射爲 DefaultConfig
類,其繼承結構圖以下微信
下面是官方給出的文檔,咱們以 3.3 的版本進行講解,其餘版本可能有些許的小改動。架構
defaultConfig官方文檔 傳送門app
defaultConfig {
// applicationId 應用的包名
// applicationId 會替換 AndroidManifest.xml 中的 manifest 標籤下 package 的 value
applicationId "com.zinc.gradlestudy"
......省略其餘配置
}
複製代碼
defaultConfig {
// 若此時 applicationId 爲 com.zinc.gradlestudy,則最終會造成 com.zinc.gradlestudy.debug 的包名
applicationIdSuffix "debug"
......省略其餘配置
}
複製代碼
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"
}
}
}
複製代碼
defaultConfig {
dimension 'debug'
......省略其餘配置
}
複製代碼
library
中,包括咱們以aar形式導入的 library ,或是直接建立的 library。它的做用是,負責該 library 被進行編譯時的混淆規則,咱們在 主App 的模塊下則能夠不用再管理各個 library 的混淆規則,會直接使用各個 library 的混淆規則文件。defaultConfig {
consumerProguardFiles 'consumer-rules.pro'
......省略其餘配置
}
// 由於該屬性是一個 List<File> 類型,若是須要多個文件配置,則以下所示
defaultConfig {
consumerProguardFiles 'consumer-rules.pro','zincPower-rules.pro'
......省略其餘配置
}
複製代碼
annotationProcessor
時所須要的參數。defaultConfig {
javaCompileOptions {
annotationProcessorOptions{
arguments = []
classNames ''
....
}
}
......省略其餘配置
}
複製代碼
JavaCompileOptions 能夠配置的具體參數,請進傳送門
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">
......
複製代碼
64K 引用限制問題官方文檔 傳送門
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。
classs.dex
。咱們在第 3.8 小點,分享到使用了多包處理,有時咱們須要將一些主要的類打包進主包,則可使用該屬性。defaultConfig {
multiDexKeepFile file('multidex-config.txt')
...
}
複製代碼
multidex-config.txt 中的書寫則以下,每個文件則爲一行
com/example/MyClass.class
com/example/TestClass.class
複製代碼
defaultConfig {
multiDexKeepFile file('multidex-config.pro')
...
}
複製代碼
multidex-config.pro 中的寫法以下
// 將會保留全部的在com.example package的類
-keep class com.example.** { *; }
複製代碼
armeabi-v7a
,不會包含其餘的架構,例如 "X86"。defaultConfig {
// ndk中,目前只有 abiFilter 一個屬性,因此 ndk 目前來講只用於 abi 的過濾
ndk {
abiFilter 'armeabi-v7a'
}
...
}
複製代碼
NdkOptions的具體可配參數見官方文檔 傳送門
buildTypes
中結合 minifyEnabled
一塊兒使用。generatedDensities
和 useSupportLibrary
。分別的用處以下defaultConfig {
vectorDrawables {
// 若是 minSdkVersion 小於 21,只生成mdpi的png
generatedDensities 'mdpi'
// 設置爲 true,會忽略 generatedDensities ,會加入svg兼容包,不會再產生png
useSupportLibrary true
}
}
複製代碼
矢量圖的用法,能夠看小盆友的另外一片文章
versionName
的區別在小盆友看來,versionCode
是給程序員看的,versionName
是給產品經理和用戶看的。defaultConfig {
versionCode 1000
......
}
複製代碼
defaultConfig {
versionName "1.0.0"
.....
}
複製代碼
defaultConfig {
// 若是 versionName "1.0.0" ,則最終的版本名爲 1.0.0.test
versionNameSuffix ".test"
.....
}
複製代碼
// 值的注意的是 value 的值是原樣放置,咱們經過使用方法一節來了解
<type> <name> = <value>
複製代碼
defaultConfig {
// 能夠經過 BuildConfig 進行獲取
buildConfigField('String', 'name', '"zinc"')
buildConfigField('int', 'age', '26')
.....
}
複製代碼
最終會生成以下圖的配置,咱們能夠經過下面代碼進行獲取
String name = BuildConfig.name;
int age = BuildConfig.age;
複製代碼
defaultConfig {
consumerProguardFile('consumer-rules.pro')
}
複製代碼
defaultConfig {
consumerProguardFile('consumer-rules.pro', 'zincPower-rules.pro',.....)
}
複製代碼
defaultConfig {
// 最高支持28版本
minSdkVersion 28
}
複製代碼
defaultConfig {
// 最低支持19版本
minSdkVersion 19
}
複製代碼
咱們的項目結構以下
zinclibrary
的
build.gradle
中編寫了以下渠道配置
// 建立 風味維度
flavorDimensions('zinc', 'handsome')
// 建立產品風味
productFlavors {
minApi13{
dimension 'zinc'
}
minApi23{
dimension 'zinc'
}
x86{
dimension 'handsome'
}
arm64{
dimension 'handsome'
}
}
複製代碼
此時若是直接在 app
的 build.gradle
中添加依賴,同步時便會出錯
dependencies {
...忽略其餘依賴
implementation project(":zinclibrary")
}
複製代碼
因此咱們須要在 app
的 build.gradle
中使用這個參數進行忽略 library 中帶來的維度和風味,即便用以下代碼
defaultConfig {
missingDimensionStrategy 'zinc', 'minApi13', 'minApi23'
missingDimensionStrategy 'handsome', 'x86', 'arm64'
}
複製代碼
defaultConfig {
// 這樣咱們編譯出的apk中,只有 「默認」 和 「中文zh」 兩種資源
resConfig "zh"
}
複製代碼
defaultConfig {
// 這樣咱們編譯出的apk中,只有 「默認」 、 「中文zh」 和 「英文en」 兩種資源
resConfigs "zh","en"
}
複製代碼
defaultConfig {
// 添加至 res/value,經過 R.string.age 獲取
resValue('string', 'age', '12year')
}
複製代碼
defaultConfig {
targetSdkVersion 28
}
複製代碼
Gradle 的配置文件看起來好像挺亂,實際上是由於咱們沒有進行總體的梳理,因此這段時間,小盆友會不斷的進行整理並結合在項目中用到的分享出來。若是喜歡的話請給我一個贊,並關注我吧。文章中若有寫的不妥的地方,請評論區或加我微信與我討論吧,共同進步。
歡迎加我微信,進行更多的交流