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

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中构建。

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",
    ],
}