4

我已经为 arm 编译了 glibc,它与 Android glibc 或仿生 C 不同,因为我编译的 glibc 环境将有助于提供更多的 api。现在我可以在 Android 运行时复制 /system/ 文件夹中的 glibc 环境,并且在执行 chroot 时我可以在 glibc 环境中运行我的程序。

目前我正在分别编译 glibc 和 Android,然后将 glibc 压缩并复制到 Android 模拟器 sdcard 上,然后在 /system 文件夹上解压缩,然后在 /system/glibc 上执行 chroot

我单独编译 glibc,然后将其放在 Android 源代码中的某个位置。现在在编译 Android 源代码时,我应该怎么做才能将 glibc 的整个预构建文件夹结构复制到 /system 文件夹并成为 system.img 的一部分。

有了这个,当我将 system.img 复制到 Android 模拟器并启动它时,glibc 已经存在于 /system 文件夹中,只需要在 glibc 环境中运行应用程序。

更新

在按照 Yuri 在他的回答中提到的操作(我创建了 glibc 文件夹并将所有内容复制到其中)之后,当我编译代码时,我得到以下输出。

build/core/main.mk:490: * Some files have been added to ALL_PREBUILT.
build/core/main.mk:491: *
build/core/main.mk:492: * ALL_PREBUILT is a deprecated mechanism that
build/core/main.mk:493: * should not be used for new files.
build/core/main.mk:494: * As an alternative, use PRODUCT_COPY_FILES in
build/core/main.mk:495: * the appropriate product definition.
build/core/main.mk:496: * build/target/product/core.mk is the product
build/core/main.mk:497: * definition used in all products.
build/core/main.mk:498: *
build/core/main.mk:499: * unexpected glibc in ALL_PREBUILT
build/core/main.mk:500: *
build/core/main.mk:501: * ALL_PREBUILT contains unexpected files. Stop.

所以我在 build/core/legacy_prebuilts.mk 中添加了 glibc

但后来我得到

make: * No rule to make target mkdir', needed byout/target/product/generic/root/glibc'. Stop.
4

5 回答 5

6

最后我以一种非常不寻常的方式做到了。

我有 3 个选择:

  1. 使用 BUILD_PREBUILT 变量,但缺点是你可以为单个文件执行此操作,但我有多个文件并且在特定的 forlder 结构中
  2. 使用 PRODUCT_COPY_FILES。但不知何故它对我不起作用 PRODUCT_COPY_FILES 是用于设备的,它对我来说不是新设备。我在模拟器上工作。
  3. 使用 Yuri 给出的解决方案,使用 ALL_PREBUILT +=,但正如 Yuri 提到的那样,它适用于 GB,我使用的是 JB 和 ICS,因此不适用于我。

我采用的方法是在 Android.mk 文件中使用 shell 脚本。我使用了一些这样的:假设您有一个名为 my_folder 的文件夹,其中包含整个预建文件夹结构,需要按原样复制到 android out 文件夹中,在my_folder中,我创建了Android.mk并输入了以下文本:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

$(shell mkdir -p $(TARGET_OUT)/my_folder/)
$(shell cp -rf $(LOCAL_PATH)/* `pwd`/$(TARGET_OUT)/my_folder/)

这样,我在my_folder目录中的所有预建文件和文件夹集都被原样复制到 android out 中的系统文件夹中。

我希望这可以帮助别人。

于 2013-02-12T01:18:59.307 回答
4

PRODUCT_COPY_FILES 必须放在产品 mk 文件 (device/mydevice/..) 中,而不是模块文件 (Android.mk) 中。这里提到了这一点。

此格式用于复制目录:

PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*,vendor/mydir,system/app)

但是,此命令不适用于 apk 文件,并给出错误:

build/core/Makefile:*** PRODUCT_COPY_FILES 中的预构建 apk:vendor/mydir/ray-system-ui-release.apk:system/app/ui-release.apk,请改用 BUILD_PREBUILT!停止。

于 2016-04-18T13:29:58.950 回答
1

这是“Embedded Android”一书中的一个例子,它可以帮助你。在您的 aosp 项目的根目录中创建一个名为 的文件夹rootfs-glibc,将您要复制的代码放在那里,并在那里创建Android.mk具有以下内容的文件:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# 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): mkdir -p $(TARGET_ROOT_OUT) cp -af $(TOPDIR)rootfs-glibc/* $(TARGET_ROOT_OUT) rm
# The last command just gets rid of this very .mk since it's copied as-is
ALL_PREBUILT += $(GLIBC_ROOTFS)

有一个说明,这对姜饼来说是正确的。也许在较新版本的 Android 中,make 系统已更改。

于 2013-02-06T10:23:43.373 回答
1

考虑使用带有自定义安装步骤的 PHONY_PACKAGE。

与上面的 $(shell cp whatever) 答案不同,这只会在安装步骤中运行,而不是在每个 Make 步骤中运行(这肯定不是你想要的)。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := some_module
LOCAL_ADDITIONAL_DEPENDENCIES := FORCE # Decide if you need this
LOCAL_POST_INSTALL_CMD = cd $(LOCAL_PATH) && cp -a mystuff $(TARGET_OUT_WHATEVER)
include $(BUILD_PHONY_PACKAGE)
于 2018-09-12T04:34:22.470 回答
0

I was thinking if I could do this way 1. I have both android and glibc compiled separetely. 2. Once both are compiled, I manually copy the glibc entire folder to /out/target/product/generic/system/glibc/ folder 3. Then I run "make snod"

Would that work?

于 2013-02-06T18:08:30.943 回答