Eng版本手机ROM安兔兔跑分异常崩溃的问题

使用安兔兔Antutu对Eng版本手机进行跑分,可能会出现异常崩溃无法测试完毕。查看Log,可以看到出错的信息:
F/libc    (18606): Fatal signal 6 (SIGABRT), code -6 in tid 18649 (Thread-181)
I/DEBUG   (  181): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  181): Build fingerprint: 'Android/aosp_hammerhead/hammerhead:5.0/LRX21M/howell01121337:eng/test-keys'
I/DEBUG   (  181): Revision: '11'
I/DEBUG   (  181): ABI: 'arm'
I/DEBUG   (  181): pid: 18606, tid: 18649, name: Thread-181  >>> com.antutu.ABenchMark:antutu3dtest <<<
I/DEBUG   (  181): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
I/DEBUG   (  181): Abort message: 'art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: the return type of CallObjectMethodV does not match void com.google.analytics.tracking.android.Tracker.setAppVersion(java.lang.String)'
I/DEBUG   (  181):     r0 00000000  r1 000048d9  r2 00000006  r3 00000000
I/DEBUG   (  181):     r4 a3292db8  r5 00000006  r6 00000002  r7 0000010c
I/DEBUG   (  181):     r8 00000000  r9 b504f550  sl a3014000  fp 00000001
I/DEBUG   (  181):     ip 000048d9  sp a3292940  lr b6f22af9  pc b6f467bc  cpsr 60070010
I/DEBUG   (  181):
I/DEBUG   (  181): backtrace:
I/DEBUG   (  181):     #00 pc 0003a7bc  /system/lib/libc.so (tgkill+12)
I/DEBUG   (  181):     #01 pc 00016af5  /system/lib/libc.so (pthread_kill+52)
I/DEBUG   (  181):     #02 pc 00017707  /system/lib/libc.so (raise+10)
I/DEBUG   (  181):     #03 pc 00013f75  /system/lib/libc.so (__libc_android_abort+36)
I/DEBUG   (  181):     #04 pc 00012a3c  /system/lib/libc.so (abort+4)
I/DEBUG   (  181):     #05 pc 0022604b  /system/lib/libart.so (art::Runtime::Abort()+170)
I/DEBUG   (  181):     #06 pc 000a72e9  /system/lib/libart.so (art::LogMessage::~LogMessage()+1360)
I/DEBUG   (  181):     #07 pc 000b1401  /system/lib/libart.so (art::JniAbort(char const*, char const*)+1112)
I/DEBUG   (  181):     #08 pc 000b1945  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+68)
I/DEBUG   (  181):     #09 pc 000b2361  /system/lib/libart.so (_ZN3art11ScopedCheck8CheckSigEP10_jmethodIDPKcb.constprop.130+284)
I/DEBUG   (  181):     #10 pc 000b9a11  /system/lib/libart.so (art::CheckJNI::CallObjectMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+72)
I/DEBUG   (  181):     #11 pc 003f8758  /data/app/com.antutu.ABenchMark-1/lib/arm/libabench3d.so (_JNIEnv::CallObjectMethod(_jobject*, _jmethodID*, ...)+36)



这种情况一般是对JNI调用进行比较严格的检查,而这种检查在User版本一般是不存在的,在Eng版本中一般存在。控制Android系统是否对JNI调用进行检查(比如检查是否GlobalRef表项太对、JNI返回值类型是否正常)是使用系统属性来控制的。
在Android5.0之前,该属性是: dalvik.vm.checkjni
而到了Android5.0之后,属性值是: ro.kernel.android.checkjni

当该属性值取值为1的时候,表示需要进行检查,取值为0的时候,不需要检查。Eng版的该属性值默认为1,User版默认为0。
对于Eng版,我们只要修改该属性值即可。该属性值位于/system/build.prop文件中。

在PC上执行如下的命令:
$ adb remount && adb pull /system/build.prop && cat build.prop | sed 's/checkjni=1/checkjni=0/' > build.prop.new && adb push build.prop.new /system/build.prop && adb shell chmod 644 /system/build.prop

重启手机可以测试通过了。


版权声明:本文为howellzhu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。