Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 181e6950 authored by Chong Zhang's avatar Chong Zhang
Browse files

Convert IResourceManagerService to stable AIDL

Convert with minimal change to the interface itself.

Add additional test to cover DrmSessionManager's usage
of possible negative value field (which is signed now).

bug: 142396029
test: ResourceManagerService_test, DrmSessionManager_test,
CTS ResourceManagerServiceTest;
Manually check battery stats reporting.

Change-Id: I5c537a54efc2663281c96ddbdbd4ee56f23c1adf
parent 318b26e7
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

#include <android/hardware/drm/1.2/types.h>
#include <android/hidl/manager/1.2/IServiceManager.h>
#include <android/media/BnResourceManagerClient.h>
#include <hidl/ServiceManagement.h>
#include <media/EventMetric.h>
#include <media/PluginMetricsReporting.h>
@@ -295,21 +296,43 @@ static status_t toStatusT_1_2(Status_V1_2 status) {

Mutex DrmHal::mLock;

bool DrmHal::DrmSessionClient::reclaimResource() {
struct DrmHal::DrmSessionClient : public android::media::BnResourceManagerClient {
    explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId)
      : mSessionId(sessionId),
        mDrm(drm) {}

    ::android::binder::Status reclaimResource(bool* _aidl_return) override;
    ::android::binder::Status getName(::std::string* _aidl_return) override;

    const Vector<uint8_t> mSessionId;

protected:
    virtual ~DrmSessionClient();

private:
    wp<DrmHal> mDrm;

    DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
};

::android::binder::Status DrmHal::DrmSessionClient::reclaimResource(bool* _aidl_return) {
    sp<DrmHal> drm = mDrm.promote();
    if (drm == NULL) {
        return true;
        *_aidl_return = true;
        return ::android::binder::Status::ok();
    }
    status_t err = drm->closeSession(mSessionId);
    if (err != OK) {
        return false;
        *_aidl_return = false;
        return ::android::binder::Status::ok();
    }
    drm->sendEvent(EventType::SESSION_RECLAIMED,
            toHidlVec(mSessionId), hidl_vec<uint8_t>());
    return true;
    *_aidl_return = true;
    return ::android::binder::Status::ok();
}

String8 DrmHal::DrmSessionClient::getName() {
::android::binder::Status DrmHal::DrmSessionClient::getName(::std::string* _aidl_return) {
    String8 name;
    sp<DrmHal> drm = mDrm.promote();
    if (drm == NULL) {
@@ -323,7 +346,8 @@ String8 DrmHal::DrmSessionClient::getName() {
        name.appendFormat("%02x", mSessionId[i]);
    }
    name.append("]");
    return name;
    *_aidl_return = name;
    return ::android::binder::Status::ok();
}

DrmHal::DrmSessionClient::~DrmSessionClient() {
+14 −10
Original line number Diff line number Diff line
@@ -18,11 +18,12 @@
#define LOG_TAG "DrmSessionManager"
#include <utils/Log.h>

#include <android/media/IResourceManagerClient.h>
#include <android/media/IResourceManagerService.h>
#include <binder/IPCThreadState.h>
#include <binder/IProcessInfoService.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <media/IResourceManagerClient.h>
#include <media/MediaResource.h>
#include <mediadrm/DrmSessionManager.h>
#include <unistd.h>
@@ -33,6 +34,7 @@
#include "ResourceManagerService.h"

namespace android {
using android::binder::Status;

static String8 GetSessionIdString(const Vector<uint8_t> &sessionId) {
    String8 sessionIdStr;
@@ -52,16 +54,16 @@ static uint64_t toClientId(const sp<IResourceManagerClient>& drm) {
    return reinterpret_cast<int64_t>(drm.get());
}

static Vector<MediaResource> toResourceVec(const Vector<uint8_t> &sessionId) {
    Vector<MediaResource> resources;
    // use UINT64_MAX to decrement through addition overflow
    resources.push_back(MediaResource(MediaResource::kDrmSession, toStdVec(sessionId), UINT64_MAX));
static std::vector<MediaResourceParcel> toResourceVec(
        const Vector<uint8_t> &sessionId, int64_t value) {
    std::vector<MediaResourceParcel> resources;
    resources.push_back(MediaResource::DrmSessionResource(toStdVec(sessionId), value));
    return resources;
}

static sp<IResourceManagerService> getResourceManagerService() {
    if (property_get_bool("persist.device_config.media_native.mediadrmserver", 1)) {
        return new ResourceManagerService();
        return new android::media::ResourceManagerService();
    }
    sp<IServiceManager> sm = defaultServiceManager();
    if (sm == NULL) {
@@ -131,7 +133,7 @@ void DrmSessionManager::addSession(int pid,

    int64_t clientId = toClientId(drm);
    mSessionMap[toStdVec(sessionId)] = (SessionInfo){pid, uid, clientId};
    mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId));
    mService->addResource(pid, uid, clientId, drm, toResourceVec(sessionId, INT64_MAX));
}

void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) {
@@ -144,7 +146,7 @@ void DrmSessionManager::useSession(const Vector<uint8_t> &sessionId) {
    }

    auto info = it->second;
    mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId));
    mService->addResource(info.pid, info.uid, info.clientId, NULL, toResourceVec(sessionId, -1));
}

void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) {
@@ -157,7 +159,7 @@ void DrmSessionManager::removeSession(const Vector<uint8_t> &sessionId) {
    }

    auto info = it->second;
    mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId));
    mService->removeResource(info.pid, info.clientId, toResourceVec(sessionId, INT64_MAX));
    mSessionMap.erase(it);
}

@@ -176,7 +178,9 @@ bool DrmSessionManager::reclaimSession(int callingPid) {
    // cannot update mSessionMap because we do not know which sessionId is reclaimed;
    // we rely on IResourceManagerClient to removeSession in reclaimResource
    Vector<uint8_t> dummy;
    return service->reclaimResource(callingPid, toResourceVec(dummy));
    bool success;
    Status status = service->reclaimResource(callingPid, toResourceVec(dummy, INT64_MAX), &success);
    return status.isOk() && success;
}

size_t DrmSessionManager::getSessionCount() const {
+1 −19
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
#include <android/hardware/drm/1.2/IDrmPlugin.h>
#include <android/hardware/drm/1.2/IDrmPluginListener.h>

#include <media/IResourceManagerService.h>
#include <media/MediaAnalyticsItem.h>
#include <mediadrm/DrmMetrics.h>
#include <mediadrm/DrmSessionManager.h>
@@ -62,24 +61,7 @@ struct DrmHal : public BnDrm,
                public IBinder::DeathRecipient,
                public IDrmPluginListener_V1_2 {

    struct DrmSessionClient : public BnResourceManagerClient {
        explicit DrmSessionClient(DrmHal* drm, const Vector<uint8_t>& sessionId)
          : mSessionId(sessionId),
            mDrm(drm) {}

        virtual bool reclaimResource();
        virtual String8 getName();

        const Vector<uint8_t> mSessionId;

    protected:
        virtual ~DrmSessionClient();

    private:
        wp<DrmHal> mDrm;

        DISALLOW_EVIL_CONSTRUCTORS(DrmSessionClient);
    };
    struct DrmSessionClient;

    DrmHal();
    virtual ~DrmHal();
+6 −1
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@
#define DRM_SESSION_MANAGER_H_

#include <binder/IBinder.h>
#include <media/IResourceManagerService.h>
#include <media/stagefright/foundation/ABase.h>
#include <utils/RefBase.h>
#include <utils/KeyedVector.h>
@@ -33,7 +32,13 @@
namespace android {

class DrmSessionManagerTest;

namespace media {
class IResourceManagerClient;
class IResourceManagerService;
}
using android::media::IResourceManagerClient;
using android::media::IResourceManagerService;

bool isEqualSessionId(const Vector<uint8_t> &sessionId1, const Vector<uint8_t> &sessionId2);

+30 −7
Original line number Diff line number Diff line
@@ -22,13 +22,19 @@ cc_library {
        enabled: true,
    },
    double_loadable: true,
    srcs: ["AudioParameter.cpp", "TypeConverter.cpp"],
    srcs: [
        "AudioParameter.cpp",
        "TypeConverter.cpp",
    ],
    cflags: [
        "-Werror",
        "-Wno-error=deprecated-declarations",
        "-Wall",
    ],
    shared_libs: ["libutils", "liblog"],
    shared_libs: [
        "libutils",
        "liblog",
    ],
    header_libs: [
        "libmedia_headers",
        "libaudioclient_headers",
@@ -49,6 +55,21 @@ filegroup {
    path: "aidl",
}

aidl_interface {
    name: "resourcemanager_aidl_interface",
    local_include_dir: "aidl",
    srcs: [
        "aidl/android/media/IResourceManagerClient.aidl",
        "aidl/android/media/IResourceManagerService.aidl",
        "aidl/android/media/MediaResourceType.aidl",
        "aidl/android/media/MediaResourceSubType.aidl",
        "aidl/android/media/MediaResourceParcel.aidl",
        "aidl/android/media/MediaResourcePolicyParcel.aidl",
    ],
    api_dir: "api/resourcemanager",
    versions: ["1"],
}

cc_library_shared {
    name: "libmedia_omx",
    vendor_available: true,
@@ -127,7 +148,6 @@ cc_library_shared {
    },
}


cc_library_shared {
    name: "libmedia_omx_client",

@@ -277,8 +297,6 @@ cc_library {
        "IMediaSource.cpp",
        "IRemoteDisplay.cpp",
        "IRemoteDisplayClient.cpp",
        "IResourceManagerClient.cpp",
        "IResourceManagerService.cpp",
        "IStreamSource.cpp",
        "MediaUtils.cpp",
        "Metadata.cpp",
@@ -345,6 +363,11 @@ cc_library {

    static_libs: [
        "libc_malloc_debug_backtrace", // for memory heap analysis
        "resourcemanager_aidl_interface-cpp",
    ],

    export_static_lib_headers: [
        "resourcemanager_aidl_interface-cpp",
    ],

    export_include_dirs: [
Loading