flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 2130837504
}
InnerClasses:
public static final #7= #2 of #6; //id=class cn/yan/libr/R$id of class cn/yan/libr/R
反编译主模块产物中 ASM 生成的R.jar
中主模块自己合并的属性成员 final 且有明确初值的R$id.class
也是 17,与上面一样,所以不再给出。
可以看到,由于我们 demo 中主 module 无额外的 id 资源,所以子 module 里通过 ASM 生成的 R$id.class
的 class 常量池占用个数为 17,主 module 里也是 17。
AGP3.5.0 的 R 字节码
反编译子模块产物中 ASM 生成的R.jar
中非 final 且属性成员无明确初值的R$id.class
为例(其他 R class 雷同):
yandeMacBook-Pro:libr yan$ javap -v R$id.class
Classfile /Users/yan/work/tmp/TestR/libR/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/cn/yan/libr/R$id.class
Last modified 2020-11-8; size 241 bytes
MD5 checksum 4b6b893cff236cdc445f392e0ce41a2b
public final class cn.yan.libr.R$id
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
//重点!!!class的常量池,这里总共占用#17个
Constant pool:
#1 = Utf8 cn/yan/libr/R$id
#2 = Class #1 // cn/yan/libr/R$id
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 cn/yan/libr/R
#6 = Class #5 // cn/yan/libr/R
#7 = Utf8 id
#8 = Utf8 test_layout
#9 = Utf8 I
#10 = Integer 2131427329
#11 = Utf8
#12 = Utf8 ()V
#13 = NameAndType #11:#12 // “”😦)V
#14 = Methodref #4.#13 // java/lang/Object.""😦)V
#15 = Utf8 ConstantValue
#16 = Utf8 Code
#17 = Utf8 InnerClasses
{
public static int test_layout;
descriptor: I
flags: ACC_PUBLIC, ACC_STATIC
ConstantValue: int 2131427329
}
InnerClasses:
public static final #7= #2 of #6; //id=class cn/yan/libr/R$id of class cn/yan/libr/R
反编译主模块产物中 javac 生成的依赖子模块自己的属性成员 final 且有明确初值的R$id.class
为例(其他 R class 雷同):
//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】
yandeMacBook-Pro:libr yan$ javap -v R$id.class
Classfile /Users/yan/work/tmp/TestR/app/build/intermediates/javac/debug/classes/cn/yan/libr/R$id.class
Last modified 2020-11-8; size 368 bytes
MD5 checksum 18fbba9c0a1f51068cbd984810e53eac
Compiled from “R.java”
public final class cn.yan.libr.R$id
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
//重点!!!class的常量池,这里总共占用#23个
Constant pool:
#1 = Methodref #3.#19 // java/lang/Object.""😦)V
#2 = Class #21 // cn/yan/libr/R$id
#3 = Class #22 // java/lang/Object
#4 = Utf8 test_layout
#5 = Utf8 I
#6 = Utf8 ConstantValue
#7 = Integer 2130837504
#8 = Utf8
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 LocalVariableTable
#13 = Utf8 this
#14 = Utf8 id
#15 = Utf8 InnerClasses
#16 = Utf8 Lcn/yan/libr/R$id;
#17 = Utf8 SourceFile
#18 = Utf8 R.java
#19 = NameAndType #8:#9 // “”😦)V
#20 = Class #23 // cn/yan/libr/R
#21 = Utf8 cn/yan/libr/R$id
#22 = Utf8 java/lang/Object
#23 = Utf8 cn/yan/libr/R
{
public static final int test_layout;
descriptor: I
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 2130837504
}
SourceFile: “R.java”
InnerClasses:
public static final #14= #2 of #20; //id=class cn/yan/libr/R$id of class cn/yan/libr/R
反编译主模块产物中 javac 生成的主模块自己合并的属性成员 final 且有明确初值的R$id.class
也是 23,与上面一样,所以不再给出。
可以看到,由于我们 demo 中主 module 无额外的 id 资源,所以子 module 里通过 ASM 生成的 R$id.class
的 class 常量池占用个数为 17,而主 module 里是先生成R.java
然后通过 javac 编译生成的R.class
,所以常量池占用个数变为了 23。我们类成员属性只有一个,ASM 和 javac 的 class 就差了 6 个,至于为什么后面分析,先继续。
AGP3.1.2 的 R 字节码
反编译子模块产物中 javac 生成的非 final 且属性成员无明确初值的R$id.class
为例(其他 R class 雷同):
yandeMacBook-Pro:libr yan$ javap -v R$id.class
Classfile /Users/yan/work/tmp/TestR/libR/build/intermediates/classes/debug/cn/yan/libr/R$id.class
Last modified 2020-11-8; size 409 bytes
MD5 checksum 7ff99374e393fa8059ab57413e787968
Compiled from “R.java”
public final class cn.yan.libr.R$id
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
//重点!!!class的常量池,这里总共占用#25个
Constant pool:
#1 = Methodref #5.#20 // java/lang/Object.""😦)V
#2 = Integer 2131492865
#3 = Fieldref #4.#21 // cn/yan/libr/R$id.test_layout:I
#4 = Class #23 // cn/yan/libr/R$id
#5 = Class #24 // java/lang/Object
#6 = Utf8 test_layout
#7 = Utf8 I
#8 = Utf8
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 LocalVariableTable
#13 = Utf8 this
#14 = Utf8 id
#15 = Utf8 InnerClasses
#16 = Utf8 Lcn/yan/libr/R$id;
#17 = Utf8
#18 = Utf8 SourceFile
#19 = Utf8 R.java
#20 = NameAndType #8:#9 // “”😦)V
#21 = NameAnd