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

问题描述 投票:0回答:1

我想对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字段,我还应该在其C ++镜像中添加一个uint64_t字段以使它们的大小相等。

2.尝试使对象实例的大小为2的幂(例如,2,4,8,16 ......)。例如,原始Object.java的大小是8,因此我添加一个长字段以将大小增加到16.如果我添加一个int字段,大小变为12并且它可能会失败很多检查。我不明白确切的原因,但我想这与memory alignment有关。

3.尝试在非原始类型字段和原始类型字段之后放置原始类型字段,按大小排序。这意味着您应该在前面放置引用类型字段,然后是8字节基元类型字段,然后是4字节基元类型字段,然后是2字节基元类型字段,然后是1字节基元 - 字段。再说一次,我猜原因是memory alignment

这就是我为满足我的要求所做的一切。如果您对这些检查的目的有任何想法(特别是2人和第3人),我愿意接受任何讨论。

java android build android-source android-build
1个回答
4
投票

首先,我想说的是,我认为这不是一个好主意,并且可能在研究目的之外是过度的。如果要修改AOSP,那么您编写的代码将取决于运行该自定义AOSP版本的目标设备。但是,它仍然有可能。

我假设您已经知道如何编译和自定义AOSP构建到设备。为了编写使用新功能的代码,您还需要编译自定义SDK。这样Android Studio就会知道你的新方法存在于Object中,并且可以正确编译它。完整的文档可以找到here,但基本上归结为:

. build/envsetup.sh
lunch sdk-eng
make sdk

当您拥有SDK zip文件时,您需要将其解压缩到SDK的platforms目录 - 它现在应该显示在SDK管理器中。如果您已经为SDK提供了自定义平台ID,那么您应该可以在build.gradle文件中使用它。

免责声明:这个建议完全来自记忆,这是一个漫长的过程,所以我没有时间仔细检查,很可能会有一些我错过的小事。这应该可以让你尽可能地走向你想去的地方。

© www.soinside.com 2019 - 2024. All rights reserved.