Orange Pi 4 LTS Android8.1:合并glibc根文件系统到AOSP的构建疑问
问题背景
Karim Yaghmour在2013年所著《Embedded Android》的附录A(Legacy User-Space)介绍了如何将包含BusyBox的glibc根文件系统合并到AOSP构建中,但该方法仅适用于Android 2.3/Gingerbread版本。
我需要在Orange Pi 4 LTS提供的Android 8.1源码中实现相同操作。按照书中指引,我将交叉编译得到的含BusyBox的glibc根文件系统复制到AOSP的新目录:
$ ls -lh ~/builds/RK3399-Android8.1/rootfs-glibc total 20K -rw-rw-r-- 1 joe joe 584 Mar 18 12:14 Android.mk drwxrwxr-x 2 joe joe 4.0K Mar 8 12:25 bin drwxrwxr-x 2 joe joe 4.0K Mar 8 11:29 lib lrwxrwxrwx 1 joe joe 11 Mar 8 12:25 linuxrc -> bin/busybox drwxrwxr-x 2 joe joe 4.0K Mar 8 12:25 sbin drwxrwxr-x 5 joe joe 4.0K Mar 8 11:30 usr
我参照书中内容创建了Android.mk文件,但未生效。经过调整后得到如下内容:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := rootfs-glibc # LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) LOCAL_MODULE_CLASS := EXECUTABLES # This part is a hack, we're doing "addprefix" because if we don't, # this dependency will be stripped out by the build system GLIBC_ROOTFS := $(addprefix $(TARGET_ROOT_OUT)/, rootfs-glibc) $(GLIBC_ROOTFS): xxxmkdir -p $(TARGET_ROOT_OUT) cp -af $(TOPDIR)rootfs-glibc/* $(TARGET_ROOT_OUT) rm $(TARGET_ROOT_OUT)/Android.mk # The last command just gets rid of this very .mk since it's copied as is include $(BUILD_PREBUILT)
我确认该Makefile已被解析,但$(GLIBC_ROOTFS)目标中的规则并未执行(已通过将mkdir改为xxxmkdir验证)。
后续了解到Android 7.0引入了Soong构建系统以替代Make,但未找到可参考的Android.bp示例。我发现可能需要使用android_filesystem模块类型,但缺乏相关示例及清晰文档。
请问我应该修复现有的Android.mk文件?如何修复?还是应该使用Android.bp文件?
解决方案
修复现有Android.mk的方案
你的Android.mk问题在于自定义目标未与AOSP核心构建目标建立依赖,且BUILD_PREBUILT的用法不符合Android 8.1规则,可按以下方式修改:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := rootfs-glibc LOCAL_MODULE_CLASS := FAKE LOCAL_MODULE_TAGS := optional # 定义根文件系统复制规则 define copy-rootfs-glibc mkdir -p $(TARGET_ROOT_OUT) cp -af $(LOCAL_PATH)/* $(TARGET_ROOT_OUT)/ rm -f $(TARGET_ROOT_OUT)/Android.mk endef # 将复制操作绑定到模块构建步骤 $(LOCAL_BUILT_MODULE): $(copy-rootfs-glibc) # 让根文件系统输出目录依赖该模块,确保构建时执行复制 $(TARGET_ROOT_OUT): $(LOCAL_BUILT_MODULE) include $(BUILD_SYSTEM)/base_rules.mk
关键修改点:
- 用
FAKE模块类型替代EXECUTABLES,因为这只是复制操作的载体而非可执行文件 - 使用
base_rules.mk替代BUILD_PREBUILT,更适配自定义构建操作 - 明确绑定
TARGET_ROOT_OUT与模块的依赖关系,强制构建系统触发复制逻辑 - 用
LOCAL_PATH替代TOPDIR,路径指向更准确,避免层级错误
使用Android.bp(Soong)的方案
Android 8.1已全面兼容Soong,可创建Android.bp替代Makefile,示例如下:
phony { name: "rootfs-glibc", tags: ["optional"], required: [":copy-rootfs-glibc"], } genrule { name: "copy-rootfs-glibc", tools: ["cp", "rm", "mkdir"], cmd: "mkdir -p $(out)/root && cp -af $(dir $(src))/* $(out)/root/ && rm -f $(out)/root/Android.mk && rm -f $(out)/root/Android.bp", srcs: ["Android.mk", "Android.bp", "bin/**", "lib/**", "sbin/**", "usr/**", "linuxrc"], out: ["root/.copied"], }
使用说明:
phony模块作为构建入口,标记为可选模块(可通过PRODUCT_PACKAGES += rootfs-glibc加入产品配置)genrule定义具体复制操作,通过srcs声明所有需复制的文件,确保构建系统能检测文件变化out生成空文件作为构建标记,避免重复执行复制操作- 单独验证可执行:
make rootfs-glibc
额外注意事项
- 确保交叉编译的BusyBox和glibc库与RK3399的aarch64架构完全匹配,避免运行时兼容性问题
- 若根文件系统含动态库,需确保其能被正确加载,可通过修改
LD_LIBRARY_PATH或复制到系统默认库目录(如/system/lib64) - 先单独执行模块构建验证复制逻辑,再进行完整AOSP构建
内容的提问来源于stack exchange,提问作者Daryl Spitzer
相关产品推荐
相关产品推荐

