一:說明
将一個獨立的應用嵌入其他應用當中;
相關方法有兩種:
第一種是将被嵌入的應用打包成 jar 包,但是這樣的局限性是無法将被嵌入的應用所使用的資源性檔案一起打包;
第二種是将被嵌入的應用打包成 aar 包,這也是 Android Studio 的一種新特性,可以将應用所使用的資源性檔案一起打包;
如果Project 中 Module 是一個應用,則在 Module 的 build.gradle 檔案中定義屬性為:apply plugin: 'com.android.application';而如果 Mudule 是一個被引用的依賴 lib 庫的話,則在 Module 的 build.gradle 檔案中定義屬性為: apply plugin: 'com.android.library;是以當我們将應用 Module 打包出 aar 檔案的時候,需要修改類型屬性。
二:打包aar 包
1.正常情況下,直接重新編譯 Module 後可以在,Module的build—output—aar 路徑下找到對應的 XXX-release.aar包。
2.調用aar包
2.1. android studio正常的module引用aar檔案需要配置如下
① 在工程的libs下面放入aar包
② 在工程的build下面加入以下2個内容,sync Now以下,就可以應用aar包的内容了
android{
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile(name:'xxx-release', ext:'aar')
}
注意點:repositories 下的 flatDir 必須在 android{} 節點下!
2.2.當一個library類型的module引用aar檔案後:
(lib的名稱:library_module)
①按照2.1的步驟設定
②任何依賴此library的module必須在它的build.gradle聲明此 aar 的 lib 所在的位置,這個位置根據檔案路徑所确定。
android{ //android節點下配置
repositories {
flatDir {
dirs 'libs', '../../../../library_module/libs'
}
}
}
③配置完②步驟後,還要在project的build.gradle檔案中配置,如下
allprojects {
repositories {
jcenter()
flatDir {
dirs '../../../library_module/libs'
}
}
}
注意:dirs 所訓示的是檔案路徑,是以針對不同的位置配置,“../../../library_module/libs” 所代表的路徑也是不一緻的。
3.出現異常的情況
按照正常aar引入的方式,竟然出現各種錯誤: ClassNotFindException等等問題,是我們想的簡單了,aar中引用的第三方庫在aar被應用是會找不到,以下有2種處理方式
- 最簡單的方法就是在應用aar的項目中app 的bulid 中重新添加依賴,但是這個違背了我們使用aar的目的
- 釋出到maven倉庫,大家都可以看到,一些開源的庫都放在上面的。
1.釋出到jcenter或maven;
2.釋出到自己搭建的maven或公司内部maven伺服器上;
3.釋出到本地maven庫;(不适合協作開發)
在生成aar,即編譯Module的過程中報錯,一般是第三方的包沒引對等等,相應排查下應該不會有什麼問題
三:打包jar
1.打成jar包的分類:
a.application應用打成jar包
b.内庫打成jar包
不管是那種打包jar包都得變成内庫,是以當一種方法講解了。
2.打jar包之前得讓你的項目成内庫:如何變成内庫呢?
看下内庫檔案的圖示如下圖:
如下兩點:
先将你項目gradle檔案最上面的
apply plugin: 'com.android.application'
改為:apply plugin: 'com.android.library'
然後注釋掉 applicationId這行代碼
如下圖:
如果你項目就是内庫那就可以跳過上面的步驟直接從下面步驟開始打包了
3.打包jar
然後将下面這行代碼放到gradle檔案的android裡面與defaultConfig,buildTypes目錄同一等級如下圖:
下面的makeJar隻是一個方法名稱可以随意取名,但是take makeJar這個裡面的方法必須得和下面的makeJar.dependsOn(build)這裡面的makeJar方法名稱一緻
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/myjar.jar'
//設定拷貝的檔案
from('build/intermediates/bundles/debug/')
//打進jar包後的檔案目錄
into('build/libs/')
//将classes.jar放入build/libs/目錄下
//include ,exclude參數來設定過濾
//(我們隻關心classes.jar這個檔案)
include('classes.jar')
//重命名
rename ('classes.jar', 'myjar.jar')
}
makeJar.dependsOn(build)
上面這行加入的代碼代表将build/intermediates/bundles/debug/目錄下生成的class.jar檔案複制到build/libs/目錄下面并且重命名為myjar.jar
如下圖:
然後找到cmd指令行輸入:gradlew makeJar 回車就好了,這個指令如下圖:
回車後看下我們打包命名成功的jar封包件:
4.上面方法AS新版無法使用的可以使用下面Android Studio 3.4.2版本的新方法:
//生成jar包
task makeJar(type: Copy) {
delete 'build/outputs/network.jar'
from('build/intermediates/packaged-classes/release/') //jar檔案來源
into('build/libs/') //生成路徑
include('classes.jar')
rename('classes.jar', 'smallAppJar.jar') //命名為network.jar
}
5.Android Studio4.0及以上請使用如下方法:
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/myjar.jar'
//設定拷貝的檔案
from('build/intermediates/aar_main_jar/release/')
//打進jar包後的檔案目錄
into('build/libs/')
//将classes.jar放入build/libs/目錄下
//include ,exclude參數來設定過濾
//(我們隻關心classes.jar這個檔案)
include('classes.jar')
//重命名
rename ('classes.jar', 'myjar.jar')
}
makeJar.dependsOn(build)
主要的差別是儲存路徑,4.0以上的儲存路徑要設定成以下的路徑,不然會報路徑找不到
build/intermediates/aar_main_jar/release/
将上面的代碼添加到gradle裡面的android目錄下即可,生成jar方法可以使用上面的cmd指令行輸入:gradlew makeJar 回車就好了
也可以直接選擇右邊的gradle的makeJar指令如下圖: