Android ClassLoader.loadClass JNI崩溃

3
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
  #00  pc 0x50f8e  /system/lib/libdvm.so (dvmAbort+89)
  #01  pc 0x59ee1  /system/lib/libdvm.so (dvmLinearAlloc(Object*, unsigned int)+64)
  #02  pc 0x76a7b  /system/lib/libdvm.so (???)
  #03  pc 0x76d77  /system/lib/libdvm.so (dvmDefineClass(DvmDex*, char const*, Object*)+10)
  #04  pc 0x71583  /system/lib/libdvm.so (???)
  #05  pc 0x30c0c  /system/lib/libdvm.so (???)
  #06  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #07  pc 0x6d109  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+284)
  #08  pc 0x6d12d  /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
  #09  pc 0x76e69  /system/lib/libdvm.so (dvmFindClassNoInit(char const*, Object*)+108)
  #10  pc 0x6216b  /system/lib/libdvm.so (???)
  #11  pc 0x62287  /system/lib/libdvm.so (???)
  #12  pc 0x65a6d  /system/lib/libdvm.so (dvmVerifyCodeFlow(VerifierData*)+9760)
  #13  pc 0x68c91  /system/lib/libdvm.so (???)
  #14  pc 0x68ce3  /system/lib/libdvm.so (dvmVerifyClass(ClassObject*)+42)
  #15  pc 0x7704d  /system/lib/libdvm.so (dvmInitClass+116)
  #16  pc 0x742d1  /system/lib/libdvm.so (???)
  #17  pc 0x30c0c  /system/lib/libdvm.so (???)
  #18  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #19  pc 0x6ce39  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+344)
  #20  pc 0x73b19  /system/lib/libdvm.so (???)
  #21  pc 0x30c0c  /system/lib/libdvm.so (???)
  #22  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #23  pc 0x6ce39  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+344)
  #24  pc 0x7431b  /system/lib/libdvm.so (???)
  #25  pc 0x30c0c  /system/lib/libdvm.so (???)
  #26  pc 0x343dc  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
  #27  pc 0x6d109  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+284)
  #28  pc 0x554af  /system/lib/libdvm.so (???)
  #29  pc 0x48c6b  /system/lib/libandroid_runtime.so (???)
  #30  pc 0x4a81f  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+394)
  #31  pc 0xf0d  /system/bin/app_process (???)
java.lang.Throwable: 
******* Java stack for JNI crash *******
    at dalvik.system.DexFile.defineClass(Native Method)
    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:195)
    at dalvik.system.DexPathList.findClass(DexPathList.java:315)
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:58)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.lily.dexLoader.invokeStaticMethod(SourceFile:70)
    at com.lily.sdk.Web.<init>(SourceFile:77)

我无法通过我的安卓应用程序重现这个崩溃,但监控系统报告了很多次这种崩溃。

目前还不清楚是dex文件损坏还是系统dalvik不稳定导致的崩溃。

有没有人对这种loadClass崩溃有经验?


这不是崩溃,而是有意的中止。在logcat输出中应该有一条消息,说明虚拟机为什么决定停止运行。 - fadden
非常感谢!“abort”是指用户终止进程吗?还是有什么特殊含义?此外,我该如何重现这种中止? - Verdigrass
1个回答

2
如果虚拟机检测到严重问题,它将向日志发送诊断信息并中止。在您使用的 Android 版本中,虚拟机通过尝试写入只读位置(0xdeadd00d)来崩溃。
查看堆栈跟踪,在 dvmAbort() 之前最后一件事是 dvmLinearAlloc()。查看最近的源文件,如果虚拟机在分配内存时用完了内存或者在特殊调试模式下无法更改页面权限,它将在该函数中中止。几乎可以确定是前者。查看 logcat 输出可以确切地告诉您。
假设您的内存不足,我猜您正在运行旧版的 Android(<= gingerbread),其中“线性分配”缓冲区过小。这个内存区域用于保存类元数据,例如方法和字段的表,但不包括数据本身(这就是为什么它可以被标记为只读以帮助查找内存垃圾)。避免这个问题的唯一方法是重新构建类。
您可以在这篇博客文章中阅读更多关于这个问题以及Facebook工程师部署的解决方案。

非常感谢您详细的解释,设备信息是:“设备:GT-I9103 android-15”。API级别为15,这意味着内存不够大以容纳dex文件?顺便说一下,优化后的dex文件大小达到了4.2M(dex文件为1.3M)。您有什么看法? - Verdigrass
API 15 是4.0.3(“冰激凌三明治”),不应该有这个问题。根据网络上的信息,GT-I9103装载了姜饼系统,但可以升级到4.x版本。所以我不确定为什么您会看到这个问题,除非那个特定设备有一些奇怪的地方。(它只是那个设备吗?) - fadden
不仅仅是这个设备,还有很多种类:华为/T8833/hwt8833:4.0.4/HuaweiT8833/C01B411:user/ota-rel-keys,release-keys; ZTE/P810N30/P810N30:4.3/JLS36C/20140829.115049:user/release-keys; Coolpad/msm8660_surf/msm8660_surf:4.0.4/IMM76D/4.0.048.P4.121106.8950:user/release-keys; 小米/mione_plus/mione_plus:4.0.4/IMM76D/ICS22.0:user/release-keys; htccn_chs_cmcc/htc_primotd/primotd:4.0.3/IML74K/61230.1:user/release-keys... - Verdigrass

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