glCreateShader()在Android 11 / Pixel 5上崩溃

我有一个Nativeactivity程序,可以在运行Android 9的OnePlus 3T上正常运行。 在Pixel 5上运行的Android 11中启动时崩溃。 我正在使用Visual Studio 2019和SDK Build-tools 29.0.2和Platform-Tools 30.0.4。 AndroidManifest.xml需要GLES版本3.1,并针对SDK 25(允许降至21)。

    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="25"/>
    <uses-feature android:glEsVersion="0x00030001" android:required="true" />

代码从标准EGL设置开始,以获取窗口,创建表面,创建上下文等(来自Nativeactivity示例的详细信息),然后运行到初始化函数中:

void graphics_init(float width,float height) {
    // Initialize GL state.
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_niceST);
    glDisable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
    glDisable(GL_DEpth_TEST);

    GLenum err = glGetError();
    GLuint fs = 0;
    GLuint vs = graphics_load_shader_text(guiVShader,GL_VERTEX_SHADER);

通过这部分。它在graphics_load_shader_text()内部崩溃:

GLuint graphics_load_shader_text(char const* text,GLenum shaderType) {
    LOGI("Creating shader type 0x%x",shaderType);
    GLuint shader = glCreateShader(shaderType);
    LOGI("Shader id is %d,source is length %ld",shader,(long)strlen(text));
    glShaderSource(shader,1,(GLchar const**)&text,nullptr);

具体来说,对glCreateShader()的调用最终生成了一个空指针seg-v。

当时的日志猫看起来像这样:

11-01 11:49:50.005 14655 14681 V threaded_app: APP_CMD_INIT_WINDOW
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: QUALCOMM build                   : 973378a,Ie73904e3bd
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Build Date                       : 06/24/20
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: OpenGL ES Shader Compiler Version: EV031.31.04.00
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Local Branch                     : gfx-adreno.lnx.2.0
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Remote Branch                    : quic/gfx-adreno.lnx.2.0
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Remote Branch                    : NONE
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Reconstruct Branch               : NOTHING
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Build Config                     : S P 10.0.4 AArch64
11-01 11:49:50.005 14655 14681 I AdrenoGLES-0: Driver Path                      : /vendor/lib64/egl/libGLESv2_adreno.so
11-01 11:49:50.009 14655 14681 I AdrenoGLES-0: PFP: 0x016dd089,ME: 0x00000000
11-01 11:49:50.010   536   536 E SELinux : avc:  denied  { find } for interface=vendor.qti.qspmhal::IQspmhal sid=u:r:untrusted_app_25:s0:c512,c768 pid=14655 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:hal_qspmhal_hwservice:s0 tclass=hwservice_manager permissive=0
11-01 11:49:50.011 14655 14681 E Adreno-AppProfiles: Could not find QSPM HAL service
11-01 11:49:50.013 14655 14681 W AdrenoUtils: <ReadGpuID_from_sysfs:197>: Failed to open /sys/class/kgsl/kgsl-3d0/gpu_model
11-01 11:49:50.013 14655 14681 W AdrenoUtils: <ReadGpuID:221>: Failed to read chip ID from gpu_model. Fallback to use the GSL path
11-01 11:49:50.017  1421  1521 D ArtManagerInternalImpl: /data/misc/iorapd/com.enchantedage.XMCRemote3/1/android.app.Nativeactivity/compiled_traces/compiled_trace.pb doesn't exist
11-01 11:49:50.017  1421  1521 I activityTaskManager: Displayed com.enchantedage.XMCRemote3/android.app.Nativeactivity: +175ms
11-01 11:49:50.022   861   866 E statsd  : Predicate 5980654721335871649 dropping data for dimension key (10)0x2010101->10388[I] (10)0x30000->*launch*[S]
11-01 11:49:50.022  1421  1516 D EventSequenceValidator: Transition from actIVITY_LAUNCHED to actIVITY_FINISHED
11-01 11:49:50.025 14655 14681 I XMCRemote3.Nativeactivity: Creating shader type 0x8b31
11-01 11:49:50.025 14655 14681 F libc    : Fatal signal 11 (SIGSEGV),code 1 (SEGV_MAPERR),fault addr 0x0 in tid 14681 (dage.XMCRemote3),pid 14655 (dage.XMCRemote3)

对此,我觉得可疑的一件事是SELinux失败:

11-01 11:49:50.010   536   536 E SELinux : avc:  denied  { find } for interface=vendor.qti.qspmhal::IQspmhal sid=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:hal_qspmhal_hwservice:s0 tclass=hwservice_manager permissive=0

这是此故障的直接原因吗? “ untrusted_app_25”位似乎可能来自用于USB开发部署的“调试签名”。那是对的吗? 如果是这样,我如何解决它以进行开发?最终真正部署该应用程序时,如何确保该应用程序不受信任?

我已经用Google搜索了一下,“写一些SELinux清单并安装它们”似乎不是一个好主意,因为我不认为APK通常可以(或应该!)做到这一点,而这样做显然取决于所使用的特定设备硬件和驱动程序,因此这不是实现此目标的预期方式。

那么,我想念什么?

min_garden 回答:glCreateShader()在Android 11 / Pixel 5上崩溃

事实证明,标准的NativeActivity设置缺少一些内容来确保GLES 3始终可用。它碰巧可以在OnePlus-with-Android-9上运行,而碰巧不能在Pixel-with-Android-11上运行。

设置过程需要将EGL_RENDERABLE_TYPE,EGL_OPENGL_ES3_BIT_KHR,的{​​{1}}添加到attribs的{​​{1}}中,并且要获得该定义,我还需要在文件中eglChooseConfig()。另外,我必须为#include <EGL/eglext.h>的{​​{1}}添加EGL_CONTEXT_CLIENT_VERSION,3,EGL_NONE,默认情况下不会传递任何属性。更新后的设置功能如下所示(希望能在这种情况下对其他人有所帮助):

contextAttributes

eglCreateContext()是我自己的功能-随时随地替换您想要的任何内容。原始样本对出了什么问题不是很详细。

,
11-01 11:49:50.017  1421  1521 D ArtManagerInternalImpl: /data/misc/iorapd/com.enchantedage.XMCRemote3/1/android.app.NativeActivity/compiled_traces/compiled_trace.pb doesn't exist
11-01 11:49:50.017  1421  1521 I ActivityTaskManager: Displayed com.enchantedage.XMCRemote3/android.app.NativeActivity: +175ms

你的问题是不可避免的吗?我在其他程序中也遇到过以上两行日志问题。这种现象是偶发的,会导致界面冻结。尝试更新它com.enchantedage.XMCRemote3

本文链接:https://www.f2er.com/1295569.html

大家都在问