在 Android 项目(使用 AGP 7.4.2)中,build
、minifyReleaseWithR8
和 compileReleaseJavaWithJavac
是三个不同的 Gradle 任务,它们的主要差异如下:
task makeJar(type: Jar) {
// 设置 JAR 文件名
archiveBaseName = 'my-library'
archiveVersion = '1.0'
// 从混淆后的类文件中获取内容
from fileTree(dir: "${buildDir}/intermediates/javac/release/classes",
excludes: ["**/R.class", "**/R\$*.class", "**/BuildConfig.class"])
// 设置目标目录
destinationDirectory.set(file("${buildDir}/outputs/jar/"))
// 依赖于混淆任务
// dependsOn("compileReleaseJavaWithJavac")
// dependsOn("minifyReleaseWithR8")
dependsOn("build")
}
1. compileReleaseJavaWithJavac
作用:
-
仅编译 Java/Kotlin 代码(不包含混淆、优化或打包)
-
生成
.class
文件,存放在build/intermediates/javac/release/classes/
目录下
特点:
-
是纯粹的编译任务
-
不涉及代码优化或资源处理
-
生成的代码未混淆,适合调试
典型输出:
复制
build/intermediates/javac/release/classes/ └── com/example/ ├── MyClass.class └── ...
2. minifyReleaseWithR8
作用:
-
执行代码混淆(ProGuard/R8)、优化和压缩
-
依赖
compileReleaseJavaWithJavac
,在其生成的.class
文件基础上处理 -
输出混淆后的代码到
build/intermediates/optimized_classes/release/
特点:
-
需要
minifyEnabled true
才会生效 -
会移除未使用的代码(Tree Shaking)
-
重命名类/方法/字段(混淆)
-
生成映射文件(
mapping.txt
)
典型输出:
复制
build/intermediates/optimized_classes/release/ └── com/example/ ├── a.class # 混淆后的类 └── ... build/outputs/mapping/release/mapping.txt
3. build
作用:
-
聚合任务,包含完整的构建流程:
-
编译(
compileReleaseJavaWithJavac
) -
混淆(
minifyReleaseWithR8
,如果启用) -
打包资源
-
生成 APK/AAR
-
特点:
-
执行所有必要的子任务
-
最终产物是完整的 APK 或 AAR
-
适合发布前的完整构建
典型输出:
复制
build/outputs/apk/release/app-release.apk 或 build/outputs/aar/library-release.aar
关键差异总结
任务 | 阶段 | 是否混淆 | 输出内容 | 典型用途 |
---|---|---|---|---|
compileReleaseJavaWithJavac | 编译 | ❌ 否 | 原始 .class 文件 | 快速检查编译结果 |
minifyReleaseWithR8 | 优化/混淆 | ✅ 是 | 优化后的 .class + mapping.txt | 生成混淆代码供分析 |
build | 完整构建流程 | 取决于配置 | APK/AAR + 所有中间文件 | 发布或测试完整产物 |
执行顺序示例
如果运行 ./gradlew build
(且启用了混淆):
-
compileReleaseJavaWithJavac
→ 生成未混淆的.class
-
minifyReleaseWithR8
→ 处理这些.class
文件 -
其他任务(如资源合并、打包等)
如何选择?
-
需要 快速编译 测试代码? → 用
compileReleaseJavaWithJavac
-
需要 分析混淆效果? → 用
minifyReleaseWithR8
-
需要 最终产物? → 用
build