![](/img/trans.png)
[英]Fabric/Crashlytics NoClassDefFoundError only on certain devices
[英]NoClassDefFoundError only some devices, only from playstore? is this even possible?
这个问题就像一个逻辑难题。 你被警告了。
我正在与其他应用程序集成的库中工作。 一个人抱怨说,他们只看到部分用户的崩溃:
java.lang.NoClassDefFoundError: com.somecompany.subpackage.SomeAsyncTaskSubclass
at com.somecompany.subpackage.ClassA.instantiateInstanceOfSomeAsyncTaskSubclass(ClassA.java:105)
at
com.somecompany.subpackage.Blah.loadsomedata(MyController.java:180)
at com.somecompany.subpackage.Blah.loadsomemoredata(MyController.java:164)
at com.somecompany.subpackage.SomeView.loadsomemoredata(SomeView.java:213)
com.other.blah.Blah.preloadstuff(Blah.java:118)
at
com.other.blah.Controller.loadSomething(Controller.java:100)
at
com.other.blah.Controller.preloadSomething(Controller.java:144)
at org.cocos2dx.lib.Cocos2dxRenderer.nativeRender(Native Method)
at org.cocos2dx.lib.Cocos2dxRenderer.onDrawFrame(Cocos2dxRenderer.java:94)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1332)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
发生崩溃的代码行位于:
public class ClassA {
public void instantiateInstanceOfSomeAsyncTaskSubclass(){
SomeAsyncTaskSubclass crashHere = new SomeAsyncTaskSubclass(); //<--- this is where it crashes
}
}
在同一个包装中,有...
class SomeAsyncTaskSubclass extends AsyncTask<String, Void, SomeCustomObject> {
// some code here...
}
这是我被告知或我知道的:
此崩溃仅发生在某些用户上。 (但基于Google Play崩溃报告。那是不准确吗?还是样本生成太慢?)
即使使用已签名的版本,开发人员也无法在内部重现此错误。 (我检查了签名的构建并对其进行了删除处理,以查看该类存在于src中,因此我相信他)
但是当该应用程序在Play商店中上线并且人们下载了他的新版本时,他突然看到了一些人的崩溃报告,据信主要是设备2.3.x,尽管尚未证实)
他声称自己已更新为“ api 17”。 当人们这么说时,是指建立目标17吗? 还是人们意味着要更新到ADT 17? 因为我知道ADT会处理lib / libs文件夹问题。
他似乎正在使用日食。
他正在通过执行handler.post()
从Android的cocos2d-x调用我的代码
这怎么可能?
我对为什么只有部分用户看到NoClassDefFoundError
感到困惑? 那是一个巨大的Google Play崩溃报告问题吗? 例如,所有用户都看到了此问题,但随后Google Play说只有部分用户看到了此问题? (我尚未与开发人员进行验证,但是可以肯定地说,他通过从Play商店下载实时版本进行了测试,并且他没有看到任何错误,并且该代码段运行得很好)。
据我了解, NoClassDefFoundError
仅在通过三个类加载器之一存在该类时出现,但是在运行时,没有一个类加载器找不到特定的类。
这是一个保卫问题吗? 我已经了解到proguard仅在发布时运行。
这是AsyncTask问题吗? 我读过AsyncTasks必须在UI线程上第一次实例化。 虽然,我不确定为什么会导致NoClassDefFoundError
。
有什么想法吗?
导致NoClassDefFoundError
出现在您的应用中的原因可能有多种,例如:
MultiDEX
,您可以按照此官方Android资源https://developer.android.com/studio/build/multidex#mdex-gradle MultiDEX
是不够的,您需要在主DEX文件中声明一些类。 基本上,您只需要将缺少的类添加到文件中,如Dean Wild指出的那样,它们会在应用程序启动时加载。 这是因为有时构建工具在计算要添加的类时可能会遇到麻烦。 官方文档: https : //developer.android.com/studio/build/multidex#keep Application
类以使用一些自定义代码扩展它,则可能必须从MultiDexApplication
类而不是从Application
类继承。 MonitoringInstrumentation
或AndroidJUnitRunner
工具,则不会发生NoClassDefFoundError
,但是您可能会得到它们。 如果是这种情况,则只需在onCreate()
方法中添加以下代码: onCreate()
方法的内容:
public void onCreate(Bundle arguments) {
MultiDex.install(getTargetContext());
super.onCreate(arguments);
}
根据SDK ICS或更高版本构建项目。
他们已经在ICS +中自动加载了AsyncTask。 这就是问题。
启用multidex对我来说会引起这个问题。 我需要multidex,因为我包括了整个Google Play服务库。 通过仅包含所需的组件(在我的情况下为GCM),我可以禁用multidex并防止出现此问题。
我知道这不是一个真正的解决办法,但我认为,如果可能的话,应该避免阅读多义词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.