NoClassDefFoundError: android.app.ANRManagerProxy

25

有人知道这是为什么吗?我的应用程序中报告了这个崩溃,但我不知道它是什么。

java.lang.NoClassDefFoundError: android.app.ANRManagerProxy

Thread: Binder_3, Exception: java.lang.NoClassDefFoundError: android.app.ANRManagerProxy 
at android.app.ANRManagerNative.asInterface(ANRManagerNative.java:30) 
at android.app.ANRManagerNative$1.create(ANRManagerNative.java:94) 
at android.app.ANRManagerNative$1.create(ANRManagerNative.java:88)
at android.util.Singleton.get(Singleton.java:34) at android.app.ANRManagerNative.getDefault(ANRManagerNative.java:37) 
at android.os.MessageLogger.dump(MessageLogger.java:253) 
at android.app.ANRAppManager.dumpMessageHistory(SourceFile:38) 
at android.app.ActivityThread$ApplicationThread.dumpMessageHistory(ActivityThread.java:1176) 
at android.app.ApplicationThreadNative.onTransact(ApplicationThreadNative.java:609) 
at android.os.Binder.execTransact(Binder.java:351) 
at dalvik.system.NativeStart.run(Native Method)

通常情况下,ANR与“应用程序无响应”相关联,当主应用程序线程长时间被占用时会出现该错误消息。这种情况发生在binder线程上,这表明ANRManagerProxy可能是监视器,用于占用关键线程,包括Binder IPC线程池。确保您没有占用主应用程序线程或任何Binder线程(例如,使用AIDL的远程服务)。但是,我不知道为什么某些Android版本缺少此类并给出NoClassDefFoundError - CommonsWare
这只发生在一个特定的设备上吗? - Jonas Czech
你解决了这个问题吗? - Jared Burrows
我曾经遇到过类似的“NoClassDefFoundError”错误,但通过移除一些不再需要的库并重新排列库的顺序来解决了这些问题。我从未确切地知道原因 - 感觉就像黑魔法一样。 - Martin
2
我们只在运行4.2.2的联想A316i上看到过这个问题。 - Dunc
显示剩余2条评论
2个回答

13

这个错误可能会出现在一小部分设备上(我没有列表,但它们通常是无名品牌),这些设备的固件开发人员出于未知原因从设备框架中删除了ANRManagerProxy (我通过追踪一个固件并对其进行反编译来确认此事)。

最好的方法是尝试查找任何可能导致线程锁定并使设备无响应的代码,并尝试使用AsyncTask或类似的方式以异步方式运行代码,避免 ANR。受影响的设备总是低端设备,因此您的代码将需要更长时间运行,并且有更大的机会导致此问题发生。

我建议使用Hugo作为调试方法执行时间的绝佳库,以缩小您关注的重点并找出花费最多时间的地方。这将有助于改进所有用户的代码,并减少出现此崩溃风险的可能性。


3
哇,这个“特性”真不错。 “嘿,伙计,我们应该从框架中删除一些随机的类吗?” “当然兄弟,那是个绝妙的主意。” - Gintas_

4
这是因为:
  • 您的应用程序正在主(GUI)线程中执行一些重型工作

  • 目标设备固件出现问题

以下是我经常遇到该错误的设备列表 - 所以不仅限于低端设备,请小心忽略它 :-)

Lenovo A316i、N5i、V769M、G3 orro、V5、G3、X-2、F-G906、Z350、V10、G910、EVOLVEO StrongPhone D2、A70C、G9006、V13、C3000、n968、SM-T322、H9503、GT-H9503、S5、F1、Lenovo TP-6000、Galaxy Tab SM-T700C...

您唯一能做的就是使您的应用程序响应迅速。最好的方法是在开发和测试期间使用Strict Mode,例如,做如下操作:

public void onCreate() {
    if (DEVELOPER_MODE) {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
             .detectDiskReads()
             .detectDiskWrites()
             .detectNetwork()   // or .detectAll() for all detectable problems
             .penaltyLog()
             .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
             .detectLeakedSqlLiteObjects()
             .detectLeakedClosableObjects()
             .penaltyLog()
             .penaltyDeath()
             .build());
    }
    super.onCreate();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接