我想对Android源代码进行一些修改以满足我的要求。这是要求:
我想通过向int
类添加一个公共的java.lang.Object
字段来索引Android应用程序中的所有对象。因此,所有类都可以继承新添加的字段,因为它们都是Object
类的子类。
到目前为止,我所做的是修改java.lang.Object
文件夹下的<Android_source>/libcore/libart/src/main/java/java/lang
类并重新编译源代码。
我想问一下我是否做对了。我的Android应用程序可以识别此更改吗(例如String
对象可以访问新添加的字段)吗?
编辑
经过大约3周的尝试和错误,我终于得到了完整的答案。如果有人要修改Android源的核心Java库(例如,修改Object.java
和String.java
等),我想与其他人分享这种经验。再次,正如迈克尔提到的,请注意,这种修改可能仅适合于研究或测试目的。
进行成功修改的关键挑战(此处“成功”表示修改后的Android源可以在模拟器或真实设备上构建并运行,而不会出现任何问题)是核心java库中的某些类具有其C ++镜像(位于<Android_source>/art/runtime/mirrors/
)。修改这些Java类时,还应该对它们的C ++镜像进行相同的修改。否则,您可能会导致构建过程失败,因为需要通过大量检查。由于我只向Object.java
添加了新字段,因此我将在下面列出一些遇到的检查(或要求):
1.对象实例的大小=其C ++镜像的大小。例如,如果将long
字段添加到Object.java
,则还应该将uint64_t
字段添加到其C ++镜像中以使其大小相等。
2.尝试使对象实例的大小为2的幂(例如2、4、8、16,...)。例如,原始Object.java
的大小为8,因此我添加了一个长字段以将其大小增加到16。如果添加一个int字段,则大小变为12,并且可能导致许多检查失败。我不知道确切的原因,但我想它与memory alignment有关。
3.尝试将原始类型字段放在非原始类型字段之后,原始类型字段应按大小排序。这意味着您应该将引用类型字段放在最前面,然后是8字节原始类型字段,然后是4字节原始类型字段,然后是2字节原始类型字段,然后是1字节原始字段。类型的字段。同样,我想原因是memory alignment
这就是我为满足要求所做的一切。如果您对这些检查的目的有任何想法(尤其是第二和第三检查),我可以公开讨论。
最佳答案
首先,我想指出,我认为这不是一个好主意,而且可能超出研究目的而过分杀伤力。如果要修改AOSP,则编写的代码将取决于运行该AOSP定制版本的目标设备。但是,仍有可能。
我假设您已经知道如何编译自定义AOSP构建并将其闪存到设备。为了编写利用您的新功能的代码,您还需要编译自定义SDK。这样一来,Android Studio就会知道您的新方法存在于Object
中,并且可以针对该新方法正确进行编译。完整的文档可以在here中找到,但实际上归结为:
. build/envsetup.sh
lunch sdk-eng
make sdk
拥有SDK压缩文件后,您需要将其解压缩到SDK的
platforms
目录-现在,它应该在SDK管理器中显示为选中状态。如果为SDK提供了自定义平台ID,则应该可以在build.gradle
文件中使用该ID。免责声明:此建议完全是出于记忆,这是一个漫长的过程,因此我没有时间仔细检查,并且可能有一些我错过的小事情。这应该可以让您通向想要去的地方。
关于java - 修改Android源的核心Java库以在应用程序中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54862299/