如何将 LD_PRELOAD 与 Android 的媒体服务器一起使用?

How to use LD_PRELOAD with Android's mediaserver?

我可以将 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 进程感兴趣。这很棘手,因为它一直在后台运行。如果你杀死它,它会自动重新启动。我可以从 "second instance" 开始:

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

它会加载我的库,尽管 "second instance" 不会用于任何播放。始终原始媒体服务器将处理媒体操作。 那么有没有什么方法可以在不修改设备上的 init.rc 文件的情况下将 LD_PRELOAD 与媒体服务器 一起使用?

事实证明,有办法做到这一点。 我必须做以下事情:

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还是没有自动启动!所以这不是你想在你关心的设备上做的事情,因为在这种状态下,如果你不手动启动媒体服务器,设备将不会完成。虽然这种现象可能是因为我在玩chown,所以可能与描述的过程无关,反正你已经被警告了。