前言:
aar
包中包含了類似APP
的res
下的一切資源腾供,實(shí)際上相當(dāng)于一個(gè)module
直接依賴了一個(gè)工程module庫(kù)
仆邓,只是我們將這個(gè)工程module庫(kù)
打包成為了一個(gè)aar
文件方便直接引用鲜滩,而不是提供真正的源代碼,而我們?cè)谶M(jìn)行開發(fā)aar的目的是為了將其作為一個(gè)庫(kù)提供給真正的application
使用节值,所以aar
自身工程在開發(fā)過程中不會(huì)也不可能引用需要自身被引用的工程中徙硅,說的有點(diǎn)繞。但是在實(shí)際開發(fā)中可能存在就是aar
作為開發(fā)的某個(gè)模塊的功能搞疗,比如直接屬于啟動(dòng)的主界面的某個(gè)Fragment
嗓蘑,并且該Fragment
包含了很多功能,該功能里面點(diǎn)擊某個(gè)view
則進(jìn)入到一個(gè)WebView
網(wǎng)頁(yè)界面匿乃,進(jìn)入網(wǎng)頁(yè)界面需要判斷該APP
是否登錄桩皿,那么我們作為一個(gè)aar
工程實(shí)際上是拿取不到該APP
登錄的邏輯的,所以就存在了一個(gè)環(huán)境模擬的思路幢炸。這個(gè)時(shí)候就涉及到運(yùn)行時(shí)和編譯時(shí)泄隔。我們?cè)?code>aar中調(diào)用APP
中的某個(gè)方法時(shí)不需要去具體實(shí)現(xiàn),只需要模擬該環(huán)境也即:包宛徊、類佛嬉、方法/屬性
并調(diào)用,實(shí)際上只需要編譯時(shí)通過即可闸天,而真正的運(yùn)行時(shí)則實(shí)際上調(diào)用的是APP
中的真正方法進(jìn)行判斷暖呕。
再者當(dāng)我們的aar包需要依賴比如百度地圖時(shí),也采用只參與編譯而非運(yùn)行時(shí)依賴苞氮,因?yàn)榘俣鹊?code>ak之類的只能一個(gè)值湾揽,而我們自行開發(fā)時(shí)需要測(cè)試,所以實(shí)際上我們?cè)撓鄳?yīng)的key該配置還得配置笼吟,便于開發(fā)库物,實(shí)際上提供aar
時(shí)屬于運(yùn)行時(shí)給APP
作為第三方庫(kù)使用,是不會(huì)影響APP
真正的使用的赞厕。
如果APP
中艳狐,比如下拉刷新定硝,是屬于自定義的下拉刷新的 方式皿桑,而我們的aar
中也用到了該下拉刷新那么也需要模擬相同環(huán)境進(jìn)行調(diào)用。那么我們開發(fā)庫(kù)中可以新建相應(yīng)的一個(gè)依賴庫(kù)模擬相同的環(huán)境的下拉刷新路徑蔬啡,如想要保持相同風(fēng)格诲侮,則可以暫時(shí)先由第三方提供測(cè)試,最終實(shí)際上運(yùn)行時(shí)的程序調(diào)用的還是APP
中的庫(kù).
如何打包AAR
:
方式一:IDE
工具界面直接打包
方式二:使用命令行
在Terminal
下使用gradlew assembleRelease
命令
AAR
包下的所有資源文件命名問題
application
中的res
下的資源名稱很有可能會(huì)和依賴的aar
庫(kù)中的res
資源名稱相同箱蟆,引發(fā)資源重復(fù)引用沟绪。
處理方式為在打包aar
庫(kù)文件時(shí),將資源名稱以自己獨(dú)有的格式命名空猜,避免常規(guī)命名沖突绽慈,比如所有的資源文件添加以公司省略英文字母作為命名前綴恨旱。
AAR
中的依賴方式
所以我們所有的這一系列的依賴方式都為:compileOnly
- 在編譯時(shí)所需的依賴關(guān)系,但在運(yùn)行時(shí)不需要例如僅源代碼注解或注釋處理器;
- 在編譯時(shí)所需的依賴關(guān)系坝疼,但在運(yùn)行時(shí)僅在使用某些功能時(shí)才需要搜贤,也稱為可選依賴項(xiàng);
- 在編譯時(shí)需要其API,但其實(shí)現(xiàn)由消費(fèi)庫(kù)钝凶,應(yīng)用程序或運(yùn)行時(shí)環(huán)境提供的依賴關(guān)系仪芒。
- 僅編譯依賴關(guān)系與常規(guī)
compile、implementation
依賴關(guān)系明顯不同耕陷。它們不包含在運(yùn)行時(shí)類路徑中掂名,它們是非傳遞性的,意味著它們不包括在依賴項(xiàng)目中哟沫。當(dāng)使用Gradle
項(xiàng)目依賴關(guān)系以及發(fā)布到Maven
或Ivy
存儲(chǔ)庫(kù)時(shí)饺蔑,這一點(diǎn)是正確的。在后一種情況下嗜诀,只有從已發(fā)布的元數(shù)據(jù)中省略編譯依賴關(guān)系膀钠。
android3.0+
依賴方式:
在
Android studio3.0+
中,compile
依賴關(guān)系已被棄用裹虫,被implementation
和api
替代肿嘲,provided
被compile only
替代,apk
被runtime only
替代筑公,剩下的看名字就知道了雳窟。下面我們來看看2.x和3.x區(qū)別
implementation:
只能在內(nèi)部使用此模塊,比如我在一個(gè)libiary
中使用implementation
依賴了gson
庫(kù)匣屡,然后我的主項(xiàng)目依賴了libiary
封救,那么,我的主項(xiàng)目就無(wú)法訪問gson
庫(kù)中的方法捣作。這樣的好處是編譯速度會(huì)加快誉结,推薦使用implementation
的方式去依賴,如果你需要提供給外部訪問券躁,那么就使用api
依賴即可api(compile)
這種是我們最常用的方式惩坑,使用該方式依賴的庫(kù)將會(huì)參與編譯和打包。
當(dāng)我們依賴一些第三方的庫(kù)時(shí)也拜,可能會(huì)遇到com.android.support
沖突的問題以舒,就是因?yàn)殚_發(fā)者使用的compile
依賴的com.android.support
包,而他所依賴的包與我們本地所依賴的com.android.support
包版本不一樣慢哈,所以就會(huì)報(bào)All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes
這個(gè)錯(cuò)誤蔓钟。
解決辦法可以看這篇博客:com.android.support沖突的解決辦法
解決方法(同樣的適用于其他的依賴沖突。)
1)修改自己項(xiàng)目中的com.android.support
的版本號(hào)卵贱,與所依賴的庫(kù)版本號(hào)一致滥沫,但是當(dāng)我們依賴的庫(kù)中的com.android.support
版本號(hào)有好幾個(gè)版本就不行了侣集。(不推薦)
2)推薦這種方法,如果發(fā)生沖突了兰绣,依賴第三方庫(kù)時(shí)候排除掉對(duì)com.android.support
包的依賴肚吏,這樣自己的項(xiàng)目隨便依賴什么版本都可以。
exclude group:表示只要包含com.android.support的都排除
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support'
}
module:刪排除group中的指定module
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support', module: 'support-v13'
exclude group: 'com.android.support', module: 'support-vector-drawable'
}
compileOnly(provided)
只在編譯時(shí)有效狭魂,不會(huì)參與打包
可以在自己的moudle中使用該方式依賴一些比如com.android.support罚攀,gson
這些使用者常用的庫(kù),避免沖突雌澄。runtimeOnly(apk)
只在生成apk的時(shí)候參與打包斋泄,編譯時(shí)不會(huì)參與,很少用镐牺。testImplementation(testCompile)
testImplementation
只在單元測(cè)試代碼的編譯以及最終打包測(cè)試apk時(shí)有效炫掐。debugImplementation(debugCompile)
debugImplementation
只在debug
模式的編譯和最終的debug apk
打包時(shí)有效releaseImplementation(releaseCompile)
releaseImplementation
僅僅針對(duì)Release
模式的編譯和最終的Release apk
打包。
在我們自己創(chuàng)建library
給別人使用時(shí)睬涧,如果需要依賴的話募胃,建議用compileOnly
的方式依賴(android studio3.0
中更改為compileOnly
老版本為provided
),這樣只會(huì)在編譯時(shí)有效畦浓,不會(huì)參與打包
痹束。實(shí)際上調(diào)用的是APP
中的功能。
如何使用AAR
implementation project(':youaarlibrary')//既可以直接依賴開發(fā)
//compile(name: 'youaarlibrary-release', ext: 'aar')//也可以添加aar方式開發(fā)
https://blog.csdn.net/yuzhiqiang_1993/article/details/78214812