这个问题就像一个逻辑难题。你被警告了。
我正在开发一个与其他应用程序集成的库。一个人抱怨说,他们只看到部分用户崩溃:
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 文件夹问题。
他似乎正在使用日食。
他从 cocos2d-x for Android 调用我的代码,通过执行
handler.post()
这怎么可能?
我很困惑为什么只有一些用户看到NoClassDefFoundError
?这是一个巨大的谷歌播放崩溃报告问题吗?就像,所有用户都看到了它,但是谷歌播放说只有一些用户看到了这个问题?(我尚未与开发人员核实,但我相当确定他通过从 Play 商店下载实时版本进行了测试,并且他没有看到任何错误,并且那段代码运行良好)。
据我了解,NoClassDefFoundError
只有当类通过三个类加载器之一存在时,但在运行时,没有一个类加载器可以找到特定的类。
这是一个proguard问题吗?我读过 proguard 只在发布时运行。
这是 AsyncTask 问题吗?我读过 AsyncTasks 必须第一次在 UI 线程上实例化。虽然,我不确定为什么会导致NoClassDefFoundError
.
有什么想法吗?