1. 程式人生 > >AndroidStudio生成jar、so、aar以及上傳遠端庫jcenter

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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授