如何在Android库AAR中引入第三方JAR且不嵌入其代码
解决第三方JAR不合并进AAR的classes.jar,保留在libs目录的方案
我来帮你搞定这个问题!要避免第三方JAR代码被打包进AAR的classes.jar,而是保留在AAR的libs/myjar.jar位置,你可以按以下步骤操作:
第一步:放置JAR文件
把你的第三方JAR文件放到Library模块根目录下的libs/文件夹里(如果没有libs目录就新建一个)。第二步:调整依赖配置
修改Library模块的build.gradle(或build.gradle.kts),把原来的依赖声明从implementation改成compileOnly,这样编译时能正常使用JAR的API,但不会把JAR的代码合并到classes.jar中:// Groovy版本 compileOnly files('libs/myjar.jar')// Kotlin DSL版本 compileOnly(files("libs/myjar.jar"))第三步:添加Gradle复制任务
我们需要添加一个自定义Gradle任务,把JAR文件复制到构建生成的AAR包的libs目录里。在build.gradle(或build.gradle.kts)中添加以下代码:Groovy版本:
task copyJarToAar(type: Copy) { // 源文件:libs下的目标JAR from 'libs/myjar.jar' // 目标目录:构建输出的AAR包内的libs文件夹 into "$buildDir/outputs/aar/${project.name}-release/libs" into "$buildDir/outputs/aar/${project.name}-debug/libs" } // 让复制任务在构建Release和Debug版本的AAR前执行 afterEvaluate { tasks.findByName('assembleRelease').dependsOn(copyJarToAar) tasks.findByName('assembleDebug').dependsOn(copyJarToAar) }Kotlin DSL版本:
val copyJarToAar by tasks.registering(Copy::class) { from("libs/myjar.jar") into("${buildDir}/outputs/aar/${project.name}-release/libs") into("${buildDir}/outputs/aar/${project.name}-debug/libs") } afterEvaluate { tasks.named("assembleRelease").configure { dependsOn(copyJarToAar) } tasks.named("assembleDebug").configure { dependsOn(copyJarToAar) } }第四步:告知依赖方处理JAR
当其他应用引用你的AAR时,他们需要手动将AAR包内libs目录下的myjar.jar添加到自己的项目依赖中;如果你的AAR发布到Maven仓库,也可以在Library的POM配置中声明该JAR的依赖,让依赖方自动引入。
这样操作后,你的AAR构建完成时,第三方JAR就会保存在AAR的libs/目录下,不会和其他应用的同版本JAR产生代码冲突导致崩溃啦。
内容的提问来源于stack exchange,提问作者i like cat
相关产品推荐
相关产品推荐

