升级Android Gradle Plugin 3.0.0后AAR发布时Jar内资源丢失求助
Android AAR丢失本地Jar中assets资源(AGP 3.0.0+)
我之前碰到过一模一样的问题,AGP 3.0+对本地依赖的资源处理逻辑做了重大调整,这正是导致你Jar包内assets资源丢失的核心原因。
问题根源
在AGP 2.2.2及更早版本中,构建系统会自动扫描libs/目录下的本地Jar包,将其中assets/目录的内容合并到最终生成的AAR中。但从AGP 3.0.0开始,为了优化构建性能、减少潜在的资源冲突,默认行为改为不自动包含本地Jar中的资源文件,这就直接导致你Jar里的assets/目录被完全剥离。
解决方案
你可以通过配置Android源码集(sourceSets),手动指定要纳入构建的Jar包assets资源。在你的模块build.gradle中添加以下配置:
android { sourceSets { main { // 遍历libs下所有Jar包,将每个Jar内的assets目录添加为构建源目录 assets.srcDirs += fileTree(dir: 'libs', include: '*.jar').collect { zipTree(it) } } } }
这段代码会自动解压libs/下的所有Jar包,把每个Jar内的assets/目录作为构建时的assets源目录,这样Gradle在打包AAR时就会把Jar里的图片资源一并包含进去。
额外优化:迁移到新版Maven发布插件
你当前使用的maven和uploadArchives是旧版Gradle发布插件,AGP 3.0+更推荐使用maven-publish插件来适配新的构建体系,如果你想长期兼容新版本Gradle,可以参考以下配置替换原有发布逻辑:
apply plugin: 'maven-publish' apply plugin: 'signing' android { // 把上面的sourceSets配置放在这里 ... } // 配置发布构件 publishing { publications { release(MavenPublication) { from components.android artifact androidSourcesJar artifact androidJavadocsJar // 复用你原有的POM配置逻辑 pom { configurePOM(project, delegate) } } } repositories { maven { // 根据版本号自动切换正式/快照仓库 url = version.endsWith('SNAPSHOT') ? "http://private-ip" : "http://private-ip" credentials { username = 'abc' password = 'abc' } } } } // 签名配置(按需保留) signing { sign publishing.publications.release } // 保留你原有的androidJavadocs、androidJavadocsJar、androidSourcesJar任务 ... // 保留你原有的configurePOM方法 ...
验证方法
构建完成后,用解压工具打开生成的AAR文件,检查assets/目录是否包含Jar包中的图片资源,即可确认问题是否解决。
内容的提问来源于stack exchange,提问作者Gaocheng Fan




