一. 簡介
aar
是一個類似于jar
的文件格式。但是他們之間是有區(qū)別的矗漾。
jar
:僅僅包含class和清單文件,沒有資源文件竹宋。
aar
:包含了class文件和資源文件熬苍。說白了就是Android的專屬“jar”
將代碼打包成aar文件稍走,可以在一定程度上加快AndroidStudio
的速度。
尤其是將Module
打包成aar
文件柴底,提升的效果很顯著婿脸。
二. 如何得到aar
1. Module的aar文件
將一個AndroidStudio項目中的Module
打包成aar
其實很簡單。
在每一個Module
的目錄下面都會有這樣一個文件夾:build\outputs\aar
柄驻。
這個文件夾下面就放著這個Module
對應的aar
文件狐树。
一般情況下會有兩個aar
文件,一個debug
版本鸿脓,一個release
版本抑钟。
我們選擇release
的就ok。
注意:
新建的Module是沒有這個文件夾的野哭。這時味赃,你可以使用 兩種方法 生成這個文件夾
- 將整個項目運行一遍,這個文件夾會自動生成
- 執(zhí)行命令 ** ./gradlew assembleRelease** 也可以生成這個文件夾
Module中的
libs
目錄文件會隨著項目的編譯被打包進aar
文件中虐拓,但是build.gradle
中的引用庫不會打包進aar
文件中心俗,這個需要 特別留意。如果你忽略了這個Module的build.gradle
中的引用庫蓉驹,很可能引發(fā)ClassNotFoundException
異常城榛。
2. 遠程倉庫的aar
在項目里面經(jīng)常會引用一下遠程倉庫的依賴庫。
這時态兴,我們也可以將它以aar
的形式引入到項目中狠持。
這個依賴庫的aar其實也很好找。
當你配置好一個依賴庫以后瞻润,點擊 Sync Now
喘垂。
AndroidStudio會自動下載這個庫到C盤(windows)甜刻。你找到這個文件就可以了。
這里我使用的是Everything
進行搜索正勒,很方便就找到這個庫的下載文件夾得院。其他操作系統(tǒng)就自行搜索吧,總之找見這個項目的下載文件夾就ok章贞。
這個下載文件夾中包含了這個項目所需要的所有東西:包括aar
祥绞、jar
等文件。
后面會以一個例子詳細講解這個過程
注:
Everything是一個搜索軟件鸭限,可以瞬間搜索全盤蜕径。
是一個非常實用的軟件。但是很可惜只有windows版本败京。
官網(wǎng)地址:https://www.voidtools.com/
三. 如何使用aar
想要使用aar文件兜喻,需要經(jīng)過以下幾步:
1. 在app的build.gradle中加入以下配置
repositories {
flatDir {
dirs 'libs' // aar目錄
}
}
2. 將aar文件拷貝到app/libs目錄下
3. 在dependencies中加入aar引用
compile(name: 'zbar-release', ext: 'aar')
四. LeakCanary項目示例
因為Module的例子比較簡單,所以選擇遠程代碼庫作為示例赡麦。
這里使用一個經(jīng)常使用的內存檢測項目LeakCanary
來做一個示例虹统。
我們通常使用依賴來使用這個庫:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
當Sync Now
完成后,我們可以在C盤(windows)找見這個項目文件夾隧甚。
該項目文件夾截圖如下:
這個文件夾下面就有我們需要的兩個依賴庫:leakcanary-android
和leakcanary-android-no-op
點開leakcanary-android文件夾车荔,目錄結構如下(1.3是對應的版本號):
打開最里層的文件夾,你會發(fā)現(xiàn)文件的類型主要有三種:
-
jar文件
:有的項目是以jar文件形式提供 -
aar文件
:有的項目是以aar文件形式提供 -
pom文件
: (Project Object Model)戚扳,實際上就是個xml忧便,是對一些必要信息的說明。這里我們只關心一個節(jié)點信息:<dependencies>:聲明依賴列表
我們用文本編輯器打開leakcanary-android文件夾
下面的pom文件:
...
<dependencies>
<dependency>
<!--包組 id帽借,通常是發(fā)布者擁有的域名的反向珠增,以免跟別人的重復-->
<groupId>com.squareup.leakcanary</groupId>
<!--包 artifactId,其實就是組以下應該有一個更小的歸類-->
<artifactId>leakcanary-analyzer</artifactId>
<!--版本號-->
<version>1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
...
想更多了解pom文件砍艾,點擊這里
當我們打開leakcanary-android
的pom文件蒂教,
我們發(fā)現(xiàn)leakcanary-android
依賴于leakcanary-analyzer
的1.3版本。
同樣的的我們打開leakcanary-analyzer
的pom文件,
發(fā)現(xiàn)leakcanary-analyzer
依賴leakcanary-watcher
和haha
脆荷。
leakcanary-watcher
和haha
則沒有依賴任何東西凝垛。
這樣整個leakcanary-android導入本地的東西就是四個:
- leakcanary-android
- leakcanary-analyzer
- leakcanary-watcher
- haha
同樣的方式去一層一層解析leakcanary-android-no-op
,將所有需要的文件都導入到AndroidStudio中蜓谋。這樣整個LeakCanary
就被我們真正實現(xiàn)本地化了梦皮。
兩種結果對比如下:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
debugCompile(name: 'leakcanary-android-1.3', ext: 'aar')
compile files('libs/leakcanary-analyzer-1.3.jar')
compile files('libs/leakcanary-watcher-1.3.jar')
compile files('libs/haha-1.1.jar')
releaseCompile(name: 'leakcanary-android-no-op-1.3', ext: 'aar')
這樣就將整個LeakCanary項目完全轉換成了本地的依賴。