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。

更多相关文章

  1. android EditText设置不可写
  2. android 使用html5作布局文件: webview跟javascript交互
  3. android studio调试c/c++代码
  4. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  5. 锁屏界面
  6. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  7. Android(安卓)version and Linux Kernel version
  8. Android(安卓)闹钟管理类的使用
  9. Android学习篇之Menu的使用

随机推荐

  1. Android(安卓)使用Parcelable序列化对象
  2. Android中init.rc文件的解析
  3. Android推送通知
  4. Android应用程序的六个组成部分
  5. eclipse导入已存在的android工程时遇到An
  6. 设置Button背景渐变效果和点击效果
  7. ASM + Transform 在android中的使用
  8. Android第三方jar包ClassNotFind
  9. 【Arcgis for android】程序运行出错原因
  10. android 中遥控器键值的添加和修改