android-V8独立应用仅在发布签名APK时与SIGILL一起死亡

android-V8独立应用仅在发布签名APK时与SIGILL一起死亡,第1张

概述我正在使用使用AndroidNDK嵌入到C应用程序中的v8.它在许多设备上均可正常运行,但使用带有签名的APK(Android4.0.4)在SamsungGalaxyTab10.1上崩溃.奇怪的是,调试签名的apk在GalaxyTab10.1上完美运行.我已经在两个调试/发布apk中检查了.so库,并且两者都相等,md5相同.我创建了

我正在使用使用Android NDK嵌入到C应用程序中的v8.它在许多设备上均可正常运行,但使用带有签名的APK(AndroID 4.0.4)在Samsung galaxy Tab 10.1上崩溃.奇怪的是,调试签名的apk在galaxy Tab 10.1上完美运行.我已经在两个调试/发布apk中检查了.so库,并且两者都相等,md5相同.

我创建了一个最小的测试案例来重现该问题.我已经测试了许多v8版本(3.22、3.23、3.26等),许多编译标志(armeabi,armeabi-v7a,-mfpu = vfpv3-d16等),启用或禁用了v8快照,但是崩溃仍然存在尚存版本中已签名的apk.

如果两个本地.so库都相等,到底是什么引起了调试和发布签名的APK之间的差异?有任何解决此崩溃的方法吗?

这是测试用例的main.cpp

#include "v8.h"#include <jni.h>#include <androID/log.h>#define LOGE(...) __androID_log_print(ANDROID_LOG_ERROR  , "Paradox",__VA_ARGS__)using namespace v8;namespace {    voID testContext()    {        LOGE("Hellooo!!!");        v8::Isolate* isolate = v8::Isolate::GetCurrent();        v8::Locker v8Lock(isolate);        v8::Isolate::Scope isolateScope(isolate);        v8::HandleScope handle_scope(isolate);        Handle<ObjectTemplate> global_templ = ObjectTemplate::New();        LOGE("Creating V8 Context...");        //crashes while creating this context        v8::Handle<v8::Context> context = v8::Context::New(isolate, 0, global_templ);        LOGE("Created V8 Context");        v8::Context::Scope context_scope(context);         v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', World! ' + Math.PI");        v8::Local<v8::Script> script = v8::Script::Compile(source);        v8::Handle<v8::Value> result = script->Run();        v8::String::Utf8Value utf8(result);        LOGE("Yehaaaaa: %s", *utf8);    }}extern "C"{       jint JNI_OnLoad(JavaVM* vm, voID* reserved)    {        jnienv* env;        if (vm->GetEnv(reinterpret_cast<voID**>(&env), JNI_VERSION_1_6) != JNI_OK) {            return -1;        }        testContext();        return JNI_VERSION_1_6;    }  }

Application.mk文件

APP_MODulES := ParadoxAPP_ABI := armeabi-v7aAPP_PLATFORM := androID-9APP_STL := stlport_static

AndroID.mk文件

MY_LOCAL_PATH := $(call my-dir)LOCAL_PATH := /Users/mortimer/Projects/v8/include $(CLEAR_VARS)LOCAL_MODulE := v8_androIDLOCAL_SRC_fileS := \    /Users/mortimer/Projects/v8/out/androID_arm.release/obj.target/tools/gyp/libv8_base.arm.ainclude $(PREBUILT_STATIC_liBRARY)LOCAL_PATH := /Users/mortimer/Projects/v8/include $(CLEAR_VARS)LOCAL_MODulE := v8_androID_snapshotLOCAL_SRC_fileS := \    /Users/mortimer/Projects/v8/out/androID_arm.release/obj.target/tools/gyp/libv8_snapshot.ainclude $(PREBUILT_STATIC_liBRARY)LOCAL_PATH := $(MY_LOCAL_PATH)include $(CLEAR_VARS)LOCAL_MODulE := ParadoxLOCAL_C_INCLUDES := \    /Users/mortimer/Projects/v8/includeLOCAL_STATIC_liBRARIES := \    v8_androID \    v8_androID_snapshotLOCAL_LDliBS := \    -llog \    -lcLOCAL_SRC_fileS := \    main.cppinclude $(BUILD_SHARED_liBRARY)

AndroID活动

package com.mortimer.paradox;import androID.app.Activity;import androID.os.Bundle;public class ParadoxActivity extends Activity {    /**     * Called when the activity is first created.     */    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        System.loadlibrary("Paradox");        setContentVIEw(R.layout.main);    }}

这是故障转储:

06-11 09:57:06.960    4198-4198/? D/dalvikvm﹕ Trying to load lib /data/data/com.mortimer.Paradox/lib/libParadox.so 0x4132f02806-11 09:57:06.970    4198-4198/? D/dalvikvm﹕ Added shared lib /data/data/com.mortimer.Paradox/lib/libParadox.so 0x4132f02806-11 09:57:06.970    4198-4198/? E/Paradox﹕ Hellooo!!!06-11 09:57:06.990    4198-4198/? E/Paradox﹕ Creating V8 Context...06-11 09:57:07.010    4198-4198/? A/libc﹕ Fatal signal 4 (SIGILL) at 0x5c60a310 (code=1)06-11 09:57:07.150      110-180/? I/AudioPolicyManager﹕ stopOutput() output 1, stream 1, session 1506-11 09:57:07.170      110-176/? I/audioflinger﹕ stop output streamType (0, 1) for 106-11 09:57:07.170      110-176/? D/AudioHarDWare﹕ AudioStreamOutALSA::setParameters() stop_output_streamtype=106-11 09:57:07.510      104-104/? I/DEBUG﹕ *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***06-11 09:57:07.510      104-104/? I/DEBUG﹕ Build fingerprint: 'samsung/GT-P7510/GT-P7510:4.0.4/IMM76D/XXLPH:user/release-keys'06-11 09:57:07.510      104-104/? I/DEBUG﹕ pID: 4198, tID: 4198  >>> com.mortimer.Paradox <<<06-11 09:57:07.510      104-104/? I/DEBUG﹕ signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 5c60a31006-11 09:57:07.510      104-104/? I/DEBUG﹕ r0 00000002  r1 5c2080a1  r2 00000002  r3 3d93a1dd06-11 09:57:07.510      104-104/? I/DEBUG﹕ r4 3d908091  r5 3d908091  r6 be859398  r7 3d90809106-11 09:57:07.510      104-104/? I/DEBUG﹕ r8 3d933711  r9 0000000c  10 00a6888c  fp be85939006-11 09:57:07.510      104-104/? I/DEBUG﹕ ip 00000056  sp be859384  lr 3ae51f18  pc 5c60a310  cpsr 2000001006-11 09:57:07.510      104-104/? I/DEBUG﹕ d0  431684be42700568  d1  3ff000004315d32c06-11 09:57:07.510      104-104/? I/DEBUG﹕ d2  457ff80000000fff  d3  000000003f00000006-11 09:57:07.510      104-104/? I/DEBUG﹕ d4  00001fff00000000  d5  3fe999999999999a06-11 09:57:07.510      104-104/? I/DEBUG﹕ d6  3fe8000000000000  d7  3f8000003f4ccccd06-11 09:57:07.510      104-104/? I/DEBUG﹕ d8  0000000000000000  d9  000000000000000006-11 09:57:07.510      104-104/? I/DEBUG﹕ d10 0000000000000000  d11 000000000000000006-11 09:57:07.510      104-104/? I/DEBUG﹕ d12 0000000000000000  d13 000000000000000006-11 09:57:07.510      104-104/? I/DEBUG﹕ d14 0000000000000000  d15 000000000000000006-11 09:57:07.510      104-104/? I/DEBUG﹕ scr 6200001006-11 09:57:07.650      104-104/? I/DEBUG﹕ #00  pc 5c60a31006-11 09:57:07.650      104-104/? I/DEBUG﹕ #01  lr 3ae51f1806-11 09:57:07.650      104-104/? I/DEBUG﹕ code around pc:06-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a2f0 ea000002 e3a0c03f e52dc004 eaffffff  ....?.....-.....06-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a300 e307c1b8 e345cbfb e59cc000 e31c0040  [email protected] 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a310 1d6d0b20 024dd080 ed2d0b1c e92dffff   .m...M...-...-.06-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a320 e59d2130 e1a0300e e28d4f4d e04b4004  [email protected] 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a330 e1a0500d e24dd00c e3cdd007 e58d5008  .P....M......P..06-11 09:57:07.660      104-104/? I/DEBUG﹕ code around lr:06-11 09:57:07.660      104-104/? I/DEBUG﹕ 3ae51ef8 e30ac000 e345cc60 e92d4900 e3a0900c  ....`.E..I-.....06-11 09:57:07.660      104-104/? I/DEBUG﹕ 3ae51f08 e52d9004 e28db008 e1a0e00f e1a0f00c  ..-.............06-11 09:57:07.660      104-104/? I/DEBUG﹕ 3ae51f18 e30ac00c e345cc60 eafffff6 00000001  ....`.E.........06-11 09:57:07.660      104-104/? I/DEBUG﹕ 3ae51f28 00000002 000000b4 1fffffff 00000134  ............4...06-11 09:57:07.660      104-104/? I/DEBUG﹕ 3ae51f38 00000000 00000000 37d08289 0000032c  ...........7,...06-11 09:57:07.660      104-104/? I/DEBUG﹕ memory map around addr 5c60a310:06-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c609000-5c60a00006-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c60a000-5c60b00006-11 09:57:07.660      104-104/? I/DEBUG﹕ 5c60b000-5c63c00006-11 09:57:07.660      104-104/? I/DEBUG﹕ stack:06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859344  00a6a268  [heap]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859348  00a68880  [heap]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be85934c  00bd1738  [heap]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859350  00bd13ec  [heap]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859354  3d93371106-11 09:57:07.660      104-104/? I/DEBUG﹕ be859358  3d90809106-11 09:57:07.660      104-104/? I/DEBUG﹕ be85935c  00a6888c  [heap]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859360  be859390  [stack]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859364  5bd7c188  /data/data/com.mortimer.paradox/lib/libParadox.so06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859368  0000000106-11 09:57:07.660      104-104/? I/DEBUG﹕ be85936c  5bd7c0f8  /data/data/com.mortimer.paradox/lib/libParadox.so06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859370  be859398  [stack]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859374  3d90809106-11 09:57:07.660      104-104/? I/DEBUG﹕ be859378  df0027ad06-11 09:57:07.660      104-104/? I/DEBUG﹕ be85937c  0000000006-11 09:57:07.660      104-104/? I/DEBUG﹕ be859380  3ae0be7c06-11 09:57:07.660      104-104/? I/DEBUG﹕ #00 be859384  0000000106-11 09:57:07.660      104-104/? I/DEBUG﹕ be859388  0000000c06-11 09:57:07.660      104-104/? I/DEBUG﹕ be85938c  3d93371106-11 09:57:07.660      104-104/? I/DEBUG﹕ be859390  be8593dc  [stack]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be859394  3ae5274806-11 09:57:07.660      104-104/? I/DEBUG﹕ be859398  3d94286106-11 09:57:07.660      104-104/? I/DEBUG﹕ be85939c  be85947c  [stack]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593a0  3ae5238106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593a4  0000000106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593a8  3d93371106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593ac  be8593dc  [stack]06-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593b0  3d90809106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593b4  3d90809106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593b8  3d90809106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593bc  0000000006-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593c0  0000000006-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593c4  3d94286106-11 09:57:07.660      104-104/? I/DEBUG﹕ be8593c8  3d9080c1

解决方法:

经过一些v8内部调试之后,我已解决了该问题

问题是V8 cpu功能检测. V8通过/ proc / cpuinfo提取内核公开的信息.这是galaxy Tab 10.1的cpuInfo

E/Paradox ( 9512): Info-> Processor : ARMv7 Processor rev 0 (v7l)E/Paradox ( 9512): processor    : 0E/Paradox ( 9512): BogoMIPS : 1998.84E/Paradox ( 9512): E/Paradox ( 9512): processor    : 1E/Paradox ( 9512): BogoMIPS : 1998.84E/Paradox ( 9512): E/Paradox ( 9512): Features : swp half thumb fastmult vfp edsp vfpv3 vfpv3d16 tls E/Paradox ( 9512): cpu implementer  : 0x41E/Paradox ( 9512): cpu architecture: 7E/Paradox ( 9512): cpu variant  : 0x1E/Paradox ( 9512): cpu part : 0xc09E/Paradox ( 9512): cpu revision : 0E/Paradox ( 9512): E/Paradox ( 9512): HarDWare : p3E/Paradox ( 9512): Revision : 000eE/Paradox ( 9512): Serial       : 4641120a0ab4919eE/Paradox ( 9512): EO DATAAAAAAAAA

问题在于功能字段同时具有vfpv3和vfpv3d16值(vfpv3d16是仅限16个64位FPU寄存器的受限vfpv3版本).

V8假定没有同时定义两个值来解析cpuInfo:

if (HasListItem(features, "vfpv3")) {  has_vfp3_ = true;  has_vfp3_d32_ = true;} else if (HasListItem(features, "vfpv3d16")) {  has_vfp3_ = true;}

修复:只需将else更改为新的if,并将has_vfp3_d32_设置为false

if (HasListItem(features, "vfpv3")) {  has_vfp3_ = true;  has_vfp3_d32_ = true;} if (HasListItem(features, "vfpv3d16")) {  has_vfp3_ = true;  has_vfp3_d32_ = false;}

调试和发布签名的apk之间的区别是,在调试版本V8上可以通过ReadELFHWCaps加载数据,但是在发布签名的apk中,它回退到cpuInfo.

总结

以上是内存溢出为你收集整理的android-V8独立应用仅在发布签名APK时与SIGILL一起死亡全部内容,希望文章能够帮你解决android-V8独立应用仅在发布签名APK时与SIGILL一起死亡所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存