android运行apk停止运行---dalvik vm兼容性问题

来源:互联网 发布:简述数据库系统的特点 编辑:程序博客网 时间:2024/05/20 08:44

  环境:  genymotion android4.3系统

  现象:运行apk有时候出现停止运行现状,概率性出现,尤其第一次运行容易出现,堆栈信息如下:

F/libc    ( 1053): Fatal signal 11 (SIGSEGV) at 0x98d51598 (code=2), thread 1053 (ll.boombeach.uc)
I/DEBUG   (  105): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  105): Build fingerprint: 'generic/vbox86tp/vbox86tp:4.3/JLS36G/eng.yangfogen.20140826.100942:eng/test-keys'
I/DEBUG   (  105): Revision: '0'
I/DEBUG   (  105): pid: 1053, tid: 1053, name: ll.boombeach.uc  >>> com.supercell.boombeach.uc <<<
I/DEBUG   (  105): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 98d51598
I/DEBUG   (  105):     eax 98d51034  ebx b6239ccc  ecx b869b1d0  edx 00000159
I/DEBUG   (  105):     esi a4f03d78  edi a4da3ef0
I/DEBUG   (  105):     xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
I/DEBUG   (  105):     eip b61566fc  ebp 98d51000  esp bfe77470  flags 00210286
I/DEBUG   (  105):
I/DEBUG   (  105): backtrace:
I/DEBUG   (  105):     #00  pc 000de6fc  /system/lib/libdvm.so (dvmResolveString+124)
I/DEBUG   (  105):     #01  pc 0002a3d7  /system/lib/libdvm.so
I/DEBUG   (  105):     #02  pc 00033817  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  105):     #03  pc 0003b322  /system/lib/libdvm.so (dvmMterpStd(Thread*)+66)
I/DEBUG   (  105):     #04  pc 000369e9  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+217)
I/DEBUG   (  105):     #05  pc 000b9f62  /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+1634)
I/DEBUG   (  105):     #06  pc 000ce9e0  /system/lib/libdvm.so (Dalvik_java_lang_reflect_Method_invokeNative(unsigned int const*, JValue*)+288)
I/DEBUG   (  105):     #07  pc 00173058  /system/lib/libdvm.so
I/DEBUG   (  105):     #08  pc 00005eff  <unknown>
I/DEBUG   (  105):     #09  pc 0003b322  /system/lib/libdvm.so (dvmMterpStd(Thread*)+66)
I/DEBUG   (  105):     #10  pc 000369e9  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+217)
I/DEBUG   (  105):     #11  pc 000bacf7  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, char*)+759)
I/DEBUG   (  105):     #12  pc 0007774d  /system/lib/libdvm.so (CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, char*)+109)
I/DEBUG   (  105):     #13  pc 0005d3ea  /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+42)
I/DEBUG   (  105):     #14  pc 0005eaac  /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+924)
I/DEBUG   (  105):     #15  pc 00001017  /system/bin/app_process (main+567)
I/DEBUG   (  105):     #16  pc 0000cedc  /system/lib/libc.so (__libc_init+108)
I/DEBUG   (  105):     #17  pc 00000a91  /system/bin/app_process (_start+97)
I/DEBUG   (  105):
I/DEBUG   (  105): stack:
I/DEBUG   (  105):          bfe77430  00000000
I/DEBUG   (  105):          bfe77434  00000000
I/DEBUG   (  105):          bfe77438  00000000
I/DEBUG   (  105):          bfe7743c  00000000
I/DEBUG   (  105):          bfe77440  00000000
I/DEBUG   (  105):          bfe77444  00000000
I/DEBUG   (  105):          bfe77448  00000000
I/DEBUG   (  105):          bfe7744c  00000000
I/DEBUG   (  105):          bfe77450  00000000
I/DEBUG   (  105):          bfe77454  00000000
I/DEBUG   (  105):          bfe77458  00000000
I/DEBUG   (  105):          bfe7745c  00000000
I/DEBUG   (  105):          bfe77460  00000000
I/DEBUG   (  105):          bfe77464  00000000
I/DEBUG   (  105):          bfe77468  00000000
I/DEBUG   (  105):          bfe7746c  00000000
I/DEBUG   (  105):     #00  bfe77470  a4f03d78  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  105):          bfe77474  00000000
I/DEBUG   (  105):          bfe77478  bfe7748c  [stack]
I/DEBUG   (  105):          bfe7747c  b6239ccc  /system/lib/libdvm.so
I/DEBUG   (  105):          bfe77480  9905e88c  /data/dalvik-cache/data@app@com.supercell.boombeach.uc-1.apk@classes.dex
I/DEBUG   (  105):          bfe77484  a4c430f0  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  105):          bfe77488  b6114605  /system/lib/libdvm.so (dvmMarkCard(void const*)+5)
I/DEBUG   (  105):          bfe7748c  00000001
I/DEBUG   (  105):          bfe77490  a4f03fb8  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  105):          bfe77494  00000001
I/DEBUG   (  105):          bfe77498  b6155039  /system/lib/libdvm.so (dvmResolveMethod+9)
I/DEBUG   (  105):          bfe7749c  00000001
I/DEBUG   (  105):          bfe774a0  9905e8be  /data/dalvik-cache/data@app@com.supercell.boombeach.uc-1.apk@classes.dex
I/DEBUG   (  105):          bfe774a4  9eccbda0
I/DEBUG   (  105):          bfe774a8  bfe77528  [stack]
I/DEBUG   (  105):          bfe774ac  b60a23d8  /system/lib/libdvm.so
I/DEBUG   (  105):     #01  bfe774b0  a4ee2818  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (  105):          ........  ........
I/DEBUG   (  105):          ........  ........
I/DEBUG   (  105):
I/DEBUG   (  105): memory map around fault addr 98d51598:
I/DEBUG   (  105):     98cdb000-98d51000 r-x /dev/ashmem/dalvik-jit-code-cache (deleted)
I/DEBUG   (  105):     98d51000-98d52000 r-x /dev/ashmem/dalvik-aux-structure (deleted)
I/DEBUG   (  105):     98d52000-98da2000 rw- /dev/ashmem/dalvik-aux-structure (deleted)

有上述堆栈信息可知,问题出现在libdvm.so这个库,直觉告诉我是dalvik 虚拟机出现问题了,但是为什么是个吧apk会崩溃,而且是几率性的崩溃,查看虚拟机参数可以发现问题,具体解决参考如下:

##################################################################

引用:  http://blog.csdn.net/a345017062/article/details/6397465

Android自从2.2开始加入了JIT技术,号称速度提高了3~5倍。不过JIT的稳定性有待考证。。。

看一下这个issue:

http://code.google.com/p/android/issues/detail?id=9281

我的系统是2.3的,我把楼主的代码放在模拟器和板子上运行时候,倒是都好着呢。但我自己从网上下载的一个含有3D调用的APK,运行时VM崩溃了。这是我的板上报出的系统LOG

 

I/DEBUG   (   71): signal 7 (SIGBUS), code 128 (?), fault addr 00000000

I/DEBUG   (   71):  r0 4675df4a  r1 00000001  r2 00000000  r3 00000004

I/DEBUG   (   71):  r4 3f800000  r5 45e89e5c  r6 4689ebf0  r7 405a39b8

I/DEBUG   (   71):  r8 aca11f00  r9 00002512  10 001ba368  fp 450cf3c4

I/DEBUG   (   71):  ip 00000012  sp 4689eba8  lr 00000000  pc 47751930  cpsr 20000030

I/DEBUG   (   71):          #00  pc 47751930  /dev/ashmem/dalvik-jit-code-cache (deleted)

I/DEBUG   (   71):          #01  lr 00000000  <unknown>

I/DEBUG   (   71): 

I/DEBUG   (   71): code around pc:

I/DEBUG   (   71): 47751910 2f002300 61296168 602b60ea d01e60ac 

I/DEBUG   (   71): 47751920 61fb623b 2304627c 60682004 602b481f 

I/DEBUG   (   71): 47751930 6e716803 4a1c4788 681368b1 1fef1c18 

I/DEBUG   (   71): 47751940 60293f15 c703606b a1034816 340c4c17 

I/DEBUG   (   71): 47751950 ebe4f7fe e004e010 602c68b4 4810e006 

I/DEBUG   (   71): 

I/DEBUG   (   71): code around lr:

I/DEBUG   (   71): 

I/DEBUG   (   71): stack:

I/DEBUG   (   71):     4689eb68  00000001  

I/DEBUG   (   71):     4689eb6c  4000c1e8  /dev/ashmem/dalvik-heap (deleted)

I/DEBUG   (   71):     4689eb70  acaa3d08  

I/DEBUG   (   71):     4689eb74  aca1acec  /system/lib/libdvm.so

I/DEBUG   (   71):     4689eb78  4053ceb0  /dev/ashmem/dalvik-heap (deleted)

I/DEBUG   (   71):     4689eb7c  45e89e8c  

I/DEBUG   (   71):     4689eb80  aca9e5c8  /system/lib/libdvm.so

I/DEBUG   (   71):     4689eb84  0000003a  

I/DEBUG   (   71):     4689eb88  aca11f00  /system/lib/libdvm.so

I/DEBUG   (   71):     4689eb8c  00000001  

I/DEBUG   (   71):     4689eb90  4053ceb0  /dev/ashmem/dalvik-heap (deleted)

I/DEBUG   (   71):     4689eb94  4675df28  /data/dalvik-cache/data@app@com.threed.jpct.bench-1.apk@classes.dex

I/DEBUG   (   71):     4689eb98  45e89e5c  

I/DEBUG   (   71):     4689eb9c  4689ebf0  

I/DEBUG   (   71):     4689eba0  df002777  

I/DEBUG   (   71):     4689eba4  e3a070ad  

I/DEBUG   (   71): #00 4689eba8  40598d38  /dev/ashmem/dalvik-heap (deleted)

I/DEBUG   (   71):     4689ebac  4689ebf0  

I/DEBUG   (   71):     4689ebb0  00000001  

I/DEBUG   (   71):     4689ebb4  001c3618  [heap]

I/DEBUG   (   71):     4689ebb8  001ba370  [heap]

I/DEBUG   (   71):     4689ebbc  001aba70  [heap]

I/DEBUG   (   71):     4689ebc0  4689eed8  

I/DEBUG   (   71):     4689ebc4  acaa3d08  

I/DEBUG   (   71):     4689ebc8  450cf3c4  /data/dalvik-cache/system@framework@framework.jar@classes.dex

I/DEBUG   (   71):     4689ebcc  aca1c0a0  /system/lib/libdvm.so

I/DEBUG   (   71):     4689ebd0  4689ebf0  

I/DEBUG   (   71):     4689ebd4  001ba368  [heap]

I/DEBUG   (   71):     4689ebd8  aca1c010  /system/lib/libdvm.so

I/DEBUG   (   71):     4689ebdc  4446fcac  /dev/ashmem/dalvik-LinearAlloc (deleted)

I/DEBUG   (   71):     4689ebe0  fffffebc  

I/DEBUG   (   71):     4689ebe4  aca1af94  /system/lib/libdvm.so

I/DEBUG   (   71):     4689ebe8  00000000  

I/DEBUG   (   71):     4689ebec  00000000  

 

这些LOG和帖子当中提到的问题看起来一样,我就试着把JIT给关闭了,果真问题不存在了。

下面记录一下Android系统是如何配置JIT的。

 

/build/core/combo/TARGET_linux-arm.mk中有这样一段

# Enable the Dalvik JIT compiler if not already specified.

ifeq ($(strip $(WITH_JIT)),)

    WITH_JIT := true

endif

默认情况下,JIT是打开的,这里就是JIT的总开关。如果要关闭,可以在这段代码前面加上WITH_JIT := false

 

WITH_JIT控制JIT是否打开时,会影响到两个库:libandroid_runtime.so和libdvm.so,控制代码分别在/frameworks/base/core/jni/Android.mk、/dalvik/vm/Android.mk和/dalvik/vm/Dvm.mk这三个Makefile中,可以在这里搜索一个WITH_JIT查看一下。

 

如何觉得上面这个比较暴力,也可以用温柔一点儿的方法:

修改/system/build.prop build.prop

在最后一行添加:

dalvik.vm.execution-mode=int:jit(开启JIT)

dalvik.vm.execution-mode=int:fast(关闭JIT)

 

这样的话,APK是稳定了,JIT的速度优势却也没了,毕竟出问题的APK只是一小部分。我这里最后发包时还是打开了,让应用程序开发者在APK里去关闭吧。只要在APK的AndroidManifest.xml中把<application>的Android:vmSafeMode属性设置true就可以对APK禁用JIT。

 

 

参考文章

 

Android2.2平台API变化概述

http://blog.csdn.net/ddna/archive/2010/05/27/5624408.aspx

如何控制dalvik

http://hi.baidu.com/seucr/blog/item/7d14a7167fb1548f6538db8e.html


0 0
原创粉丝点击