作爲非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