java - NoClassDefFoundError 只有一些设备,只能来自 playstore?这甚至可能吗?

标签 java android classloader google-play noclassdeffounderror

这个问题就像一个逻辑谜题。你已被警告。

我正在开发一个与其他应用程序集成的库。一个人提示说他们只看到部分用户的崩溃:

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. 他好像用的是eclipse。

  6. 他通过 handler.post()

  7. 从 cocos2d-x for Android 调用我的代码

这怎么可能?

我很困惑为什么只有一些用户看到了 NoClassDefFoundError?这是一个巨大的 google play 崩溃报告问题吗?就像,所有用户都看到了它,但是谷歌播放说只有一些用户看到了这个问题? (我还没有与开发人员核实,但我相当肯定他通过从 Play 商店下载实时版本进行了测试,他没有看到任何错误,并且那段代码运行正常)。

据我所知,NoClassDefFoundError 仅当该类通过三个类加载器之一存在时,但在运行时,没有一个类加载器可以找到特定的类。

这是一个proguard问题吗?我读到混淆器只在发布时运行。

这是 AsyncTask 问题吗?我读过必须在 UI 线程上第一次实例化 AsyncTasks。虽然,我不确定为什么会导致 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);
}

关于java - NoClassDefFoundError 只有一些设备,只能来自 playstore?这甚至可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18542419/

相关文章:

java double 计算

android - 取消 RecyclerView 垂直滑动/滑动

java - 在循环中访问按钮 id 是一个好习惯吗?

Java反射,如何在运行时重新加载已更改和重新编译的类?

java - EAP 6.1 中的类加载问题 - JBoss 7.2/WAR 类看不到 EAR 类

java - java中的系统类加载器有什么用?

java - 解析 XML 时将子节点与控制值进行比较

java - 尝试在 Tomcat 中将 LDAP 配置为 JNDI 资源

java - Bouncy caSTLe key 生成器示例错误

java - Google map Activity 显示空白屏幕