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
- android运行apk停止运行---dalvik vm兼容性问题
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- android dalvik vm alloc
- android dalvik vm oo
- android dalvik vm alloc
- Android 的 Dalvik VM
- android dalvik vm oo
- android dalvik vm alloc
- Android ART运行时与Dalvik虚拟机
- Android 判断运行环境(ART or Dalvik)
- Android之Dalvik运行过程分析
- Android APK开机自动运行
- Android从apk到运行
- C#中使用byte[]数据,生成Bitmap
- UVa 572 Oil Deposits(DFS求8连通块)
- Android设备无法查看logcat解决方法
- android中的类加载器
- Lambda表达式
- android运行apk停止运行---dalvik vm兼容性问题
- tomcat多域名配置
- Ajax传参中文问题
- linux的系统目录
- javascript 为元素绑定事件并获取元素位置
- 分析归档日志提取某些对象被修改的记录
- CocoaPods安装和使用教程
- centos 6.0 下安装mysql
- 电脑组合键使用技巧