作为非Android人的序言(某些Linux民众可能知道此信息的答案):有没有办法在Android中关闭动态加载的库?
Android中的每个应用程序都运行在Dalvik虚拟机的一个实例中。当启动一个应用程序时,一个名为ActivityManager的实体写入一个管道,通知另一个实体Zygote需要启动一个应用程序。 Zygote是一个空白页面的Dalvik VM实例,预先加载了库,在通过管道传递后,它克隆自己,克隆将其权限级别降低到与要启动的应用相关联的Linux用户。这在启动应用程序时节省了时间和内存 - 考虑重新加载所有库并每次都进行所有设置的替代方法。
我的问题是,Zygote中有一个特定的库,我想在这个特定的进程中关闭,因为我想使用我自己的库版本。我已将我的本地代码与MY .so文件链接起来,该文件被复制到适当的文件夹中,并在应用程序启动时通过Java层“System.load('xyz')”加载,但是当我的代码运行时,它会调用原系统库的功能,而不是我的。当我运行“cat/proc/NNNN/maps”时,我可以看到旧库和我的内存一样。
有没有办法在我的应用程序中关闭特定的库?如果没有,是否有办法确保对该库中的函数的任何/每个调用都传递给MY版本而不是旧版本?
谢谢!
“关闭”,如卸载以前加载的共享库?似乎没有办法。请参阅:https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/59Xu4kKjgnA和https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/ sf56xVIySfI – MarsAtomic 2013-04-22 16:46:25
@MarsAtomic:这些帖子是关于卸载应用程序本身加载的库,稍有不同。如果你管理自己的'dlopen()'/'dlclose()'调用,而不是依赖'System.load()',你可以实际做到。由于一切都在应用程序的控制之下,因此可以安全地进行操作。这真的是你想更新共享库而不重新启动应用程序(或更可能是服务)的场景,而这里的问题是关于覆盖系统的库副本。 – fadden 2013-04-22 18:10:37
大家好!实际上,我想卸载Zygote中默认加载的库,以便我可以自己加载不同版本的库(在我的DVM实例中),并将通常会转到原始库的调用转到我的库中。 – ZachM 2013-04-24 18:29:24