跳转至

基础 AOSP 技巧

你买这本书最大的目的可能就是——hack AOSP 来满足自己的需求。接下来几页中,我们会探讨一些你很可能最想尝试的常见技巧。当然,这里只是铺垫,主要涉及与编译系统相关的部分。

添加应用

为你的开发板添加一个应用相对直接。先创建一个存放应用源码的目录,例如在 packages/apps/ 下新建一个目录,然后在其中创建 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MyApp
LOCAL_SRC_FILES := $(call all-java-files-under, src)
include $(BUILD_PACKAGE)

构建时,执行 make MyApp,编译产物(.apk)会输出到 out/target/product/<product>/system/app/

添加原生工具或守护进程

与上述添加应用的方式类似,也可以为开发板添加原生工具或守护进程。在 external/system/ 下创建对应的目录和 Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_tool
LOCAL_SRC_FILES := my_tool.c
include $(BUILD_EXECUTABLE)

守护进程还需要在 init 脚本中添加启动配置(init.rc)。

添加原生库

像应用和二进制文件一样,也可以为开发板添加原生库。创建 Android.mk 并使用相应的库模板:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libmylib
LOCAL_SRC_FILES := mylib.c
include $(BUILD_SHARED_LIBRARY)

使用 make libmylib 编译,库文件(.so)会输出到 out/target/product/<product>/system/lib/

添加设备

添加自定义设备很可能是最高优先级的需求之一(如果不是排第一的话)。设备配置主要通过 device/<vendor>/<device>/ 目录下的 BoardConfig.mk 文件完成,该文件指定:

  • CPU 架构和变体
  • 内核命令行参数
  • 分区布局
  • HAL 模块路径
  • 产品特定配置

device/<vendor>/<device>/ 下创建目录,添加 AndroidProducts.mk 和 BoardConfig.mk,然后在 lunch 菜单中选择对应的产品即可。

添加应用覆盖层

应用覆盖层(App Overlay)用于在不修改原始应用源码的情况下替换应用资源(图片、字符串、布局等)。在 vendor/<vendor>/overlay/ 下创建对应应用名称的目录结构,按照标准 Android 资源组织方式放置替换文件即可。编译系统会自动将覆盖层资源优先于默认资源编译进最终镜像。