I've been unsuccessfully trying to debug a sporadic crash in Emacs, which only occurs on two specific devices running Android 8.0.0 and 8.1.0:
Build fingerprint: 'vivo/PD1818G/PD1818G:8.1.0/OPM1.171019.026/compil08012129:user/release-keys' and: Build fingerprint: 'docomo/SO-04H/SO-04H:8.0.0/41.3.B.1.41/762327233:user/release-keys' where, in both cases, the backtrace ends in a worker thread, apparently created by Skia: #00 pc 00000000005ec0c0 /system/lib64/libskia.so (_Z13blitRect_corePN8SkShader7ContextEiiiiPjmbbP10SkXfermodePFvS2_PKjijES2_+768) #01 pc 00000000005ec1b0 /system/lib64/libskia.so (_Z15worker_blitRectPv+128) #02 pc 00000000000668a0 /system/lib64/libc.so (_ZL15__pthread_startPv+36) #03 pc 000000000001f374 /system/lib64/libc.so (__start_thread+68) in response to a call to `Canvas.drawBitmap': #0 0x0000007b9ee67868 in (anonymous namespace)::Sk4pxXfermode<(anonymous namespace)::SrcIn>::xfer32(unsigned int*, unsigned int const*, int, unsigned char const*) const () from target:/system/lib64/libskia.so #1 0x0000007b9eeceda0 in Sprite_D32_S32A_Xfer::blitRect(int, int, int, int) () from target:/system/lib64/libskia.so #2 0x0000007b9eeb580c in SkScan::FillIRect(SkIRect const&, SkRegion const*, SkBlitter*) () from target:/system/lib64/libskia.so #3 0x0000007b9eeb5a1c in SkScan::FillIRect(SkIRect const&, SkRasterClip const&, SkBlitter*) () from target:/system/lib64/libskia.so #4 0x0000007b9ee1204c in SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const () from target:/system/lib64/libskia.so #5 0x0000007b9ed6cc54 in SkBitmapDevice::drawBitmapRect(SkBitmap const&, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) () from target:/system/lib64/libskia.so #6 0x0000007b9ee0b5d0 in SkBaseDevice::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) () from target:/system/lib64/libskia.so #7 0x0000007b9ed8ca78 in SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) () from target:/system/lib64/libskia.so #8 0x0000007b9edf86a4 in SkColorSpaceXformCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) () from target:/system/lib64/libskia.so #9 0x0000007b9c211ea8 in android::SkiaCanvas::drawBitmap(android::Bitmap&, float, float, float, float, float, float, float, float, SkPaint const*) () from target:/system/lib64/libhwui.so #10 0x0000007b9be65940 in android::CanvasJNI::drawBitmapRect(_JNIEnv*, _jobject*, long, _jobject*, float, float, float, float, float, float, float, float, long, int, int) () from target:/system/lib64/libandroid_runtime.so #11 0x0000000071626b00 in android.graphics.BaseCanvas.nDrawBitmap () from target:/system/framework/arm64/boot-framework.oat #12 0x0000007b1b028a50 in art_quick_invoke_static_stub () from target:/system/lib64/libart.so #13 0x0000007b1abbcfb4 in art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) () from target:/system/lib64/libart.so #14 0x0000007b1ad7a294 in art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #15 0x0000007b1ad757c0 in bool art::interpreter::DoCall<true, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #16 0x0000007b1b0133bc in MterpInvokeStaticRange () from target:/system/lib64/libart.so #17 0x0000007b1b01aa18 in artMterpAsmInstructionStart () from target:/system/lib64/libart.so #18 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) () from target:/system/lib64/libart.so #19 0x0000007b1ad5a8e8 in art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from target:/system/lib64/libart.so #20 0x0000007b1ad7485c in bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #21 0x0000007b1b0110a8 in MterpInvokeSuper () from target:/system/lib64/libart.so #22 0x0000007b1b01a618 in artMterpAsmInstructionStart () from target:/system/lib64/libart.so #23 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) () from target:/system/lib64/libart.so #24 0x0000007b1ad5a8e8 in art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from target:/system/lib64/libart.so #25 0x0000007b1ad7485c in bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #26 0x0000007b1b010a60 in MterpInvokeVirtual () from target:/system/lib64/libart.so #27 0x0000007b1b01a598 in artMterpAsmInstructionStart () from target:/system/lib64/libart.so #28 0x0000007b1ad54ce0 in art::interpreter::Execute(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) () from target:/system/lib64/libart.so #29 0x0000007b1ad5a8e8 in art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame*, art::JValue*) () from target:/system/lib64/libart.so #30 0x0000007b1ad75f28 in bool art::interpreter::DoCall<true, true>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #31 0x0000007b1ad94094 in bool art::interpreter::DoInvoke<(art::InvokeType)0, true, true>(art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) () from target:/system/lib64/libart.so #32 0x0000007b1ad8ad64 in art::JValue art::interpreter::ExecuteSwitchImpl<true, false>(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) () from target:/system/lib64/libart.so #33 0x0000007b1ad54de0 in art::interpreter::Execute(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue, bool) () from target:/system/lib64/libart.so #34 0x0000007b1b00363c in artQuickToInterpreterBridge () from target:/system/lib64/libart.so #35 0x0000007b1b031910 in art_quick_to_interpreter_bridge () from target:/system/lib64/libart.so #36 0x0000007b1b02878c in art_quick_invoke_stub () from target:/system/lib64/libart.so #37 0x0000007b1abbcf78 in art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*) () from target:/system/lib64/libart.so #38 0x0000007b1af4cd38 in art::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod*, art::ArgArray*, art::JValue*, char const*) () from target:/system/lib64/libart.so #39 0x0000007b1af4c964 in art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list) () from target:/system/lib64/libart.so #40 0x0000007b1ae3f140 in art::JNI::CallNonvirtualVoidMethodV(_JNIEnv*, _jobject*, _jclass*, _jmethodID*, std::__va_list) () from target:/system/lib64/libart.so #41 0x0000007b1abf1288 in art::CheckJNI::CallMethodV(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, std::__va_list, art::Primitive::Type, art::InvokeType) () from target:/system/lib64/libart.so #42 0x0000007b1abe0494 in art::CheckJNI::CallNonvirtualVoidMethod(_JNIEnv*, _jobject*, _jclass*, _jmethodID*, ...) () from target:/system/lib64/libart.so #43 0x0000007af7da1208 in android_copy_area (src=<optimized out>, dest=<optimized out>, gc=<optimized out>, src_x=-1623016232, src_y=-1623016232, src_y@entry=140, width=599, height=2665904160, dest_x=<optimized out>, dest_y=92) at /home/staff/emacs-dev/emacs-android/src/android.c:3931 #44 0x0000007af7d6dac0 in android_scroll_run (w=0x5294fda228, run=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/androidterm.c:2330 #45 0x0000007af789503c in scrolling_window (w=0x5294fda228, tab_line_p=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/dispnew.c:4808 #46 update_window (w=<optimized out>, force_p=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/dispnew.c:3713 #47 0x0000007af78987b8 in update_window_tree (w=w@entry=0x5294fda228, force_p=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/dispnew.c:3469 #48 0x0000007af7892c4c in update_frame (f=f@entry=0x5294fd9f98, force_p=true, inhibit_hairy_id_p=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/dispnew.c:3304 #49 0x0000007af78fbb08 in redisplay_internal () at /home/staff/emacs-dev/emacs-android/src/xdisp.c:17147 #50 0x0000007af7909cb8 in redisplay_preserve_echo_area (from_where=from_where@entry=12) at /home/staff/emacs-dev/emacs-android/src/xdisp.c:17430 #51 0x0000007af7cac744 in wait_reading_process_output (time_limit=<optimized out>, nsecs=<optimized out>, read_kbd=<optimized out>, do_display=<optimized out>, wait_for_cell=<optimized out>, wait_proc=<optimized out>, just_wait_proc=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/process.c:5922 #52 0x0000007af7ab5f80 in kbd_buffer_get_event (end_time=0x0, kbp=<optimized out>, used_mouse_menu=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:4046 #53 read_event_from_main_queue (end_time=0x0, local_getcjmp=0x7af5ffe5d0, used_mouse_menu=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:2292 #54 read_decoded_event_from_main_queue (end_time=0x0, local_getcjmp=0x7af5ffe5d0, prev_event=0x0, used_mouse_menu=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:2356 #55 read_char (commandflag=commandflag@entry=1, map=map@entry=0x7af3d97593, prev_event=0x0, used_mouse_menu=used_mouse_menu@entry=0x7af5ffea80, end_time=0x0) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:2986 #56 0x0000007af7aae81c in read_key_sequence (keybuf=<optimized out>, prompt=<optimized out>, dont_downcase_last=<optimized out>, can_return_switch_frame=<optimized out>, fix_current_buffer=<optimized out>, prevent_redisplay=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:10374 #57 0x0000007af7aaa078 in command_loop_1 () at /home/staff/emacs-dev/emacs-android/src/keyboard.c:1397 #58 0x0000007af7bea660 in internal_condition_case (bfun=bfun@entry=0x7af7aa97a0 <command_loop_1>, handlers=<optimized out>, handlers@entry=0x90, hfun=hfun@entry=0x7af7aacf3c <cmd_error>) at /home/staff/emacs-dev/emacs-android/src/eval.c:1486 #59 0x0000007af7aa978c in command_loop_2 (handlers=handlers@entry=0x90) at /home/staff/emacs-dev/emacs-android/src/keyboard.c:1146 #60 0x0000007af7be94d8 in internal_catch (tag=tag@entry=0xf270, func=func@entry=0x7af7aa9758 <command_loop_2>, arg=arg@entry=0x90) at /home/staff/emacs-dev/emacs-android/src/eval.c:1209 #61 0x0000007af7aa858c in command_loop () at /home/staff/emacs-dev/emacs-android/src/keyboard.c:1124 #62 0x0000007af7aa8270 in recursive_edit_1 () at /home/staff/emacs-dev/emacs-android/src/keyboard.c:733 #63 0x0000007af7aa8a38 in Frecursive_edit () at /home/staff/emacs-dev/emacs-android/src/keyboard.c:816 #64 0x0000007af7aa5ef0 in android_emacs_init (argc=<optimized out>, argv=0x7af5fff880, dump_file=dump_file@entry=0x4194f00040 "/data/user/0/org.gnu.emacs/files/emacs-c2a575c8b8fbdcdf6c4fc8d697d391f36272cc41f023c519dc467a79c25a7d02.pdmp") at /home/staff/emacs-dev/emacs-android/src/emacs.c:2633 #65 0x0000007af7d99308 in Java_org_gnu_emacs_EmacsNative_initEmacs (env=0x7b1b7e20c0, object=<optimized out>, argv=0x7af5fff9a8, dump_file_object=0x7af5fff9ac, api_level=<optimized out>) at /home/staff/emacs-dev/emacs-android/src/android.c:2482 #66 0x0000007b0c9873e4 in oatexec () from target:/data/app/org.gnu.emacs-4nlXnkbG14zdXIKlt5hhjg==/oat/arm64/base.odex Emacs runs its own main loop in a second thread; this thread maintains a Bitmap containing the contents of the Emacs frame (which is our terminology for a GUI ``window''.) Each time drawing completes, Emacs copies the contents of that Bitmap to a second bitmap maintained by the View displaying the frame, and invalidates that view. This copying is interlocked with the View's `onDraw' function, so that `drawBitmap' never reads from the view's bitmap in the UI thread while Emacs is writing to the bitmap from the main loop. The Bitmap containing the contents of the Emacs frame is never drawn to outside of the Emacs main loop. Do any of you see a problem with the above strategy? I've never seriously worked with Android prior to porting Emacs, and the documentation regarding Bitmap interlocking seems to be non-existent, so I'm really at a loss here... TIA. -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/android-developers/89bedd2c-2183-4bea-a602-6036de3e17c1n%40googlegroups.com.