Android Gradle插件3.0+下Dexguard映射文件未上传至Crashlytics问题
我之前也碰到过一模一样的情况,AGP从2.x升级到3.x后,Fabric的自动上传任务直接“消失”了——本质是旧版Fabric Gradle插件(1.25.2)没适配AGP 3.0+全新的变体任务触发逻辑,导致crashlyticsUploadDeobs{flavor + buildvariant}任务没被正确绑定到构建流程里。
下面是亲测有效的解决步骤:
1. 先确认DexGuard的映射文件生成配置
首先得保证DexGuard确实输出了正确的mapping文件,在模块级build.gradle的DexGuard配置块里,添加或确认以下配置:
dexguard { // 保留你原有的其他配置 printmapping "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt" }
这会让DexGuard在对应变体的输出目录下生成标准格式的mapping文件,供Crashlytics解析使用。
2. 手动绑定上传任务到构建流程
由于AGP 3.0+改用了新的任务提供者(Provider)API,旧版Fabric插件无法自动关联任务,我们需要手动创建并绑定上传任务:
android { applicationVariants.all { variant -> def variantCapitalized = variant.name.capitalize() // 指定DexGuard生成的mapping文件路径 def mappingFile = file("${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt") // 创建Crashlytics上传任务 def uploadDeobsTask = tasks.create( name: "crashlyticsUploadDeobs${variantCapitalized}", type: com.crashlytics.tools.gradle.tasks.CrashlyticsUploadDeobsTask ) { this.mappingFile = mappingFile this.variantName = variant.name this.applicationId = variant.applicationId } // 让上传任务在变体的assemble任务完成后自动执行 variant.assembleProvider.get().finalizedBy(uploadDeobsTask) } }
这段代码会为每个构建变体创建对应的上传任务,并把它设置为assemble任务的收尾任务,这样每次构建完成后都会自动上传mapping文件。
3. 验证配置是否生效
重新执行构建命令(比如./gradlew assembleRelease),你应该能在控制台日志里看到crashlyticsUploadDeobs{...}任务被执行了。之后再查看Crashlytics的控制台,新产生的崩溃日志应该就能正常反混淆了。
如果后续项目允许升级Fabric插件到更适配AGP 3.x的版本(比如1.30+),可能就不需要手动配置了,但如果因为项目限制必须用1.25.2,上面的方法应该能完美解决问题。
内容的提问来源于stack exchange,提问作者Jason Grife

