在文件夹中添加预先构建的文件集到android out文件夹

问题描述 投票:4回答:5

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

目前我正在单独编译glibc和Android,然后将glibc和它复制到Android模拟器SD卡上,然后在/ system文件夹上解压缩然后在/ system / glibc上执行chroot

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

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

UPDATE

根据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
5个回答
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)

有一点需要注意姜饼。也许在较新版本的Android中,make系统已经改变。


5
投票

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

我有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的文件夹,其中包含整个预建文件夹结构,需要将其复制到anddroid 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中的system文件夹中。

我希望这可以帮助别人。


3
投票

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中找到的prebuilt apk:vendor / mydir / ray-system-ui-release.apk:system / app / ui-release.apk,改为使用BUILD_PREBUILT!停止。


1
投票

考虑将PHONY_PACKAGE与自定义安装步骤一起使用。

与上面的$(shell cp无论如何)答案不同,这只会在安装步骤中运行,而不是在每个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)

0
投票

我在想是否可以这样做1.我同时编译了android和glibc。 2.一旦编译完毕,我手动将glibc整个文件夹复制到/ out / target / product / generic / system / glibc / folder 3.然后我运行“make snod”

那会有用吗?

© www.soinside.com 2019 - 2024. All rights reserved.