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

Commit ff998616 authored by Jiyong Park's avatar Jiyong Park
Browse files

Guard __AActivityManager_* APIs with __builtin_available

* AActivityManager_checkPermission
* AActivityManager_addUidImportanceListener
* AActivityManager_removeUidImportanceListener
* AActivityManager_isUidActive
* AActivityManager_getUidImportance

Above APIs were added for the API level 31 and beyond. Currently,their
existence is not tested before calling them, which can result linkage
error at runtime when the code runs on pre-31 platforms.

Now, we have a preferred way of testing the API availability;
__builtin_available. The calls to the APIs are now guarded with the
macro so that they get called only on the platforms they are available.

Bug: 150860940
Bug: 134795810
Test: m
Change-Id: I442426641a33bcdb341a166e68f300e539fc85d2
parent ae8ef795
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -302,12 +302,14 @@ bool TranscodingClientManager::isTrustedCaller(pid_t pid, uid_t uid) {
    }

    int32_t result;
    if (__builtin_available(android 31, *)) {
        if (APermissionManager_checkPermission("android.permission.WRITE_MEDIA_STORAGE", pid, uid,
                                               &result) == PERMISSION_MANAGER_STATUS_OK &&
            result == PERMISSION_MANAGER_PERMISSION_GRANTED) {
            mTrustedUids.insert(uid);
            return true;
        }
    }

    return false;
}
+16 −9
Original line number Diff line number Diff line
@@ -48,8 +48,9 @@ void TranscodingUidPolicy::OnUidImportance(uid_t uid, int32_t uidImportance, voi
}

void TranscodingUidPolicy::registerSelf() {
    mUidObserver = AActivityManager_addUidImportanceListener(
            &OnUidImportance, -1, (void*)this);
    if (__builtin_available(android 31, *)) {
        mUidObserver = AActivityManager_addUidImportanceListener(&OnUidImportance, -1, (void*)this);
    }

    if (mUidObserver == nullptr) {
        ALOGE("Failed to register uid observer");
@@ -62,12 +63,16 @@ void TranscodingUidPolicy::registerSelf() {
}

void TranscodingUidPolicy::unregisterSelf() {
    if (__builtin_available(android 31, *)) {
        AActivityManager_removeUidImportanceListener(mUidObserver);
        mUidObserver = nullptr;

        Mutex::Autolock _l(mUidLock);
        mRegistered = false;
        ALOGI("Unregistered uid observer");
    } else {
        ALOGE("Failed to unregister uid observer");
    }
}

void TranscodingUidPolicy::setCallback(const std::shared_ptr<UidPolicyCallbackInterface>& cb) {
@@ -86,9 +91,11 @@ void TranscodingUidPolicy::registerMonitorUid(uid_t uid) {
    }

    int32_t state = IMPORTANCE_UNKNOWN;
    if (__builtin_available(android 31, *)) {
        if (mRegistered && AActivityManager_isUidActive(uid)) {
            state = AActivityManager_getUidImportance(uid);
        }
    }

    ALOGV("%s: inserting new uid: %u, procState %d", __FUNCTION__, uid, state);

+12 −10
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ binder_status_t MediaTranscodingService::dump(int fd, const char** /*args*/, uin

    uid_t callingUid = AIBinder_getCallingUid();
    pid_t callingPid = AIBinder_getCallingPid();
    if (__builtin_available(android 31, *)) {
        int32_t permissionResult;
        if (APermissionManager_checkPermission("android.permission.DUMP", callingPid, callingUid,
                                               &permissionResult) != PERMISSION_MANAGER_STATUS_OK ||
@@ -73,6 +74,7 @@ binder_status_t MediaTranscodingService::dump(int fd, const char** /*args*/, uin
            write(fd, result.string(), result.size());
            return PERMISSION_DENIED;
        }
    }

    const size_t SIZE = 256;
    char buffer[SIZE];