安卓打包aar引用远程依赖

这篇博客介绍了如何使用fat-aar插件来打包包含远程依赖的Android AAR文件。步骤包括在根目录gradle文件中添加插件和依赖,然后在library中应用插件并用embed关键字替换implementation引入依赖。需要注意的是,当第三方库有额外依赖时,可能需要手动添加这些依赖。例如,对于okhttp3,不仅需要embed主库,还需要添加其依赖okio。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用fat-aar-android打包aar

第一步再根目录的gradle文件中添加

    repositories {
        jcenter()
    }
    
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        //添加插件
        classpath 'com.github.kezong:fat-aar:1.3.6'
    }
第二步再library中添加

apply plugin: 'com.kezong.fat-aar'

第三步使用 embed 关键字替换引入依赖的 implementation,api 例如

    //正常情况,引入远程依赖
// implementation 'org.greenrobot:eventbus:3.2.0'

// implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
 
    //需要插入aar包的远程依赖
   


embed ('org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'){ transitive = true}
embed ('org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'){ transitive = true}


第四步生成aar

备注:有时候第三方包里引用了其他的包,也需要单独再引用,

比如:

单独引用这个就可以了,implementation 'com.squareup.okhttp3:okhttp:3.11.0',但是换成embed就不行了

需要这些

embed ('com.squareup.okhttp3:okhttp:3.11.0'){ transitive = true}
embed ('com.squareup.okio:okio:1.14.0'){ transitive = true}
<think>我们正在解决AAR打包依赖无法带上(即依赖缺失)的问题。根据提供的引用和常见实践,以下是解决方案:###1.使用FatAAR(胖AAR)FatAAR是一种将依赖库(包括传递依赖打包进单个AAR文件的方法。可以使用第三方插件如`fat-aar`来实现。**步骤**:1.在项目的根`build.gradle`中添加FatAAR插件依赖:```groovybuildscript{repositories{jcenter()}dependencies{classpath'com.github.kezong:fat-aar:1.3.8'}}```2.在需要打包成FatAAR的模块中应用插件并配置依赖:```groovyapplyplugin:'com.kezong.fat-aar'dependencies{implementationfileTree(dir:'libs',include:['*.jar'])//嵌入依赖(将远程依赖或本地模块打包AAR)embed('com.example:library:1.0.0')//嵌入本地模块embedproject(':local-module')}```**注意**:FatAAR可能会导致依赖冲突,需要排除重复依赖。###2.使用远程依赖和动态设置SO库(针对包含SO库的第三方SDK)如果AAR中包含SO库,会导致AAR体积过大。解决方案是:-将第三方SDK改为远程依赖(如Maven仓库)。-在打包AAR时,通过Gradle动态指定支持的SO库架构。**步骤**:1.在模块的`build.gradle`中,将第三方SDK的依赖从`implementation`改为`api`(确保依赖传递):```groovydependencies{api'com.example:third-party-sdk:1.0.0'}```2.在发布AAR时,通过`ndk`配置指定需要支持的ABI(减少体积):```groovyandroid{defaultConfig{ndk{abiFilters'armeabi-v7a','arm64-v8a'}}}```###3.解决依赖冲突当多个模块依赖同一库的不同版本时,需要统一版本或排除冲突。**步骤**:1.在构建脚本中强制指定版本:```groovyconfigurations.all{resolutionStrategy{force'com.example:library:1.0.0'}}```2.排除特定模块的传递依赖:```groovyembed('com.example:library:1.0.0'){excludegroup:'com.unwanted',module:'module'}```###4.包含源码和注释默认AAR不包含源码和注释。可以通过以下方式添加:1.生成源码JAR和JavadocJAR,并上传到Maven仓库。2.使用`maven-publish`插件发布AAR时附加源码和文档。**示例**:```groovytasksourcesJar(type:Jar){fromandroid.sourceSets.main.java.srcDirsclassifier='sources'}artifacts{archivessourcesJar}```###5.使用Maven发布解决传递依赖(推荐)将AAR发布到Maven仓库,并在`pom.xml`中声明依赖,这样使用者通过Maven依赖时会自动解析传递依赖。**步骤**:1.使用`maven-publish`插件:```groovyapplyplugin:'maven-publish'publishing{publications{aar(MavenPublication){groupId='com.example'artifactId='mylibrary'version='1.0.0'artifact("$buildDir/outputs/aar/mylibrary-release.aar")//生成pom文件并声明依赖pom.withXml{defdependenciesNode=asNode().appendNode('dependencies')configurations.api.allDependencies.each{dep->defdependencyNode=dependenciesNode.appendNode('dependency')dependencyNode.appendNode('groupId',dep.group)dependencyNode.appendNode('artifactId',dep.name)dependencyNode.appendNode('version',dep.version)}}}}}```###总结-**推荐方案**:使用Maven发布(第5点),让依赖管理交给构建工具。-**次选方案**:使用FatAAR(第1点),但需注意体积和冲突问题。-**针对SO库**:使用远程依赖+ABI过滤(第2点)减少体积。-**依赖冲突**:统一版本或排除(第3点)。-**源码注释**:额外生成源码和文档JAR(第4点)。[^1]:详解Android打包上传使用AAR[^2]:AndroidFatAAR项目常见问题解决方案[^3]:AndroidStudio多Module使用aar依赖包丢包解决[^4]:Flutter项目移动端SQLite升级指南:解决json_extract函数缺失问题§§相关问题§§1.如何解决AAR包中的资源冲突问题?2.如何发布AAR到私有Maven仓库?3.如何为AAR包添加ProGuard混淆规则?</think>### AAR打包依赖缺失解决方案 根据您的问题和引用资料,以下是解决AAR打包依赖缺失的完整方案: #### 1. **依赖传递问题(核心问题)** - **问题本质**:AAR默认不包含其依赖的第三方库[^1][^2] - **解决方案**: ```groovy // 模块级 build.gradle dependencies { // 使用api声明依赖(替代implementation) api 'com.third.party:library:1.0.0' // 本地AAR依赖需添加transitive=true implementation(name: 'local-lib', ext: 'aar') { transitive = true } } ``` - `api` 会将依赖传递给使用方 - `transitive=true` 解析传递依赖[^3] #### 2. **Fat AAR方案(合并依赖)** 当需要将第三方库直接打包AAR时: ```groovy // 根 build.gradle buildscript { dependencies { classpath 'com.github.kezong:fat-aar:1.3.8' // Fat AAR插件 } } // 模块 build.gradle apply plugin: 'com.kezong.fat-aar' dependencies { embed 'com.third.party:sdk:4.2.0' // 嵌入第三方库 embed project(':local-module') // 嵌入本地模块 } ``` - **优点**:生成自包含的AAR文件 - **注意**:可能导致依赖冲突,需用`exclude`解决[^2] ```groovy embed('com.lib:core:1.0') { exclude group: 'com.android.support', module: 'appcompat-v7' } ``` #### 3. **SO库处理方案** 针对含原生SO库的依赖: ```groovy android { packagingOptions { // 明确指定支持的ABI abiFilters 'armeabi-v7a', 'arm64-v8a' // 排除冲突SO文件 exclude 'lib/x86/libthird.so' } } ``` - 减少AAR体积约60%(仅打包必要ABI)[^1] - 使用方需在`build.gradle`中匹配相同ABI配置 #### 4. **远程依赖管理(推荐方案)** ```groovy // 发布方配置(模块build.gradle) publishing { publications { aar(MavenPublication) { // 自动生成包含依赖的pom文件 pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') configurations.api.allDependencies.each { dep -> def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) dependencyNode.appendNode('version', dep.version) } } } } } ``` - **使用流程**: 1. 发布到Maven仓库(公有/私有) 2. 使用方通过标准依赖引入: ```groovy implementation 'com.your.group:artifact:version' ``` #### 5. **常见错误修复 - **问题**:ClassNotFoundException - **解决**:检查是否使用`api`而非`implementation` - **问题**:资源冲突 - **解决**:在`build.gradle`中添加: ```groovy android { resourcePrefix "yourlib_" // 资源前缀隔离 } ``` ### 方案选择建议 | 场景 | 推荐方案 | 优点 | |------|----------|------| | 企业级开发 | 远程依赖管理(第4方案) | 依赖自动解析,版本可控 | | 封闭SDK交付 | Fat AAR(第2方案) | 单文件分发,无依赖配置 | | 临时调试 | 传递依赖(第1方案) | 快速实现,无需插件 | > **关键点**:AAR本身不包含传递依赖,必须通过依赖声明(`pom.xml`或`transitive`)或合并打包(Fat AAR)解决[^1][^3]。实际项目中,**远程依赖管理**是最规范且可维护的解决方案。 [^1]: 详解Android打包上传使用AAR [^2]: Android Fat AAR 项目常见问题解决方案 [^3]: Android Studio多Module使用 aar 依赖包 丢包解决 [^4]: Flutter项目移动端SQLite升级指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源源源源圆圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值