2017-08-02 19 views
1

AOSPのカスタムビルドにあらかじめ作成されたapkを追加するのに問題があります。私が達成しようとしているのは、これらのアプリケーションの開発者がソース管理下のディレクトリにドロップするだけで、イメージの次のCIビルドにはそれらのアプリケーションだけが含まれることです。私はincluded_apksディレクトリ内のすべてのAPKを追加するために、以下のコードを使用してこれを試しましたが、期待通りに動作しません。すべての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 userdebug userdebugビルドバリアントに含まれるLOCAL_MODULE_TAGS := eng debugでなければなりません。 makeの構文は、私がしようとしていたものに対して正しいものでした。

+0

を:[私の代わりに名前で$コールの位置引数を参照することができますか? ](https://stackoverflow.com/questions/45426468/can-i-refer-to-the-positional-arguments-of-call-by-name-instead)および[シェルコマンドのターゲットワイルドカード](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'です。これは、' userdebug'ビルドバリアントに含める 'LOCAL_MODULE_TAGS:= eng debug'でなければなりません。 makeの構文は、私がしようとしていたものに対して正しいものでした。ありがとう@maschall – Bobbake4

0

'LOCAL_MODULE_TAGS := eng debug'ユーザーのビルドでこれを含むが、ENGとuserdebugません。それをユーザービルドに含める場合。それは'optional'なければならないとあなたのdevice/.../BoardConfig.mkはにそれらを追加する必要があります:あなたは、2つの類似の質問に対する私の最近の答えを読むことができ、あなたの問題を理解するために

PRODUCT_PACKAGES += your_local_module1 \ 
       your_local_module2 end so on... 
関連する問題