Android studio 將 Module 打包成 Jar 包

整理記錄?AndroidStudio 把一個 module 項目打包成 jar 包。

一、默認自動生成的 jar 包

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

  注意:

  若發現 Android Studio 項目 bundle 文件夾下沒有 release?目錄,可能是沒有將 module 添加到主 module 依賴中。

方式1:主module右鍵 --> 倒數第二個Open Module Setting--> 上面最后一個選項Dependencies-->右邊綠色加號-->Module dependency......然后確定

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

二、自定義生成 jar 包

首先,需要將待打包 module 項目中的 build.gradld 文件進行修改,如下圖:

其次,在 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/')//從這個目錄下取出默認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'//從哪里打包class文件?from('build/intermediates/bundles/default/')

? ? //打包到jar后的目錄結構?into('build/')

? ? //去掉不需要打包的目錄和文件?exclude('test/', 'BuildConfig.class', 'R.class')

? ? //去掉R開頭的文件??exclude{it.name.startsWith('R');}

}

makeJar.dependsOn(clearJar, build)

  注意:

  以上配置信息要與 android {…….} 配置的腳本成平級關系。

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

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

方式 A :點擊 Android Studio 右側(一般在這個位置)的 Gradle 面板,在項目或者該類庫的目錄中找到 Tasks -> other -> makeJar 命令,雙擊這個makeJar之后等一會就會編譯好jar包。

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


方式 B :通過 cmd 命令行,在項目根目錄下,執行 gradlew makeJar 命令,看到編譯完成的信息以后就OK了,也能生成一樣的jar包,和直接使用①中的方式是等價的。

  注意:使用此方式前要配置好 gradle 的“ 環境變量 ”,否則直接在項目根目錄下找不到這個命令。使用 cmd 比較費勁,不推薦。


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

  打包成功如下圖:

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


  注意:

  問題1:

對于以上配置 form 默認 jar 包部分,在用目錄是 from('build/intermediates/bundles/release/') ,注意粗體部分,最初我也是按照這個目錄寫的,確實沒問題。但后來,也就是Android Studio 更新到2.3以后,發現這個目錄沒有了,取而代之的是?default 和 debug?目錄,debug目錄之前也是有的,沒有變化,只是原來的release目錄被現在的default目錄代替了。這導致我后來生成jar包的時候始終沒有找到jar包,報上圖所示錯誤。

原因就是沒有了 release 目錄,找不到默認的 classes.jar 文件,所以也就沒有生成自定義名字的jar包,改為 default 或者 debug 目錄以后就能正常生成jar包了,要注意這點變化。

  問題2

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

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

android {

? ? lintOptions {

? ? ? ? abortOnError false? ? }

? ? ...

}

最后注意:

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

三、直接使用 aar 包

將被嵌入的應用打包成 aar 包,這也是 Android Studio 的一種新特性,可以將應用所使用的資源性文件一起打包。編譯即可打包生成 aar 包,而且也不用擔心漏掉資源問題。

  如果Project 中 Module 是一個應用,則在 Module 的 build.gradle 文件中定義屬性為:apply plugin: 'com.android.application';而如果 Mudule 是一個被引用的依賴 lib 庫的話,則在 Module 的 build.gradle 文件中定義屬性為:?apply plugin: 'com.android.library;所以當我們將應用 Module 打包出 aar 文件的時候,需要修改類型屬性。正常情況下,直接重新編譯 Module,生成的 aar 包在 Module 根目錄的/build/outputs/aar/,如下圖:

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

  首先,將 aar 包復制到 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?的以下工程。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容