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

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿8 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神9 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法10 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter11 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快12 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl13 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江13 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-13 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记