AndroidStudio生成jar、so、aar以及上傳遠程庫jcenter

原由

各位安卓開發的各位小夥伴,你們確定要用到不少類庫。
若是,咱們有一些特殊需求,就是一個項目的某個模塊的功能給其餘項目使用。咱們直觀的是想到依賴module唄。確實能夠,若是項目模塊依賴過多呢?咱們能夠選擇更好的jar、so、aar方式進行管理,使項目更加的清晰分明。java

名詞

jar:故名思議,java類庫。不包含任何其餘東西。android

so:有過c、c++開發的小夥伴必定不陌生。動態連接庫,只包含c、c++c++

aar:二進制歸檔文件,包含jar、so以及res、assets等各類資源。git

明白以上概念的區別以後,咱們能夠根據業務需求,選擇不一樣的依賴。github

jar生成

項目結構,三個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平臺小夥伴本身去配置下全局環境吧。

-------------------------------完成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 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索