Android-Gradle詳解

一腮敌、什么是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下Android Studio項目結(jié)構(gòu)

二垃沦、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>...

生成.abb格式或.apk格式文件

2乡数、根據(jù)步驟3生成的是aab文件,需要上傳到谷歌闻牡,谷歌會生成相應(yīng)的apk文件供用戶下載

????選中內(nèi)容在上傳aab到谷歌時需要用到下面省的內(nèi)容净赴。

????已有jks文件就如下圖顯示,沒有jks的>點擊Create new...按要求填寫即可

生成谷歌需要的sign文件


生成jks簽名文件

3罩润、直接生成apk文件,已有jks文件就如上圖顯示玖翅,沒有點擊Create new...按要求填寫即可

選中已生成jks文件打包

五、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)用程序中刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗦锐,一起剝皮案震驚了整個濱河市嫌松,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奕污,老刑警劉巖萎羔,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碳默,居然都是意外死亡贾陷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門嘱根,熙熙樓的掌柜王于貴愁眉苦臉地迎上來髓废,“玉大人,你說我怎么就攤上這事该抒』藕椋” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵凑保,是天一觀的道長冈爹。 經(jīng)常有香客問我,道長愉适,這世上最難降的妖魔是什么犯助? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮维咸,結(jié)果婚禮上剂买,老公的妹妹穿的比我還像新娘。我一直安慰自己癌蓖,他們只是感情好瞬哼,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著租副,像睡著了一般坐慰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上用僧,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天结胀,我揣著相機(jī)與錄音,去河邊找鬼责循。 笑死糟港,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的院仿。 我是一名探鬼主播秸抚,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼速和,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剥汤?” 一聲冷哼從身側(cè)響起颠放,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吭敢,沒想到半個月后碰凶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡省有,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年痒留,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢沿。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡伸头,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舷蟀,到底是詐尸還是另有隱情恤磷,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布野宜,位于F島的核電站扫步,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匈子。R本人自食惡果不足惜河胎,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虎敦。 院中可真熱鬧游岳,春花似錦、人聲如沸其徙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唾那。三九已至访锻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闹获,已是汗流浹背期犬。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留避诽,地道東北人哭懈。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像茎用,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容