You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:32:03