transcoder: plumb uid/pid to transcoder createCodec
Instead of using ResourceManagerService::overrideProcessInfo to
override the procinfo of the native MediaTranscodingService,
use the newly added AMediaCodec create methods with UID/PID.
This will allow the codec instance to be attributed to the
actual client (for battery reporting as well resource managerment
purposes), instead of all to media.transcoding.
Plumb uid/pid to transcoder to create the codec with them.
Fix up the unit test after the change.
bug: 159172726
test: transcoder unit tests.
Change-Id: Ie7e6fd813ec53f125590665ab3466758a0fd4601
diff --git a/media/libmediatranscoding/Android.bp b/media/libmediatranscoding/Android.bp
index 763a73e..ec806d1 100644
--- a/media/libmediatranscoding/Android.bp
+++ b/media/libmediatranscoding/Android.bp
@@ -77,7 +77,6 @@
static_libs: [
"mediatranscoding_aidl_interface-ndk_platform",
- "resourcemanager_aidl_interface-ndk_platform",
"resourceobserver_aidl_interface-ndk_platform",
],
diff --git a/media/libmediatranscoding/TranscoderWrapper.cpp b/media/libmediatranscoding/TranscoderWrapper.cpp
index fffbfe9..8cc8dd2 100644
--- a/media/libmediatranscoding/TranscoderWrapper.cpp
+++ b/media/libmediatranscoding/TranscoderWrapper.cpp
@@ -347,7 +347,8 @@
mCurrentClientId = clientId;
mCurrentSessionId = sessionId;
mTranscoderCb = std::make_shared<CallbackImpl>(shared_from_this(), clientId, sessionId);
- mTranscoder = MediaTranscoder::create(mTranscoderCb, pausedState);
+ mTranscoder = MediaTranscoder::create(mTranscoderCb, request.clientPid, request.clientUid,
+ pausedState);
if (mTranscoder == nullptr) {
ALOGE("failed to create transcoder");
return AMEDIA_ERROR_UNKNOWN;
diff --git a/media/libmediatranscoding/TranscodingResourcePolicy.cpp b/media/libmediatranscoding/TranscodingResourcePolicy.cpp
index 4fd8338..f2e973a 100644
--- a/media/libmediatranscoding/TranscodingResourcePolicy.cpp
+++ b/media/libmediatranscoding/TranscodingResourcePolicy.cpp
@@ -41,7 +41,7 @@
}
struct TranscodingResourcePolicy::ResourceObserver : public BnResourceObserver {
- explicit ResourceObserver(TranscodingResourcePolicy* owner) : mOwner(owner), mPid(getpid()) {}
+ explicit ResourceObserver(TranscodingResourcePolicy* owner) : mOwner(owner) {}
// IResourceObserver
::ndk::ScopedAStatus onStatusChanged(
@@ -51,12 +51,12 @@
::aidl::android::media::toString(event).c_str(), uid, pid,
toString(observables[0]).c_str());
- // Only report kIdle event for codec resources from other processes.
- if (((uint64_t)event & (uint64_t)MediaObservableEvent::kIdle) != 0 && (pid != mPid)) {
+ // Only report kIdle event.
+ if (((uint64_t)event & (uint64_t)MediaObservableEvent::kIdle) != 0) {
for (auto& observable : observables) {
if (observable.type == MediaObservableType::kVideoSecureCodec ||
observable.type == MediaObservableType::kVideoNonSecureCodec) {
- mOwner->onResourceAvailable();
+ mOwner->onResourceAvailable(pid);
break;
}
}
@@ -65,7 +65,6 @@
}
TranscodingResourcePolicy* mOwner;
- const pid_t mPid;
};
// static
@@ -83,7 +82,9 @@
}
TranscodingResourcePolicy::TranscodingResourcePolicy()
- : mRegistered(false), mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)) {
+ : mRegistered(false),
+ mResourceLostPid(-1),
+ mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)) {
registerSelf();
}
@@ -155,11 +156,20 @@
mResourcePolicyCallback = cb;
}
-void TranscodingResourcePolicy::onResourceAvailable() {
+void TranscodingResourcePolicy::setPidResourceLost(pid_t pid) {
+ std::scoped_lock lock{mCallbackLock};
+ mResourceLostPid = pid;
+}
+
+void TranscodingResourcePolicy::onResourceAvailable(pid_t pid) {
std::shared_ptr<ResourcePolicyCallbackInterface> cb;
{
std::scoped_lock lock{mCallbackLock};
- cb = mResourcePolicyCallback.lock();
+ // Only callback if codec resource is released from other processes.
+ if (mResourceLostPid != -1 && mResourceLostPid != pid) {
+ cb = mResourcePolicyCallback.lock();
+ mResourceLostPid = -1;
+ }
}
if (cb != nullptr) {
diff --git a/media/libmediatranscoding/TranscodingSessionController.cpp b/media/libmediatranscoding/TranscodingSessionController.cpp
index 1c3ee7e..bab25c6 100644
--- a/media/libmediatranscoding/TranscodingSessionController.cpp
+++ b/media/libmediatranscoding/TranscodingSessionController.cpp
@@ -504,6 +504,7 @@
if (clientCallback != nullptr) {
clientCallback->onTranscodingPaused(mCurrentSession->key.second);
}
+ mResourcePolicy->setPidResourceLost(mCurrentSession->request.clientPid);
}
mResourceLost = true;
diff --git a/media/libmediatranscoding/TranscodingUidPolicy.cpp b/media/libmediatranscoding/TranscodingUidPolicy.cpp
index fdda327..8a74d5d 100644
--- a/media/libmediatranscoding/TranscodingUidPolicy.cpp
+++ b/media/libmediatranscoding/TranscodingUidPolicy.cpp
@@ -17,8 +17,6 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "TranscodingUidPolicy"
-#include <aidl/android/media/BnResourceManagerClient.h>
-#include <aidl/android/media/IResourceManagerService.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <binder/ActivityManager.h>
@@ -35,43 +33,6 @@
constexpr static uid_t OFFLINE_UID = -1;
constexpr static const char* kTranscodingTag = "transcoding";
-/*
- * The OOM score we're going to ask ResourceManager to use for our native transcoding
- * service. ResourceManager issues reclaims based on these scores. It gets the scores
- * from ActivityManagerService, which doesn't track native services. The values of the
- * OOM scores are defined in:
- * frameworks/base/services/core/java/com/android/server/am/ProcessList.java
- * We use SERVICE_ADJ which is lower priority than an app possibly visible to the
- * user, but higher priority than a cached app (which could be killed without disruption
- * to the user).
- */
-constexpr static int32_t SERVICE_ADJ = 500;
-
-using Status = ::ndk::ScopedAStatus;
-using aidl::android::media::BnResourceManagerClient;
-using aidl::android::media::IResourceManagerService;
-
-/*
- * Placeholder ResourceManagerClient for registering process info override
- * with the IResourceManagerService. This is only used as a token by the service
- * to get notifications about binder death, not used for reclaiming resources.
- */
-struct TranscodingUidPolicy::ResourceManagerClient : public BnResourceManagerClient {
- explicit ResourceManagerClient() = default;
-
- Status reclaimResource(bool* _aidl_return) override {
- *_aidl_return = false;
- return Status::ok();
- }
-
- Status getName(::std::string* _aidl_return) override {
- _aidl_return->clear();
- return Status::ok();
- }
-
- virtual ~ResourceManagerClient() = default;
-};
-
struct TranscodingUidPolicy::UidObserver : public BnUidObserver,
public virtual IBinder::DeathRecipient {
explicit UidObserver(TranscodingUidPolicy* owner) : mOwner(owner) {}
@@ -116,7 +77,6 @@
mRegistered(false),
mTopUidState(ActivityManager::PROCESS_STATE_UNKNOWN) {
registerSelf();
- setProcessInfoOverride();
}
TranscodingUidPolicy::~TranscodingUidPolicy() {
@@ -152,22 +112,6 @@
ALOGI("TranscodingUidPolicy: Unregistered with ActivityManager");
}
-void TranscodingUidPolicy::setProcessInfoOverride() {
- ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager"));
- std::shared_ptr<IResourceManagerService> service = IResourceManagerService::fromBinder(binder);
- if (service == nullptr) {
- ALOGE("Failed to get IResourceManagerService");
- return;
- }
-
- mProcInfoOverrideClient = ::ndk::SharedRefBase::make<ResourceManagerClient>();
- Status status = service->overrideProcessInfo(
- mProcInfoOverrideClient, getpid(), ActivityManager::PROCESS_STATE_SERVICE, SERVICE_ADJ);
- if (!status.isOk()) {
- ALOGW("Failed to setProcessInfoOverride.");
- }
-}
-
void TranscodingUidPolicy::setUidObserverRegistered(bool registered) {
Mutex::Autolock _l(mUidLock);
diff --git a/media/libmediatranscoding/include/media/ResourcePolicyInterface.h b/media/libmediatranscoding/include/media/ResourcePolicyInterface.h
index 4a92af8..ecce252 100644
--- a/media/libmediatranscoding/include/media/ResourcePolicyInterface.h
+++ b/media/libmediatranscoding/include/media/ResourcePolicyInterface.h
@@ -27,6 +27,7 @@
// Set the associated callback interface to send the events when resource
// status changes. (Set to nullptr will stop the updates.)
virtual void setCallback(const std::shared_ptr<ResourcePolicyCallbackInterface>& cb) = 0;
+ virtual void setPidResourceLost(pid_t pid) = 0;
protected:
virtual ~ResourcePolicyInterface() = default;
diff --git a/media/libmediatranscoding/include/media/TranscodingResourcePolicy.h b/media/libmediatranscoding/include/media/TranscodingResourcePolicy.h
index 0836eda..ee232e7 100644
--- a/media/libmediatranscoding/include/media/TranscodingResourcePolicy.h
+++ b/media/libmediatranscoding/include/media/TranscodingResourcePolicy.h
@@ -40,6 +40,7 @@
~TranscodingResourcePolicy();
void setCallback(const std::shared_ptr<ResourcePolicyCallbackInterface>& cb) override;
+ void setPidResourceLost(pid_t pid) override;
private:
struct ResourceObserver;
@@ -51,6 +52,7 @@
mutable std::mutex mCallbackLock;
std::weak_ptr<ResourcePolicyCallbackInterface> mResourcePolicyCallback
GUARDED_BY(mCallbackLock);
+ pid_t mResourceLostPid GUARDED_BY(mCallbackLock);
::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
@@ -58,7 +60,7 @@
void registerSelf();
void unregisterSelf();
- void onResourceAvailable();
+ void onResourceAvailable(pid_t pid);
}; // class TranscodingUidPolicy
} // namespace android
diff --git a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
index dec67b9..acd3cff 100644
--- a/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
+++ b/media/libmediatranscoding/include/media/TranscodingUidPolicy.h
@@ -54,7 +54,6 @@
void setUidObserverRegistered(bool registerd);
void registerSelf();
void unregisterSelf();
- void setProcessInfoOverride();
int32_t getProcState_l(uid_t uid) NO_THREAD_SAFETY_ANALYSIS;
void updateTopUid_l() NO_THREAD_SAFETY_ANALYSIS;
@@ -68,7 +67,6 @@
std::unordered_map<uid_t, int32_t> mUidStateMap GUARDED_BY(mUidLock);
std::map<int32_t, std::unordered_set<uid_t>> mStateUidMap GUARDED_BY(mUidLock);
std::weak_ptr<UidPolicyCallbackInterface> mUidPolicyCallback;
- std::shared_ptr<ResourceManagerClient> mProcInfoOverrideClient;
}; // class TranscodingUidPolicy
} // namespace android
diff --git a/media/libmediatranscoding/transcoder/MediaTranscoder.cpp b/media/libmediatranscoding/transcoder/MediaTranscoder.cpp
index d89b58f..07df5e0 100644
--- a/media/libmediatranscoding/transcoder/MediaTranscoder.cpp
+++ b/media/libmediatranscoding/transcoder/MediaTranscoder.cpp
@@ -154,11 +154,12 @@
mCallbacks->onProgressUpdate(this, progress);
}
-MediaTranscoder::MediaTranscoder(const std::shared_ptr<CallbackInterface>& callbacks)
- : mCallbacks(callbacks) {}
+MediaTranscoder::MediaTranscoder(const std::shared_ptr<CallbackInterface>& callbacks, pid_t pid,
+ uid_t uid)
+ : mCallbacks(callbacks), mPid(pid), mUid(uid) {}
std::shared_ptr<MediaTranscoder> MediaTranscoder::create(
- const std::shared_ptr<CallbackInterface>& callbacks,
+ const std::shared_ptr<CallbackInterface>& callbacks, pid_t pid, uid_t uid,
const std::shared_ptr<ndk::ScopedAParcel>& pausedState) {
if (pausedState != nullptr) {
LOG(INFO) << "Initializing from paused state.";
@@ -168,7 +169,7 @@
return nullptr;
}
- return std::shared_ptr<MediaTranscoder>(new MediaTranscoder(callbacks));
+ return std::shared_ptr<MediaTranscoder>(new MediaTranscoder(callbacks, pid, uid));
}
media_status_t MediaTranscoder::configureSource(int fd) {
@@ -257,7 +258,7 @@
}
}
- transcoder = VideoTrackTranscoder::create(shared_from_this());
+ transcoder = VideoTrackTranscoder::create(shared_from_this(), mPid, mUid);
AMediaFormat* mergedFormat =
mergeMediaFormats(mSourceTrackFormats[trackIndex].get(), trackFormat);
diff --git a/media/libmediatranscoding/transcoder/VideoTrackTranscoder.cpp b/media/libmediatranscoding/transcoder/VideoTrackTranscoder.cpp
index 4cf54f1..c1456fd 100644
--- a/media/libmediatranscoding/transcoder/VideoTrackTranscoder.cpp
+++ b/media/libmediatranscoding/transcoder/VideoTrackTranscoder.cpp
@@ -167,8 +167,10 @@
// static
std::shared_ptr<VideoTrackTranscoder> VideoTrackTranscoder::create(
- const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback) {
- return std::shared_ptr<VideoTrackTranscoder>(new VideoTrackTranscoder(transcoderCallback));
+ const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback, pid_t pid,
+ uid_t uid) {
+ return std::shared_ptr<VideoTrackTranscoder>(
+ new VideoTrackTranscoder(transcoderCallback, pid, uid));
}
VideoTrackTranscoder::~VideoTrackTranscoder() {
@@ -232,7 +234,7 @@
return AMEDIA_ERROR_INVALID_PARAMETER;
}
- AMediaCodec* encoder = AMediaCodec_createEncoderByType(destinationMime);
+ AMediaCodec* encoder = AMediaCodec_createEncoderByTypeForClient(destinationMime, mPid, mUid);
if (encoder == nullptr) {
LOG(ERROR) << "Unable to create encoder for type " << destinationMime;
return AMEDIA_ERROR_UNSUPPORTED;
@@ -261,7 +263,7 @@
return AMEDIA_ERROR_INVALID_PARAMETER;
}
- mDecoder = AMediaCodec_createDecoderByType(sourceMime);
+ mDecoder = AMediaCodec_createDecoderByTypeForClient(sourceMime, mPid, mUid);
if (mDecoder == nullptr) {
LOG(ERROR) << "Unable to create decoder for type " << sourceMime;
return AMEDIA_ERROR_UNSUPPORTED;
diff --git a/media/libmediatranscoding/transcoder/benchmark/MediaTranscoderBenchmark.cpp b/media/libmediatranscoding/transcoder/benchmark/MediaTranscoderBenchmark.cpp
index 465632f..93a08d1 100644
--- a/media/libmediatranscoding/transcoder/benchmark/MediaTranscoderBenchmark.cpp
+++ b/media/libmediatranscoding/transcoder/benchmark/MediaTranscoderBenchmark.cpp
@@ -123,7 +123,7 @@
}
for (auto _ : state) {
- auto transcoder = MediaTranscoder::create(callbacks, nullptr);
+ auto transcoder = MediaTranscoder::create(callbacks);
status = transcoder->configureSource(srcFd);
if (status != AMEDIA_OK) {
diff --git a/media/libmediatranscoding/transcoder/include/media/MediaTranscoder.h b/media/libmediatranscoding/transcoder/include/media/MediaTranscoder.h
index 555cfce..4bbb41a 100644
--- a/media/libmediatranscoding/transcoder/include/media/MediaTranscoder.h
+++ b/media/libmediatranscoding/transcoder/include/media/MediaTranscoder.h
@@ -20,6 +20,7 @@
#include <android/binder_auto_utils.h>
#include <media/MediaSampleWriter.h>
#include <media/MediaTrackTranscoderCallback.h>
+#include <media/NdkMediaCodecPlatform.h>
#include <media/NdkMediaError.h>
#include <media/NdkMediaFormat.h>
#include <utils/Mutex.h>
@@ -70,6 +71,7 @@
*/
static std::shared_ptr<MediaTranscoder> create(
const std::shared_ptr<CallbackInterface>& callbacks,
+ pid_t pid = AMEDIACODEC_CALLING_PID, uid_t uid = AMEDIACODEC_CALLING_UID,
const std::shared_ptr<ndk::ScopedAParcel>& pausedState = nullptr);
/** Configures source from path fd. */
@@ -116,7 +118,7 @@
virtual ~MediaTranscoder() = default;
private:
- MediaTranscoder(const std::shared_ptr<CallbackInterface>& callbacks);
+ MediaTranscoder(const std::shared_ptr<CallbackInterface>& callbacks, pid_t pid, uid_t uid);
// MediaTrackTranscoderCallback
virtual void onTrackFormatAvailable(const MediaTrackTranscoder* transcoder) override;
@@ -140,6 +142,8 @@
std::vector<std::shared_ptr<MediaTrackTranscoder>> mTrackTranscoders;
std::mutex mTracksAddedMutex;
std::unordered_set<const MediaTrackTranscoder*> mTracksAdded GUARDED_BY(mTracksAddedMutex);
+ pid_t mPid;
+ uid_t mUid;
std::atomic_bool mCallbackSent = false;
std::atomic_bool mCancelled = false;
diff --git a/media/libmediatranscoding/transcoder/include/media/VideoTrackTranscoder.h b/media/libmediatranscoding/transcoder/include/media/VideoTrackTranscoder.h
index d000d7f..33ae3ba 100644
--- a/media/libmediatranscoding/transcoder/include/media/VideoTrackTranscoder.h
+++ b/media/libmediatranscoding/transcoder/include/media/VideoTrackTranscoder.h
@@ -19,7 +19,7 @@
#include <android/native_window.h>
#include <media/MediaTrackTranscoder.h>
-#include <media/NdkMediaCodec.h>
+#include <media/NdkMediaCodecPlatform.h>
#include <media/NdkMediaFormat.h>
#include <condition_variable>
@@ -38,7 +38,8 @@
public MediaTrackTranscoder {
public:
static std::shared_ptr<VideoTrackTranscoder> create(
- const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback);
+ const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback,
+ pid_t pid = AMEDIACODEC_CALLING_PID, uid_t uid = AMEDIACODEC_CALLING_UID);
virtual ~VideoTrackTranscoder() override;
@@ -61,8 +62,9 @@
};
class CodecWrapper;
- VideoTrackTranscoder(const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback)
- : MediaTrackTranscoder(transcoderCallback){};
+ VideoTrackTranscoder(const std::weak_ptr<MediaTrackTranscoderCallback>& transcoderCallback,
+ pid_t pid, uid_t uid)
+ : MediaTrackTranscoder(transcoderCallback), mPid(pid), mUid(uid){};
// MediaTrackTranscoder
media_status_t runTranscodeLoop() override;
@@ -95,6 +97,8 @@
BlockingQueue<std::function<void()>> mCodecMessageQueue;
std::shared_ptr<AMediaFormat> mDestinationFormat;
std::shared_ptr<AMediaFormat> mActualOutputFormat;
+ pid_t mPid;
+ uid_t mUid;
};
} // namespace android
diff --git a/media/libmediatranscoding/transcoder/tests/MediaTranscoderTests.cpp b/media/libmediatranscoding/transcoder/tests/MediaTranscoderTests.cpp
index 1bf2d8c..f813a5c 100644
--- a/media/libmediatranscoding/transcoder/tests/MediaTranscoderTests.cpp
+++ b/media/libmediatranscoding/transcoder/tests/MediaTranscoderTests.cpp
@@ -151,7 +151,7 @@
media_status_t transcodeHelper(const char* srcPath, const char* destPath,
FormatConfigurationCallback formatCallback,
TranscodeExecutionControl executionControl = kRunToCompletion) {
- auto transcoder = MediaTranscoder::create(mCallbacks, nullptr);
+ auto transcoder = MediaTranscoder::create(mCallbacks);
EXPECT_NE(transcoder, nullptr);
const int srcFd = open(srcPath, O_RDONLY);
diff --git a/services/mediatranscoding/tests/Android.bp b/services/mediatranscoding/tests/Android.bp
index 6497685..5a7c4cc 100644
--- a/services/mediatranscoding/tests/Android.bp
+++ b/services/mediatranscoding/tests/Android.bp
@@ -24,6 +24,7 @@
static_libs: [
"mediatranscoding_aidl_interface-ndk_platform",
+ "resourcemanager_aidl_interface-ndk_platform",
],
required: [
diff --git a/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h b/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
index f4d3ff8..66cced5 100644
--- a/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
+++ b/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
@@ -176,17 +176,19 @@
std::unique_lock lock(mLock);
auto startTime = std::chrono::system_clock::now();
+ int64_t remainingUs = timeoutUs;
std::list<Event>::iterator it;
while (((it = std::find(mEventQueue.begin(), mEventQueue.end(), target)) ==
mEventQueue.end()) &&
- timeoutUs > 0) {
- std::cv_status status = mCondition.wait_for(lock, std::chrono::microseconds(timeoutUs));
+ remainingUs > 0) {
+ std::cv_status status =
+ mCondition.wait_for(lock, std::chrono::microseconds(remainingUs));
if (status == std::cv_status::timeout) {
break;
}
std::chrono::microseconds elapsedTime = std::chrono::system_clock::now() - startTime;
- timeoutUs -= elapsedTime.count();
+ remainingUs = timeoutUs - elapsedTime.count();
}
if (it == mEventQueue.end()) {
diff --git a/services/mediatranscoding/tests/mediatranscodingservice_resource_tests.cpp b/services/mediatranscoding/tests/mediatranscodingservice_resource_tests.cpp
index bf99efc..790e80b 100644
--- a/services/mediatranscoding/tests/mediatranscodingservice_resource_tests.cpp
+++ b/services/mediatranscoding/tests/mediatranscodingservice_resource_tests.cpp
@@ -17,7 +17,11 @@
// Unit Test for MediaTranscodingService.
//#define LOG_NDEBUG 0
-#define LOG_TAG "MediaTranscodingServiceRealTest"
+#define LOG_TAG "MediaTranscodingServiceResourceTest"
+
+#include <aidl/android/media/BnResourceManagerClient.h>
+#include <aidl/android/media/IResourceManagerService.h>
+#include <binder/ActivityManager.h>
#include "MediaTranscodingServiceTestHelper.h"
@@ -43,6 +47,60 @@
#define OUTPATH(name) "/data/local/tmp/MediaTranscodingService_" #name ".MP4"
+/*
+ * The OOM score we're going to ask ResourceManager to use for our native transcoding
+ * service. ResourceManager issues reclaims based on these scores. It gets the scores
+ * from ActivityManagerService, which doesn't track native services. The values of the
+ * OOM scores are defined in:
+ * frameworks/base/services/core/java/com/android/server/am/ProcessList.java
+ * We use SERVICE_ADJ which is lower priority than an app possibly visible to the
+ * user, but higher priority than a cached app (which could be killed without disruption
+ * to the user).
+ */
+constexpr static int32_t SERVICE_ADJ = 500;
+
+using Status = ::ndk::ScopedAStatus;
+using aidl::android::media::BnResourceManagerClient;
+using aidl::android::media::IResourceManagerService;
+
+/*
+ * Placeholder ResourceManagerClient for registering process info override
+ * with the IResourceManagerService. This is only used as a token by the service
+ * to get notifications about binder death, not used for reclaiming resources.
+ */
+struct ResourceManagerClient : public BnResourceManagerClient {
+ explicit ResourceManagerClient() = default;
+
+ Status reclaimResource(bool* _aidl_return) override {
+ *_aidl_return = false;
+ return Status::ok();
+ }
+
+ Status getName(::std::string* _aidl_return) override {
+ _aidl_return->clear();
+ return Status::ok();
+ }
+
+ virtual ~ResourceManagerClient() = default;
+};
+
+static std::shared_ptr<ResourceManagerClient> gResourceManagerClient =
+ ::ndk::SharedRefBase::make<ResourceManagerClient>();
+
+void TranscodingHelper_setProcessInfoOverride(int32_t procState, int32_t oomScore) {
+ ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager"));
+ std::shared_ptr<IResourceManagerService> service = IResourceManagerService::fromBinder(binder);
+ if (service == nullptr) {
+ ALOGE("Failed to get IResourceManagerService");
+ return;
+ }
+ Status status =
+ service->overrideProcessInfo(gResourceManagerClient, getpid(), procState, oomScore);
+ if (!status.isOk()) {
+ ALOGW("Failed to setProcessInfoOverride.");
+ }
+}
+
class MediaTranscodingServiceResourceTest : public MediaTranscodingServiceTestBase {
public:
MediaTranscodingServiceResourceTest() { ALOGI("MediaTranscodingServiceResourceTest created"); }
@@ -62,9 +120,20 @@
* cause the session to be paused. The activity will hold the codecs for a few seconds
* before releasing them, and the transcoding service should be able to resume
* and complete the session.
+ *
+ * Note that this test must run as root. We need to simulate submitting a request for a
+ * client {uid,pid} running at lower priority. As a cmd line test, it's not easy to get the
+ * pid of a living app, so we use our own {uid,pid} to submit. However, since we're a native
+ * process, RM doesn't have our proc info and the reclaim will fail. So we need to use
+ * RM's setProcessInfoOverride to override our proc info, which requires permission (unless root).
*/
TEST_F(MediaTranscodingServiceResourceTest, TestResourceLost) {
- ALOGD("TestResourceLost starting...");
+ ALOGD("TestResourceLost starting..., pid %d", ::getpid());
+
+ // We're going to submit the request using our own {uid,pid}. Since we're a native
+ // process, RM doesn't have our proc info and the reclaim will fail. So we need to use
+ // RM's setProcessInfoOverride to override our proc info.
+ TranscodingHelper_setProcessInfoOverride(ActivityManager::PROCESS_STATE_SERVICE, SERVICE_ADJ);
EXPECT_TRUE(ShellHelper::RunCmd("input keyevent KEYCODE_WAKEUP"));
EXPECT_TRUE(ShellHelper::RunCmd("wm dismiss-keyguard"));
@@ -81,8 +150,8 @@
// Submit session to Client1.
ALOGD("Submitting session to client1 (app A) ...");
- EXPECT_TRUE(
- mClient1->submit(0, srcPath0, dstPath0, TranscodingSessionPriority::kNormal, kBitRate));
+ EXPECT_TRUE(mClient1->submit(0, srcPath0, dstPath0, TranscodingSessionPriority::kNormal,
+ kBitRate, ::getpid(), ::getuid()));
// Client1's session should start immediately.
EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0));