各位安卓開發的各位小夥伴,你們確定要用到不少類庫。
若是,咱們有一些特殊需求,就是一個項目的某個模塊的功能給其餘項目使用。咱們直觀的是想到依賴module唄。確實能夠,若是項目模塊依賴過多呢?咱們能夠選擇更好的jar、so、aar方式進行管理,使項目更加的清晰分明。java
jar:故名思議,java類庫。不包含任何其餘東西。android
so:有過c、c++開發的小夥伴必定不陌生。動態連接庫,只包含c、c++c++
aar:二進制歸檔文件,包含jar、so以及res、assets等各類資源。git
明白以上概念的區別以後,咱們能夠根據業務需求,選擇不一樣的依賴。github
項目結構,三個module分別對應生成jar、so、aar生成相關工做app
你們在寫好代碼後,若是要生成jar,能夠雙擊下面藍色部分測試
最後生成默認名字爲classes.jar文件,路徑層級以下gradle
那麼,咱們每次從這裏面找文件,無疑是操蛋的。別急,自定義任務指定輸出jar路徑。ui
注意:在對應module的android{}區域內定義。spa
//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平臺小夥伴本身去配置下全局環境吧。
各位小夥伴確定用到過不少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裏面。兩個要一塊兒使用。
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文件存放路徑) //android{}裏面添加下面代碼 repositories { flatDir { dirs 'libs' } } //依賴generate-release.aar文件 //dependencies {}裏面添加下面代碼 implementation(name: 'generateaar-release', ext: '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 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。