web-dev-qa-db-ja.com

XML名前空間宣言:自動置換パッケージ名

Android複数のビルドターゲット(antを使用)のプロジェクトがあります。テスト目的で、これらのビルドターゲットはすべて異なるパッケージ名を持っています(したがって、私のパッケージ名はリリースビルドのcom.mycompany.myappです。 com.mycompany.myapp.test for test build)。

これは、レイアウトファイルのカスタムxml名前空間に関する場合を除いて、ほとんどの部分でうまく機能します。したがって、この:

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res/com.mycompany.myapp" />

パッケージ名がcom.mycompany.myapp.testに置き換えられるとすぐに動作を停止します。
そのため、ビルド前に毎回com.mycompany.myappの値を置き換える必要があります。そして、これらのファイルはすべてvcsにあり、1人が構成を切り替えてマージするたびに競合しないため、レイアウトファイルを特定の構成フォルダーに移動する必要がありました。

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res/@CONFIG.PACKAGENAME@" />

これで、このファイルはvcsに保存され、@ CONFIG.PACKAGENAME @は事前構築中に置き換えられ、ファイルは./config/file.xmlから./res/layout/file.xmlにコピーされます。

これは非常に不便であり、実際にはうまく拡張できません(ビルドスクリプトで50個のファイルのすべてに言及することは想像できません)。

だから私の質問は、名前空間宣言で現在のパッケージ名を自動的に使用する方法はありますか?または、少なくともパッケージファイルを変更するたびにcom.mycompany.myappを置き換える必要がないように、レイアウトファイル(またはビルドファイル)を変更します。

47
Alexey

そのためのポストフィックスがあることがわかりました:res-auto。

だからあなたがする必要があるのは書くことです

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res-auto" />

これにより、現在のパッケージ名が自動的に使用されます。

118
Alexey