【问题标题】:How can I add multiple prebuilt files to system.img in Android?如何在 Android 中向 system.img 添加多个预构建文件?
【发布时间】:2016-01-20 03:00:45
【问题描述】:

我的构建系统是 Android 6.0。我正在从源代码构建 AOSP。我想在生成的 system.img 中包含多个预构建文件。 我知道我可以使用 device.mk 中的 PRODUCT_COPY_FILES 来复制预建文件。但是,由于某些原因,我无法修改系统文件。 如何在 Android.mk 中做到这一点?

例如,我想将 test1.txt 和 test2.txt 复制到 /system/etc。我写了一个Android.mk,如下所示。

SMB_CONFIG_FILES := test1.txt test2.txt
SMB_CONFIG_TARGET := $(addprefix $(TARGET_OUT)/etc/, $(SMB_CONFIG_FILES))

ALL_PREBUILT += $(SMB_CONFIG_TARGET)                    
$(SMB_CONFIG_TARGET) : $(TARGET_OUT)/etc/% : $(LOCAL_PATH)/% | $(ACP)
    $(transform-prebuilt-to-target)

然后我运行“make”来构建整个源代码,但它显示了

build/core/main.mk:517: *** Some files have been added to ALL_PREBUILT.
build/core/main.mk:518: *
build/core/main.mk:519: * ALL_PREBUILT is a deprecated mechanism that
build/core/main.mk:520: * should not be used for new files.
build/core/main.mk:521: * As an alternative, use PRODUCT_COPY_FILES in
build/core/main.mk:522: * the appropriate product definition.
build/core/main.mk:523: * build/target/product/core.mk is the product
build/core/main.mk:524: * definition used in all products.
build/core/main.mk:525: *
build/core/main.mk:526: * unexpected test1.txt in ALL_PREBUILT
build/core/main.mk:526: * unexpected test2.txt in ALL_PREBUILT
build/core/main.mk:527: *
build/core/main.mk:528: *** ALL_PREBUILT contains unexpected files.  Stop.

似乎我无法在 Android 6.0 中使用 ALL_PREBUILT。 我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    作为错误消息的详细信息,在 build/target/product/core.mk 中添加 PRODUCT_COPY_FILES。

    将以下行添加到 build/target/product/core.mk 文件中,并将下面的 <dir> 替换为从 AOSP 目录的根 $ANDROID_BUILD_TOP 到test1.txt 和 test2.txt 文件:

    PRODUCT_COPY_FILE += \
        <dir>/test1.txt:system/etc/test1.txt \
        <dir>/test2.txt:system/etc/test2.txt
    

    【讨论】:

    • 感谢您的回复。正如我在问题中所描述的,我知道我可以使用目标产品的 device.mk 中添加的 PRODUCT_COPY_FILE 来复制文件。但是,由于某些权限原因,我无法更改文件。
    【解决方案2】:

    您可以在设备配置中使用PRODUCT_COPY_FILES += &lt;my_files&gt; (device/&lt;vendor&gt;/&lt;device_name&gt;)。您可以添加这些的相关文件是例如device.mkdevice-common.mk&lt;device_name&gt;.mk

    另一种方法是在Android.mk 中使用BUILD_PREBUILT 规则。下面是一个这样的文件的示例:

    LOCAL_PATH := $(my-dir)
    
    ########################
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := platform.xml
    
    LOCAL_MODULE_CLASS := ETC
    
    # This will install the file in /system/etc/permissions
    LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
    
    LOCAL_SRC_FILES := $(LOCAL_MODULE)
    
    include $(BUILD_PREBUILT)
    

    当然,如果您要复制多个文件,您可以在 for 循环中生成多个预构建文件。例如。将上面的代码放在一个单独的makefile中,用$(MY_MODULE)替换platform.xml,并在你设置MY_MODULE := &lt;my_module&gt;include &lt;my_separate_makefile&gt;Android.mk中添加一个for循环。

    但这对我来说似乎是一种解决方法。我建议在您的产品配置中使用PRODUCT_COPY_FILES += &lt;my_files&gt;

    【讨论】:

    • 能否详细说明循环多个模块?
    猜你喜欢
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多