当前位置: 代码迷 >> Android >> Android JIT带来的虚拟机崩溃有关问题及解决方案(转)
  详细解决方案

Android JIT带来的虚拟机崩溃有关问题及解决方案(转)

热度:65   发布时间:2016-05-01 13:51:58.0
Android JIT带来的虚拟机崩溃问题及解决方案(转)

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 [email protected]@[email protected]

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 [email protected]@[email protected]

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。

  相关解决方案