前一段時(shí)間因?yàn)榇?AAR 包折騰了一整天恃轩,不得不懷疑我對(duì) Gradle 的認(rèn)識(shí)腹鹉。雖然在此之前確實(shí)能解決一些 Gradle 打包依賴的沖突或錯(cuò)誤,但并沒(méi)有系統(tǒng)的去學(xué)習(xí)臭家。
一、Gradle 是什么
Gradle 是 依賴管理 + 構(gòu)建工具方淤。它繼承了 Ant 的靈活和 Maven 的生命周期管理钉赁,它最后被 google 作為了 Android 御用管理工具。它最大的區(qū)別是不用 XML 作為配置文件格式携茂,采用了DSL格式你踩,使得腳本更加簡(jiǎn)潔。
Ant 是最早的構(gòu)建工具,基于 idea带膜,好象是2000年有的吩谦,當(dāng)時(shí)是最流行 java 構(gòu)建工具,不過(guò)它的 XML 腳本編寫格式讓 XML 文件特別大膝藕。對(duì)工程構(gòu)建過(guò)程中的過(guò)程控制特別好式廷。
Maven 它是用來(lái)給 Ant 補(bǔ)坑的,Maven 第一次支持了從網(wǎng)絡(luò)上下載的功能芭挽,仍然采用 xml 作為配置文件格式滑废,它的問(wèn)題是不能很好的相同庫(kù)文件的版本沖突。Maven 專注的是依賴管理袜爪,構(gòu)建神馬的并不擅長(zhǎng)蠕趁。
-
構(gòu)建工具 是什么
單個(gè)源碼文件,你可以很輕松地 javac辛馆、gcc俺陋。然而項(xiàng)目結(jié)構(gòu)復(fù)雜的時(shí)候,從源代碼到實(shí)際產(chǎn)出的生成物之間需要經(jīng)過(guò)一些列的轉(zhuǎn)換操作昙篙,比如說(shuō)編譯腊状、打包。而這一整個(gè)完整的過(guò)剩叫做“構(gòu)建”苔可。
Maven 的主要功能主要分為5點(diǎn)寿酌,分別是依賴管理系統(tǒng)、多模塊構(gòu)建硕蛹、一致的項(xiàng)目結(jié)構(gòu)、一致的構(gòu)建模型和插件機(jī)制硕并。
二法焰、Android 是如何打包的
將一堆源碼生成一個(gè) APK 的過(guò)程就是打包,Gradle 作為一個(gè)構(gòu)建平臺(tái)已經(jīng)有了很好的基礎(chǔ)倔毙,到具體的打包應(yīng)用步驟就由 Android Gradle Plugin 完成埃仪。即我們?cè)陧?xiàng)目下 build.gradle 的配置:
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
另外在項(xiàng)目子工程中,app陕赃、XXXlibrary 內(nèi)的 build.gradle 文件使用 apply plugin
來(lái)指定具體使用的插件卵蛉,如:
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
關(guān)于該插件打包時(shí)更多的配置,請(qǐng)參見(jiàn)(如:buildTypes么库、productFlavors傻丝、signingConfigs、ProGuard):
https://developer.android.com/studio/build/index.html
三诉儒、什么是 AAR 文件
AAR 文件本身是一個(gè) zip 文件葡缰,在您構(gòu)建相關(guān)應(yīng)用模塊時(shí),庫(kù)模塊將先編譯到 AAR 文件中,然后再添加到應(yīng)用模塊中泛释。為了避免常用資源 ID 的資源沖突滤愕,請(qǐng)使用在模塊(或在所有項(xiàng)目模塊)中具有唯一性的前綴或其他一致的命名方案。解壓后可以看到如下目錄:
- aapt
- aidl
- AndroidManifest.xml
- assets
- classes.jar
- jni
- libs
- R.txt
- res
四怜校、依賴沖突的解決辦法
在集成多個(gè)庫(kù)工程時(shí)间影,出現(xiàn)了如下異常:
java.lang.NoSuchMethodError: android.support.v4.app.ActivityCompat.startActivity
很明顯是 support 包沖突的問(wèn)題,查看 gradle.build
文件茄茁,在 dependencies
中有如下警告信息:
All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes).
Found versions 25.2.0, 24.0.0. Examples include com.android.support:animated-vector-drawable:25.2.0 and com.android.support:mediarouter-v7:24.0.0
提示存在多個(gè)版本魂贬,可能會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,需要使用同一個(gè)版本胰丁。解決辦法:
通過(guò)
./gradlew dependencies
或gradle dependencies
查看依賴樹(shù)-
可以使用
exclude
關(guān)鍵字來(lái)排除單個(gè)的庫(kù)工程随橘,如:compile('com.yanzhenjie:recyclerview-swipe:1.0.3') { exclude group: 'com.android.support', module: 'recyclerview-v7' }
-
可以使用全局的方式替換,在根目錄的 build.gradle 文件中锦庸,代碼如下:
subprojects { project.configurations.all { resolutionStrategy.eachDependency { details -> if (details.requested.group == 'com.android.support' && details.requested.name.contains('appcompat-v7') ) { details.useVersion "24.2.0" } } } }
并且在項(xiàng)目中可見(jiàn)的地方机蔗,修改為相同的版本號(hào),并
sync project gradle
參考:
the-exact-same-version-specification
the-exact-same-version/42582204#42582204
五甘萧、Android Studio 如何快速運(yùn)行程序
運(yùn)行速度嚴(yán)重影響了開(kāi)發(fā)效率萝嘁,雖然換 MBP 后比以前的運(yùn)行速度提高了三倍,但還是不夠滿意扬卷。提高速度主要有如下幾個(gè)方法:
-
提高編譯內(nèi)存牙言,在工程目錄下的 gradle.properties 文件中新增如下代碼:
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.daemon=true
-
在 app 子工程目錄下的 build.gradle 中配置下改成增量編譯和調(diào)整 minSdkVersion
dexOptions { incremental true } productFlavors { dev { // dev utilizes minSDKVersion = 21 // to allow the Android gradle plugin // to pre-dex each module and produce an APK that can be tested on // Android Lollipop without time consuming dex merging processes. minSdkVersion 21 } prod { // The actual minSdkVersion for the application. minSdkVersion 15 } }
使用插件 Freeline
參考文檔
上面是我再查找資料中做的一些總結(jié),內(nèi)容不全面和一些不連貫地方怪得。如要更詳細(xì)的了解請(qǐng)見(jiàn)如下鏈接:
Android Gradle Plugin 指南: https://developer.android.com/studio/build/index.html
Android Gradle Plugin 指南(1-6): http://blog.csdn.net/qinxiandiqi/article/category/2394347
項(xiàng)目自動(dòng)構(gòu)建工具對(duì)比(Maven咱枉、Gradle、Ant): http://www.cnblogs.com/renhui/p/6855934.html
Android Gradle Plugin 版本: https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle
AAR 詳解: https://developer.android.com/studio/projects/android-library.html#aar-contents
Maven 官網(wǎng): http://maven.apache.org/guides/getting-started/index.html