关于 .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()}")
    }
}


1
2
allenfeng
回复
xxxxjase普通
会,可以解压apk验证
2021-08-23
共2条回复

Android 应用程序构建实战+原理精讲

深度掌握 Gradle 使用,系统性学习 Android 应用构建知识

450 学习 · 116 问题

查看课程