【问题标题】:How Android handle multiple R.java?Android如何处理多个R.java?
【发布时间】:2012-05-03 22:31:54
【问题描述】:

我正在为一个项目制作几个 Android 库应用程序。为了简化问题,假设我在这个项目中有两个库(utilLibscreenLib)(现在将称为app)。

每个项目中都有同名但值不同的字符串资源。像这样:

utilLib

<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。有没有人遇到过这种情况?

【问题讨论】:

    标签: android modularity android-library r.java-file


    【解决方案1】:
    Log.d(TAG, "version: " + version); // 0.1 show be here
    

    原因来自官方开发指南Managing Projects - Library Projects

    当您构建依赖于库项目的应用程序时,SDK 工具会将库编译为临时 JAR 文件并在主项目中使用,然后使用结果生成 .apk。如果在应用程序和库中都定义了资源 ID,这些工具会确保应用程序中声明的资源获得优先权,并且库项目中的资源不会编译到应用程序 .apk 中。这使您的应用程序可以灵活地使用或重新定义在任何库中定义的任何资源行为或值。


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

    这由库项目优先级决定。

    引用官方开发指南Managing Project -Library Projects

    • 资源冲突

      由于这些工具将库项目的资源与依赖应用程序项目的资源合并,因此可能会在两个项目中定义给定的资源 ID。在这种情况下,工具从应用程序或具有最高优先级的库中选择资源,并丢弃其他资源。在开发应用程序时,请注意公共资源 ID 可能会在多个项目中定义并且将被合并,应用程序或最高优先级库中的资源优先。

    引用官方开发指南From Eclipse with ADT - Referencing a library project

    如果您要添加对多个库的引用,请注意,您可以通过选择一个库并使用向上和向下控件来设置它们的相对优先级(和合并顺序)。这些工具将引用的库与您的应用程序合并,从最低优先级(列表底部)到最高(列表顶部)。如果多个库定义了相同的资源 ID,则工具会从具有更高优先级的库中选择资源。应用程序本身具有最高优先级,其资源始终优先于库中定义的相同资源 ID 使用。

    引用官方开发指南From the Command Line - Referencing a Library Project

    如果您要添加对多个库的引用,请注意您可以通过手动编辑 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
    

    我找不到比官方开发指南更清楚地解释这一点的任何词。

    【讨论】:

    • 我从来没有认真阅读过《管理项目》。愚蠢的我,我今晚会这样做。非常感谢:D
    • 我读过很多书籍/在线指南,涵盖不同出版物的不同编程技术。 Android 官方开发指南 IMO 是最好的、简单的英文单词,带有完整的示例和代码 sn-p。这是让我选择它而不是 Cocoa/ObjectiveC 的主要原因之一:)
    【解决方案2】:

    您必须导入 com.screenLib.R 和 com.utilLib.R
    在您的代码中,它可能会抛出错误“无法解析你好”

    让我知道这是否正确!!!!

    【讨论】:

    • 即使我没有导入任何 R,项目也已解决。Eclipse 将其显示为 com.app.R.hello 但显然没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多