如何在Android的mediaserver中使用LD_PRELOAD?

时间:2016-05-05 12:33:38

标签: android linker ld-preload

我可以将LD_PRELOAD用于普通的原生应用,例如LS:

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与 mediaserver 进程一起使用。这很棘手,因为它始终在后台运行。如果你杀了它,它将自动重新启动。我可以开始"第二个实例"用:

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

它会加载我的库,虽然"第二个实例"不会在任何播放中使用。始终原始的mediaserver将处理媒体操作。 那么有没有办法在设备上使用LD_PRELOAD和mediaserver 而不修改 init.rc文件?

1 个答案:

答案 0 :(得分: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

然后我杀死了mediaserver,它(令人惊讶地)没有自动启动,所以我也必须手动启动它:

adb shell
/system/bin/mediaserver &

无论如何都可以这样做,所以如果没有人有更好的话,我会接受我的回答。

只有一个警告 - 当我返回上一个状态时:

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

并重新启动设备,mediaserver仍未自动启动!所以这不是你想要在你关心的设备上做的事情,因为在这种状态下,如果你不用手启动mediaserver将不会被设备完成。虽然这种现象可能因为我正在玩chown而发生,所以可能与描述的程序无关,无论如何你都被警告过。