Android Studio中Run app与Rebuild执行Gradle任务差异的疑问
为什么Run App时不需要重新执行
:library:assembleDebug? 这背后的核心是Gradle的增量构建机制——Gradle会智能判断哪些任务需要重新执行,哪些可以跳过,避免做重复劳动。咱们一步步拆解你的问题:
1. Rebuild vs Run App的本质区别
Rebuild Project是强制先执行clean(删除所有模块的build目录),再执行全量的assembleDebug(包括app和library)。这相当于把所有构建产物清空,从头来过,所以你会看到三个任务依次运行。- 而
Run App(在Clean之后),Gradle会先检查每个任务的输入和输出状态:- 输入:比如你的library源码、资源、配置文件有没有修改;
- 输出:对应的build目录下的产物(比如aar文件、编译后的class文件)是否存在且和输入匹配。
2. 为什么你看不到:library:assembleDebug被执行?
你提到Clean后Run App只看到:app:assembleDebug,大概率是因为:
- 你的library代码、资源、配置没有任何变化;
- Gradle判断
:library:assembleDebug的所有依赖任务(比如compileDebugJavaWithJavac、processDebugResources等)的输入输出都是一致的,标记这些任务为UP-TO-DATE(最新状态),直接跳过执行; - 而
:app:assembleDebug依赖于library的输出产物,既然library的产物已经是最新的,Gradle就只需要执行app模块自身的构建任务。
3. 验证这个逻辑的小技巧
你可以做个小测试:
- Clean Project之后,不要直接Run App,先修改library里的任意一行代码(比如加个注释);
- 再Run App,你会发现Gradle会先执行
:library:assembleDebug,再执行:app:assembleDebug——因为此时library的输入发生了变化,Gradle必须重新构建它。
补充:关于你看到的Clean任务内容
你提到Clean执行了:library:generateDebugSources等任务,这是因为Android Studio的Clean操作除了删除build目录,还会触发一些生成源码的任务(比如Data Binding、Room的源码生成),但这些任务的输出会在后续构建中被Gradle复用,只要输入没变化就不会重复生成。
内容的提问来源于stack exchange,提问作者John M.
相关产品推荐
相关产品推荐

