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