一腮敌、什么是Gradle
? ? Gradle,它是一個基于JVM的新一代構(gòu)建工具石咬,關(guān)于Gradle完全可以寫一本書揩悄。這個小節(jié)就講講Android項目中Gradle的使用。目前Android應(yīng)用大多都是采用Android Studio來開發(fā)的鬼悠,Android Studio默認(rèn)是采用Gradle作為構(gòu)建工具的删性。通常開發(fā)者可以不需要理解任何Gradle的腳本配置亏娜,就可以開發(fā)出一個APP。但是蹬挺,當(dāng)你想做一些更智能的操作時维贺,比如修改打包后的輸出目錄、提高打包速度巴帮、構(gòu)建系統(tǒng)溯泣、插件化、熱修復(fù)和組件化等等榕茧,就必須對Gradle有比較深入的了解
二垃沦、project/build.gradle(project)
從上面來說整個項目有兩個build.gradle文件,咱們先重點查看project中的build.gradle即
//頂級生成文件用押,您可以在其中添加所有子項目/模塊通用的配置選項肢簿。
```java
buildscript {
//構(gòu)建過程依賴的倉庫
????????repositories {
????????????google()
????????????//代碼托管倉庫
????????????mavenCentral()
? ? }
????dependencies {
????????????//Gradle 插件及使用版本
????? ? ? ? classpath "com.android.tools.build:gradle:4.2.0"
????????????//注意:不要將應(yīng)用程序依賴項放在這里;他們屬于
????????????//app(單個模塊)/build.gradle文件中
????? }
????}
//這里面配置整個項目依賴的倉庫,這樣每個module就不用配置倉庫了
????allprojects {
????????repositories {
????????????//代碼托管倉庫蜻拨,可以引用 jcenter() 上任何的開源項目
????????????google()
????????????mavenCentral()
????????????jcenter() // 警告:此存儲庫即將關(guān)閉
????????}
}
????// 運(yùn)行g(shù)radle clean時池充,執(zhí)行此處定義的task。
????// 該任務(wù)繼承自Delete缎讼,刪除根目錄中的build目錄收夸。
????// 相當(dāng)于執(zhí)行Delete.delete(rootProject.buildDir)
????task clean(type: Delete) {
????????delete rootProject.buildDir
????}
三、app/build.gradle
上面講到了project中的build.gradle休涤,下面咱們看看app/build.gradle
//都表示是一個應(yīng)用程序的模塊咱圆,可獨立運(yùn)行
//(兩種方式因Android Studio版本不同產(chǎn)生的)
//apply plugin: 'com.android.application'
plugins {
????????id 'com.android.application'
}
都表示是一個依賴庫,不能獨立運(yùn)行可生成jar或者aar
//apply plugin: 'com.android.library'
//plugins {
????????// id 'com.android.library'
//}
android {
????????compileSdkVersion 30//項目的編譯版本
????????defaultConfig {
????????????applicationId "com.scc.demo"http://包名
????????????minSdkVersion 23//最低的兼容的Android系統(tǒng)版本
????????????targetSdkVersion 30//目標(biāo)版本功氨,表示你在該Android系統(tǒng)版本已經(jīng)做過充分的測試
????????????versionCode 1//版本號
????????????versionName "1.0.0"http://版本名稱
????????????????????ndk {
????????????????????????abiFilters 'armeabi-v7a', 'arm64-v8a'
????????????????????????//運(yùn)行環(huán)境,要上傳Google Play必須兼容64位手幢,這里僅兼容ARM架構(gòu)
????? ? ? ? ? ? ? ? ? ? //對于ARM架構(gòu)捷凄,32 位庫位于armeabi-v7a 中。64 位等效項是arm64-v8a围来。
????????????????????????//對于x86體系結(jié)構(gòu)跺涤,查找x86(用于 32 位)和 x86_64(用于 64 位)。
? ? ? ? ? ? ? ? ? ? ?}
}
buildTypes {//配置了多個版本(設(shè)置自動打包環(huán)境)
?release {
????????????minifyEnabled false
????????????proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
//正常情況上面這個夠用了监透,下面的用來了解
//指定生成安裝文件的配置桶错,常有兩個子包:release,debug,
// 咱這邊多一個子包胀蛮,多一種配置方式
// 注:直接運(yùn)行的都是debug安裝文件
????????????getByName("release") {
????????????????minifyEnabled true//是否開啟收縮院刁、混淆、優(yōu)化粪狼,true開啟
????????????????shrinkResources = true // 是否開啟資源收縮 退腥,true開啟
????????????????//applicationIdSuffix 未設(shè)置默認(rèn)包名 applicationId "com.scc.demo"
????????????????proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
????????????}
????????????getByName("debug") {
????????????????applicationIdSuffix = ".debug"//打包后會變成com.scc.demo.debug
????????????????minifyEnabled false
????????????}
/**
* initWith 屬性允許您從其他生成類型復(fù)制配置任岸,
*/
create("staging") {
initWith(getByName("debug"))
applicationIdSuffix = ".staging"
}
}
//flavorDimensions多維度配置
flavorDimensions "scc"
productFlavors {
create("demo") {
// Assigns this product flavor to the "version" flavor dimension.
// If you are using only one dimension, this property is optional,
// and the plugin automatically assigns all the module's flavors to
// that dimension.
dimension = "scc"
applicationIdSuffix = ".demo"
versionNameSuffix = "-demo"
}
create("full") {
dimension = "scc"
applicationIdSuffix = ".full"
versionNameSuffix = "-full"
}
}
//指定jdk版本
//設(shè)置代碼編譯的版本,一般是在使用JDK1.8時狡刘,配置這個享潜,使編譯出來的jar包讓別人使用時更通用
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {//指定當(dāng)前項目的所有依賴關(guān)系:本地依賴、庫依賴嗅蔬、遠(yuǎn)程依賴
//本地測試剑按,聲明測試用列庫
testImplementation 'junit:junit:4.+'
//androidTestImplementation僅為測試APK添加遠(yuǎn)程依賴項。
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
//庫依賴:(跟app同級文件的項目)
implementation(project(":mylibrary"))
//本地依賴:Gradle在項目app/libs/目錄中聲明對jar文件的依賴
//(因為 Gradle讀取相對于build.gradle文件的路徑)澜术。
implementation fileTree(dir: 'libs', include: ['*.jar'])
//或者艺蝴,你可以按如下方式指定單個文件
implementation(name: 'app-release11', ext: 'aar')
implementation files('libs/scc.jar', 'libs/stt.jar')
//注意:像這樣的遠(yuǎn)程依賴項要求你聲明適當(dāng)?shù)倪h(yuǎn)程存儲庫,Gradle 應(yīng)在其中查找?guī)臁?/p>
// 遠(yuǎn)程依賴:如果該庫在本地尚不存在瘪板,則 Gradle 會在構(gòu)建需要時(例如吴趴,當(dāng)你單擊將項目與 Gradle 文件同步 或運(yùn)行構(gòu)建時)
// 從遠(yuǎn)程站點拉取它。
//全稱應(yīng)為implementation group: 'com.android.billingclient',
// name: 'billing', version: '3.0.0'
????implementation 'com.android.billingclient:billing:3.0.0'
}
????//聲明是要使用谷歌服務(wù)框架(這個一般放在gradle最下面)
????apply plugin: 'com.google.gms.google-services'
????compileSdkVersion 和 targetSdkVersion 區(qū)別
????compileSdkVersion 告訴 Gradle 用哪個 Android SDK 版本編譯你的應(yīng)用侮攀。使用任何新添加的 API 就需要使用對應(yīng)等級的 Android SDK锣枝。需要強(qiáng)調(diào)的是修改 compileSdkVersion 不會改變運(yùn)行時的行為。
????targetSdkVersion 是 Android 提供向前兼容的主要依據(jù)兰英,在應(yīng)用的 targetSdkVersion 沒有更新之前系統(tǒng)不會應(yīng)用最新的行為變化撇叁。這允許你在適應(yīng)新的行為變化之前就可以使用新的 API。compileSdkVersion 不能小于 targetSdkVersion 畦贸。
????這些基本的看過了咱再看打包和簽名
四陨闹、Signing應(yīng)用簽名
????構(gòu)建系統(tǒng)使你能夠在構(gòu)建配置中指定簽名設(shè)置,并且可以在構(gòu)建過程中自動對你的APK 進(jìn)行簽名薄坏。構(gòu)建系統(tǒng)使用已知憑據(jù)使用默認(rèn)密鑰和證書對調(diào)試版本進(jìn)行簽名趋厉,以避免在構(gòu)建時出現(xiàn)密碼提示。除非你明確定義此構(gòu)建的簽名配置胶坠,否則構(gòu)建系統(tǒng)不會對發(fā)布版本進(jìn)行簽名君账。
1、按照圖上步驟進(jìn)行操作沈善,操作欄中選擇Build>Generate signed Bundle or apk>...
2乡数、根據(jù)步驟3生成的是aab文件,需要上傳到谷歌闻牡,谷歌會生成相應(yīng)的apk文件供用戶下載
????選中內(nèi)容在上傳aab到谷歌時需要用到下面省的內(nèi)容净赴。
????已有jks文件就如下圖顯示,沒有jks的>點擊Create new...按要求填寫即可
3罩润、直接生成apk文件,已有jks文件就如上圖顯示玖翅,沒有點擊Create new...按要求填寫即可
五、app/builde.gradle拓展
Dependencies
????????構(gòu)建系統(tǒng)管理來自本地文件系統(tǒng)和遠(yuǎn)程存儲庫的項目依賴項。這可以防止你必須手動搜索烧栋、下載和復(fù)制依賴項的二進(jìn)制包到你的項目目錄中写妥。
????????指定依賴項時,不應(yīng)使用動態(tài)版本號审姓,例如'com.android.tools.build:gradle:3.+'. 使用此功能可能會導(dǎo)致意外的版本更新和難以解決版本差異珍特。
代碼和資源縮減
????????當(dāng)你使用Android Gradle插件3.4.0或更高版本構(gòu)建項目時 ,該插件不再使用 ProGuard 來執(zhí)行編譯時代碼優(yōu)化魔吐。相反扎筒,該插件與R8 編譯器一起處理以下編譯時任務(wù):
? ??????代碼收縮:檢測并安全地從你的應(yīng)用程序及其庫依賴項中刪除未使用的類、字段酬姆、方法和屬性(使其成為解決64K引用限制的寶貴工具 )嗜桌。例如,如果你只使用庫依賴項的幾個 API辞色,收縮可以識別你的應(yīng)用程序未使用的庫代碼骨宠,并僅從你的應(yīng)用程序中刪除該代碼。
? ??????資源收縮:從打包的應(yīng)用程序中刪除未使用的資源相满,包括應(yīng)用程序庫依賴項中未使用的資源层亿。它與代碼收縮一起工作,這樣一旦刪除了未使用的代碼立美,也可以安全地刪除不再引用的任何資源匿又。
? ??????混淆:縮短類和成員的名稱,從而減少DEX 文件大小建蹄。
? ??????優(yōu)化:檢查并重寫你的代碼以進(jìn)一步減小應(yīng)用DEX 文件的大小碌更。例如,如果 R8 檢測到else {} 給定 if/else 語句的分支從未被采用洞慎,R8 將刪除該else {}分支的代碼痛单。
壓縮你的代碼
????????當(dāng)你將該minifyEnabled 屬性設(shè)置為true.
????????代碼收縮(也稱為搖樹)是刪除R8 確定在運(yùn)行時不需要的代碼的過程。例如劲腿,如果你的應(yīng)用程序包含許多庫依賴項但僅使用其功能的一小部分桦他,則此過程可以大大減少你的應(yīng)用程序的大小。
????????為了縮減應(yīng)用程序的代碼谆棱,R8 首先根據(jù)組合的配置文件集確定應(yīng)用程序代碼的所有入口點。這些入口點包括 Android 平臺可能用來打開應(yīng)用程序的活動或服務(wù)的所有類圆仔。從每個入口點開始垃瞧,R8 會檢查你的應(yīng)用程序的代碼,以構(gòu)建你的應(yīng)用程序可能在運(yùn)行時訪問的所有方法坪郭、成員變量和其他類的圖表个从。未連接到該圖的代碼被視為無法訪問,可能會從應(yīng)用程序中刪除。