关于 .flat 和 R.java 的问题
来源:10-3 探究资源编译流程

xxxxjase普通
2021-08-10
当前的工程是 app 主 module + visited 子 module
1、关于 .flat 中间文件的问题:
我发现只有 app 主 module 的 build/intermediates/res/merged/ 目录下有 .flat 中间文件
visited 子 module 的 build 目录下的资源都是文件自身,这是为什么呢??
(是因为资源需要统一打包,所以要放到 app 主 module 中统一处理么??)
2、关于 R.java 文件
我发现 visited 子 module 的 R.java 文件是在 build/intermediates/compile_only_not_namespaced_r_class_jar 目录下。
但是 app 主 module 的 build 目录却没有 compile_only_not_namespaced_r_class_jar 的目录,那它的 R.jar 在哪里呢??
1回答
-
allenfeng
2021-08-21
1. 子module中的资源只进行合并打包以及R文件的生成,最终资源是在主工程(app)中统一进行compile与link,.flat文件是aapt2进行compile后的二进制产物
2. 以 gradle版本6.4.1 + Android Gradle Plugin版本3.5.0 为例:主工程的R文件在:app/build/generated/not_namespaced_r_class_sources/debug/r 下
------------------
可以在任意版本中,通过下面的方式找到R文件的生成路径:
(1)打印所有任务:
gradle.taskGraph.afterTask { task ->
println("[all-task] " + task.name)
}
(2)找到名为“:app:processDebugResources”的任务,进一步打印其类,得到类名:
com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask_Decorated
(3)查看LinkApplicationAndroidResourcesTask的源码,进一步分析寻找R文件的输出路径(如getSourceOutputDir()方法),即可得到:
app/build/generated/not_namespaced_r_class_sources/debug/r
以上方法的完整示例代码:
//写在 settings.gradle: gradle.taskGraph.afterTask { task -> if (task.name.endsWith("processDebugResources")) { println("[all-task] ${task.class}") println("[all-task] R file path = ${task.getSourceOutputDir()}") } }
122021-08-23
相似问题