Собственные сбои при отмене в консоли разработчика с 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);
}