欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

参考资料