gpt4 book ai didi

android - 有没有办法在 Android 中关闭动态加载的库?

转载 作者:太空狗 更新时间:2023-10-29 13:30:25 25 4
gpt4 key购买 nike

作为非 Android 用户的序言(一些 Linux 用户可能知道此信息的答案):

Android 中的每个应用程序都在 Dalvik 虚拟机实例中运行。启动应用程序时,称为 ActivityManager 的实体写入管道以通知另一个实体 Zygote 需要启动应用程序。 Zygote 是一个空白的 Dalvik VM 实例,预加载了库,通过管道调用后,它会克隆自己,并且克隆会降低与要启动的应用程序关联的 Linux 用户的权限级别。这可以在启动应用程序时节省时间和内存 - 考虑重新加载所有库并每次都进行所有设置的替代方案。

我的问题是 Zygote 中加载了一个特定的库,我想在此特定进程中关闭它,因为我想使用我自己的库版本。我已将我的 native 代码链接到我的 .so 文件,该文件被复制到适当的文件夹中,并在应用程序启动时通过 Java 层“System.load('xyz')”加载,但是当我的代码运行时,它正在调用原始系统库的功能,而不是我的。当我运行“cat/proc/NNNN/maps”时,我可以看到旧库和我的一样在内存中。

有没有办法关闭我的应用程序中的特定库?如果没有,是否有办法确保对该库中函数的任何/每次调用都传递给我的版本而不是旧版本?

谢谢!

最佳答案

关闭共享库(使用 dlclose())在最好的情况下是棘手的,因为它会取消映射库的代码。如果稍后调用该代码(可能是 C++ 析构函数),程序将立即崩溃。由于该库是由您以外的代码加载的,因此在您取消映射该库时,另一个线程完全有可能正在执行该库中的代码,再次导致崩溃。

所以,不要那样做。 :-)

如果您可以将您的库版本构建为静态库并将其直接链接到您的代码中,您应该能够完全避免该问题。

FWIW,各种库(特别是 SSL 和 ICU)链接到 Dalvik,未由 zygote 显式加载,因此如果您尝试替换其中一个库,您将获得 /system/lib version 无论你是否从 zygote fork 出来。

关于android - 有没有办法在 Android 中关闭动态加载的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com