使用AS將 Module 打包成 Jar 包和 aar

寫在前面:本文系轉(zhuǎn)載文章,非原創(chuàng)遣钳,侵刪。
原文鏈接:https://www.cnblogs.com/xinaixia/p/7660173.html

整理記錄 AndroidStudio 把一個(gè) module 項(xiàng)目打包成 jar 包劝评。

一倦淀、默認(rèn)自動(dòng)生成的 jar 包

眾所周知 android studio 會(huì)在library所依賴的 app運(yùn)行 或 build 之后自動(dòng)生成 jar 包,路徑為 Module根目錄/build/intermediates/bundles/debug or release/classes.jar姻成,這樣生成的jar是可以用的愿棋,但不是我們可以控制的,所以我們需要通過其他方式來解決這個(gè)問題才睹。

注意:

若發(fā)現(xiàn) Android Studio 項(xiàng)目 bundle 文件夾下沒有 release 目錄,可能是沒有將 module 添加到主 module 依賴中垮庐。

方式1:主module右鍵 --> 倒數(shù)第二個(gè)Open Module Setting--> 上面最后一個(gè)選項(xiàng)Dependencies-->右邊綠色加號(hào)-->Module dependency......然后確定

方式2:主Module的gradle的dependencies(平時(shí)添加第三方庫的地方)中加上 compile project(':lib-zxing')

二坞琴、自定義生成 jar 包

首先,需要將待打包 module 項(xiàng)目中的 build.gradld 文件進(jìn)行修改解恰,如下圖:
image

其次浙于,在 build.gradle 文件中加入如下代碼:

方式一:

def _BASENAME = "TestJar";
def _VERSION = "_V1.0";
def _DestinationPath = "build"; //生成jar包的位置
def zipFile = file('build/intermediates/bundles/default/classes.jar'); //待打包文件位置

task deleteBuild(type:Delete){
    delete _DestinationPath + _BASENAME + _VERSION + ".jar"
}

task makeJar(type:Jar){
    from zipTree(zipFile)
    from fileTree(dir:'src/main',includes:['assets/**']) //將assets目錄打入jar包  
    baseName = _BASENAME + _VERSION
    destinationDir = file(_DestinationPath)
}

makeJar.dependsOn(deleteBuild, build)

方式二:打包的 jar 只有源代碼的.class 文件羞酗,不包含資源文件

task makeJar(type: Copy) {
    delete 'build/TestJar_V1.0.jar' //刪除之前的舊jar包
    from('build/intermediates/bundles/default/') //從這個(gè)目錄下取出默認(rèn)jar包
    into('build/') //將jar包輸出到指定目錄下
    include('classes.jar')
    rename('classes.jar', 'TestJar_V1.0.jar') //自定義jar包的名字
}
makeJar.dependsOn(build)

方式三:

task clearJar(type: Delete) {
    delete 'build/TestJar_V1.0.jar' //jar包的名字,隨便命名 
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
    //指定生成的jar名 
    baseName 'TestJar_V1.0'
    //從哪里打包c(diǎn)lass文件 
    from('build/intermediates/bundles/default/')
    //打包到j(luò)ar后的目錄結(jié)構(gòu) 
    into('build/')
    //去掉不需要打包的目錄和文件 
    exclude('test/', 'BuildConfig.class', 'R.class')
    //去掉R開頭的文件  
    exclude{it.name.startsWith('R');}
}
makeJar.dependsOn(clearJar, build)

注意:

以上配置信息要與 android {…….} 配置的腳本成平級(jí)關(guān)系胸竞。

其中 _BASENAME = "TestJar"; _VERSION = "_V1.0"; 是定義生成 jar 包的名字為TestJar_V1.0.jar卫枝。

配置好以后就可以編譯jar包了讹挎,有兩種方式:

方式 A :點(diǎn)擊 Android Studio 右側(cè)(一般在這個(gè)位置)的 Gradle 面板,在項(xiàng)目或者該類庫的目錄中找到 Tasks -> other -> makeJar 命令筒溃,雙擊這個(gè)makeJar之后等一會(huì)就會(huì)編譯好jar包怜奖。

image

打包成功后:在配置的指定目錄下生成jar包

image

方式 B :通過 cmd 命令行,在項(xiàng)目根目錄下迁央,執(zhí)行 gradlew makeJar 命令滥崩,看到編譯完成的信息以后就OK了,也能生成一樣的jar包幅狮,和直接使用①中的方式是等價(jià)的株灸。

注意:使用此方式前要配置好 gradle 的“ 環(huán)境變量 ”,否則直接在項(xiàng)目根目錄下找不到這個(gè)命令逐抑。使用 cmd 比較費(fèi)勁屹蚊,不推薦。

方式 C :在 Android Studio 終端窗口中輸入 gradlew makeJar 命令命斧。

image

打包成功如下圖:

image

打包成功后:在配置的指定目錄下生成jar包

image

  注意:

問題1:

image

對(duì)于以上配置 form 默認(rèn) jar 包部分,在用目錄是 from('build/intermediates/bundles/release/') 芹壕,注意粗體部分,最初我也是按照這個(gè)目錄寫的通孽,確實(shí)沒問題睁壁。但后來,也就是Android Studio 更新到2.3以后糠惫,發(fā)現(xiàn)這個(gè)目錄沒有了钉疫,取而代之的是 default 和 debug 目錄,debug目錄之前也是有的牲阁,沒有變化城菊,只是原來的release目錄被現(xiàn)在的default目錄代替了。這導(dǎo)致我后來生成jar包的時(shí)候始終沒有找到j(luò)ar包凌唬,報(bào)上圖所示錯(cuò)誤。

原因就是沒有了 release 目錄况褪,找不到默認(rèn)的 classes.jar 文件,所以也就沒有生成自定義名字的jar包捏膨,改為 default 或者 debug 目錄以后就能正常生成jar包了食侮,要注意這點(diǎn)變化。

  問題2

Execution failed for task ':mylibrary:lint'.
> Lint found errors in the project; aborting build.

解決在 build.gradle 文件中锯七,加入下面的代碼塊(注意代碼塊所在的位置),重新執(zhí)行 gradlew makeJar 命令眉尸。

android {
    lintOptions {
        abortOnError false
    }
    ...
}

最后注意:

將被嵌入的應(yīng)用打包成 jar 包,但是這樣的方式有局限性效五,無法將被嵌入的應(yīng)用所使用的資源性文件一起打包畏妖。下面介紹 aar 打包方式。

三戒劫、直接使用 aar 包

將被嵌入的應(yīng)用打包成 aar 包,這也是 Android Studio 的一種新特性巫橄,可以將應(yīng)用所使用的資源性文件一起打包茵典。編譯即可打包生成 aar 包,而且也不用擔(dān)心漏掉資源問題彩倚。

如果Project 中 Module 是一個(gè)應(yīng)用,則在 Module 的 build.gradle 文件中定義屬性為:apply plugin: 'com.android.application'扶平;而如果 Mudule 是一個(gè)被引用的依賴 lib 庫的話帆离,則在 Module 的 build.gradle 文件中定義屬性為: apply plugin: 'com.android.library;所以當(dāng)我們將應(yīng)用 Module 打包出 aar 文件的時(shí)候结澄,需要修改類型屬性哥谷。正常情況下岸夯,直接重新編譯 Module,生成的 aar 包在 Module 根目錄的/build/outputs/aar/们妥,如下圖:

image

下面介紹將 aar 包添加到其他 Android 工程:

首先囱修,將 aar 包復(fù)制到 libs 目錄下

其次,配置build.gradle文件:

A: 在 android 中加入王悍,如下:

repositories {  
    flatDir {  
        dirs 'libs'  
    }  
}  

B: 在 dependencies 中加入 compile(name:lib-zxing-release', ext:'aar')

完整 build.gradle 文件如下:

apply plugin: 'com.android.application'  
  
android {  
    ...
    repositories {  
        flatDir {  
            dirs 'libs'  
        }  
    }  
}  
  
dependencies {  
    ...
    compile(name:'lib-zxing-release', ext:'aar')  
}  

最后餐曼,重新編譯 Rebuild 的以下工程压储。

------------------------------ 我是傲嬌的分割線 ------------------------------

寫在最后:感謝原文作者分享此經(jīng)驗(yàn),尊重作者知識(shí)產(chǎn)權(quán)源譬,侵刪集惋。
從本文進(jìn)行二次轉(zhuǎn)載也請(qǐng)注明出處,蟹蟹踩娘」涡蹋≡(▔﹏▔)≡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市养渴,隨后出現(xiàn)的幾起案子雷绢,更是在濱河造成了極大的恐慌,老刑警劉巖理卑,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘紊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡藐唠,警方通過查閱死者的電腦和手機(jī)帆疟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宇立,“玉大人踪宠,你說我怎么就攤上這事÷栲冢” “怎么了柳琢?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長润脸。 經(jīng)常有香客問我染厅,道長,這世上最難降的妖魔是什么津函? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任肖粮,我火速辦了婚禮,結(jié)果婚禮上尔苦,老公的妹妹穿的比我還像新娘涩馆。我一直安慰自己行施,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布魂那。 她就那樣靜靜地躺著蛾号,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涯雅。 梳的紋絲不亂的頭發(fā)上鲜结,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音活逆,去河邊找鬼精刷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔗候,可吹牛的內(nèi)容都是我干的怒允。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼锈遥,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纫事!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起所灸,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤丽惶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后爬立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚊夫,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年懦尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了知纷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陵霉,死狀恐怖琅轧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踊挠,我是刑警寧澤乍桂,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站效床,受9級(jí)特大地震影響睹酌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剩檀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一憋沿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪猴,春花似錦辐啄、人聲如沸采章。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悯舟。三九已至,卻和暖如春砸民,著一層夾襖步出監(jiān)牢的瞬間抵怎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工岭参, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留反惕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓冗荸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親利耍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚌本,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353