AndroidStudio生成jar、so、aar以及上傳遠端庫jcenter
起因
各位安卓開發的各位小夥伴,大家肯定要用到很多類庫。
如果,我們有一些特殊需求,就是一個專案的某個模組的功能給其他專案使用。我們直觀的是想到依賴module唄。確實可以,如果專案模組依賴過多呢?我們可以選擇更好的jar、so、aar方式進行管理,使專案更加的清晰分明。
名詞
jar:故名思議,java類庫。不包含任何其他東西。
so:有過c、c++開發的小夥伴一定不陌生。動態連結庫,只包含c、c++
aar:二進位制歸檔檔案,包含jar、so以及res、assets等各種資源。
明白以上概念的區別之後,我們可以根據業務需求,選擇不同的依賴。
jar生成
專案結構,三個module分別對應生成jar、so、aar生成相關工作
大家在寫好程式碼後,如果要生成jar,可以雙擊下面藍色部分
最後生成預設名字為classes.jar檔案,路徑層級如下
那麼,我們每次從這裡面找檔案,無疑是操蛋的。別急,自定義任務指定輸出jar路徑。
注意:在對應module的android{}區域內定義。
//generatejar_makeJar是任務名稱,推薦通過mouldeName+actionName(考慮多模組問題) //型別是copy操作 task generatejar_makeJar(type: Copy) { //指定來原始檔夾 from('build/intermediates/bundles/release') //指定目的資料夾(目的檔案如果已經存在,不需要先執行刪除,會執行覆蓋.) into('build/libs') //指定來原始檔 include('classes.jar') //給複製後的檔案重新命名 rename('classes.jar', 'generatejar.jar') } //generatejar_makeJar的執行依賴於build(build先去生成對應的原始檔) generatejar_makeJar.dependsOn(build)
定義完畢之後,後面就是執行任務了。
任務執行成功之後,檢視如下目錄
我們在module的build資料夾直接子層級,生成了libs目錄以及裡面的generatejar.jar檔案
注意:通過 gradlew generateaar_makeAar 命令我們直接就拿到了對應的jar(我們自定義task依賴了build)。不需要像之前那樣先執行module的 assembleRelease命令。
什麼?你告訴我gradlew不是內部或者外部命令?
圖片.png
win平臺小夥伴自己去配置下全域性環境吧。
-------------------------------完成jar的生成--------------------------------------
生成so
各位小夥伴肯定用到過很多so檔案,有沒有想過生成自己的so檔案?這樣,別人也可以方便的使用我們的so。
好吧,這個涉及到cmake、lldb和jni等,我後續專門開文介紹吧,不能跑題,繼續so的生成。
首先,類似jar的生成,我們需要先雙擊下面藍色命令
圖片.png
執行完畢命令之後,得到了不同cpu構架的so檔案
圖片.png
同樣的,我們可以自定義任務指定輸出路徑
//跟上面jar生成方式一致
task generateso_makeJar(type: Copy) {
from('build/intermediates/bundles/release')
into('build/libs')
include('classes.jar')
rename('classes.jar', 'generateso.jar')
}
//這個generatejarMakeJar的執行依賴於build(build先生成對應的原始檔)
generateso_makeJar.dependsOn(build)
//定義任務指定來原始檔夾、目的資料夾、
//目的檔案如果已經存在,不需要先執行刪除,會執行覆蓋.
//generateso_makeSo是任務名稱,推薦通過mouldeName+actionName(考慮多模組問題)
task generateso_makeSo(type: Copy) {
from('build/intermediates/bundles/release/jni')
into('build/so')
}
generateso_makeSo.dependsOn(build)
執行命令,如下所示
圖片.png
最後,得到module的build資料夾直接子層級so資料夾以及內部檔案,如下所示
圖片.png
注意:我們不僅需要生成so還需要生成對應的jar,因為我們的so是動態連結庫,包含c、c++。但是,我們呼叫c、c++的方法程式碼全在jar裡面。兩個要一起使用。
-------------------------------------------完成so的生成----------------------------------------
生成aar
aar的生成和上面類似,首先要雙擊如下藍色按鈕
圖片.png
執行完畢,得到generate-release.aar。路徑層級如下
圖片.png
我們同樣可以自定義任務,指明我們的輸出路徑。
//定義任務指定來原始檔夾、目的資料夾、來原始檔、並且重新命名
//目的檔案如果已經存在,不需要先執行刪除,會執行覆蓋.
//generateaar_makeAar 是任務名稱,推薦通過mouldeName+actionName(考慮多模組問題)
//include指定包含那些檔案(下面表示所有的aar型別)
task generateaar_makeAar(type: Copy) {
from('build/outputs/aar')
into('build/aar')
include('*.aar')
}
//generateaar_makeAar依賴build(build生成相關原始檔)
generateaar_makeAar.dependsOn(build)
執行命令,如下
圖片.png
得到對應的generate-release.aar,目錄層級如下
圖片.png
這樣我們jar、so、aar三個資料夾的層級都在moudle的build資料夾的直接子層級。方便獲取管理。
注意:本地aar的依賴首先要指定本地倉庫,然後指明依賴。在app.gradle裡面新增如下程式碼
//指明本地資料夾路徑(本地.aar檔案存放路徑)
//android{}裡面新增下面程式碼
repositories {
flatDir {
dirs 'libs'
}
}
//依賴generate-release.aar檔案
//dependencies {}裡面新增下面程式碼
implementation(name: 'generateaar-release', ext: 'aar')
------------------------------完成aar生成-------------------------------------------------
最後,我們生成了so、jar、aar。我們可以方便的給其他專案新增,保證結構整齊。我們也可以分享給其他人。但是。作為分享的話,釋出遠端倉庫這種方式也是不錯的方案,特別對於喜歡寫開原始碼的小夥伴。
由於篇幅過長,釋出遠端倉庫(jcenter)不再贅述。傳送門:https://www.jianshu.com/p/903f3f111e3b
總結
使用jar、so、aar可以更好的細化我們的專案,特別是針對包含c、c++程式碼的專案,一個專案負責生成so以及jar並測試,一個專案負責呼叫native程式碼。
希望本文能幫到大家~
Demo地址:https://github.com/HoldMyOwn/GenerateJarSoAar.git
commit預覽(包含c、c++的簡單呼叫,後期開文介紹c、c++開發)
作者:Allen___
連結:https://www.jianshu.com/p/9058b1e040e1
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授