java - 修改Android源的核心Java库以在应用程序中使用

标签 java android build android-source android-build

我想对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.javaString.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/

相关文章:

java - 需要双击 EditText 让点击监听响应

java - 如何使用viewpager2和fragmentstateadapter动态添加和删除 fragment ?

tomcat - 远程部署在tomcat 6.0.14服务器

c++ - 如何准备在 Windows 和 Unix 系统上进行编译的代码库

java - Hector 与 CQL 的集成

java - Libgdx file.internal 文件未找到错误

java - 尝试使用 HERE Maps Android Lite API 计算路线时出现 HTTP 错误

java - 多态性和参数?

android - 图片无法在android 2.3.3及以上android版本上下载

groovy - Gradle:获取传递依赖项并导出到最小的运行时 fat jar