03 Android系统之添加自定义模块
程序员文章站
2024-02-02 21:44:16
...
背景介绍
早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。
- Android 7.0引入ninja和kati
- Android 8.0使用Android.bp来替换Android.mk,引入Soong
- Android 9.0强制使用Android.bp
添加模块
然后开始介绍如何通过Android.bp来引入一个hello world
模块。
1、目录结构
./device/mi/pure/hello/
├── Android.bp
└── hello.cpp
0 directories, 2 files
2.hello.cpp
文件
#include <cstdio>
#include <android/log.h>
#define LOG_TAG "qiushao"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG ,__VA_ARGS__)
int main() {
printf("hello qiushao\n");
LOGD("hello qiushao");
return 0;
}
3、Android.bp
文件
cc_binary { //模块类型为可执行文件
name: "hello", //模块名hello
srcs: ["hello.cpp"], //源文件列表
vendor: true, //编译出来放在/vendor目录下(默认是放在/system目录下)
shared_libs: [ //编译依赖的动态库
"liblog",
],
}
4、编译hello模块
[email protected]:hello$ mma
5、添加product配置
[email protected]:pure$ pwd
/home/hinzer/source/android-10/device/mi/pure
[email protected]:pure$ echo "PRODUCT_PACKAGES += hello" >> product01.mk
6、整编android系统
[email protected]:android-10$ source ./build/envsetup.sh
[email protected]:android-10$ lunch product01-eng
[email protected]:android-10$ make -j4
这是其中一个常见的模块实例,需要定义其他类型的模块时,可以参考以下文档soong。或者参考系统已有的 Android.bp 模块。
验证
[email protected]:android-10$ emulator
...
[email protected]:~$ adb devices
List of devices attached
emulator-5554 device
[email protected]:~$ adb shell hello # 运行可执行文件hello
hello qiushao
理论补充
1、模块编译输出分区
- system :主要包含 Android 框架, google 官方实现
- Android.mk 默认就是输出到 system 分区,不用指定
- Android.bp 默认就是输出到 system 分区,不用指定
- vendor :SoC芯片商分区(系统级核心厂商,如高通), 为他们提供一些核心功能和服务,由 soc 实现
- Android.mk LOCAL_VENDOR_MODULE := true
- Android.bp vendor: true
- odm :设备制造商分区(如华为、小米),为他们的传感器或外围设备提供一些核心功能和服务
- Android.mk LOCAL_ODM_MODULE := true
- Android.bp device_specific: true
- product :产品机型分区
- Android.mk LOCAL_PRODUCT_MODULE := true
- Android.bp product_specific
参考资料
上一篇: java中使用json以及所导入的包