Android AAR嵌套AAR打包出现问题解决方案

一、背景

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',相关版本需要在报错时耐心查找,这里引入的版本要对应上,不然不同版本可能会报错。

相关推荐
-seventy-1 小时前
Android 玩机知识储备
android
CYRUS STUDIO1 小时前
frida脚本,自动化寻址JNI方法
android·运维·自动化·逆向·移动安全·jni·frida
暮志未晚Webgl2 小时前
102. UE5 GAS RPG 实现范围技能奥术伤害
android·java·ue5
Patience to do2 小时前
Android Studio项目(算法计算器)
android·算法·android studio
我又来搬代码了5 小时前
【Android】使用TextView实现按钮开关代替Switch开关
android
江-月*夜8 小时前
uniapp vuex 搭建
android·javascript·uni-app
大风起兮云飞扬丶9 小时前
Android——显式/隐式Intent
android
大风起兮云飞扬丶9 小时前
Android——metaData
android
看山还是山,看水还是。9 小时前
Nginx 的 Http 模块介绍(中)
android·运维·网络·nginx·http
SouthBay49312 小时前
PHP内存马:不死马
android·开发语言·php