动态添加所有apk的内部目录到AOSP系统镜像

Dynamically adding all apk's inside directory to AOSP system image

我在将一组预构建的 apk 添加到我的 AOSP 自定义构建时遇到问题。我想要完成的是让这些应用程序的开发人员只需将它们放在源代码管理下的目录中,下一个 CI 构建的映像将只包含这些应用程序。我已经尝试使用下面的代码将所有 apk 添加到 included_apks 目录中,但它没有按预期工作。

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 := 
    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 语法对于我试图做的事情是正确的。

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

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 := 
    LOCAL_CERTIFICATE := PRESIGNED

    include $(BUILD_PREBUILT)
endef

'LOCAL_MODULE_TAGS := eng debug' 不会将其包含在用户构建中,但会包含 eng 和 userdebug。如果您想将它包含在用户构建中。它必须是 'optional' 并且你的 device/.../BoardConfig.mk 必须将它们添加到:

PRODUCT_PACKAGES += your_local_module1 \
                your_local_module2 end so on...