Android R(11)将HIDL服务添加到系统镜像(七)

本文介绍如何将自定义模块集成到AOSP_x86_64系统镜像中,包括修改makefile、添加hidl服务及编译流程。

1.添加自定义makefile文件到产品

  前面几章介绍的方法一般用于开发阶段,在功能开发完成后,则需要集成到系统镜像中去。我们使用的产品则是aosp_x86_64

TARGET_PRODUCT=aosp_x86_64

  所以需要将自定义的makefile文件添加到产品的配置makefile中去,

--- a/target/product/aosp_x86_64.mk
+++ b/target/product/aosp_x86_64.mk
@@ -63,6 +63,7 @@ $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk)
 ifeq (aosp_x86_64,$(TARGET_PRODUCT))
 $(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_release.mk)
 endif
+$(call inherit-product, test/flagstaffTest/device.mk)

  aosp_x86_64的配置位置比较特别并非位于device下,一般产品的配置文件多会被放置到device下

flagstaff@flagstaff-pc:~/aosp_r.lns$ tree  -L 1 device/google/cuttlefish
device/google/cuttlefish
├── Android.bp
├── Android.mk
├── AndroidProducts.mk
├── CleanSpec.mk
├── common
├── default-permissions.xml
...

  此处的Android.mk文件其实和每个模块的Android.bp/mk也是一样的,用来描述对应设备的构成以及如何构成,一般产品的顶层makefile了,其内部再会包含各个模块的makefile

flagstaff@flagstaff-pc:~/aosp_r.lns$ cat device/google/cuttlefish/Android.mk 
ifneq ($(filter vsoc_arm64 vsoc_x86 vsoc_x86_64, $(TARGET_BOARD_PLATFORM)),)
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
include $(LOCAL_PATH)/fetcher.mk

include $(CLEAR_VARS)
include $(LOCAL_PATH)/host_package.mk

include $(call first-makefiles-under,$(LOCAL_PATH))
endif

  可见只有在 TARGET_BOARD_PLATFORM 中包含字段vsoc_arm64 vsoc_x86 vsoc_x86_64的时候该模块才会被包含。
  其中AndroidProduct.mk会包含lunch时供选择的产品名称以及其对应的makefile路径

flagstaff@flagstaff-pc:~/aosp_r.lns$ cat device/google/cuttlefish/AndroidProducts.mk 
PRODUCT_MAKEFILES := \
	aosp_cf_arm64_auto:$(LOCAL_DIR)/vsoc_arm64/auto/aosp_cf.mk \
    ...

COMMON_LUNCH_CHOICES := \
	aosp_cf_arm64_auto-userdebug \
    ...

2.添加 hidl service

//file:test/flagstaffTest/device.mk
PRODUCT_PACKAGES += \
	flagstaff.hardware.custom_hardware@1.0-service

  名字被添加到PRODUCT_PACKAGES变量中的模块,在整编译的时候会被包含到系统镜像中去。模块名字则来自于对应模块的name字段

flagstaff@flagstaff-pc:~/aosp_r.lns$ cat test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/default/Android.bp 
cc_binary {
    name: "flagstaff.hardware.custom_hardware@1.0-service",
    ...
    vendor: true,
}

3.编译

~/aosp_r.lns$ source build/envsetup.sh
~/aosp_r.lns$ lunch 30
~/aosp_r.lns$ make

  待编译好后,模块内容则会被包含在vendor.img中,因为hidl service的bp文件中指定了放置到vendor中去。

flagstaff@flagstaff-pc:~/aosp_r.lns$ ls out/target/product/generic_x86_64/*.img
out/target/product/generic_x86_64/cache.img
out/target/product/generic_x86_64/dtb.img
out/target/product/generic_x86_64/encryptionkey.img
out/target/product/generic_x86_64/ramdisk.img
out/target/product/generic_x86_64/super.img
out/target/product/generic_x86_64/system.img
out/target/product/generic_x86_64/userdata.img
out/target/product/generic_x86_64/vbmeta.img
out/target/product/generic_x86_64/vendor_boot.img
out/target/product/generic_x86_64/vendor.img

  实际上system.img/vendor.img都被打包进了surper.img了。
  当然在使用镜像前,也可以确认下hidlservice是否被正确包含,此时看下vendor目录即可,其内容和vendor.img是一致的,当然前提是全编译前删除了vendor目录。

flagstaff@flagstaff-pc:~/aosp_r.lns$ find  out/target/product/generic_x86_64/vendor -name "*flagstaff*"
out/target/product/generic_x86_64/vendor/etc/vintf/manifest/flagstaff.hardware.custom_hardware@1.0.xml
out/target/product/generic_x86_64/vendor/etc/init/flagstaff.hardware.custom_hardware@1.0-service.rc
out/target/product/generic_x86_64/vendor/bin/hw/flagstaff.hardware.custom_hardware@1.0-service
out/target/product/generic_x86_64/vendor/lib64/flagstaff.hardware.custom_hardware@1.0.so

  另外如果有问题,欢迎留言或者email(836190520@qq.com)我,技术升级在于交流~~

<think> 我们正在解决如何将android.hardware.power-V3-ndk库包含到Android编译系统中的问题。根据之前的讨论,我们知道这是一个动态链接库,需要在编译时打包到系统镜像中。以下步骤将指导如何实现: ### 解决方案:添加android.hardware.power-V3-ndk库到Android编译系统 #### 1. **确认库的源代码位置** 首先,确保该库的源代码存在于AOSP源码树中。通常,HAL库的源代码位于: ``` hardware/interfaces/power/3.x/ ``` 或者 ``` vendor/<供应商>/<设备>/power/ ``` 如果不存在,需要从官方或供应商获取。 #### 2. **添加库到产品配置** 在设备的`device.mk`(或类似的产品配置文件)中添加以下行: ```makefile PRODUCT_PACKAGES += android.hardware.power-V3-ndk ``` 这将指示编译系统包含该库。 #### 3. **检查库的Android.bp/Android.mk** 确保库的构建脚本(如`Android.bp`)正确。一个典型的`android.hardware.power-V3-ndk`库的`Android.bp`可能如下: ```bp cc_library_shared { name: "android.hardware.power-V3-ndk", vendor_available: true, srcs: ["Power.cpp"], shared_libs: [ "libbase", "liblog", "libutils", ], export_include_dirs: ["include"], } ``` #### 4. **将库包含到系统镜像分区** 确定库应该放在哪个分区(通常是`/vendor`或`/system`)。在`device.mk`中,确保分区属性包含该库: ```makefile # 如果放在vendor分区 PRODUCT_VENDOR_PLATFORM_PACKAGES += android.hardware.power-V3-ndk ``` #### 5. **编译并验证** 重新编译系统镜像: ```bash m android.hardware.power-V3-ndk # 或者编译整个系统 m ``` 编译后,检查生成的镜像中是否包含该库: ```bash find out/target/product/<设备名>/system -name "android.hardware.power-V3-ndk.so" find out/target/product/<设备名>/vendor -name "android.hardware.power-V3-ndk.so" ``` #### 6. **解决依赖问题** 如果使用该库的可执行文件或库,需要在它们的构建脚本中添加依赖: ```bp shared_libs: [ // ... "android.hardware.power-V3-ndk", ], ``` ### 常见问题排除 - **库未生成**:检查构建脚本是否有语法错误,确保`cc_library_shared`的`name`与`PRODUCT_PACKAGES`中的名称一致。 - **库不在镜像中**:确认分区设置(如`PRODUCT_PACKAGES`和`PRODUCT_VENDOR_PLATFORM_PACKAGES`)是否正确。 - **运行时仍找不到库**:检查设备的`/vendor/lib[64]`或`/system/lib[64]`目录是否存在该库,并确认权限和SELinux策略。 通过以上步骤,可以确保在编译时将`android.hardware.power-V3-ndk`库包含进系统镜像。 §§相关问题§§ 1. 如何为自定义的 Android HAL 库编写 Android.bp 文件? 2. 在 Android 系统中,如何将库安装到 vendor 分区? 3. 如何处理 Android 编译时出现的库依赖错误? 4. 如何验证 Android 系统镜像中是否包含特定的共享库? 5. 在 Android 设备上,运行时找不到库应该怎么调试? </think> ### 在 Android 编译时集成 `android.hardware.power-V3-ndk` 库的方法 #### 1. **修改产品配置文件(device.mk)** 在设备配置文件中添加库声明: ```makefile # 文件路径: device/<厂商>/<设备>/device.mk PRODUCT_PACKAGES += \ android.hardware.power-V3-ndk \ android.hardware.power-service ``` 这会确保编译系统将库打包到系统镜像中[^1]。 #### 2. **配置库依赖(Android.bp)** 在依赖库的模块定义中声明链接关系: ```bp cc_binary { name: "my_power_module", srcs: ["power_module.cpp"], shared_libs: [ "liblog", "android.hardware.power-V3-ndk", // 关键声明 ], vendor: true, // 如果放在vendor分区 } ``` #### 3. **设置分区属性** 根据库类型指定安装路径: ```makefile # 在 device.mk 中添加 PRODUCT_VENDOR_PLATFORM_PACKAGES += android.hardware.power-V3-ndk ``` #### 4. **验证编译结果** 编译后检查输出目录: ```bash make -j8 find out/target/product/<device>/ -name "*power-V3-ndk.so" ``` 预期输出路径: ``` /vendor/lib[64]/android.hardware.power-V3-ndk.so ``` #### 5. **处理 HAL 依赖** 在 HAL 实现模块中添加版本声明: ```bp hidl_interface { name: "android.hardware.power@3.0", srcs: ["IPower.hal"], interfaces: ["android.hidl.base@1.0"], vendor_available: true, } ``` ### 常见问题解决 1. **库未生成**: ```bash # 检查依赖树 mma -j8 android.hardware.power-V3-ndk | grep "Install:" ``` 2. **版本冲突**: ```makefile # 在 device.mk 中移除旧版本 PRODUCT_PACKAGES := $(filter-out android.hardware.power@2.0, $(PRODUCT_PACKAGES)) ``` 3. **SELinux 权限**: ```te # 在 file_contexts 中添加 /vendor/lib(64)?/android\.hardware\.power-V3-ndk\.so u:object_r:hal_power_default:s0 ``` ### 编译流程示意图 ```mermaid graph LR A[源代码] --> B(编译配置) B --> C{Android.bp/Android.mk} C --> D[编译系统] D --> E[生成共享库] E --> F[打包到系统镜像] F --> G[设备分区加载] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值