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

Commit 89dd7fe2 authored by Jooyung Han's avatar Jooyung Han Committed by android-build-merger
Browse files

Merge "Add libandroid_runtime_lazy"

am: c10e80f5

Change-Id: Id212cf0bf1af64916835a5a79c09ea927def9e1a
parents b9814060 c10e80f5
Loading
Loading
Loading
Loading
+65 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// libandroid_runtime_lazy is a shim library.
// This provides very limited small set of APIs from libandroid_runtime.
//
// By depending on this instead of libandroid_runtime,
// a library can be loaded without paying the cost of libandroid_runtime
// which is quite huge. The cost will be paid when libandroid_runtime is actually used.
//
// For Partial-source PDK build, there is a constraint that
// frameworks/native modules should not depend on frameworks/base.
// This library can be used to cut down the dependency between them.
// (e.g. libbinder_ndk)
//
// Some libraries which serve as LL-NDK and NDK as well may depend on this
// instead of libandroid_runtime. When they are used by a vendor process,
// depending on libandroid_runtime is meaningless. In this case,
// they can depend on libandroid_runtime_lazy.
cc_library {
    name: "libandroid_runtime_lazy",
    vendor_available: true,

    cflags: [
        "-Wall",
        "-Werror",
        "-Wunused",
        "-Wunreachable-code",
    ],

    srcs: [
        "android_runtime_lazy.cpp",
    ],

    shared_libs: [
        "liblog",
        "libutils",
    ],

    required: [
        "libandroid_runtime",
    ],

    export_include_dirs: [
        "include",
    ],

    header_libs: [
        "jni_headers",
        "libbinder_headers",
    ],
}
+98 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#define LOG_TAG "ANDROID_RUNTIME_LAZY"
#include "android_runtime/AndroidRuntime.h"
#include "android_util_Binder.h"

#include <dlfcn.h>
#include <mutex>

#include <log/log.h>

namespace android {
namespace {

std::once_flag loadFlag;

typedef JNIEnv* (*getJNIEnv_t)();
typedef sp<IBinder> (*ibinderForJavaObject_t)(JNIEnv* env, jobject obj);
typedef jobject (*javaObjectForIBinder_t)(JNIEnv* env, const sp<IBinder>& val);

getJNIEnv_t _getJNIEnv;
ibinderForJavaObject_t _ibinderForJavaObject;
javaObjectForIBinder_t _javaObjectForIBinder;

void load() {
    std::call_once(loadFlag, []() {
        void* handle = dlopen("libandroid_runtime.so", RTLD_LAZY);
        if (handle == nullptr) {
            ALOGE("Could not open libandroid_runtime.");
            return;
        }

        _getJNIEnv = reinterpret_cast<getJNIEnv_t>(
                dlsym(handle, "_ZN7android14AndroidRuntime9getJNIEnvEv"));
        if (_getJNIEnv == nullptr) {
            ALOGW("Could not find getJNIEnv.");
            // no return
        }

        _ibinderForJavaObject = reinterpret_cast<ibinderForJavaObject_t>(
                dlsym(handle, "_ZN7android20ibinderForJavaObjectEP7_JNIEnvP8_jobject"));
        if (_ibinderForJavaObject == nullptr) {
            ALOGW("Could not find ibinderForJavaObject.");
            // no return
        }

        _javaObjectForIBinder = reinterpret_cast<javaObjectForIBinder_t>(
                dlsym(handle,
                      "_ZN7android20javaObjectForIBinderEP7_JNIEnvRKNS_2spINS_7IBinderEEE"));
        if (_javaObjectForIBinder == nullptr) {
            ALOGW("Could not find javaObjectForIBinder.");
            // no return
        }
    });
}

} // namespace

// exports delegate functions

JNIEnv* AndroidRuntime::getJNIEnv() {
    load();
    if (_getJNIEnv == nullptr) {
        return nullptr;
    }
    return _getJNIEnv();
}

sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) {
    load();
    if (_ibinderForJavaObject == nullptr) {
        return nullptr;
    }
    return _ibinderForJavaObject(env, obj);
}

jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) {
    load();
    if (_javaObjectForIBinder == nullptr) {
        return nullptr;
    }
    return _javaObjectForIBinder(env, val);
}

} // namespace android
+30 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "jni.h"

namespace android {

// Intentionally use the same name with AndroidRuntime in frameworks/base/core/jni/
// to make the client use this in the same way with the original class.
class AndroidRuntime {
public:
    static JNIEnv* getJNIEnv();
};

} // namespace android
+31 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <binder/IBinder.h>
#include "jni.h"

namespace android {

// The name of this file is same with the file in frameworks/base/core/jni/
// This is intentional to make the client use these exported functions
// in the same way with the original.

jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val);
sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj);

} // namespace android
+1 −6
Original line number Original line Diff line number Diff line
@@ -39,17 +39,12 @@ cc_library {
    ],
    ],


    shared_libs: [
    shared_libs: [
        "libandroid_runtime_lazy",
        "libbase",
        "libbase",
        "libbinder",
        "libbinder",
        "libutils",
        "libutils",
    ],
    ],


    required: [
        // libbinder_ndk may be used by Java and non-Java things. When lower-level things use it,
        // they shouldn't have to take on the cost of loading libandroid_runtime.
        "libandroid_runtime",
    ],

    header_libs: [
    header_libs: [
        "jni_headers",
        "jni_headers",
    ],
    ],
Loading