在应用中覆盖系统的.so库是否可行?

10
我需要修改Android Media Player的Http Live Streaming实现。这个实现位于stagefright库下。 http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/httplive/LiveDataSource.cpp 我认为这些库将编译成一个libstagefright.so,它应该是Android系统的一部分。
我的问题是,如果我对这个库进行一些更改并编译一个新的libstagefright.so, 如果我在我的新应用程序中加载这个新的libstagefright.so并调用媒体播放器,它会使用我新的libstagefright.so中的代码吗?

soulseekah 是正确的,你不能仅仅替换系统库。你具体想要做什么? - Dave
我想修改HLS实现,使其从TS流中读取ID3元数据。当前的Android媒体播放器实现不提供读取这些元数据的功能。 - eroy4u
你可以尝试向AOSP提交一个包含新功能的补丁。 - soulseekah
2个回答

9

由于在尝试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中的那个。

您可以通过查看以下内容来了解更多:

我相信出于安全考虑,您无法替换默认的类加载器。

不过,您可以简单地分叉媒体播放器并让它加载您修改后的libstagefright-modified.so。可能还有其他解决方案,但我没有查看过媒体播放器的代码。


谢谢您的回答。此外,如果我直接fork并加载我的修改后的libstagefright-modified.so,如果我创建一个android.media.MediaPlayer,它会使用我的libstagefright-modified.so而不是系统的libstagefright.so吗? - eroy4u
我猜答案是否定的,libstagefright.so是由libmedia_jni.so加载的,而它又被android.media.MediaPlayer加载,所以我认为我必须重新编译lib media_jni.so(将其更改为依赖于libstagefright-modified.so),并重新编译android.media.MediaPlayer和可能其他相关库,以便使用libstagefright-modified.so中的新函数? - eroy4u
1
是的,您需要一个独立的分支,所有依赖代码都要改为依赖于libstagefright-modified.so。此外,您需要重构所有名称和包,并查找冲突。请参见https://dev59.com/Qmgv5IYBdhLWcg3wSe0f#11677070以获取类似的想法。 - soulseekah

4

了解到您想要在数据传递到MediaPlayer之前对其进行解析,我建议不要尝试修改Android库。正如soulseekah所提到的,没有root设备是行不通的。虽然有其他选择,但它们都有缺点。

1) 如果您只针对最近的版本(我相信是4.2或更高版本),可以查看添加到android.media包中的新类,例如MediaExtractorMediaCodec。我不太熟悉这些类,因为它们不适用于我使用的硬件,但它们可能有助于获取原始数据。这里是一个使用它们播放视频的不错示例。缺点是这些类在早期版本中不可用。

2) 另一种选择是在设备上放置本地代理。将 MediaPlayer 连接到代理并自己向媒体服务器发出请求。在这里查看我的答案 获取更多信息。使用代理,您将看到通过的所有数据,有机会解析 ID3 标签。缺点是您将不得不解析 TS 数据包以组合基本流(本质上是执行 demuxer 的工作),但它将适用于任何版本的 Android。TS 流不难拆卸,ID3 标签不耗费时间进行解析,因此我认为这是一个合理的方法。


对于第二种方法,由于HLS是包含.ts文件列表的.m3u8文件,因此在我的本地代理中,如果代理了.m3u8文件和其他.ts文件,那应该就可以了,为什么还要解析TS数据包来组合基本流呢?谢谢,非常支持。 - eroy4u
谢谢提供的信息。对于第一点,正如您所提到的,我将不会使用MediaPlayer,因此我必须实现自己的媒体播放器,包括HLS实现-解析源,从正确的文件获取TS字节等等。之后,我可以将视频传递给MediaCodec来播放视频。这是正确的方法吗?看起来重新实现HLS需要做很多工作。 - eroy4u
就像我说的,我对那些类不是太熟悉。我相信MediaExtractor会为您执行解复用(包括提取TS包的有效负载),这意味着其余部分不应该太困难。如果真是这样,您需要下载m3u8并使用类似于示例链接中的MediaExtractory / MediaCodec算法来处理每个连续的TS流。我认为在调用“readSampleData”后,您有机会解析ID3标签。 - Dave
我已经使用了第二个选项,并成功提取了ID3标签。 - anz
很酷,你和我有一样的情况?是HLS吗?你介意告诉我你在使用哪个本地代理库吗? - eroy4u
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接