From 7d91c1b33cd95177bd222b15dfcdd83c74bf9e70 Mon Sep 17 00:00:00 2001 From: Konsta Date: Sat, 15 Mar 2025 15:38:22 +0200 Subject: [PATCH] bluetooth: convert to apex * Use device as an identifier in package names so APEXs on rpi4/rpi5 trees can co-exist. Somehow apex definitions escape the soong namespace. It doesn't complain about duplicate package names but dependecies later in the build after analyzing Android.bp files and generating ninja file. FAILED: ninja: ... multiple rules generate com.android.hardware.bluetooth.rpi-deps-info [-w dupbuild=err] https://android.googlesource.com/platform/build/soong/+/refs/heads/main/README.md#namespaces * Not sure if this is an AOSP bug or intended behaviour for apex targets. Don't like using the rpi4/rpi5 tags but couldn't come up with better solution to limit the visibility that worked. * General cleanups. As APEX package contains all dependencies that are needed for the service, remove unused shared libraries. Run 'bpfmt -s -w Android.bp'. --- bluetooth/Android.bp | 53 +++++++++++++------ ...android.hardware.bluetooth-service.rpi.rc} | 2 +- ...ndroid.hardware.bluetooth-service.rpi.xml} | 0 bluetooth/apex_file_contexts | 3 ++ bluetooth/apex_manifest.json | 4 ++ bluetooth/main.cpp | 36 +++++++++++++ bluetooth/service.cpp | 50 ----------------- device.mk | 2 +- sepolicy/file_contexts | 1 - 9 files changed, 83 insertions(+), 68 deletions(-) rename bluetooth/{bluetooth-service-rpi.rc => android.hardware.bluetooth-service.rpi.rc} (53%) rename bluetooth/{bluetooth-service-rpi.xml => android.hardware.bluetooth-service.rpi.xml} (100%) create mode 100644 bluetooth/apex_file_contexts create mode 100644 bluetooth/apex_manifest.json create mode 100644 bluetooth/main.cpp delete mode 100644 bluetooth/service.cpp diff --git a/bluetooth/Android.bp b/bluetooth/Android.bp index 5c45eed..5fc8db2 100644 --- a/bluetooth/Android.bp +++ b/bluetooth/Android.bp @@ -6,28 +6,51 @@ cc_binary { name: "android.hardware.bluetooth-service.rpi", relative_install_path: "hw", - init_rc: ["bluetooth-service-rpi.rc"], - vintf_fragments: ["bluetooth-service-rpi.xml"], vendor: true, - cflags: [ - "-Wall", - "-Wextra", - ], srcs: [ "BluetoothHci.cpp", + "main.cpp", "net_bluetooth_mgmt.cpp", - "service.cpp", - ], - shared_libs: [ - "android.hardware.bluetooth-V1-ndk", - "libbase", - "libbinder_ndk", - "libhidlbase", - "liblog", - "libutils", ], static_libs: [ "android.hardware.bluetooth.async", "android.hardware.bluetooth.hci", ], + shared_libs: [ + "android.hardware.bluetooth-V1-ndk", + "libbase", + "libbinder_ndk", + "liblog", + "libutils", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.bluetooth-service.rpi.rc", + src: "android.hardware.bluetooth-service.rpi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.bluetooth-service.rpi.xml", + src: "android.hardware.bluetooth-service.rpi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.bluetooth.rpi4", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.bluetooth-service.rpi"], + prebuilts: [ + "android.hardware.bluetooth-service.rpi.rc", + "android.hardware.bluetooth-service.rpi.xml", + ], } diff --git a/bluetooth/bluetooth-service-rpi.rc b/bluetooth/android.hardware.bluetooth-service.rpi.rc similarity index 53% rename from bluetooth/bluetooth-service-rpi.rc rename to bluetooth/android.hardware.bluetooth-service.rpi.rc index fdb1f85..e344198 100644 --- a/bluetooth/bluetooth-service-rpi.rc +++ b/bluetooth/android.hardware.bluetooth-service.rpi.rc @@ -1,4 +1,4 @@ -service vendor.bluetooth-default /vendor/bin/hw/android.hardware.bluetooth-service.rpi +service vendor.bluetooth-rpi /apex/com.android.hardware.bluetooth.rpi4/bin/hw/android.hardware.bluetooth-service.rpi class hal capabilities BLOCK_SUSPEND NET_ADMIN SYS_NICE user bluetooth diff --git a/bluetooth/bluetooth-service-rpi.xml b/bluetooth/android.hardware.bluetooth-service.rpi.xml similarity index 100% rename from bluetooth/bluetooth-service-rpi.xml rename to bluetooth/android.hardware.bluetooth-service.rpi.xml diff --git a/bluetooth/apex_file_contexts b/bluetooth/apex_file_contexts new file mode 100644 index 0000000..c32def4 --- /dev/null +++ b/bluetooth/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.bluetooth-service\.rpi u:object_r:hal_bluetooth_default_exec:s0 diff --git a/bluetooth/apex_manifest.json b/bluetooth/apex_manifest.json new file mode 100644 index 0000000..c337bf4 --- /dev/null +++ b/bluetooth/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.bluetooth.rpi4", + "version": 1 +} diff --git a/bluetooth/main.cpp b/bluetooth/main.cpp new file mode 100644 index 0000000..74a0576 --- /dev/null +++ b/bluetooth/main.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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. + */ + +#include "BluetoothHci.h" + +#include +#include +#include + +using ::aidl::android::hardware::bluetooth::impl::BluetoothHci; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr bluetooth = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + BluetoothHci::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(bluetooth->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/bluetooth/service.cpp b/bluetooth/service.cpp deleted file mode 100644 index 06e8dac..0000000 --- a/bluetooth/service.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * Copyright (C) 2024 KonstaKANG - * - * 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 "aidl.android.hardware.bluetooth.service.rpi" - -#include -#include -#include -#include -#include - -#include "BluetoothHci.h" - -using ::aidl::android::hardware::bluetooth::impl::BluetoothHci; -using ::android::hardware::configureRpcThreadpool; -using ::android::hardware::joinRpcThreadpool; - -int main(int /* argc */, char** /* argv */) { - ALOGI("Bluetooth HAL starting"); - if (!ABinderProcess_setThreadPoolMaxThreadCount(0)) { - ALOGI("failed to set thread pool max thread count"); - return 1; - } - - std::shared_ptr service = - ndk::SharedRefBase::make(); - std::string instance = std::string() + BluetoothHci::descriptor + "/default"; - auto result = - AServiceManager_addService(service->asBinder().get(), instance.c_str()); - if (result == STATUS_OK) { - ABinderProcess_joinThreadPool(); - } else { - ALOGE("Could not register as a service!"); - } - return 0; -} diff --git a/device.mk b/device.mk index 64a563c..febcc5b 100644 --- a/device.mk +++ b/device.mk @@ -74,7 +74,7 @@ PRODUCT_COPY_FILES += \ # Bluetooth PRODUCT_PACKAGES += \ - android.hardware.bluetooth-service.rpi + com.android.hardware.bluetooth.rpi4 PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \ diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts index 99cf696..aa7663e 100644 --- a/sepolicy/file_contexts +++ b/sepolicy/file_contexts @@ -1,6 +1,5 @@ # Bluetooth /sys/class/rfkill/rfkill[0-9]/state u:object_r:sysfs_bluetooth_writable:s0 -/vendor/bin/hw/android\.hardware\.bluetooth-service\.rpi u:object_r:hal_bluetooth_default_exec:s0 # CEC /dev/cec0 u:object_r:cec_device:s0