我的问题是,如果我对这个库进行一些更改并编译一个新的libstagefright.so, 如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它会使用我新的libstagefright.so中的代码吗?
由于在尝试loadLibrary
时,它会从/system/lib
中加载库,因此您将无法替换原始库。因此,除非您替换它(在未root的设备上不可能),否则您将无法加载自定义代码。
https://github.com/android/platform_system_core/blob/66ed50af6870210ce013a5588a688434a5d48ee9/rootdir/init.environ.rc.in默认设置了LD_LIBRARY_PATH
。如果可用,则从这些路径加载它。如果没有,则将搜索您应用程序的lib
目录;但反之则不会。
我曾经尝试在各种主流设备上使用libwebkit.so
,但没有成功使其加载代替/system/lib
中的那个。
您可以通过查看以下内容来了解更多:
doLoad
https://android.googlesource.com/platform/libcore/+/41d00b744b7772f9302fdb94dddadb165b951220/luni/src/main/java/java/lang/Runtime.javafindLibrary
在这里http://developer.android.com/reference/dalvik/system/BaseDexClassLoader.html#findLibrary(java.lang.String)我相信出于安全考虑,您无法替换默认的类加载器。
不过,您可以简单地分叉媒体播放器并让它加载您修改后的libstagefright-modified.so
。可能还有其他解决方案,但我没有查看过媒体播放器的代码。
了解到您想要在数据传递到MediaPlayer之前对其进行解析,我建议不要尝试修改Android库。正如soulseekah所提到的,没有root设备是行不通的。虽然有其他选择,但它们都有缺点。
1) 如果您只针对最近的版本(我相信是4.2或更高版本),可以查看添加到android.media
包中的新类,例如MediaExtractor
和MediaCodec
。我不太熟悉这些类,因为它们不适用于我使用的硬件,但它们可能有助于获取原始数据。这里是一个使用它们播放视频的不错示例。缺点是这些类在早期版本中不可用。
2) 另一种选择是在设备上放置本地代理。将 MediaPlayer
连接到代理并自己向媒体服务器发出请求。在这里查看我的答案 获取更多信息。使用代理,您将看到通过的所有数据,有机会解析 ID3 标签。缺点是您将不得不解析 TS 数据包以组合基本流(本质上是执行 demuxer 的工作),但它将适用于任何版本的 Android。TS 流不难拆卸,ID3 标签不耗费时间进行解析,因此我认为这是一个合理的方法。