10

プロジェクト用にいくつかの Android ライブラリ アプリを作成しています。質問を簡単にするために、このプロジェクトに 2 つのライブラリ ( utilLibscreenLib ) があるとします (現在はappと呼ばれます)。

各プロジェクト内に同じ名前の文字列リソースがありますが、値は異なります。このような:

ユーティリティ ライブラリ

<string name="app_version">1.0</string>
<string name="hello">UtilLib Hello</string>

screenLib

<string name="app_version">0.7a</string>
<string name="hello">ScreenLib Hello</string>

アプリ

<string name="app_version">0.1</string>

com.package.Rを使用して文字列を参照できることに気付きましたが、コードが次のようになっていると何が表示されるのでしょうか?

<!-- language: java -->
import com.app.R; 
...

private void checkValue(){
    String version = getString(R.app_version);
    Log.d(TAG, "version: " + version); // 0.1 show be here
    String hello = getString(R.hello);
    Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello')
}

ここでモジュラー ビルドを作成しようとしていますが、Android が R.java の使用を優先する方法を完全には理解していません。誰もこれを経験したことがありますか?

4

2 に答える 2

15
Log.d(TAG, "version: " + version); // 0.1 show be here

公式開発ガイドから引用した理由プロジェクトの管理-ライブラリプロジェクト

ライブラリプロジェクトに依存するアプリケーションをビルドする場合、SDKツールはライブラリを一時的なJARファイルにコンパイルし、メインプロジェクトで使用してから、その結果を使用して.apkを生成します。アプリケーションとライブラリの両方でリソースIDが定義されている場合、ツールは、アプリケーションで宣言されたリソースが優先され、ライブラリプロジェクトのリソースがアプリケーション.apkにコンパイルされないようにします。これにより、アプリケーションは、任意のライブラリで定義されているリソースの動作または値を使用または再定義する柔軟性が得られます。


Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello')

これは、ライブラリプロジェクトの優先度によって決まります。

公式開発ガイドからの引用プロジェクトの管理-ライブラリプロジェクト

  • リソースの競合

    ツールはライブラリプロジェクトのリソースを依存アプリケーションプロジェクトのリソースとマージするため、特定のリソースIDが両方のプロジェクトで定義される場合があります。この場合、ツールはアプリケーションまたは最も優先度の高いライブラリからリソースを選択し、他のリソースを破棄します。アプリケーションを開発するときは、共通のリソースIDが複数のプロジェクトで定義される可能性が高く、アプリケーションまたは最も優先度の高いライブラリのリソースが優先されてマージされることに注意してください。

公式開発ガイドからの引用ADTを使用したEclipseから-ライブラリプロジェクトの参照

複数のライブラリへの参照を追加する場合は、ライブラリを選択し、上下のコントロールを使用して、それらの相対的な優先度(およびマージ順序)を設定できることに注意してください。ツールは、参照されたライブラリを、優先度の低いもの(リストの一番下)から高いもの(リストの一番上)までアプリケーションとマージします。複数のライブラリが同じリソースIDを定義している場合、ツールはライブラリからより高い優先度でリソースを選択します。アプリケーション自体が最優先され、そのリソースは常にライブラリで定義された同一のリソースIDよりも優先して使用されます。

公式開発ガイドからの引用コマンドラインから-ライブラリプロジェクトの参照

複数のライブラリへの参照を追加する場合は、project.propertiesファイルを手動で編集し、各参照の.nインデックスを適切に調整することで、相対的な優先度(およびマージ順序)を設定できることに注意してください。たとえば、次の参照を想定します。

 android.library.reference.1=path/to/library_projectA
 android.library.reference.2=path/to/library_projectB
 android.library.reference.3=path/to/library_projectC

次のようにして、参照を並べ替えて、library_projectCに最高の優先順位を付けることができます。

 android.library.reference.2=path/to/library_projectA
 android.library.reference.3=path/to/library_projectB
 android.library.reference.1=path/to/library_projectC

これを公式の開発ガイドよりも明確に説明できる言葉は見つかりません。

于 2012-04-23T10:48:02.860 に答える
-1

com.screenLib.Rとcom.utilLib.Rをインポートする必要があり
ます。コードで「helloを解決できません」というエラーがスローされる可能性があります。

Lemmmeはこれが正しいかどうか知っています!!!!

于 2012-04-23T10:07:07.023 に答える