【发布时间】:2013-04-22 14:54:47
【问题描述】:
作为非 Android 人员的序言(一些 Linux 人员可能通过此信息知道答案):
Android 中的每个应用程序都在 Dalvik 虚拟机的一个实例中运行。启动应用程序时,名为 ActivityManager 的实体会写入管道以通知另一个实体 Zygote 需要启动应用程序。 Zygote 是一个空白的 Dalvik VM 实例,预加载了库,在通过管道调用时,它会克隆自己,并且克隆会降低与要启动的应用程序关联的 Linux 用户的权限级别。这可以在启动应用程序时节省时间和内存 - 考虑重新加载所有库并每次都进行所有设置的替代方案。
我的问题是在 Zygote 中加载了一个特定的库,我想在这个特定的过程中关闭它,因为我想使用我自己的库版本。我已经将我的本机代码与我的 .so 文件链接起来,该文件被复制到适当的文件夹中,并在应用程序启动时通过 Java 层“System.load('xyz')”加载,但是当我的代码运行时,它正在调用原始系统库的功能,而不是我的。当我运行“cat /proc/NNNN/maps”时,我可以看到旧库和我的一样在内存中。
有没有办法在我的应用程序中关闭该特定库?如果没有,有没有办法确保对该库中函数的任何/每个调用都传递给我的版本而不是旧版本?
谢谢!
【问题讨论】:
-
“关闭”就像卸载以前加载的共享库一样?似乎没有办法。请参阅:groups.google.com/forum/?fromgroups=#!topic/android-ndk/… 和 groups.google.com/forum/?fromgroups=#!topic/android-ndk/…
-
@MarsAtomic:这些帖子是关于卸载应用程序本身加载的库,这略有不同。如果您管理自己的
dlopen()/dlclose()呼叫而不是依赖System.load(),您实际上可以做到这一点。由于一切都在应用程序的控制之下,因此可以安全地进行。这确实适用于您希望在不重新启动应用程序(或者更可能是服务)的情况下更新共享库的情况,而这里的问题是关于覆盖系统的库副本。 -
大家好!实际上,我想卸载 Zygote 中默认加载的库,以便我可以自己加载该库的不同版本(在我的 DVM 实例中),并让通常会转到原始库的调用转到我的。
标签: android linux shared-libraries dalvik