Android Gradle如何将文件打包进aar的META-INF目录?
问题根因
原有配置不生效是两个核心问题导致的:
packagingOptions的作用是处理打包过程中重复依赖文件的合并、排除、优先选择规则,不会主动将本地自定义文件加入AAR,你写的规则没有对应待打包的输入文件,自然不会产生效果。- Android Library模块打包AAR时,默认不会将
src/main/resources路径下的META-INF内容打包到AAR根目录的META-INF结构中,该目录下的内容属于Java编译期类路径资源,不会进入AAR的公开文件结构。
可行配置方案
方案1:自定义打包任务注入文件(全AGP版本兼容,最稳定)
直接在模块build.gradle的android配置块外添加如下逻辑,会在AAR打包执行前自动将指定目录下的文件写入AAR的META-INF路径:
android.libraryVariants.all { variant -> def packageAarTask = tasks.named("package${variant.name.capitalize()}Aar") packageAarTask.configure { // 这里可以自定义你的待打包文件存放路径,示例为模块根目录下的release-files文件夹 from("${projectDir}/release-files") { into "META-INF" } } }
使用步骤:
- 在当前Library模块根目录新建
release-files文件夹(可自定义路径,和上述代码中from后的路径保持一致即可) - 将需要打包的第三方许可证、pom文件、测试用test.txt等目标文件放入该文件夹
- 删除之前在
packagingOptions中添加的test.txt相关无效配置,执行assembleRelease任务重新打包即可。
方案2:放置到对应源集目录(零代码配置,适合简单场景)
如果不想编写自定义Gradle任务,可以直接将待打包的META-INF文件放到如下路径:
模块根目录/src/main/META-INF/
注意不要放在resources目录下,直接在main源集根目录新建META-INF文件夹放入目标文件即可,AGP打包AAR时会自动将该目录下的内容打入AAR根目录的META-INF路径。
如果打包时提示文件重复冲突,再按需在
packagingOptions中添加对应文件的pickFirst或merge规则即可,无冲突不需要额外配置。
验证方法
打包完成后,到模块路径build/outputs/aar/下找到生成的aar文件,将后缀改为.zip后解压,查看根目录下META-INF文件夹内是否存在你放入的目标文件即可确认结果。
内容的提问来源于stack exchange,提问作者xs w
相关产品推荐
相关产品推荐

