早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。如果你从 Android7.0 的代码一路看到 Android10.0,你就会发现系统的各个模块正在逐步替换成 Android.bp。既然官方都在逐步弃用 Android.mk 了,那我们也跟随官方的脚步使用 Android.bp 来创建新模块。
1. 可执行文件:cc_binary
下面我们以一个 hello world 模块为例来初步认识一下一个 Android.bp 模块的相关概念。
在 device/qiushao/pure 目录下创建一个 hello 目录,创建 hello.cpp:
1 | #include <cstdio> |
在 hello 目录下创建 Android.bp
1 | cc_binary { //模块类型为可执行文件 |
至此一个模块就已经添加完成了,接下来我们可以在 hello 目录下用 mm 命令测试一下是否可以编译通过
1 | qiushao@qiushao-pc:~/source/android-10/device/qiushao/pure/hello$ mm -j |
在 device/qiushao/pure/pure.mk 中添加配置
1 | PRODUCT_PACKAGES += hello |
添加这个配置之后,编译系统时就会自动编译并打包这个模块到系统里面。
我们完整编译一下系统,运行虚拟机,然后连接 adb shell 执行刚刚添加的模块:
1 | qiushao@qiushao-pc:~/source/android-10$ adb shell |
我们来回顾一下 Android.bp 的内容,也就几行配置而已,非常简单。当然其实还有非常多的配置我们并没有使用到。
具体的配置项可以参考以下文档 cc_binary
2. c/c++ 库:cc_library
1 | cc_library { //模块类型为c/c++库, 会同时编译动态库和静态库, |
3. java 库:java_library
1 | java_library { //模块类型为 java 库,这个类型与 java_library_static 是完全一样的 |
其中 installable 配置有必要作下说明,官方文档是这么写的:
java_library builds and links sources into a
.jar
file for the device, and possibly for the host as well. By default, a java_library has a single variant that produces a.jar
file containing.class
files that were compiled against the device bootclasspath. This jar is not suitable for installing on a device, but can be used as astatic_libs
dependency of another module. Specifyinginstallable: true
will product a.jar
file containingclasses.dex
files, suitable for installing on a device.
简单的说就是如果不指定 installable: true, 则编译出来的 jar 包里面是 .class 文件。这种包是没法安装到系统上的,只能给其他 java 模块作为 static_libs 依赖。
指定 installable: true, 则编译出来的 jar 包里面是 classes.dex 文件。这种才是 Android 虚拟机可以加载的格式。
上面的这几个例子是最常见的模块。Android 系统中还有非常多种类型的模块。这里面就不一一举例了,需要定义其他类型的模块时,可以参考以下文档 soong。或者参考系统已有的 Android.bp 模块。
4. 模块编译输出分区
前面的几个例子,我们只有输出到 system 或者 vendor 分区这两种选择, 其实系统还有其它几个目录可以输出的,下面对这些目录的作用及怎么指定模块的输出分区作下说明:
- system :主要包含 Android 框架, google 官方实现
- Android.mk 默认就是输出到 system 分区,不用指定
- Android.bp 默认就是输出到 system 分区,不用指定
- vendor :SoC芯片商分区(系统级核心厂商,如高通), 为他们提供一些核心功能和服务,由 soc 实现
- Android.mk
LOCAL_VENDOR_MODULE := true
- Android.bp
vendor: true
- Android.mk
- odm :设备制造商分区(如华为、小米),为他们的传感器或外围设备提供一些核心功能和服务
- Android.mk
LOCAL_ODM_MODULE := true
- Android.bp
device_specific: true
- Android.mk
- product :产品机型分区
- Android.mk
LOCAL_PRODUCT_MODULE := true
- Android.bp
product_specific
- Android.mk