可以在App中覆盖系统.so库

时间:2013-12-03 04:46:07

标签: android android-ndk android-mediaplayer stagefright

我必须修改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中的代码?

2 个答案:

答案 0 :(得分:7)

您将无法替换原始库,因为当您尝试loadLibrary时,它将从/system/lib内加载库。因此,除非您更换(在无根设备上无法替换),否则您将无法加载自定义代码。

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。可能还有其他解决方案,没有看过Media Player的代码。

答案 1 :(得分:4)

知道您要做的就是在数据到达MediaPlayer之前解析数据,我建议不要尝试更改Android库。正如soulseekah所提到的,如果没有一个有根设备,它就无法运作。还有其他选择,虽然它们都有缺点。

1)如果您只定位最新版本(我相信4.2或更高版本),您可以查看添加到android.media包中的新类,例如MediaExtractor和{{1} }。我对这些并不是很熟悉,因为它们与我工作的硬件不可用,但它们在获取原始数据时非常有用。 Here是使用它们播放视频的不错的样本。缺点是这些类在早期版本中不可用。

2)另一种选择是在设备上放置本地代理。将MediaCodec连接到代理并自行向媒体服务器发出请求。 See my answer here了解更多信息。使用代理,您将看到所有数据,让您有机会解析ID3标记。有一个缺点是你必须解析TS数据包以组合一个基本流(基本上做分离器的工作),但它适用于任何版本的Android。 TS流不难拆解,而且ID3标签解析起来并不费时,所以我认为这是一种合理的方法。