Android JIT带来的虚拟机崩溃问题及解决方案
报错日志
backtrace:
#00 pc 00033cf8 /dev/ashmem/dalvik-jit-code-cache (deleted)
#01 pc 00033ea1 /dev/ashmem/dalvik-jit-code-cache (deleted)
这些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中把的Android:vmSafeMode属
性设置true就可以对APK禁用JIT。