public static int test_layout; //只有定义,没再随机赋值了,依旧保持非 final
private id() {
}
}
…
public static final class string {
public static int lib_test_string;
private string() {
}
}
}
app 主 module 的产物分析
接着我们再来看看 app 主模块下的情况,编译后主 module 的产物结构图解:
上图中先看看build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/cn/yan/libr/R.class
下的 libR 的 final R class,如下:
//已知结论
//相对 lib module 下的中间产物来说,这里 lib 的 R 已经变为 final 了,且给了明确的赋值
package cn.yan.libr;
public final class R {
private R() {
}
public static final class id {
public static final int test_layout = 2130837504; //已赋值具体值
private id() {
}
}
…
public static final class string {
public static final int lib_test_string = 2131099649;
private string() {
}
}
}
然后再来看看build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/cn/yan/testr/R.class
下 app 的 final R class,如下:
//已知结论
//这里主 module 的 R 也是 final 且有明确值,此外已经合并了子 module 下的 R 属性到这个类
package cn.yan.testr;
public final class R {
private R() {
}
//来自子模块cn.yan.libr.R$id.class下的属性
public static final class id {
public static final int test_layout = 2130837504;
private id() {
}
}
…
//主module和子module的各自属性合并
public static final class string {
public static final int app_name = 2131099648;
public static final int lib_test_string = 2131099649;
private string() {
}
}
}
gradle 构建脚本版本如下:
//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
…
dependencies {
classpath “com.android.tools.build:gradle:3.5.0”
}
}
libR 子 module 的产物分析
如下是编译后子 module 的产物结构图解:
可以看到,上面 libR 模块中的R.jar
里面的R.class
内容如下:
package cn.yan.libr;
public final class R {
private R() {
}
public static final class id {
public static int test_layout;
private id() {
}
}
…
public static final class string {
public static int lib_test_string;
private string() {
}
}
}
app 主 module 的产物分析
接着我们再来看看 app 主模块下的情况,编译后主 module 的产物结构图解:
我们可以看到,他与上面 AGP4.1.0 版本最大的区别就是 app module 的构建产物不一样,AGP3.5.0 版本会先生成build/generated/not_namespaced_r_class_sources/debug/r/cn/yan/libr/R.java
和build/generated/not_namespaced_r_class_sources/debug/r/cn/yan/testr/R.java
两个源码 java 文件,其中都是 final static 且具有明确值的;接着对他们通过 javac 编译生成了build/intermediates/javac/debug/classes/cn/yan/libr/R.class
和build/intermediates/javac/debug/classes/cn/yan/testr/R.class
两个 class 文件,记住,这里 class 是 javac 生成的。
上图中先看看build/intermediates/javac/debug/classes/cn/yan/libr/R.class
下的 libR 的 final R class,如下:
package cn.yan.libr;
public final class R {
private R() {
}
public static final class string {
public static final int lib_test_string = 2131099649;
private string() {
}
}
…
public static final class id {
public static final int test_layout = 2130837504;
private id() {
}
}
}
然后再来看看build/intermediates/javac/debug/classes/cn/yan/testr/R.class
下 app 的 final R class,如下:
package cn.yan.testr;
public final class R {
public R() {
}
//主module和子module合并属性
public static final class string {
public static final int app_name = 2131099648;
public static final int lib_test_string = 2131099649;
public string() {
}
}
…
public static final class id {
public static final int test_layout = 2130837504;
public id() {
}
}
}
gradle 构建脚本版本如下:
//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
…
dependencies {
classpath “com.android.tools.build:gradle:3.1.2”
}
}
libR 子 module 的产物分析
如下是编译后子 module 的产物结构图解: