一、背景
module 打包一般会打包成 aar 的形式。如果 module 引用了一个本地的 aar,在打包的时候,这个被引用的 aar 是不会打包进去的,这种设计思想是比较好的,可以很好的避免包冲突的问题。例如 App 引用了两个 aar(1.aar 和 2.aar),1.aar 和 2.aar 都依赖了第三方的 3.aar,如果1.aar 和 2.aar 都把 3.aar 打包进去的话,App 再引用 1.aar 和 2.aar 的时候就会因为都有 3.aar 发生引用冲突。
另外,aar中会引用第三方的库,但是,又不想让引用方引用自己的aar时,知道都是用了什么第三方的库,所以就需要把第三方的库打进到自己的 aar 中。
故,将moudle打包成aar包时,一般需要处理两个问题:
1、将moudle中的aar包打包到aar包中;
2、将第三方库打包到aar中
二、解决方案
方案一:不将自己的moudle打包成aar,将自己的moudle发送到maven 库,供第三方调用
方案二:使用fataar方案,博主这里介绍方案二,也是项目中采用的方式,开发的SDK,一般是提供aar包给客户使用比较多。
fataar方案在gradle高版本和低版本使用方式又不一样,这里将详细介绍两种可以的方式供参考。
2.1 gradle 低版本
(1)先看看整体Project的部署情况,A处是嵌套的aar
(2)进入到B处的build.gradle文件
文件中要加上D处这一行,应用fat-aar。由于是libs中的aar是嵌套的,所以在E处需要用embed。
(3)进入到C处的build.gradle,也就是整个Project的build.gradle文件
2.2 gradle 高版本
1、在project项目下的build.gradle配置,博主这里用的是gradle8.0
buildscript {
repositories {
maven {
setUrl("https://jitpack.io")
content {
includeGroup("com.github.aasitnikov")
}
}
}
dependencies {
classpath 'com.github.aasitnikov:fat-aar-android:1.4.0'
}
}
plugins {
id 'com.android.application' version '8.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
id 'org.jetbrains.kotlin.jvm' version '1.9.0' apply false
id 'com.android.library' version '8.2.2' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2、在要打包成aar的moudle中的build.gradle配置
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
// id 'com.cpdroid.fat-aar'
id 'com.kezong.fat-aar'
}
android {
namespace 'com.vc.videosdk'
compileSdk 33
defaultConfig {
minSdk 24
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
embed 'com.elvishew:xlog:1.11.1'
embed 'org.java-websocket:Java-WebSocket:1.5.2'
embed 'org.slf4j:slf4j-api:1.7.25' //这里是因为java-websocket中用到了slf4j日子库,而又没
有将该库打包进aar包
// implementation 'com.alibaba:fastjson:1.1.56.android'
embed 'com.alibaba:fastjson:1.2.32' //将第三方库打包进aar
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
这里注意,有时候将第三方库打包进aar时,第三方库中又用了其他库,没打进去的话,使用aar时会闪退,这里就要根据报错,找到缺少的日志库和版本,将缺少的库在moudle中使用embed打包进aar库。
例如:博主这里用到了java-wersocket库,该库中用了一个日志库,打包aar时,没打进去,这里就需要额外配置,embed 'org.slf4j:slf4j-api:1.7.25',相关版本需要在报错时耐心查找,这里引入的版本要对应上,不然不同版本可能会报错。