自定义Android Gradle插件致应用体积大幅增加30MB问题排查
问题原因分析及排查方向
1. Gradle API/插件依赖被误打包进APK
project.tasks.whenTaskAdded的逻辑如果不小心修改了主应用的编译/打包类路径,很可能会把buildSrc依赖的gradle-api.jar、groovy-all.jar这类体积庞大的库(单文件就可能超过20MB)引入到最终APK中。比如如果你的插件逻辑里写了类似下面的错误代码:
project.tasks.whenTaskAdded { task -> if (task.name.contains("compile")) { // 错误:把buildSrc的依赖加到了主应用编译类路径 task.classpath += project.buildscript.configurations.classpath } }
这类操作会直接把Gradle构建脚本的依赖库塞进APK,导致体积暴增。
2. 任务监听逻辑引入了冗余依赖
当你通过whenTaskAdded监听打包相关任务(比如mergeAssets、mergeClasses)时,若逻辑中错误地将buildSrc模块的资源、类文件或者第三方依赖添加到了主应用的打包资源/类集合里,就会额外增加体积。比如误将buildSrc的输出jar包加入到主应用的依赖中:
project.tasks.whenTaskAdded { task -> if (task instanceof MergeClassesTask) { // 错误:把buildSrc的产物加到了主应用类集合 task.inputs.files(project.buildDir.file("buildSrc/libs/custom-plugin.jar")) } }
3. 破坏了R8/ProGuard的代码裁剪
whenTaskAdded的逻辑如果修改了任务的输入输出规则,可能导致Gradle的增量构建缓存失效,或者让R8无法正确识别哪些代码是无用的。比如插件强制保留了某些本来会被裁剪的类,或者修改了混淆规则的生成逻辑,导致大量冗余代码没有被移除,最终体现在APK体积上。
4. buildSrc的依赖泄漏
buildSrc模块的依赖默认是和主应用隔离的,但如果你的插件通过反射、动态类加载或者修改类加载器的方式,让主应用的类加载器加载了buildSrc的依赖类,打包工具会误以为这些类是主应用的依赖,从而将它们打包进APK。
内容的提问来源于stack exchange,提问作者ssssssshhhhhh
相关产品推荐
相关产品推荐

