diff options
-rw-r--r-- | cmds/atrace/atrace.cpp | 4 | ||||
-rw-r--r-- | libs/binder/Android.bp | 14 | ||||
-rw-r--r-- | libs/binder/PermissionCache.cpp | 5 | ||||
-rw-r--r-- | libs/binder/ProcessState.cpp | 4 | ||||
-rw-r--r-- | libs/binder/RpcConnection.cpp | 33 | ||||
-rw-r--r-- | libs/binder/RpcServer.cpp | 10 | ||||
-rw-r--r-- | libs/binder/include/binder/IBinder.h | 30 | ||||
-rw-r--r-- | libs/binder/include/binder/PermissionCache.h | 2 | ||||
-rw-r--r-- | libs/binder/include/binder/RpcServer.h | 17 | ||||
-rw-r--r-- | libs/binder/ndk/Android.bp | 14 | ||||
-rw-r--r-- | libs/binder/rust/src/binder.rs | 27 | ||||
-rw-r--r-- | libs/binder/rust/src/lib.rs | 11 | ||||
-rw-r--r-- | libs/binder/rust/tests/integration.rs | 63 | ||||
-rw-r--r-- | libs/binder/rust/tests/ndk_rust_interop.rs | 35 | ||||
-rw-r--r-- | libs/binder/rust/tests/serialization.rs | 14 | ||||
-rw-r--r-- | libs/binder/tests/Android.bp | 3 | ||||
-rw-r--r-- | libs/nativewindow/Android.bp | 15 | ||||
-rw-r--r-- | opengl/Android.bp | 8 | ||||
-rw-r--r-- | opengl/libs/Android.bp | 52 | ||||
-rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 2 | ||||
-rw-r--r-- | vulkan/libvulkan/Android.bp | 15 |
21 files changed, 196 insertions, 182 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index 88a5872b01..6f5f70d1ed 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -320,9 +320,6 @@ static const char* k_funcgraphCpuPath = static const char* k_funcgraphProcPath = "options/funcgraph-proc"; -static const char* k_funcgraphFlatPath = - "options/funcgraph-flat"; - static const char* k_ftraceFilterPath = "set_ftrace_filter"; @@ -700,7 +697,6 @@ static bool setKernelTraceFuncs(const char* funcs) ok &= setKernelOptionEnable(k_funcgraphAbsTimePath, true); ok &= setKernelOptionEnable(k_funcgraphCpuPath, true); ok &= setKernelOptionEnable(k_funcgraphProcPath, true); - ok &= setKernelOptionEnable(k_funcgraphFlatPath, true); // Set the requested filter functions. ok &= truncateFile(k_ftraceFilterPath); diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index cba82071d4..3f110c9212 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -192,6 +192,9 @@ cc_library { // Only check our headers "--header-filter=^.*frameworks/native/libs/binder/.*.h$", ], + tidy_checks: [ + "-performance-no-int-to-ptr", + ], tidy_checks_as_errors: [ // Explicitly list the checks that should not occur in this module. "abseil-*", @@ -199,20 +202,9 @@ cc_library { "bugprone-*", "cert-*", "clang-analyzer-*", - "-clang-analyzer-core.CallAndMessage", - "-clang-analyzer-core.uninitialized.Assign", - "-clang-analyzer-unix.Malloc", - "-clang-analyzer-deadcode.DeadStores", - "-clang-analyzer-optin.cplusplus.UninitializedObject", "google-*", - "-google-readability-*", - "-google-runtime-references", "misc-*", - "-misc-no-recursion", - "-misc-redundant-expression", - "-misc-unused-using-decls", "performance*", - "-performance-no-int-to-ptr", "portability*", ], diff --git a/libs/binder/PermissionCache.cpp b/libs/binder/PermissionCache.cpp index 6eae5efc29..670fd55da3 100644 --- a/libs/binder/PermissionCache.cpp +++ b/libs/binder/PermissionCache.cpp @@ -109,5 +109,10 @@ bool PermissionCache::checkPermission( return granted; } +void PermissionCache::purgeCache() { + PermissionCache& pc(PermissionCache::getInstance()); + pc.purge(); +} + // --------------------------------------------------------------------------- } // namespace android diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index ca99042342..a2efb1c95f 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -362,7 +362,7 @@ status_t ProcessState::setThreadPoolMaxThreadCount(size_t maxThreads) { status_t ProcessState::enableOnewaySpamDetection(bool enable) { uint32_t enableDetection = enable ? 1 : 0; if (ioctl(mDriverFD, BINDER_ENABLE_ONEWAY_SPAM_DETECTION, &enableDetection) == -1) { - ALOGE("Binder ioctl to enable oneway spam detection failed: %s", strerror(errno)); + ALOGI("Binder ioctl to enable oneway spam detection failed: %s", strerror(errno)); return -errno; } return NO_ERROR; @@ -401,7 +401,7 @@ static int open_driver(const char *driver) uint32_t enable = DEFAULT_ENABLE_ONEWAY_SPAM_DETECTION; result = ioctl(fd, BINDER_ENABLE_ONEWAY_SPAM_DETECTION, &enable); if (result == -1) { - ALOGE("Binder ioctl to enable oneway spam detection failed: %s", strerror(errno)); + ALOGI("Binder ioctl to enable oneway spam detection failed: %s", strerror(errno)); } } else { ALOGW("Opening '%s' failed: %s\n", driver, strerror(errno)); diff --git a/libs/binder/RpcConnection.cpp b/libs/binder/RpcConnection.cpp index 1388a801e4..f2302f7e56 100644 --- a/libs/binder/RpcConnection.cpp +++ b/libs/binder/RpcConnection.cpp @@ -130,24 +130,21 @@ bool RpcConnection::addVsockClient(unsigned int cid, unsigned int port) { #endif // __BIONIC__ -class SocketAddressImpl : public RpcConnection::SocketAddress { +class InetSocketAddress : public RpcConnection::SocketAddress { public: - SocketAddressImpl(const sockaddr* addr, size_t size, const String8& desc) - : mAddr(addr), mSize(size), mDesc(desc) {} + InetSocketAddress(const sockaddr* sockAddr, size_t size, const char* addr, unsigned int port) + : mSockAddr(sockAddr), mSize(size), mAddr(addr), mPort(port) {} [[nodiscard]] std::string toString() const override { - return std::string(mDesc.c_str(), mDesc.size()); + return String8::format("%s:%u", mAddr, mPort).c_str(); } - [[nodiscard]] const sockaddr* addr() const override { return mAddr; } + [[nodiscard]] const sockaddr* addr() const override { return mSockAddr; } [[nodiscard]] size_t addrSize() const override { return mSize; } - void set(const sockaddr* addr, size_t size) { - mAddr = addr; - mSize = size; - } private: - const sockaddr* mAddr = nullptr; - size_t mSize = 0; - String8 mDesc; + const sockaddr* mSockAddr; + size_t mSize; + const char* mAddr; + unsigned int mPort; }; AddrInfo GetAddrInfo(const char* addr, unsigned int port) { @@ -170,14 +167,15 @@ AddrInfo GetAddrInfo(const char* addr, unsigned int port) { } bool RpcConnection::setupInetServer(unsigned int port) { - auto aiStart = GetAddrInfo("127.0.0.1", port); + const char* kAddr = "127.0.0.1"; + + auto aiStart = GetAddrInfo(kAddr, port); if (aiStart == nullptr) return false; - SocketAddressImpl socketAddress(nullptr, 0, String8::format("127.0.0.1:%u", port)); for (auto ai = aiStart.get(); ai != nullptr; ai = ai->ai_next) { - socketAddress.set(ai->ai_addr, ai->ai_addrlen); + InetSocketAddress socketAddress(ai->ai_addr, ai->ai_addrlen, kAddr, port); if (setupSocketServer(socketAddress)) return true; } - ALOGE("None of the socket address resolved for 127.0.0.1:%u can be set up as inet server.", + ALOGE("None of the socket address resolved for %s:%u can be set up as inet server.", kAddr, port); return false; } @@ -185,9 +183,8 @@ bool RpcConnection::setupInetServer(unsigned int port) { bool RpcConnection::addInetClient(const char* addr, unsigned int port) { auto aiStart = GetAddrInfo(addr, port); if (aiStart == nullptr) return false; - SocketAddressImpl socketAddress(nullptr, 0, String8::format("%s:%u", addr, port)); for (auto ai = aiStart.get(); ai != nullptr; ai = ai->ai_next) { - socketAddress.set(ai->ai_addr, ai->ai_addrlen); + InetSocketAddress socketAddress(ai->ai_addr, ai->ai_addrlen, addr, port); if (addSocketClient(socketAddress)) return true; } ALOGE("None of the socket address resolved for %s:%u can be added as inet client.", addr, port); diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index 1fa37bacb3..9a0be921a7 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -30,8 +30,6 @@ namespace android { -using base::unique_fd; - RpcServer::RpcServer() {} RpcServer::~RpcServer() {} @@ -48,16 +46,20 @@ sp<RpcConnection> RpcServer::addClientConnection() { auto connection = RpcConnection::make(); connection->setForServer(sp<RpcServer>::fromExisting(this)); - mConnections.push_back(connection); + { + std::lock_guard<std::mutex> _l(mLock); + mConnections.push_back(connection); + } return connection; } void RpcServer::setRootObject(const sp<IBinder>& binder) { - LOG_ALWAYS_FATAL_IF(mRootObject != nullptr, "There can only be one root object"); + std::lock_guard<std::mutex> _l(mLock); mRootObject = binder; } sp<IBinder> RpcServer::getRootObject() { + std::lock_guard<std::mutex> _l(mLock); return mRootObject; } diff --git a/libs/binder/include/binder/IBinder.h b/libs/binder/include/binder/IBinder.h index 31f63c86b8..52f221d5b2 100644 --- a/libs/binder/include/binder/IBinder.h +++ b/libs/binder/include/binder/IBinder.h @@ -49,39 +49,39 @@ class [[clang::lto_visibility_public]] IBinder : public virtual RefBase { public: enum { - FIRST_CALL_TRANSACTION = 0x00000001, - LAST_CALL_TRANSACTION = 0x00ffffff, + FIRST_CALL_TRANSACTION = 0x00000001, + LAST_CALL_TRANSACTION = 0x00ffffff, - PING_TRANSACTION = B_PACK_CHARS('_','P','N','G'), - DUMP_TRANSACTION = B_PACK_CHARS('_','D','M','P'), - SHELL_COMMAND_TRANSACTION = B_PACK_CHARS('_','C','M','D'), - INTERFACE_TRANSACTION = B_PACK_CHARS('_', 'N', 'T', 'F'), - SYSPROPS_TRANSACTION = B_PACK_CHARS('_', 'S', 'P', 'R'), - EXTENSION_TRANSACTION = B_PACK_CHARS('_', 'E', 'X', 'T'), - DEBUG_PID_TRANSACTION = B_PACK_CHARS('_', 'P', 'I', 'D'), + PING_TRANSACTION = B_PACK_CHARS('_', 'P', 'N', 'G'), + DUMP_TRANSACTION = B_PACK_CHARS('_', 'D', 'M', 'P'), + SHELL_COMMAND_TRANSACTION = B_PACK_CHARS('_', 'C', 'M', 'D'), + INTERFACE_TRANSACTION = B_PACK_CHARS('_', 'N', 'T', 'F'), + SYSPROPS_TRANSACTION = B_PACK_CHARS('_', 'S', 'P', 'R'), + EXTENSION_TRANSACTION = B_PACK_CHARS('_', 'E', 'X', 'T'), + DEBUG_PID_TRANSACTION = B_PACK_CHARS('_', 'P', 'I', 'D'), // See android.os.IBinder.TWEET_TRANSACTION // Most importantly, messages can be anything not exceeding 130 UTF-8 // characters, and callees should exclaim "jolly good message old boy!" - TWEET_TRANSACTION = B_PACK_CHARS('_', 'T', 'W', 'T'), + TWEET_TRANSACTION = B_PACK_CHARS('_', 'T', 'W', 'T'), // See android.os.IBinder.LIKE_TRANSACTION // Improve binder self-esteem. - LIKE_TRANSACTION = B_PACK_CHARS('_', 'L', 'I', 'K'), + LIKE_TRANSACTION = B_PACK_CHARS('_', 'L', 'I', 'K'), // Corresponds to TF_ONE_WAY -- an asynchronous call. - FLAG_ONEWAY = 0x00000001, + FLAG_ONEWAY = 0x00000001, // Corresponds to TF_CLEAR_BUF -- clear transaction buffers after call // is made - FLAG_CLEAR_BUF = 0x00000020, + FLAG_CLEAR_BUF = 0x00000020, // Private userspace flag for transaction which is being requested from // a vendor context. - FLAG_PRIVATE_VENDOR = 0x10000000, + FLAG_PRIVATE_VENDOR = 0x10000000, }; - IBinder(); + IBinder(); /** * Check if this IBinder implements the interface named by diff --git a/libs/binder/include/binder/PermissionCache.h b/libs/binder/include/binder/PermissionCache.h index 835a3a8eb8..21aa705ff7 100644 --- a/libs/binder/include/binder/PermissionCache.h +++ b/libs/binder/include/binder/PermissionCache.h @@ -73,6 +73,8 @@ public: static bool checkPermission(const String16& permission, pid_t pid, uid_t uid); + + static void purgeCache(); }; // --------------------------------------------------------------------------- diff --git a/libs/binder/include/binder/RpcServer.h b/libs/binder/include/binder/RpcServer.h index d29b651f0b..a665fad43a 100644 --- a/libs/binder/include/binder/RpcServer.h +++ b/libs/binder/include/binder/RpcServer.h @@ -21,6 +21,8 @@ #include <utils/Errors.h> #include <utils/RefBase.h> +#include <mutex> + // WARNING: This is a feature which is still in development, and it is subject // to radical change. Any production use of this may subject your code to any // number of problems. @@ -30,9 +32,6 @@ namespace android { /** * This represents a server of an interface, which may be connected to by any * number of clients over sockets. - * - * This object is not (currently) thread safe. All calls to it are expected to - * happen at process startup. */ class RpcServer final : public virtual RefBase { public: @@ -51,16 +50,8 @@ public: sp<RpcConnection> addClientConnection(); /** - * Allowing a server to explicitly drop clients would be easy to add here, - * but it is not currently implemented, since users of this functionality - * could not use similar functionality if they are running under real - * binder. - */ - // void drop(const sp<RpcConnection>& connection); - - /** * The root object can be retrieved by any client, without any - * authentication. + * authentication. TODO(b/183988761) */ void setRootObject(const sp<IBinder>& binder); @@ -77,8 +68,8 @@ private: bool mAgreedExperimental = false; + std::mutex mLock; sp<IBinder> mRootObject; - std::vector<sp<RpcConnection>> mConnections; // per-client }; diff --git a/libs/binder/ndk/Android.bp b/libs/binder/ndk/Android.bp index eb103d3d77..b03e24cd1a 100644 --- a/libs/binder/ndk/Android.bp +++ b/libs/binder/ndk/Android.bp @@ -55,7 +55,9 @@ cc_library { defaults: ["libbinder_ndk_host_user"], host_supported: true, - llndk_stubs: "libbinder_ndk.llndk", + llndk: { + symbol_file: "libbinder_ndk.map.txt", + }, export_include_dirs: [ "include_cpp", @@ -192,13 +194,3 @@ ndk_library { symbol_file: "libbinder_ndk.map.txt", first_version: "29", } - -llndk_library { - name: "libbinder_ndk.llndk", - symbol_file: "libbinder_ndk.map.txt", - export_include_dirs: [ - "include_cpp", - "include_ndk", - "include_platform", - ], -} diff --git a/libs/binder/rust/src/binder.rs b/libs/binder/rust/src/binder.rs index 321b422185..695a83e414 100644 --- a/libs/binder/rust/src/binder.rs +++ b/libs/binder/rust/src/binder.rs @@ -548,6 +548,28 @@ unsafe impl<T, V: AsNative<T>> AsNative<T> for Option<V> { } } +/// The features to enable when creating a native Binder. +/// +/// This should always be initialised with a default value, e.g.: +/// ``` +/// # use binder::BinderFeatures; +/// BinderFeatures { +/// set_requesting_sid: true, +/// ..BinderFeatures::default(), +/// } +/// ``` +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct BinderFeatures { + /// Indicates that the service intends to receive caller security contexts. This must be true + /// for `ThreadState::with_calling_sid` to work. + pub set_requesting_sid: bool, + // Ensure that clients include a ..BinderFeatures::default() to preserve backwards compatibility + // when new fields are added. #[non_exhaustive] doesn't work because it prevents struct + // expressions entirely. + #[doc(hidden)] + pub _non_exhaustive: (), +} + /// Declare typed interfaces for a binder object. /// /// Given an interface trait and descriptor string, create a native and remote @@ -730,8 +752,9 @@ macro_rules! declare_binder_interface { impl $native { /// Create a new binder service. - pub fn new_binder<T: $interface + Sync + Send + 'static>(inner: T) -> $crate::Strong<dyn $interface> { - let binder = $crate::Binder::new_with_stability($native(Box::new(inner)), $stability); + pub fn new_binder<T: $interface + Sync + Send + 'static>(inner: T, features: $crate::BinderFeatures) -> $crate::Strong<dyn $interface> { + let mut binder = $crate::Binder::new_with_stability($native(Box::new(inner)), $stability); + $crate::IBinderInternal::set_requesting_sid(&mut binder, features.set_requesting_sid); $crate::Strong::new(Box::new(binder)) } } diff --git a/libs/binder/rust/src/lib.rs b/libs/binder/rust/src/lib.rs index 30928a5cff..2694cba870 100644 --- a/libs/binder/rust/src/lib.rs +++ b/libs/binder/rust/src/lib.rs @@ -107,10 +107,9 @@ use binder_ndk_sys as sys; pub mod parcel; pub use crate::binder::{ - FromIBinder, IBinder, IBinderInternal, Interface, InterfaceClass, Remotable, - Stability, Strong, TransactionCode, TransactionFlags, Weak, - FIRST_CALL_TRANSACTION, FLAG_CLEAR_BUF, FLAG_ONEWAY, FLAG_PRIVATE_LOCAL, - LAST_CALL_TRANSACTION, + BinderFeatures, FromIBinder, IBinder, IBinderInternal, Interface, InterfaceClass, Remotable, + Stability, Strong, TransactionCode, TransactionFlags, Weak, FIRST_CALL_TRANSACTION, + FLAG_CLEAR_BUF, FLAG_ONEWAY, FLAG_PRIVATE_LOCAL, LAST_CALL_TRANSACTION, }; pub use error::{status_t, ExceptionCode, Result, Status, StatusCode}; pub use native::add_service; @@ -125,8 +124,8 @@ pub mod public_api { pub use super::parcel::ParcelFileDescriptor; pub use super::{add_service, get_interface}; pub use super::{ - DeathRecipient, ExceptionCode, IBinder, Interface, ProcessState, SpIBinder, Status, - StatusCode, Strong, ThreadState, Weak, WpIBinder, + BinderFeatures, DeathRecipient, ExceptionCode, IBinder, Interface, ProcessState, SpIBinder, + Status, StatusCode, Strong, ThreadState, Weak, WpIBinder, }; /// Binder result containing a [`Status`] on error. diff --git a/libs/binder/rust/tests/integration.rs b/libs/binder/rust/tests/integration.rs index 60e3502759..03320076cb 100644 --- a/libs/binder/rust/tests/integration.rs +++ b/libs/binder/rust/tests/integration.rs @@ -19,7 +19,7 @@ use binder::declare_binder_interface; use binder::parcel::Parcel; use binder::{ - Binder, IBinderInternal, Interface, StatusCode, ThreadState, TransactionCode, + Binder, BinderFeatures, IBinderInternal, Interface, StatusCode, ThreadState, TransactionCode, FIRST_CALL_TRANSACTION, }; use std::convert::{TryFrom, TryInto}; @@ -55,7 +55,8 @@ fn main() -> Result<(), &'static str> { }))); service.set_requesting_sid(true); if let Some(extension_name) = extension_name { - let extension = BnTest::new_binder(TestService { s: extension_name }); + let extension = + BnTest::new_binder(TestService { s: extension_name }, BinderFeatures::default()); service .set_extension(&mut extension.as_binder()) .expect("Could not add extension"); @@ -212,8 +213,8 @@ mod tests { use std::time::Duration; use binder::{ - Binder, DeathRecipient, FromIBinder, IBinder, IBinderInternal, Interface, SpIBinder, - StatusCode, Strong, + Binder, BinderFeatures, DeathRecipient, FromIBinder, IBinder, IBinderInternal, Interface, + SpIBinder, StatusCode, Strong, }; use super::{BnTest, ITest, ITestSameDescriptor, TestService, RUST_SERVICE_BINARY}; @@ -495,9 +496,12 @@ mod tests { #[test] fn reassociate_rust_binder() { let service_name = "testing_service"; - let service_ibinder = BnTest::new_binder(TestService { - s: service_name.to_string(), - }) + let service_ibinder = BnTest::new_binder( + TestService { + s: service_name.to_string(), + }, + BinderFeatures::default(), + ) .as_binder(); let service: Strong<dyn ITest> = service_ibinder @@ -510,9 +514,12 @@ mod tests { #[test] fn weak_binder_upgrade() { let service_name = "testing_service"; - let service = BnTest::new_binder(TestService { - s: service_name.to_string(), - }); + let service = BnTest::new_binder( + TestService { + s: service_name.to_string(), + }, + BinderFeatures::default(), + ); let weak = Strong::downgrade(&service); @@ -525,9 +532,12 @@ mod tests { fn weak_binder_upgrade_dead() { let service_name = "testing_service"; let weak = { - let service = BnTest::new_binder(TestService { - s: service_name.to_string(), - }); + let service = BnTest::new_binder( + TestService { + s: service_name.to_string(), + }, + BinderFeatures::default(), + ); Strong::downgrade(&service) }; @@ -538,9 +548,12 @@ mod tests { #[test] fn weak_binder_clone() { let service_name = "testing_service"; - let service = BnTest::new_binder(TestService { - s: service_name.to_string(), - }); + let service = BnTest::new_binder( + TestService { + s: service_name.to_string(), + }, + BinderFeatures::default(), + ); let weak = Strong::downgrade(&service); let cloned = weak.clone(); @@ -556,12 +569,18 @@ mod tests { #[test] #[allow(clippy::eq_op)] fn binder_ord() { - let service1 = BnTest::new_binder(TestService { - s: "testing_service1".to_string(), - }); - let service2 = BnTest::new_binder(TestService { - s: "testing_service2".to_string(), - }); + let service1 = BnTest::new_binder( + TestService { + s: "testing_service1".to_string(), + }, + BinderFeatures::default(), + ); + let service2 = BnTest::new_binder( + TestService { + s: "testing_service2".to_string(), + }, + BinderFeatures::default(), + ); assert!(!(service1 < service1)); assert!(!(service1 > service1)); diff --git a/libs/binder/rust/tests/ndk_rust_interop.rs b/libs/binder/rust/tests/ndk_rust_interop.rs index ce75ab7125..4702e45f1f 100644 --- a/libs/binder/rust/tests/ndk_rust_interop.rs +++ b/libs/binder/rust/tests/ndk_rust_interop.rs @@ -16,15 +16,13 @@ //! Rust Binder NDK interop tests -use std::ffi::CStr; -use std::os::raw::{c_char, c_int}; -use ::IBinderRustNdkInteropTest::binder::{self, Interface, StatusCode}; use ::IBinderRustNdkInteropTest::aidl::IBinderRustNdkInteropTest::{ BnBinderRustNdkInteropTest, IBinderRustNdkInteropTest, }; -use ::IBinderRustNdkInteropTest::aidl::IBinderRustNdkInteropTestOther::{ - IBinderRustNdkInteropTestOther, -}; +use ::IBinderRustNdkInteropTest::aidl::IBinderRustNdkInteropTestOther::IBinderRustNdkInteropTestOther; +use ::IBinderRustNdkInteropTest::binder::{self, BinderFeatures, Interface, StatusCode}; +use std::ffi::CStr; +use std::os::raw::{c_char, c_int}; /// Look up the provided AIDL service and call its echo method. /// @@ -37,18 +35,21 @@ pub unsafe extern "C" fn rust_call_ndk(service_name: *const c_char) -> c_int { // The Rust class descriptor pointer will not match the NDK one, but the // descriptor strings match so this needs to still associate. - let service: binder::Strong<dyn IBinderRustNdkInteropTest> = match binder::get_interface(service_name) { - Err(e) => { - eprintln!("Could not find Ndk service {}: {:?}", service_name, e); - return StatusCode::NAME_NOT_FOUND as c_int; - } - Ok(service) => service, - }; + let service: binder::Strong<dyn IBinderRustNdkInteropTest> = + match binder::get_interface(service_name) { + Err(e) => { + eprintln!("Could not find Ndk service {}: {:?}", service_name, e); + return StatusCode::NAME_NOT_FOUND as c_int; + } + Ok(service) => service, + }; match service.echo("testing") { - Ok(s) => if s != "testing" { - return StatusCode::BAD_VALUE as c_int; - }, + Ok(s) => { + if s != "testing" { + return StatusCode::BAD_VALUE as c_int; + } + } Err(e) => return e.into(), } @@ -88,7 +89,7 @@ impl IBinderRustNdkInteropTest for Service { #[no_mangle] pub unsafe extern "C" fn rust_start_service(service_name: *const c_char) -> c_int { let service_name = CStr::from_ptr(service_name).to_str().unwrap(); - let service = BnBinderRustNdkInteropTest::new_binder(Service); + let service = BnBinderRustNdkInteropTest::new_binder(Service, BinderFeatures::default()); match binder::add_service(&service_name, service.as_binder()) { Ok(_) => StatusCode::OK as c_int, Err(e) => e as c_int, diff --git a/libs/binder/rust/tests/serialization.rs b/libs/binder/rust/tests/serialization.rs index f1b068ee43..66ba846c2d 100644 --- a/libs/binder/rust/tests/serialization.rs +++ b/libs/binder/rust/tests/serialization.rs @@ -18,11 +18,11 @@ //! access. use binder::declare_binder_interface; +use binder::parcel::ParcelFileDescriptor; use binder::{ - Binder, ExceptionCode, Interface, Parcel, Result, SpIBinder, Status, + Binder, BinderFeatures, ExceptionCode, Interface, Parcel, Result, SpIBinder, Status, StatusCode, TransactionCode, }; -use binder::parcel::ParcelFileDescriptor; use std::ffi::{c_void, CStr, CString}; use std::sync::Once; @@ -85,7 +85,7 @@ static mut SERVICE: Option<SpIBinder> = None; pub extern "C" fn rust_service() -> *mut c_void { unsafe { SERVICE_ONCE.call_once(|| { - SERVICE = Some(BnReadParcelTest::new_binder(()).as_binder()); + SERVICE = Some(BnReadParcelTest::new_binder((), BinderFeatures::default()).as_binder()); }); SERVICE.as_ref().unwrap().as_raw().cast() } @@ -108,8 +108,12 @@ impl ReadParcelTest for BpReadParcelTest {} impl ReadParcelTest for () {} #[allow(clippy::float_cmp)] -fn on_transact(_service: &dyn ReadParcelTest, code: TransactionCode, - parcel: &Parcel, reply: &mut Parcel) -> Result<()> { +fn on_transact( + _service: &dyn ReadParcelTest, + code: TransactionCode, + parcel: &Parcel, + reply: &mut Parcel, +) -> Result<()> { match code { bindings::Transaction_TEST_BOOL => { assert_eq!(parcel.read::<bool>()?, true); diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index f303b7c1e3..c0f7c99564 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -35,6 +35,7 @@ cc_test { name: "binderDriverInterfaceTest_IPC_32", defaults: ["binder_test_defaults"], srcs: ["binderDriverInterfaceTest.cpp"], + header_libs: ["libbinder_headers"], compile_multilib: "32", multilib: { lib32: { suffix: "" } }, cflags: ["-DBINDER_IPC_32BIT=1"], @@ -49,7 +50,7 @@ cc_test { cflags: ["-DBINDER_IPC_32BIT=1"], }, }, - + header_libs: ["libbinder_headers"], srcs: ["binderDriverInterfaceTest.cpp"], test_suites: ["device-tests", "vts"], } diff --git a/libs/nativewindow/Android.bp b/libs/nativewindow/Android.bp index 8675439938..928600999c 100644 --- a/libs/nativewindow/Android.bp +++ b/libs/nativewindow/Android.bp @@ -60,7 +60,13 @@ ndk_library { cc_library { name: "libnativewindow", - llndk_stubs: "libnativewindow.llndk", + llndk: { + symbol_file: "libnativewindow.map.txt", + unversioned: true, + override_export_include_dirs: [ + "include" + ], + }, export_include_dirs: [ "include", "include-private", @@ -115,11 +121,4 @@ cc_library { }, } -llndk_library { - name: "libnativewindow.llndk", - symbol_file: "libnativewindow.map.txt", - unversioned: true, - export_include_dirs: ["include"], -} - subdirs = ["tests"] diff --git a/opengl/Android.bp b/opengl/Android.bp index 748f7953c9..16ce15b2f7 100644 --- a/opengl/Android.bp +++ b/opengl/Android.bp @@ -68,11 +68,9 @@ cc_library_headers { name: "gl_headers", vendor_available: true, export_include_dirs: ["include"], -} - -llndk_headers { - name: "gl_llndk_headers", - export_include_dirs: ["include"], + llndk: { + llndk_headers: true, + }, } subdirs = [ diff --git a/opengl/libs/Android.bp b/opengl/libs/Android.bp index 3ee0fafdb1..daaaf88bbb 100644 --- a/opengl/libs/Android.bp +++ b/opengl/libs/Android.bp @@ -142,7 +142,12 @@ cc_library_static { cc_library_shared { name: "libEGL", defaults: ["egl_libs_defaults"], - llndk_stubs: "libEGL.llndk", + llndk: { + symbol_file: "libEGL.map.txt", + export_llndk_headers: ["gl_headers"], + // Don't export EGL/include from the LLNDK variant. + override_export_include_dirs: [], + }, srcs: [ "EGL/egl_tls.cpp", "EGL/egl_cache.cpp", @@ -208,7 +213,12 @@ cc_defaults { cc_library_shared { name: "libGLESv1_CM", defaults: ["gles_libs_defaults"], - llndk_stubs: "libGLESv1_CM.llndk", + llndk: { + symbol_file: "libGLESv1_CM.map.txt", + export_llndk_headers: ["gl_headers"], + // Don't export EGL/include from the LLNDK variant. + override_export_include_dirs: [], + }, srcs: ["GLES_CM/gl.cpp"], cflags: ["-DLOG_TAG=\"libGLESv1\""], version_script: "libGLESv1_CM.map.txt", @@ -220,7 +230,12 @@ cc_library_shared { cc_library_shared { name: "libGLESv2", defaults: ["gles_libs_defaults"], - llndk_stubs: "libGLESv2.llndk", + llndk: { + symbol_file: "libGLESv2.map.txt", + export_llndk_headers: ["gl_headers"], + // Don't export EGL/include from the LLNDK variant. + override_export_include_dirs: [], + }, srcs: ["GLES2/gl2.cpp"], cflags: ["-DLOG_TAG=\"libGLESv2\""], @@ -235,31 +250,12 @@ cc_library_shared { cc_library_shared { name: "libGLESv3", defaults: ["gles_libs_defaults"], - llndk_stubs: "libGLESv3.llndk", + llndk: { + symbol_file: "libGLESv3.map.txt", + export_llndk_headers: ["gl_headers"], + // Don't export EGL/include from the LLNDK variant. + override_export_include_dirs: [], + }, srcs: ["GLES2/gl2.cpp"], cflags: ["-DLOG_TAG=\"libGLESv3\""], } - -llndk_library { - name: "libEGL.llndk", - symbol_file: "libEGL.map.txt", - export_llndk_headers: ["gl_llndk_headers"], -} - -llndk_library { - name: "libGLESv1_CM.llndk", - symbol_file: "libGLESv1_CM.map.txt", - export_llndk_headers: ["gl_llndk_headers"], -} - -llndk_library { - name: "libGLESv2.llndk", - symbol_file: "libGLESv2.map.txt", - export_llndk_headers: ["gl_llndk_headers"], -} - -llndk_library { - name: "libGLESv3.llndk", - symbol_file: "libGLESv3.map.txt", - export_llndk_headers: ["gl_llndk_headers"], -} diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 5a24d5122a..082356dc6e 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -186,7 +186,7 @@ std::optional<compositionengine::LayerFE::LayerSettings> BufferLayer::prepareCli } } bool blackOutLayer = (isProtected() && !targetSettings.supportsProtectedContent) || - (isSecure() && !targetSettings.isSecure); + ((isSecure() || isProtected()) && !targetSettings.isSecure); compositionengine::LayerFE::LayerSettings& layer = *result; if (blackOutLayer) { prepareClearClientComposition(layer, true /* blackout */); diff --git a/vulkan/libvulkan/Android.bp b/vulkan/libvulkan/Android.bp index 67cd8754a3..440c5b144a 100644 --- a/vulkan/libvulkan/Android.bp +++ b/vulkan/libvulkan/Android.bp @@ -29,17 +29,14 @@ ndk_library { unversioned_until: "current", } -llndk_library { - name: "libvulkan.llndk", - symbol_file: "libvulkan.map.txt", - export_llndk_headers: [ - "vulkan_headers_llndk", - ], -} - cc_library_shared { name: "libvulkan", - llndk_stubs: "libvulkan.llndk", + llndk: { + symbol_file: "libvulkan.map.txt", + export_llndk_headers: [ + "vulkan_headers", + ], + }, clang: true, sanitize: { misc_undefined: ["integer"], |