Android UWB——HAL AIDL实现

1.关于Android.bp

Android.bp是Android构建系统的重要组成部分。Android.bp可以让我们定义模块和规则,以便系统能够自动执行构建操作。熟悉Android.bp的语法和常见的module_type的使用方法,可以更好地编写清晰和容易维护的项目代码。

在Android实现中,Android.bp是一个Makefile与Blueprints的结合。 Makefile是一个类Unix系统的编译构建最常用的工具之一。使用Makefile可以定义目标和规则,递归的去解决目标之间的依赖关系,实现自动化构建的过程。 Blueprints是Google提出的Android构建系统。它通过类似Make的文件来定义模块,然后生成构建系统所需的构建配置。 Android.bp文件是融合了两种工具的思想和功能的文件。

Android.bp中常见的module_type:

  • cc_binary:用于编译可执行文件的模块
  • cc_library_static:用于编译静态库的模块
  • cc_library_shared:用于编译动态库的模块
  • java_library:用于编译java类库的模块,将源代码构建并链接到设备的.jar文件中。默认情况下,java_library只是一个变量,生成一个包含根据设备引导类路径编译的.class文件的.jar包。生成的jar不适合直接安装在设备上,通常会用作另一个模块的static_libs依赖项。
  • java_binary:用于包含主要方法的Java应用程序的模块。
  • android_app,用于构建Android应用程序安装包,是Android系统应用开发中常用的模块类型。
  • android_library,将源代码与android资源文件一起构建并连接到设备的.jar文件职工。

另外,在Android.bp中提供了一系列的xx_defaults模块类型,如:cc_defaults、java_defaults、doc_defaults、stubs_defaults等,提供了一组可由其他模块继承的属性。其他模块可以通过:defaults: ["<default_module_name>"]来继承xx_defaults类型模块中定义的属性,可以被多个模块继承,减少在bp中书写重复的属性。

2.NXP HAL AIDL实现

对于供应商而言,要提供底层的AIDL接口实现,本例中以NXP实现为例。

在NXP实现的AIDL接口中,使用binder对应的线程池。Android.bp文件中,cc_binary,在shared_libs中添加uwb_uci.helios

makefile 复制代码
package {
    // See: http://go/android-license-faq
    // A large-scale-change added 'default_applicable_licenses' to import
    // all of the 'license_kinds' from "hardware_nxp_uwb_license"
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["hardware_nxp_uwb_license"],
}

//生成可执行文件android.hardware.uwb-service.nxp

cc_binary {
    name: "android.hardware.uwb-service.nxp", 
    relative_install_path: "hw",
    init_rc: ["nxp-uwb-service.rc"],
    vintf_fragments: ["nxp-uwb-service.xml"],
    vendor: true,
    cflags: [
        "-Wall",
        "-Wextra",
        "-g",
    ],
    shared_libs: [
        "uwb_uci.helios",  //使用的共享库文件(动态库)
        "liblog",
        "libbinder_ndk",
    ],
    
    //libnxpuwbexampleimple,nxp uwb示例实现,在下一个静态库中生成
    static_libs: [
        "libbase",
        "libutils",
        "android.hardware.uwb-V1-ndk",   //uwb-V1-ndk,静态库
        "libnxpuwbexampleimpl",   
    ],
    srcs: [
        "service.cpp",  //目标源文件
    ],
}
cc_library_static {
    name: "libnxpuwbexampleimpl",
    vendor: true,
    shared_libs: [
        "liblog",
        "libbinder_ndk",
    ],
    static_libs: [
        "libbase",
        "libutils",
        "android.hardware.uwb-V1-ndk",
    ],
    srcs: [
        "uwb.cpp",
        "uwb_chip.cpp",   //静态库的cpp文件及头文件目录
    ],
    include_dirs: [
        "hardware/nxp/uwb/extns/inc",
        "hardware/nxp/uwb/halimpl/inc",
    ],
    cflags: [
        "-Wall",
        "-Wextra",
        "-g",
    ],
}

NXP AIDL提供的Android.bp的主要工作:

1)通过编译uwb.cpp/uwb_chip.cpp文件,生成静态库libnxpuwbexampleimpl;其中使用到的uci_defs.h文件,定义了UWB_UCI中涉及到的大多数定义,可以在开发中使用。

2)将service.cpp编译生成可执行的文件。

其中,关于 uwb_uci.helios, 共享库文件的生成,在整个工程的Android.bp中构建。

java 复制代码
package {
    default_applicable_licenses: ["hardware_nxp_uwb_license"],
}

// Added automatically by a large-scale-change
// See: http://go/android-license-faq
license {
    name: "hardware_nxp_uwb_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
    ],
    // large-scale-change unable to identify any license_text files
}

cc_library_shared {
    name: "uwb_uci.helios",  //目标动态库,service.cpp会有使用
    defaults: [
        "hidl_defaults",   //?
    ],
    proprietary: true,
    srcs: [
        "halimpl/fwd/sr1xx/*.cc",
        "halimpl/inc/common/*.cc",
        "halimpl/hal/*.cc",
        "halimpl/log/*.cc",
        "halimpl/tml/*.cc",
        "halimpl/utils/*.cc",
    ],
    shared_libs: [
        "android.hardware.uwb-V1-ndk",//???
        "libcutils",
        "liblog",
        "libhardware",
        "libbase",
        "libchrome",
        "libutils",
        "libdl",
        "libhidlbase"
    ],
    local_include_dirs: [
        "halimpl/fwd/sr1xx",
        "halimpl/inc",
        "halimpl/inc/common",
        "halimpl/hal",
        "halimpl/log",
        "halimpl/tml",
        "halimpl/utils",
        "extns/inc",
    ],

    cflags: [
        "-DGENERIC",
        "-DSOC_DEFAULT",
        "-DBUILDCFG=1",
        "-Wno-deprecated-register",
        "-Wno-unused-parameter",
        "-Wno-missing-field-initializers",
    ],
}
相关推荐
alexhilton1 天前
学会在Jetpack Compose中加载Lottie动画资源
android·kotlin·android jetpack
ljt27249606615 天前
Compose笔记(六十一)--SelectionContainer
android·笔记·android jetpack
QING6185 天前
Jetpack Compose 中的 ViewModel 作用域管理 —— 新手指南
android·kotlin·android jetpack
惟恋惜5 天前
Jetpack Compose 的状态使用之“界面状态”
android·android jetpack
喜熊的Btm6 天前
探索 Kotlin 的不可变集合库
kotlin·android jetpack
惟恋惜6 天前
Jetpack Compose 界面元素状态(UI Element State)详解
android·ui·android jetpack
惟恋惜6 天前
Jetpack Compose 多页面架构实战:从 Splash 到底部导航,每个 Tab 拥有独立 ViewModel
android·ui·架构·android jetpack
alexhilton7 天前
Jetpack Compose 2025年12月版本新增功能
android·kotlin·android jetpack
モンキー・D・小菜鸡儿8 天前
Android Jetpack Compose 基础控件介绍
android·kotlin·android jetpack·compose
darryrzhong10 天前
FluxImageLoader : 基于Coil3封装的 Android 图片加载库,旨在提供简单、高效且功能丰富的图片加载解决方案
android·github·android jetpack