2013-10-10 13 views
6

私は2つのAndroidプロジェクト、メインのもの(パッケージ名com.adip.sampler)とmain(パッケージ名com.samples.projb)に追加されるライブラリを持っています。 my_int_values:リソースでそれらの両方で、私は、同じキーを持つinteger-arrayを持っている主なプロジェクトでAndroidのリソースキーの衝突

<integer-array name="my_int_values"> 
    <item>10</item> 
    <item>20</item> 
    <item>30</item> 
    <item>40</item> 
    <item>50</item> 
    <item>60</item> 
    <item>70</item> 
    <item>80</item> 
</integer-array> 

図書館にいる間:メインプロジェクトで

<integer-array name="my_int_values"> 
    <item>34</item> 
    <item>35</item> 
    <item>36</item> 
    <item>37</item> 
</integer-array> 

活動からこれらの配列(メインプロジェクトとライブラリの両方)の値が何であるか調べていたら:

その後、

私はLogcatでこれを見ている:

In Main: [10, 20, 30, 40, 50, 60, 70, 80] 
In Libr: [10, 20, 30, 40, 50, 60, 70, 80] 

メインプロジェクトは、ライブラリの配列で定義された値をオーバーライドしているようだ...私は正しいキーとし、その資源から読んでいた場合、私がチェック倍増します大丈夫ですか?私がそれぞれのRクラスを見てみるまで、メインプロジェクトでは、これは私がcom.adip.sampler.R.array.my_int_valuesのために持っているものです。

public static final class array { 
    public static final int my_int_values=0x7f060000; 
} 

com.samples.projb.R.array.my_int_valuesライブラリプロジェクトにいる間:

public static final class array { 
    public static final int my_int_values = 0x7f060000; 
} 

Androidのツールは、同じ値を生成しているので、不思議では私は、この動作を取得していないのです。整数配列の1つからキーを変更するとこの動作を取り除くことができますが、多くのリソース、依存関係ライブラリを持つ大きなプロジェクトがあるとしたら、遅かれ早かれこの種の問題にぶつかる可能性があります。同じキーの値を持つ同じ種類のリソース(私はstringでチェックし、string-array以上の動作も同様に表示されます)。したがって、質問は次のようになります。

  1. なぜこの問題が発生するのですか?それが問題ではない場合は、この動作を説明するものは何ですか?
  2. これを避けるにはどうすればよいですか?私は...トリックを行いますキーを定義する際に一意のいくつかの種類を持ってしようとしているが、開発者は怠惰になりがちという推測してい

これは、最新のADTとEclipseのバージョン(ジュノとインディゴの複数のバリアントを使用して表示されます)。 Windowsのみでチェックされます。

答えて

8

Library Projects at Android Developersを読むと、ビルド時にマージが起こり、同じIDを持つリソースが上書きされることが明らかになっている多くの参考文献があります。

リソースIDは、アプリケーションと ライブラリの両方で定義されているライブラリと場合によってはアプリケーション

から同じIDを持つリソースの場合

は、ツールは アプリケーションで宣言されたリソースを取得することを確認してくださいライブラリプロジェクト のリソースがアプリケーション.apkにコンパイルされていないことを確認してください。これにより、任意のリソースビヘイビアを使用または再定義する柔軟性や、任意のライブラリで定義されている の値がアプリケーションに与えられます( )。 2つのライブラリ

から同じIDを持つリソースの場合

...あなたのアプリケーションは、 が各ライブラリ内のリソースの相対的な優先順位を指定して、複数のライブラリプロジェクトへの参照を追加することができます。この は、 でアプリケーションで実際に使用されているリソースを蓄積することができます。 アプリケーションから参照される2つのライブラリ が同じリソースIDを定義する場合、ツールはより高い優先度を持つ ライブラリからリソースを選択し、もう一方を破棄します。

ソリューションは、マニュアルでリソースを回避するために

使用プレフィックス

は、共通リソースIDのリソースの競合を避けるために一意である プレフィックスまたは他の一貫性のある命名規則を使用することを検討するには、競合を示唆しましたプロジェクト (またはすべてのプロジェクトで一意です)。手動 プロジェクトを編集することにより、あなたは それらの相対的な優先順位を設定(および順序をマージ)できることに注意し、複数のライブラリへの参照を追加する場合command line

からライブラリ内の優先順位を設定する方法

。プロパティファイルを開き、各参照の.nインデックスを として適切に調整します。

+0

私はこれが答えであることを恐れていました:) Lintが異なるプロジェクト間で重複するリソースIDを検出することを意味するのかどうか知りましたか? – gunar

+1

これはあなたのアプリケーションに任意のライブラリで定義されているリソースの動作や値を使用または再定義するための柔軟性を与えます。 Androidがメインプロジェクトのリソースを使用している場合、または優先度の高いプロジェクトから重複リソースをダンプする場合、柔軟性はどこですか? – gunar

+0

答えが受け入れられましたが、StackOverflowでは22時間で賞金を払うことができます。 tacksåmycket! – gunar

1

個人的には、私はリソースの名前を変更します。命名規則について何か読んだら、それは意味のあるものでなければならず、 "my_int_array"は、特に他の人やプロジェクトが潜在的に使うことができる図書館ではあまり役に立ちません。

理想的には、6ヶ月間このことを忘れて、戻ってきて、その配列が何であるかを知りたいのであれば、コードがどのようなものであるかを推測する必要はありませんそれで終わった。

この投稿は、 https://stackoverflow.com/a/7249410/1222199には、命名規則に関するいくつかの異なる回答が含まれています。

最後に、競合についてはわからない、何かを掘ることができなかった。私はそれが自動的に生成される方法と関係があり、バグとしてログに記録して、開発チームから何か応答があるかどうかを確認する価値があると思います。

+0

私はあなたが 'my_int_array'を理解していると思います。このプロジェクトは、この質問の明確さのために作られたものです。私は他の5つの図書館プロジェクトを持つ巨大なプロジェクトに取り組んでおり、それぞれは独自のリソースを持つ別の中規模プロジェクトです。私は重複したリソースキーを狩り、それらが使用されているところで変更しています。しかし、これがなぜ起こっているのかを知ることは素晴らしいことです。ビルドシステムがワークスペース/プロジェクトのエコシステム全体でユニークなキーを生成しないのはなぜですか? – gunar

+0

ええ、そうです。それでも、私が持っている現在のプロジェクトは10個の別個のプロジェクトで構成されており、そのうちいくつかは私が制御しているだけです。 1文字を追加/削除するだけでキーを変更することができると思います。明らかに、使用されているアルゴリズムはワークスペースレベルでは機能せず、プロジェクトレベルでしか機能しないため、これをバグとして記録することをお勧めします。すべての正直なところ、これはおそらく非常にまれなことです。問題に関する情報がほとんどまたはまったくないという事実は、これがどれほどまれであるかを強調する。 – Trent