【问题标题】:Adding prebuilt set of files structured in folders to android out folder将文件夹中结构化的预建文件集添加到 android out 文件夹
【发布时间】:2013-01-21 01:09:13
【问题描述】:

我已经为 arm 编译了 glibc,这与 Android glibc 或仿生 C 不同,因为我编译的 glibc 环境将有助于提供更多的 api。 现在我可以在 Android 运行时将 glibc 环境复制到 /system/ 文件夹中,并且在执行 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.

【问题讨论】:

    标签: android linux makefile android-source prebuild


    【解决方案1】:

    以下是“嵌入式 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)
    

    请注意,这对 Gingerbread 来说是正确的。也许在较新版本的 Android 中,make 系统已更改。

    【讨论】:

    • 感谢 Yury,但在您的情况下,当使用 android 工具链编译 glibc 时,我可能需要检查并修复编译问题。它可能无需任何更改即可完美编译。
    • 我不明白。您是尝试添加预构建的二进制文件还是想使用 android 工具链编译 glibc?
    • 嗨 Yuri,我需要在特定文件夹结构中添加一堆预构建二进制文件,即我在 glibc 文件夹的文件夹结构中有很多二进制文件,需要添加到 /system/ 目录中是
    • 那么我的答案是一个可能的解决方案。代码不会用 android 工具链编译,它会被简单地复制。
    • 按照您在回答中提到的操作(我创建了 glibc 文件夹并将所有内容复制到其中)之后,当我编译代码时,我得到以下输出。 build/core/main.mk:499: * ALL_PREBUILT 中的意外 glibc build/core/main.mk:501: * ALL_PREBUILT 包含意外文件。停止。所以我在 build/core/legacy_prebuilts.mk 中添加了 glibc 但随后我得到了 make: * No rule to make target mkdir', required byout/target/product/generic/root/glibc'。停止。
    【解决方案2】:

    我在想我是否可以这样做 1.我分别编译了android和glibc。 2. 两者都编译好后,我手动将 glibc 整个文件夹复制到 /out/target/product/generic/system/glibc/ 文件夹 3. 然后我运行“make snod”

    这行得通吗?

    【讨论】:

      【解决方案3】:

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

      我有 3 个选择:

      1. 使用 BUILD_PREBUILT 变量,但缺点是你可以这样做 单个文件,但我有多个文件并且在一个特定的文件夹中 结构
      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 中的系统文件夹中。

      我希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:

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

        此格式用于复制目录:

        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!停下来。

        【讨论】:

          【解决方案5】:

          考虑使用带有自定义安装步骤的 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-08-21
            • 1970-01-01
            • 1970-01-01
            • 2018-12-08
            • 1970-01-01
            • 1970-01-01
            • 2013-03-10
            相关资源
            最近更新 更多