Android库项目无法与ACRA一起使用,因为它们的资源标识符不再是最终字段

Android库项目无法与ACRA一起使用,因为它们的资源标识符不再是最终字段,android,adt,android-library,acra,Android,Adt,Android Library,Acra,从ADT站点: 这些常量在库项目中不是最终的。原因是什么 很简单:当组合多个库项目时,实际 字段的值(必须是唯一的)可能会发生冲突。ADT前 14,所有字段都是最终字段,因此,所有库都必须具有 它们的所有资源和相关的Java代码都随 无论何时使用主项目。这对性能不利, 因为它使得构建非常缓慢。它还阻止了图书馆的分发 不包含源代码的项目,限制了使用范围 图书馆项目的管理 这是可以解释的 所以,为了解决这个问题,我使用了- int id = view.getId(); if (id == R.id.

从ADT站点:

这些常量在库项目中不是最终的。原因是什么 很简单:当组合多个库项目时,实际 字段的值(必须是唯一的)可能会发生冲突。ADT前 14,所有字段都是最终字段,因此,所有库都必须具有 它们的所有资源和相关的Java代码都随 无论何时使用主项目。这对性能不利, 因为它使得构建非常缓慢。它还阻止了图书馆的分发 不包含源代码的项目,限制了使用范围 图书馆项目的管理

这是可以解释的

所以,为了解决这个问题,我使用了-

int id = view.getId();
if (id == R.id.button1) {
    action1();
} else if (id == R.id.button2) {
    action2();
} else if (id == R.id.button3) {
    action3();
}
而不是-

    int id = view.getId();

    switch (id) {
    case R.id.button1:
        action1();
        break;
    case R.id.button2:
        action2();
        break;
    case R.id.button3:
        action3();
        break;
}
但是我有一个类
GlobalData
,我无法修复这些错误

代码-

错误显示--


当我将光标指向位于
R.string.crash\u dialog\u text的error时,注释属性
ReportsCrashes.resDialogText
的值必须是一个常量表达式。您必须在应用程序类中动态添加这些参数
onCreate()
,如下所示-

public class GlobalData extends Application {
@Override
        public void onCreate() {

            ACRAConfiguration config = ACRA.getConfig();
            config.setMailTo("abc@test.com");
            config.setResDialogIcon(android.R.drawable.ic_dialog_info);
            config.setResDialogText(R.string.crash_dialog_text);
            config.setResDialogTitle(R.string.crash_dialog_title);
            config.setResDialogCommentPrompt(R.string.crash_dialog_comment_prompt);
            config.setResDialogOkToast(R.string.crash_dialog_ok_toast);

            try
            {
                config.setMode(ReportingInteractionMode.DIALOG);
            }
            catch (ACRAConfigurationException e)
            {
                e.printStackTrace();
                return;
            }

            ACRA.setConfig(config);

            ACRA.init(this);
            super.onCreate();
    }
}

如果您在Android库中定义了一个具体的应用程序类,并为ACRA添加了注释,那么这只是一个问题


问题是,为什么Android库中会有一个具体的应用程序类,因为它属于您的应用程序项目,将拥有最终的资源属性。

您必须在Application.onCreate()中动态添加这些参数。 不能在ACRA.init()之前使用ACRA.getConfig()(如果在ACRA.init()之前调用,则返回null)。 改为使用ACRA.getNewDefaultConfig()。 您可以使用属性和其他编程方式初始化某些参数

例如:

@ReportsCrashes(
        mailTo = "abc@test.com",
        mode = ReportingInteractionMode.DIALOG,
        resDialogIcon = android.R.drawable.ic_dialog_info
)
public class MyApplication extends Application {

    @Override
    public void onCreate() {

        ACRAConfiguration config = ACRA.getNewDefaultConfig(this);
        config.setResDialogText(R.string.crash_dialog_text);
        config.setResDialogTitle(R.string.crash_dialog_title);
        config.setResDialogCommentPrompt(R.string.crash_dialog_comment_prompt);
        config.setResDialogOkToast(R.string.crash_dialog_ok_toast);

        ACRA.setConfig(config);
        ACRA.init(this);

        super.onCreate();
    }
}

不必是具体的,如果在库中为处理ACRA的应用程序创建抽象扩展,就会出现这种情况。不管怎样,上述答案是有效的,ACRA消息来源指出,在未来的版本中将有一个新的init方法来避免这个问题。问题是,为什么您希望在库中包含ACRA配置的抽象应用程序对象,而您必须在某一点上拥有一个具体的应用程序对象,而这一点可以很容易地拥有ACRA配置,特别是因为至少有一些配置是特定于应用程序的。作为ACRA提交人之一:您所指的方法是在4.3.0版(大约18个月前)中发布的。我使用一个自定义ACRA发件人,它位于一个单独的库中(以及我所有应用程序的通用代码),用于处理ACRA详细信息。然而,我的应用程序对祝酒词和提示使用相同的通用值,因此我不会在具体的应用程序中重新定义任何内容。作为一个提交者,你能建议这是否是一个推荐的做法,为什么?首先,我错了。我把日期看错了。但是,也许你可以帮我…当我链接ARCA 4.5.0 jar时,为什么我没有可用的ACRA#init(app,config)方法?这是我对未来版本得出错误结论的原因之一。但你的具体应用程序肯定有一个特定的键或url。除非你将所有应用程序的崩溃集中到一个桶中,否则这将是一种非常糟糕的管理方法。Mea culpa re#init(App,confi),该方法是在2014年2月才添加的,这就是为什么它不在4.5.0中发送的错误数据已经有了包名和版本代码,我一起使用这些数据片段来形成一个键,用于将错误彼此分离。通过这种方式,应用程序除了将错误发送到提交URL之外几乎没有什么可做的,这对于我的所有应用程序来说都很常见,因为我也管理自定义后端。因此,它们实际上进入不同的存储桶,而不需要预定义的唯一键或特定于应用程序的url。即使有一个密钥,重新定义每个应用程序的单个密钥也比在每个应用程序中保留自定义发送者代码要好。对库所做的更改要容易得多。