在emulator上更新到SDK 4.1.0后,MapBox Android应用程序崩溃

在emulator上更新到SDK 4.1.0后,MapBox Android应用程序崩溃,android,crash,emulation,mapbox,Android,Crash,Emulation,Mapbox,更新到Android MapBox SDK 4.1.0/4.1.1后,我的应用程序在Android emulator上崩溃,原因是: E/mbgl: [Shader]: Vertex shader fill failed to compile: precision highp float; #ifdef GL_ES precision highp float; #else #define lowp #define mediump #define h

更新到Android MapBox SDK 4.1.0/4.1.1后,我的应用程序在Android emulator上崩溃,原因是:

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编译时也不会崩溃

本地编译时发生相同错误的崩溃的MapBox示例

在Linux Mint上测试,并显示以下图像:

英特尔x86 Atom_系统映像API 19第22版 英特尔x86 Atom_系统映像API 23第15版 英特尔x86 Atom_64系统映像API 24第5版


这是已知的问题吗?此崩溃会影响物理设备上的生产构建吗?有什么解决办法吗?

我想你指的是Android Mapbox SDK 4.1.0/4.1.1,而不是DropBox;)

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

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

这是已知的问题吗?这次崩溃会影响生产吗 物理设备?有什么解决办法吗

回答-

  • 如果在x86仿真器上崩溃,那么它很有可能在x86设备上崩溃
  • 如果你通过了ARM设备上的测试,你的应用很有可能在ARM设备上正常运行
  • 如果这还不能回答你最初的问题,那么还有一个问题需要讨论
我也看到了同样的崩溃,在OSX和Android Studio中的x86模拟器上。相同的应用程序在ARM设备上传递

正如您所提到的,模拟器是
intelx86atom\u系统
images

与gradle一起编译的Mapbox Android SDK是一个
AAR
文件,其中包含用于不同设备处理器(包括ARM、x86和MIPS)的多个共享对象

也就是说,当你使用这个

compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:4.1.0@aar')
您可以在Android APK中获得多个libmapbox-gl.so共享对象


对于使用模拟器的用户:

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


我怀疑这是特定于仿真器的。

我已验证此问题确实会使Android x86物理设备崩溃。RemixOS的崩溃与从catlog中可以看到的完全相同-如果有人想要完整的日志,请告诉我,但基本上与上面的相同,只是我还有reg转储和回溯,表明是mapbox SDK引发了这个问题


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

使用mapbox android sdk:4.1的Emulator上会发生崩溃。0@aar&mapbox android sdk:4.1。1@aarItMapbox似乎没有问题,但Android模拟器和“Android SDK工具”,至少在macOS上是这样。请参阅,该问题可以在Android Studio中构建的emulator上以及使用SDK 4.1.1的OS X上复制。因此,OpenGL设置或图形卡可能没有问题。有没有计划研究这个问题并可能解决它?MapBox SDK 4.0.0没有问题。请查看我的答案。对图形使用软件仿真似乎可以解决这个问题,支持您的说法,即这是一个模拟器问题。