6

默认情况下,android Gigerbread 2.3 使用 PV_Player(opencore 库)。我找到了一种解决方案,它应该是修补系统 build.prop 文件,但我不想修补系统。我想使用将使用 StageFright 播放器的 android 媒体框架创建自己的库。我知道 libmediaplayerservice 决定播放器的选择。看看媒体框架

我想根据android框架创建库-

  • libmedia_jni_own
  • libmedia_own
  • libmediaplayerservice_own

    但问题是 libmedia 不直接与 libmediaplayerservice 库交互,它不直接依赖于 libmediaplayerservice 库。以至于无法创造出怯场的播放器。Libmedia 通过 Binder IPC 机制与 libmediaplayerservice 库进行通信。如何修补 libmedia 源库,以便它可以访问我的 libmediaplayerservice 库并能够创建 StageFright 播放器以及 StageFright 记录器等的所有访问权限,而不是 opencore 库。

  • 4

    2 回答 2

    1

    我认为您无法修改媒体服务的工作方式而无需修补系统。由于媒体服务及其库位于系统分区上,因此您实际上无法劫持 jni 负载。如果您运行的是非 AOSP rom(如三星、HTC 等),您将无法只更换库,因为来自库存 rom 的库包含许多与专有库的链接。

    于 2012-05-21T22:04:37.283 回答
    1

    通过查看您提到的 Binder 机制的 android 源代码,您应该查看方法“getMediaPlayerService()”并检查服务管理器如何处理媒体服务。如果您可以修补此方法并正确定义您的服务,那么您应该没问题。

    IMediaDeathNotifier::getMediaPlayerService()
    {
        LOGV("getMediaPlayerService");
        Mutex::Autolock _l(sServiceLock);
        if (sMediaPlayerService.get() == 0) {
            sp<IServiceManager> sm = defaultServiceManager();
            sp<IBinder> binder;
            do {
                binder = sm->getService(String16("media.player"));
                if (binder != 0) {
                    break;
                 }
                 LOGW("Media player service not published, waiting...");
                 usleep(500000); // 0.5 s
            } while(true);
    
            if (sDeathNotifier == NULL) {
            sDeathNotifier = new DeathNotifier();
        }
        binder->linkToDeath(sDeathNotifier);
        sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
        }
        LOGE_IF(sMediaPlayerService == 0, "no media player service!?");
        return sMediaPlayerService;
    }
    

    有问题的方法位于: frameworks/base/media/libmedia/IMediaDeathNotifier.cpp

    此外,通过调用设置服务:

     void MediaPlayerService::instantiate() {
                 defaultServiceManager()->addService(
                 String16("media.player"), new MediaPlayerService());
     }
    

    可以在以下位置找到:/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

    于 2012-05-22T11:20:37.190 回答