在模拟器

时间:2016-07-23 04:28:08

标签: android crash emulation mapbox

更新Android MapBox SDK 4.1.0 / 4.1.1后,我的应用程序在Android模拟器上崩溃:

E/mbgl: [Shader]: Vertex shader fill failed to compile: precision highp float;
    #ifdef GL_ES
    precision highp float;
    #else
    #define lowp
    #define mediump
    #define highp
    #endif

    attribute vec2 a_pos;

    uniform mat4 u_matrix;

    void main() {
        gl_Position = u_matrix * vec4(a_pos, 0, 1);
    }

07-23 00:07:06.818 8965-8965/? A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadcab1 (code=1), thread 8965 (pboxandroiddemo)

应用程序在Android物理设备上运行时没有崩溃,并且使用MapBox SDK 4.0.0进行编译。

https://github.com/mapbox/mapbox-android-demo上的MapBox示例在本地编译时崩溃并出现相同的错误。

使用以下图片在Linux Mint上测试:

Intel x86 Atom_System Image API 19修订版22 Intel x86 Atom_System Image API 23修订版15 英特尔x86 Atom_64系统映像API 24修订版5

这是已知的问题吗?此崩溃是否会影响物理设备上的生产?有没有解决方法?

4 个答案:

答案 0 :(得分:2)

对于那些使用模拟器的人:

可以通过在AVD设置中将模拟图形更改为Software - GLES 2.0来解决此问题。这不是理想的,但它可以工作(并且仍然比模拟ARM设备更快 )。

我怀疑这是特定于模拟器的。

答案 1 :(得分:0)

我假设你的意思是Android Mapbox SDK 4.1.0 / 4.1.1而不是DropBox;)

首先,确保您始终使用最新版本的SDK,4.1.1修复了可能会破坏您应用的重要错误。这听起来像是模拟器可能没有正确设置OpenGL的问题。我不熟悉Linux Mint,但您需要确保您的图形驱动程序已安装并且是最新的。它还需要能够支持OpenGL 2.0或更高版本。

我们不保证Mapbox能够在模拟器上工作,但我们会努力确保Mapbox能够在尽可能多的物理设备上运行。如果必须使用模拟器,我们建议使用内置的Android Studio或Genymotion

答案 2 :(得分:0)

  

这是已知的问题吗?此崩溃是否会影响生产   物理设备?有没有解决方法?

回答 -

  • 如果你在x86模拟器上崩溃,那么真的很有可能会在x86设备上崩溃。
  • 如果您在ARM设备上通过测试,那么确实很有可能您的应用在ARM设备上正常运行
  • 如果这不能回答您的初始问题,那么Mapbox issue #5456会有一些讨论。

我还在使用Android Studio的OS X中的x86模拟器上看到了相同的崩溃。在ARM设备上传递了相同的应用程序。

正如您所提到的,模拟器是Intel x86 Atom_System图像。

使用gradle作为AAR文件编译的Mapbox Android SDK包含用于不同设备处理器的多个共享对象,包括ARM,x86和MIPS。

也就是说,当你使用这个

compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.1.0@aar')

您在Android APK中获得了几个libmapbox-gl.so共享对象

enter image description here

答案 3 :(得分:0)

我已经确认此问题确实会导致Android x86物理设备崩溃。 RemixOS具有与catlog完全相同的崩溃 - 如果有人想要完整的日志 - 让我知道,但它与上面大致相同,除了我还有reg转储和回溯显示它是源自mapbox的SDK这个问题。

我的猜测是问题是因为大多数Android x86设备都不支持OpenGL的ES变体(适用于嵌入式设备),而是支持完整的桌面规范。这通常不是一个问题,但#ifdef专门测试ES变体,然后#define's远离我认为需要定义的几种类型。 ES变体将highp设置为浮点数,而非ES代码将其留空!这会导致编译问题(基本上是通过LLVM进行JIT),然后是缺少代码和崩溃的问题。