使用安兔兔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版权协议,转载请附上原文出处链接和本声明。