Собственные сбои при отмене в консоли разработчика с Oreo (8.1)

В консоли разработчика я все больше и больше отказываюсь от сбоя в работе. Это происходит ТОЛЬКО для устройства android 8.1! Кто-нибудь знает о регрессии? Вот обратная линия:

   #00  pc 000000000001da4c  /system/lib64/libc.so (abort+112)
   #01  pc 0000000000007f7c  /system/lib64/liblog.so (__android_log_assert+312) 
   #02  pc 000000000006cff8  /system/lib64/libhwui.so (android::uirenderer::renderthread::EglManager::createSurface(ANativeWindow*, bool)+324) 
   #03  pc 000000000006ad14  /system/lib64/libhwui.so (android::uirenderer::renderthread::OpenGLPipeline::setSurface(android::Surface*, android::uirenderer::renderthread::SwapBehavior, android::uirenderer::renderthread::ColorMode)+72) 
   #04  pc 00000000000679ec  /system/lib64/libhwui.so (android::uirenderer::renderthread::CanvasContext::setSurface(android::Surface*)+144) 
   #05  pc 00000000000703bc  /system/lib64/libhwui.so (android::uirenderer::renderthread::Bridge_initialize(android::uirenderer::renderthread::initializeArgs*)+16) 
   #06  pc 00000000000726c4  /system/lib64/libhwui.so (android::uirenderer::renderthread::MethodInvokeRenderTask::run()+24) 
   #07  pc 00000000000738d8  /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+336) 
   #08  pc 0000000000011504  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+264) 
   #09  pc 00000000000a9830  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+140) 
   #10  pc 0000000000069c94  /system/lib64/libc.so (__pthread_start(void*)+36) 
   #11  pc 000000000001eeec  /system/lib64/libc.so (__start_thread+68)

ОБНОВЛЕНИЕ: Я думаю, что проблема может быть решена только самими Google :( Проблема отслеживается здесь https://issuetracker.google.com/issues/70259031
А пока кто-то уже может воспроизвести проблему или хотя бы объяснить, когда возникла проблема? Это поможет найти обходной путь!

Ответы

Ответ 1

То, что Surface использует подсказки для OpenGL ES и GLSurfaceView - что расширяет View.

Возможный обходной путь может состоять в том, чтобы отключить аппаратное ускорение для представлений, что приводит к сбою на Android 8.1 и 9.0 (как libhwui.so) - потому что даже если это будет исправлено, любое не обновленное устройство будет продолжать сбой. это можно сделать для каждого View (см. документацию):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    mSurface.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

конечно, это приведет к неоптимальной производительности; но все же лучше, чем крах.

Ответ 2

Проверьте этот ответ:

tgkill - собственная ошибка на Android 8.0 Samsung S8

Кажется, это может быть связано с Samsung S8 и Samsung S8+.

В основном, если у вас есть текст для редактирования в диалоге или фрагменте диалога, выделите текст, а затем закройте диалоговое окно (или измените ориентацию), это произойдет сбой.

Чтобы решить эту проблему, мне пришлось отключить аппаратное ускорение на оскорбительных действиях - это можно сделать в манифесте, что приведет к некоторому отставанию активности.

   <activity android:name=".activities.CarDamageActivity"
           android:hardwareAccelerated="false" />

Чтобы предотвратить задержку на ДРУГИХ устройствах, можно проверить модель устройства и, если это НЕ S8 или S8+, включить аппаратное ускорение.

    String phoneMake =  Build.MANUFACTURER;
    String phoneModel =  Build.MODEL.toUpperCase();
    if (!(phoneMake.equalsIgnoreCase("samsung") && (phoneModel.startsWith("SM-G950")
            ||  phoneModel.startsWith("SM-G955")))) {
        window.setFlags(
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
    }