diff options
-rw-r--r-- | libs/binder/Android.bp | 164 | ||||
-rw-r--r-- | libs/binder/liblog_stub/Android.bp | 1 | ||||
-rw-r--r-- | libs/binder/ndk/Android.bp | 52 | ||||
-rw-r--r-- | libs/binder/ndk/include_platform/android/binder_manager.h | 6 | ||||
-rw-r--r-- | libs/binder/ndk/service_manager.cpp | 20 | ||||
-rw-r--r-- | libs/binder/tests/Android.bp | 18 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcWireProtocolTest.cpp | 40 |
7 files changed, 262 insertions, 39 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 090e35bc37..cb1d1143bc 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -28,6 +28,7 @@ cc_library_headers { recovery_available: true, host_supported: true, native_bridge_supported: true, + cmake_snapshot_supported: true, header_libs: [ "libbinder_headers_platform_shared", @@ -83,6 +84,124 @@ cc_library_headers { }, } +cc_cmake_snapshot { + name: "binder_sdk", + modules: [ + "libbinder_sdk", + "libbinder_sdk_single_threaded", + "libbinder_ndk_sdk", + "binderRpcTestNoKernel", + ], + prebuilts: [ + // to enable arm64 host support, build with musl - e.g. on aosp_cf_arm64_phone + "aidl", + "libc++", + ], + include_sources: true, + cflags: [ + "-DNDEBUG", + "-DBINDER_ENABLE_LIBLOG_ASSERT", + "-DBINDER_DISABLE_NATIVE_HANDLE", + "-DBINDER_DISABLE_BLOB", + "-DBINDER_NO_LIBBASE", + "-DBINDER_NO_KERNEL_IPC_TESTING", + + // from Soong's global.go commonGlobalCflags and noOverrideGlobalCflags + "-Wno-c99-designator", + "-Wno-missing-field-initializers", + + // warnings that only pop up on gcc + "-Wno-unknown-pragmas", // "pragma clang" + "-Wno-attributes", // attributes on compound-statements + "-Wno-psabi", // reminders about old ABI changes + ], + cflags_ignored: [ + // gcc requires all header constexprs to be used in all dependent compilatinon units + "-Wunused-const-variable", + ], + library_mapping: [ + { + android_name: "libssl", + mapped_name: "ssl", + package_pregenerated: "external/boringssl", + }, + { + android_name: "libcrypto", + mapped_name: "crypto", + package_pregenerated: "external/boringssl", + }, + { + android_name: "libgtest", + mapped_name: "GTest::gtest", + package_system: "GTest", + }, + { + android_name: "libgtest_main", + mapped_name: "GTest::gtest", + package_system: "GTest", + }, + + // use libbinder_sdk and friends instead of full Android's libbinder + { + android_name: "libbinder_rpc_no_kernel", + mapped_name: "android::libbinder_sdk", + }, + { + android_name: "libbinder_rpc_single_threaded_no_kernel", + mapped_name: "android::libbinder_sdk_single_threaded", + }, + { + android_name: "libbinder_headers", + mapped_name: "android::libbinder_headers_base", + }, + { + android_name: "libbinder", + mapped_name: "android::libbinder_sdk", + }, + { + android_name: "libbinder_ndk", + mapped_name: "android::libbinder_ndk_sdk", + }, + { + android_name: "liblog", + mapped_name: "android::liblog_stub", + }, + + // explicitly included by Binder tests, but not needed outside of Android + { + android_name: "libbase", + }, + { + android_name: "libcutils", + }, + { + android_name: "libutils", + }, + + // disable tests that don't work outside of Android yet + { + android_name: "binder_rpc_test_service", + }, + { + android_name: "binder_rpc_test_service_single_threaded", + }, + + // trusty mocks are artificially triggered and not needed outside of Android build + { + android_name: "libbinder_on_trusty_mock", + }, + { + android_name: "libbinder_ndk_on_trusty_mock", + }, + { + android_name: "binderRpcTestService_on_trusty_mock", + }, + { + android_name: "binderRpcTest_on_trusty_mock", + }, + ], +} + // These interfaces are android-specific implementation unrelated to binder // transport itself and should be moved to AIDL or in domain-specific libs. // @@ -126,6 +245,9 @@ cc_defaults { header_libs: [ "libbinder_headers_base", ], + export_header_lib_headers: [ + "libbinder_headers_base", + ], cflags: [ "-Wextra", @@ -369,6 +491,7 @@ cc_library { double_loadable: true, // TODO(b/153609531): remove when no longer needed. native_bridge_supported: true, + cmake_snapshot_supported: false, // libbinder does not offer a stable wire protocol. // if a second copy of it is installed, then it may break after security @@ -408,16 +531,8 @@ cc_library { afdo: true, } -cc_library_host_shared { - name: "libbinder_sdk", - - defaults: [ - "libbinder_common_defaults", - ], - - shared_libs: [ - "libutils_binder_sdk", - ], +cc_defaults { + name: "binder_sdk_defaults", cflags: [ "-DBINDER_ENABLE_LIBLOG_ASSERT", @@ -429,6 +544,21 @@ cc_library_host_shared { header_libs: [ "liblog_stub", ], +} + +cc_defaults { + name: "libbinder_sdk_defaults", + + cmake_snapshot_supported: true, + + defaults: [ + "libbinder_common_defaults", + "binder_sdk_defaults", + ], + + shared_libs: [ + "libutils_binder_sdk", + ], srcs: [ "OS_non_android_linux.cpp", @@ -446,6 +576,19 @@ cc_library_host_shared { }, } +cc_library_host_shared { + name: "libbinder_sdk", + defaults: ["libbinder_sdk_defaults"], +} + +cc_library_host_shared { + name: "libbinder_sdk_single_threaded", + defaults: ["libbinder_sdk_defaults"], + cflags: [ + "-DBINDER_RPC_SINGLE_THREADED", + ], +} + cc_library { name: "libbinder_rpc_no_kernel", vendor_available: true, @@ -535,6 +678,7 @@ cc_defaults { defaults: ["libbinder_tls_shared_deps"], vendor_available: true, host_supported: true, + cmake_snapshot_supported: true, header_libs: [ "libbinder_headers", diff --git a/libs/binder/liblog_stub/Android.bp b/libs/binder/liblog_stub/Android.bp index f2ca22fdb0..2de6658419 100644 --- a/libs/binder/liblog_stub/Android.bp +++ b/libs/binder/liblog_stub/Android.bp @@ -30,6 +30,7 @@ cc_library_headers { product_available: true, recovery_available: true, vendor_available: true, + cmake_snapshot_supported: true, target: { windows: { diff --git a/libs/binder/ndk/Android.bp b/libs/binder/ndk/Android.bp index 9a2d14af32..26c228d9a4 100644 --- a/libs/binder/ndk/Android.bp +++ b/libs/binder/ndk/Android.bp @@ -32,17 +32,11 @@ license { ], } -cc_library { - name: "libbinder_ndk", - +cc_defaults { + name: "libbinder_ndk_common_defaults", host_supported: true, recovery_available: true, - llndk: { - symbol_file: "libbinder_ndk.map.txt", - export_llndk_headers: ["libvendorsupport_llndk_headers"], - }, - export_include_dirs: [ "include_cpp", "include_ndk", @@ -50,7 +44,6 @@ cc_library { ], cflags: [ - "-DBINDER_WITH_KERNEL_IPC", "-Wall", "-Wextra", "-Wextra-semi", @@ -59,14 +52,48 @@ cc_library { srcs: [ "ibinder.cpp", - "ibinder_jni.cpp", "libbinder.cpp", "parcel.cpp", + "stability.cpp", + "status.cpp", + ], +} + +cc_library_host_shared { + name: "libbinder_ndk_sdk", + + defaults: [ + "libbinder_ndk_common_defaults", + "binder_sdk_defaults", + ], + cmake_snapshot_supported: true, + + shared_libs: [ + "libbinder_sdk", + "libutils_binder_sdk", + ], +} + +cc_library { + name: "libbinder_ndk", + + defaults: ["libbinder_ndk_common_defaults"], + cmake_snapshot_supported: false, + + llndk: { + symbol_file: "libbinder_ndk.map.txt", + export_llndk_headers: ["libvendorsupport_llndk_headers"], + }, + + cflags: [ + "-DBINDER_WITH_KERNEL_IPC", + ], + + srcs: [ + "ibinder_jni.cpp", "parcel_jni.cpp", "persistable_bundle.cpp", "process.cpp", - "stability.cpp", - "status.cpp", "service_manager.cpp", ], @@ -195,6 +222,7 @@ cc_library_headers { host_supported: true, // TODO(b/153609531): remove when no longer needed. native_bridge_supported: true, + cmake_snapshot_supported: true, target: { darwin: { enabled: false, diff --git a/libs/binder/ndk/include_platform/android/binder_manager.h b/libs/binder/ndk/include_platform/android/binder_manager.h index 52edae4a38..41b30a0a0f 100644 --- a/libs/binder/ndk/include_platform/android/binder_manager.h +++ b/libs/binder/ndk/include_platform/android/binder_manager.h @@ -30,7 +30,11 @@ enum AServiceManager_AddServiceFlag : uint32_t { * Services with methods that perform file IO, web socket creation or ways to egress data must * not be added with this flag for privacy concerns. */ - ADD_SERVICE_ALLOW_ISOLATED = 1, + ADD_SERVICE_ALLOW_ISOLATED = 1 << 0, + ADD_SERVICE_DUMP_FLAG_PRIORITY_CRITICAL = 1 << 1, + ADD_SERVICE_DUMP_FLAG_PRIORITY_HIGH = 1 << 2, + ADD_SERVICE_DUMP_FLAG_PRIORITY_NORMAL = 1 << 3, + ADD_SERVICE_DUMP_FLAG_PRIORITY_DEFAULT = 1 << 4, }; /** diff --git a/libs/binder/ndk/service_manager.cpp b/libs/binder/ndk/service_manager.cpp index 5529455cc6..4436dbeed7 100644 --- a/libs/binder/ndk/service_manager.cpp +++ b/libs/binder/ndk/service_manager.cpp @@ -49,7 +49,25 @@ binder_exception_t AServiceManager_addServiceWithFlags(AIBinder* binder, const c sp<IServiceManager> sm = defaultServiceManager(); bool allowIsolated = flags & AServiceManager_AddServiceFlag::ADD_SERVICE_ALLOW_ISOLATED; - status_t exception = sm->addService(String16(instance), binder->getBinder(), allowIsolated); + int dumpFlags = 0; + if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_CRITICAL) { + dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_CRITICAL; + } + if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_HIGH) { + dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_HIGH; + } + if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_NORMAL) { + dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_NORMAL; + } + if (flags & AServiceManager_AddServiceFlag::ADD_SERVICE_DUMP_FLAG_PRIORITY_DEFAULT) { + dumpFlags |= IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT; + } + if (dumpFlags == 0) { + dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT; + } + status_t exception = + sm->addService(String16(instance), binder->getBinder(), allowIsolated, dumpFlags); + return PruneException(exception); } diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index 8771af52f3..4c7684ccb7 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -25,6 +25,7 @@ package { cc_defaults { name: "binder_test_defaults", + cmake_snapshot_supported: true, cflags: [ "-Wall", "-Werror", @@ -142,6 +143,7 @@ aidl_interface { name: "binderRpcTestIface", vendor_available: true, host_supported: true, + cmake_snapshot_supported: true, unstable: true, srcs: [ "BinderRpcTestClientInfo.aidl", @@ -223,6 +225,7 @@ cc_library_static { cc_defaults { name: "binderRpcTest_common_defaults", host_supported: true, + cmake_snapshot_supported: true, target: { darwin: { enabled: false, @@ -264,6 +267,7 @@ cc_defaults { defaults: [ "binderRpcTest_common_defaults", ], + compile_multilib: "first", srcs: [ "binderRpcTest.cpp", @@ -333,7 +337,7 @@ cc_defaults { ], } -cc_test { +cc_binary { // The module name cannot start with "binderRpcTest" because // then atest tries to execute it as part of binderRpcTest name: "binder_rpc_test_service", @@ -344,7 +348,7 @@ cc_test { ], } -cc_test { +cc_binary { name: "binder_rpc_test_service_no_kernel", defaults: [ "binderRpcTest_service_defaults", @@ -355,7 +359,7 @@ cc_test { ], } -cc_test { +cc_binary { name: "binder_rpc_test_service_single_threaded", defaults: [ "binderRpcTest_service_defaults", @@ -370,7 +374,7 @@ cc_test { ], } -cc_test { +cc_binary { name: "binder_rpc_test_service_single_threaded_no_kernel", defaults: [ "binderRpcTest_service_defaults", @@ -382,6 +386,9 @@ cc_test { static_libs: [ "libbinder_rpc_single_threaded_no_kernel", ], + shared_libs: [ + "libbinder_ndk", + ], } cc_binary { @@ -502,6 +509,9 @@ cc_test { static_libs: [ "libbinder_rpc_single_threaded_no_kernel", ], + shared_libs: [ + "libbinder_ndk", + ], } cc_test { diff --git a/libs/binder/tests/binderRpcWireProtocolTest.cpp b/libs/binder/tests/binderRpcWireProtocolTest.cpp index e59dc82b2b..91145f0c13 100644 --- a/libs/binder/tests/binderRpcWireProtocolTest.cpp +++ b/libs/binder/tests/binderRpcWireProtocolTest.cpp @@ -14,14 +14,15 @@ * limitations under the License. */ -#include <android-base/logging.h> -#include <android-base/properties.h> -#include <android-base/strings.h> #include <binder/Parcel.h> #include <binder/RpcSession.h> #include <binder/Status.h> #include <gtest/gtest.h> +#ifdef __ANDROID__ +#include <android-base/properties.h> +#endif + #include "../Debug.h" #include "../Utils.h" @@ -69,8 +70,8 @@ static const std::vector<std::function<void(Parcel* p)>> kFillFuns { [](Parcel* p) { ASSERT_EQ(OK, p->writeString16(String16(u"a"))); }, [](Parcel* p) { ASSERT_EQ(OK, p->writeString16(String16(u"baba"))); }, [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinder(nullptr)); }, - [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Array(arraysize(kInt32Array), kInt32Array)); }, - [](Parcel* p) { ASSERT_EQ(OK, p->writeByteArray(arraysize(kByteArray), kByteArray)); }, + [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Array(countof(kInt32Array), kInt32Array)); }, + [](Parcel* p) { ASSERT_EQ(OK, p->writeByteArray(countof(kByteArray), kByteArray)); }, [](Parcel* p) { ASSERT_EQ(OK, p->writeBool(true)); }, [](Parcel* p) { ASSERT_EQ(OK, p->writeBool(false)); }, [](Parcel* p) { ASSERT_EQ(OK, p->writeChar('a')); }, @@ -162,8 +163,8 @@ static const std::vector<std::function<void(Parcel* p)>> kFillFuns { static void setParcelForRpc(Parcel* p, uint32_t version) { auto session = RpcSession::make(); - CHECK(session->setProtocolVersion(version)); - CHECK_EQ(OK, session->addNullDebuggingClient()); + EXPECT_TRUE(session->setProtocolVersion(version)); + EXPECT_EQ(OK, session->addNullDebuggingClient()); p->markForRpc(session); } @@ -180,13 +181,25 @@ static std::string buildRepr(uint32_t version) { return result; } +// To be replaced with std::views::split (and std::views::zip) once C++ compilers catch up. +static std::vector<std::string> split(std::string_view s, char delimiter) { + std::vector<std::string> result; + size_t pos = 0; + while (true) { + const auto found = s.find(delimiter, pos); + result.emplace_back(s.substr(pos, found - pos)); + if (found == s.npos) return result; + pos = found + 1; + } +} + static void checkRepr(const std::string& repr, uint32_t version) { const std::string actualRepr = buildRepr(version); - auto expected = base::Split(repr, "|"); + auto expected = split(repr, '|'); ASSERT_EQ(expected.size(), kFillFuns.size()); - auto actual = base::Split(actualRepr, "|"); + auto actual = split(actualRepr, '|'); ASSERT_EQ(actual.size(), kFillFuns.size()); for (size_t i = 0; i < kFillFuns.size(); i++) { @@ -257,8 +270,13 @@ TEST(RpcWire, NextIsPlusOneReminder) { TEST(RpcWire, ReleaseBranchHasFrozenRpcWireProtocol) { if (RPC_WIRE_PROTOCOL_VERSION == RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL) { - EXPECT_FALSE(base::GetProperty("ro.build.version.codename", "") == "REL") - << "Binder RPC wire protocol must be frozen on a release branch!"; +#ifdef __ANDROID__ + bool isRelease = base::GetProperty("ro.build.version.codename", "") == "REL"; +#else + bool isRelease = true; +#endif + EXPECT_FALSE(isRelease) + << "Binder RPC wire protocol must be frozen in release configuration!"; } } |