2016-05-05 23 views
2

我可以將LD_PRELOAD用於普通的本機應用程序,例如LS:如何在Android的mediaserver上使用LD_PRELOAD?

LD_PRELOAD=/path/to/my/library.so ls 

一番搜索後,我還能夠通過設置這樣的屬性與Java應用程序使用它:

adb shell setprop wrap.com.some.app LD_PRELOAD=/path/to/my/library.so 

但我感興趣的是使用LD_PRELOAD與媒體服務器過程。這很棘手,因爲它始終在後臺工作。如果你殺了它,它會自動重新啓動。我可以開始「二審」有:

LD_PRELOAD=/path/to/my/library.so /system/bin/mediaserver 

,它會載入我的圖書館雖然「二審」不會在任何播放使用。始終原始的mediaserver將處理媒體操作。 那麼有什麼辦法可以在設備上使用LD_PRELOAD和mediaserver 而不需要修改 init.rc文件?

回答

1

原來,有一種方法可以做到這一點。 我不得不做以下的事情:

adb root 
adb remount 
adb pull /system/bin/mediaserver 
echo "LD_PRELOAD=/path/to/my/library.so /system/bin/mediaserver_orig" > mediaserver 
adb shell mv /system/bin/mediaserver /system/bin/mediaserver_orig 
adb push mediaserver /system/bin/mediaserver 

然後我殺了媒體服務器,它(奇怪)沒有自動啓動,所以我也不得不手動啓動它:

adb shell 
/system/bin/mediaserver & 

反正它有可能做到這一點,所以如果沒有更好的東西,我會接受我的答案。

只是一個警告 - 當我回到了以前的狀態:

adb shell mv /system/bin/mediaserver_orig /system/bin/mediaserver 

並重新啓動設備,媒體服務器仍然不能自動啓動!所以這不是你想在你關心的設備上做的事情,因爲在這種狀態下如果你不用手工啓動mediaserver,啓動將不會被設備完成。雖然這種現象可能發生,因爲我正在玩chown,所以可能與描述的程序無關,無論如何,你都被警告過。