【发布时间】:2018-01-10 02:21:47
【问题描述】:
我无法将一组预构建的 apk 添加到我的自定义 AOSP 构建中。我想要完成的是允许这些应用程序的开发人员简单地将它们放在源代码控制下的目录中,并且图像的下一个 CI 构建将只包含这些应用程序。我已经尝试使用下面的代码在 included_apks 目录中添加所有 apk,但它没有按预期工作。
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 userdebug 应为 LOCAL_MODULE_TAGS := eng debug 以包含在 userdebug 构建变体中。 make 语法对于我试图做的事情是正确的。
【问题讨论】:
-
要了解您的问题,您可以阅读我最近对两个类似问题的回答:Can I refer to the positional arguments of $call by name instead? 和 Target wildcards in a shell command。
-
谢谢@RenaudPacalet,我去看看
-
@RenaudPacalet @Bobbake4 真的是
include“调用”制作子模块的首选方式吗?我可以想象一千种这会如何适得其反,特别是对于有状态的构建脚本。
标签: android makefile gnu-make android-source