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

相关推荐
拭心2 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王4 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡5 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道5 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库6 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道6 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe7 小时前
Android Hook - 动态加载so库
android
居居飒7 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He10 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗10 小时前
Android笔试面试题AI答之Android基础(1)
android