繁体   English   中英

NoClassDefFoundError仅某些设备,仅来自playstore? 这有可能吗?

[英]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...
}

这是我被告知或我知道的:

  1. 此崩溃仅发生在某些用户上。 (但基于Google Play崩溃报告。那是不准确吗?还是样本生成太慢?)

  2. 即使使用已签名的版本,开发人员也无法在内部重现此错误。 (我检查了签名的构建并对其进行了删除处理,以查看该类存在于src中,因此我相信他)

  3. 但是当该应用程序在Play商店中上线并且人们下载了他的新版本时,他突然看到了一些人的崩溃报告,据信主要是设备2.3.x,尽管尚未证实)

  4. 他声称自己已更新为“ api 17”。 当人们这么说时,是指建立目标17吗? 还是人们意味着要更新到ADT 17? 因为我知道ADT会处理lib / libs文件夹问题。

  5. 他似乎正在使用日食。

  6. 他正在通过执行handler.post()从Android的cocos2d-x调用我的代码

这怎么可能?

我对为什么只有部分用户看到NoClassDefFoundError感到困惑? 那是一个巨大的Google Play崩溃报告问题吗? 例如,所有用户都看到了此问题,但随后Google Play说只有部分用户看到了此问题? (我尚未与开发人员进行验证,但是可以肯定地说,他通过从Play商店下载实时版本进行了测试,并且他没有看到任何错误,并且该代码段运行得很好)。

据我了解, NoClassDefFoundError仅在通过三个类加载器之一存在该类时出现,但是在运行时,没有一个类加载器找不到特定的类。

这是一个保卫问题吗? 我已经了解到proguard仅在发布时运行。

这是AsyncTask问题吗? 我读过AsyncTasks必须在UI线程上第一次实例化。 虽然,我不确定为什么会导致NoClassDefFoundError

有什么想法吗?

导致NoClassDefFoundError出现在您的应用中的原因可能有多种,例如:

  • APK中包含超过65536个方法。 解决方案是启用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类继承。
  • 在测试过程中,如果您使用MonitoringInstrumentationAndroidJUnitRunner工具,则不会发生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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM