当前位置: 首页 > article >正文

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


http://www.kler.cn/news/367643.html

相关文章:

  • 安全知识见闻-网络安全热门证书
  • 智能工厂的软件设计 专有名词(juncture/relation/selection):意识形态及认知计算机科学的架构、系统和运用
  • KAN原作论文github阅读(readme)
  • 【WiFi7】 支持wifi7的手机
  • ELK之路第一步——Elasticsearch集群的搭建以及踩坑记录
  • gin入门教程(5):请求参数处理
  • 自由学习记录(15)
  • 前端SSE-EventSource message事件执行异常问题
  • TypeScript(中)+算法(二)
  • 道可云人工智能元宇宙每日资讯|《嘉兴市推动人工智能高质量发展实施方案》发布
  • C/C++ 每日一练:二分查找
  • 【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
  • apply call bind 简介
  • 设计模式06-结构型模式1(适配器/桥接/组合模式/Java)
  • 理解LSTM
  • 【视频混剪Demo】FFmpeg的使用【Windows】
  • codeforces _ 补题
  • 数据可视化视频制作
  • 国内动态短效sk5,http
  • MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询
  • Elasticsearch 在linux部署 及 Docker 集群部署详解案例示范
  • vscode如何debug环境配置?torchrun与deepspeed库又该如何配置?
  • Python爬虫:商品详情的“八卦记者”
  • LeetCode 3185.构成整天的下标对数目 II:哈希表
  • [Ansible实践笔记]自动化运维工具Ansible(二):Ansible的playbook及角色
  • AudioSetCaps数据集:包含190万对来自AudioSet录音的音频-字幕对。