2017-08-02 24 views
1

我无法为我的AOSP自定义版本添加一组预制的apk。我试图完成的是允许这些应用程序的开发人员简单地将它们放在源代码管理下的目录中,图像的下一个CI构建将包含这些应用程序。我已经尝试使用下面的代码来添加included_apks目录中的所有apks,但它不像预期的那样工作。将所有apk的内部目录动态添加到AOSP系统映像

define add_included_apks 

    include $(CLEAR_VARS) 

    LOCAL_MODULE := $(1:included_apks/%.apk=%) 
    LOCAL_MODULE_TAGS := eng userdebug 
    LOCAL_MODULE_CLASS := APPS 
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 
    LOCAL_SRC_FILES := $1 
    LOCAL_CERTIFICATE := PRESIGNED 

    include $(BUILD_PREBUILT) 
endef 

APKS := $(call find-subdir-subdir-files, included_apks, '*.apk') 
$(foreach item, $(APKS), $(eval $(call add_included_apks, $(item)))) 

此方法的问题似乎在add_included_apks函数内部以及它如何评估。当我打印出$(1:included_apks/%.apk=%)这是正确的值,但如果我打印出LOCAL_MODULE这是在此循环之前设置的最后一个值,即使我打电话给include $(CLEAR_VARS)。最后模块不包含在系统映像中。我误解了一个foreach调用如何在make文件中工作?

编辑答案是正确的,但是真正的AOSP的错误是这样的:

LOCAL_MODULE_TAGS := eng userdebugLOCAL_MODULE_TAGS := eng debug被包含在一个userdebug构建变​​量。 make语法对于我正在尝试执行的操作是正确的。

+0

要了解你的问题,你可以阅读我最近回答两个类似的问题:我可以按名称引用$调用的位置参数呢? ](https://stackoverflow.com/questions/45426468/can-i-refer-to-the-positional-arguments-of-call-by-name-instead)和[shell命令中的目标通配符](https: //stackoverflow.com/questions/45459103/target-wildcards-in-a-shell-command)。 –

+0

谢谢@RenaudPacalet,我来看看 – Bobbake4

+0

@RenaudPacalet @ Bobbake4是否真的是通过'include'调用子模块的首选方式?我可以幻想一千种方式如何回避你,特别是构建有状态的脚本。 – Vroomfondel

回答

2

当你想打印一个像这样的定义时,你必须用另一个$来转义$。

define add_included_apks 

    include $(CLEAR_VARS) 

    LOCAL_MODULE := $(1:included_apks/%.apk=%) 
    $$(error $$(LOCAL_MODULE)) 
    LOCAL_MODULE_TAGS := eng userdebug 
    LOCAL_MODULE_CLASS := APPS 
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 
    LOCAL_SRC_FILES := $1 
    LOCAL_CERTIFICATE := PRESIGNED 

    include $(BUILD_PREBUILT) 
endef 
+0

你是对的!在这之后,它正在印刷我期待的东西。因此,对于任何来到这个问题的人来说,实际的错误是'LOCAL_MODULE_TAGS:= eng userdebug',因为它应该是'LOCAL_MODULE_TAGS:= eng debug'以包含在'userdebug'构建变体中。 make语法对于我正在尝试执行的操作是正确的。谢谢@maschall – Bobbake4

0

'LOCAL_MODULE_TAGS := eng debug'将不包括该用户建立,但ENG和userdebug。如果你想让它包含在用户构建中。它必须是'optional'和你device/.../BoardConfig.mk必须添加这些到:

PRODUCT_PACKAGES += your_local_module1 \ 
       your_local_module2 end so on... 
相关问题