Android studio將Module打包成Jar的方法
整理記錄 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是可以用的,但不是我們可以控制的,所以我們需要通過(guò)其他方式來(lái)解決這個(gè)問(wèn)題。
注意:
若發(fā)現(xiàn) Android Studio 項(xiàng)目 bundle 文件夾下沒(méi)有 release目錄,可能是沒(méi)有將 module 添加到主 module 依賴中。
方式1:主module右鍵 --> 倒數(shù)第二個(gè)Open Module Setting--> 上面最后一個(gè)選項(xiàng)Dependencies-->右邊綠色加號(hào)-->Module dependency......然后確定
方式2:主Module的gradle的dependencies(平時(shí)添加第三方庫(kù)的地方)中加上 compile project(':lib-zxing')
二、自定義生成 jar 包
首先,需要將待打包 module 項(xiàng)目中的 build.gradld 文件進(jìn)行修改,如下圖:

其次,在 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開(kāi)頭的文件
exclude{it.name.startsWith('R');}
}
makeJar.dependsOn(clearJar, build)
注意:
以上配置信息要與 android {…….} 配置的腳本成平級(jí)關(guān)系。
其中 _BASENAME = "TestJar"; _VERSION = "_V1.0"; 是定義生成 jar 包的名字為T(mén)estJar_V1.0.jar。
配置好以后就可以編譯jar包了,有兩種方式:
方式 A :點(diǎn)擊 Android Studio 右側(cè)(一般在這個(gè)位置)的 Gradle 面板,在項(xiàng)目或者該類(lèi)庫(kù)的目錄中找到 Tasks -> other -> makeJar 命令,雙擊這個(gè)makeJar之后等一會(huì)就會(huì)編譯好jar包。

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

方式 B :通過(guò) cmd 命令行,在項(xiàng)目根目錄下,執(zhí)行 gradlew makeJar 命令,看到編譯完成的信息以后就OK了,也能生成一樣的jar包,和直接使用①中的方式是等價(jià)的?! ?/p>
注意:使用此方式前要配置好 gradle 的“ 環(huán)境變量 ”,否則直接在項(xiàng)目根目錄下找不到這個(gè)命令。使用 cmd 比較費(fèi)勁,不推薦?! ?/p>
方式 C :在 Android Studio 終端窗口中輸入 gradlew makeJar 命令?! ?/p>

打包成功如下圖:

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

注意:
問(wèn)題1:
對(duì)于以上配置 form 默認(rèn) jar 包部分,在用目錄是 from('build/intermediates/bundles/release/') ,注意粗體部分,最初我也是按照這個(gè)目錄寫(xiě)的,確實(shí)沒(méi)問(wèn)題。但后來(lái),也就是Android Studio 更新到2.3以后,發(fā)現(xiàn)這個(gè)目錄沒(méi)有了,取而代之的是 default 和 debug 目錄,debug目錄之前也是有的,沒(méi)有變化,只是原來(lái)的release目錄被現(xiàn)在的default目錄代替了。這導(dǎo)致我后來(lái)生成jar包的時(shí)候始終沒(méi)有找到j(luò)ar包,報(bào)上圖所示錯(cuò)誤。
原因就是沒(méi)有了 release 目錄,找不到默認(rèn)的 classes.jar 文件,所以也就沒(méi)有生成自定義名字的jar包,改為 default 或者 debug 目錄以后就能正常生成jar包了,要注意這點(diǎn)變化。
問(wè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 包,但是這樣的方式有局限性,無(wú)法將被嵌入的應(yīng)用所使用的資源性文件一起打包。下面介紹 aar 打包方式。
三、直接使用 aar 包
將被嵌入的應(yīng)用打包成 aar 包,這也是 Android Studio 的一種新特性,可以將應(yīng)用所使用的資源性文件一起打包。編譯即可打包生成 aar 包,而且也不用擔(dān)心漏掉資源問(wèn)題。
如果Project 中 Module 是一個(gè)應(yīng)用,則在 Module 的 build.gradle 文件中定義屬性為:apply plugin: 'com.android.application';而如果 Mudule 是一個(gè)被引用的依賴 lib 庫(kù)的話,則在 Module 的 build.gradle 文件中定義屬性為:apply plugin: 'com.android.library;所以當(dāng)我們將應(yīng)用 Module 打包出 aar 文件的時(shí)候,需要修改類(lèi)型屬性。正常情況下,直接重新編譯 Module,生成的 aar 包在 Module 根目錄的/build/outputs/aar/,如下圖:

下面介紹將 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ī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)現(xiàn)Android 獲取cache緩存的目錄路徑的方法
這篇文章主要介紹了實(shí)現(xiàn)Android 獲取cache緩存的目錄路徑的方法的相關(guān)資料,這里實(shí)現(xiàn)一個(gè)靜態(tài)類(lèi)來(lái)實(shí)現(xiàn)該功能,希望能幫助到大家,需要的朋友可以參考下2017-08-08
Sql Server2008遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法
這篇文章主要為大家詳細(xì)介紹了Sql Server2008遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Kotlin中實(shí)體類(lèi)的創(chuàng)建方式
這篇文章主要介紹了Kotlin中實(shí)體類(lèi)的創(chuàng)建方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
android使用PullToRefresh框架實(shí)現(xiàn)ListView下拉刷新上拉加載更多
這篇文章主要介紹了android使用PullToRefresh框架實(shí)現(xiàn)ListView下拉刷新上拉加載更多,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Flow轉(zhuǎn)LiveData數(shù)據(jù)丟失原理詳解
這篇文章主要為大家介紹了Flow轉(zhuǎn)LiveData數(shù)據(jù)丟失原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
一看就懂的Android APP開(kāi)發(fā)入門(mén)教程
這篇文章主要介紹了Android APP開(kāi)發(fā)入門(mén)教程,從SDK下載、開(kāi)發(fā)環(huán)境搭建、代碼編寫(xiě)、APP打包等步驟一一講解,非常簡(jiǎn)明的一個(gè)Android APP開(kāi)發(fā)入門(mén)教程,需要的朋友可以參考下2014-05-05
詳解Android XML中引用自定義內(nèi)部類(lèi)view的四個(gè)why
本篇文章主要介紹了詳解Android XML中引用自定義內(nèi)部類(lèi)view,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。2016-12-12
Android :okhttp+Springmvc文件解析器實(shí)現(xiàn)android向服務(wù)器上傳照片
這篇文章主要介紹了Android :okhttp+Springmvc文件解析器實(shí)現(xiàn)android向服務(wù)器上傳照片,需要的朋友可以參考下2020-05-05

