Skip to content

[BUG] addHeatmapLayer hard crash application #554

Open
@alextran1502

Description

@alextran1502

Platforms

Android

Version of flutter maplibre_gl

0.21.0

Bug Description

When using addHeatMapLayer, the application crash.

It works fine on 0.19.2, the crash starts to happen after upgrading pass that version

Relevant logs

W/Mbgl    (23483): {TextureViewRend}[ParseStyle]: Layer 'OSgZPbZL6Y_0' has an invalid value for text-font and will not render text. Output values must be contained as literals within the expression.
E/FrameEvents(23483): updateAcquireFence: Did not find frame.
F/libc    (23483): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x2827b710e11041 in tid 24098 (TextureViewRend), pid 23483 (an.immich.debug)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/dm1quew/dm1q:14/UP1A.231005.007/S911U1UEU5CYB2:user/release-keys'
Revision: '13'
ABI: 'arm64'
Processor: '5'
Timestamp: 2025-03-08 14:59:46.104907081-0600
Process uptime: 247s
Cmdline: app.alextran.immich.debug
pid: 23483, tid: 24098, name: TextureViewRend  >>> app.alextran.immich.debug <<<
uid: 10440
tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
pac_enabled_keys: 000000000000000f (PR_PAC_APIAKEY, PR_PAC_APIBKEY, PR_PAC_APDAKEY, PR_PAC_APDBKEY)
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x002827b710e11041
    x0  0002827b710e1105  x1  0000006f27afb264  x2  0000000000000f9b  x3  61702d6c61796572
    x4  61702d6c61796572  x5  726579616c2d7061  x6  726579616c2d7061  x7  b400006f449e9394
    x8  05ee058e05fe0500  x9  0000000000000019  x10 000504f6e21c2208  x11 000504f6e21c2208
    x12 0000000000000001  x13 0000000000000000  x14 0000000000000000  x15 0000000000000000
    x16 0000000000000000  x17 0000000000000000  x18 0000006f1bd4e000  x19 0000006f27afb260
    x20 b400007045023c70  x21 0000006f27afc000  x22 0000000000000002  x23 b400006f3e3abd18
    x24 b400006f93de2000  x25 b400006f3fadb600  x26 b400006f3e42ac80  x27 b400006f93e5a500
    x28 b400006f3fab9c0c  x29 0000006f27afb060
    lr  0000006f21f727bc  sp  0000006f27afb050  pc  0000006f21f72804  pst 0000000080001000
18 total frames
backtrace:
      #00 pc 000000000065f804  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #01 pc 0000000000683208  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #02 pc 00000000006c1588  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #03 pc 00000000006d551c  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #04 pc 00000000006d42f0  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #05 pc 00000000004e26a8  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (mbgl::android::MapRenderer::render(_JNIEnv&)+216) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #06 pc 00000000004e58b8  /data/app/~~59nVvyvzogBLGyf0voHhbA==/app.alextran.immich.debug-ELY2B9_t710mMwZxD6yGgg==/base.apk!libmaplibre.so (offset 0x3e2c000) (auto auto jni::MakeNativeMethod<auto jni::NativeMethodMaker<void (auto jni::NativePeerMemberFunctionMethod<void (mbgl::android::MapRenderer::*)(_JNIEnv&), &(mbgl::android::MapRenderer::render(_JNIEnv&))>::operator()<mbgl::android::MapRenderer, mbgl::android::MapRenderer, void>(jni::Field<mbgl::android::MapRenderer, long> const&)::'lambda'(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&)::*)(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&) const>::operator()<auto jni::NativePeerMemberFunctionMethod<void (mbgl::android::MapRenderer::*)(_JNIEnv&), &(mbgl::android::MapRenderer::render(_JNIEnv&))>::operator()<mbgl::android::MapRenderer, mbgl::android::MapRenderer, void>(jni::Field<mbgl::android::MapRenderer, long> const&)::'lambda'(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&)>(char const*, auto jni::NativePeerMemberFunctionMethod<void (mbgl::android::MapRenderer::*)(_JNIEnv&), &(mbgl::android::MapRenderer::render(_JNIEnv&))>::operator()<mbgl::android::MapRenderer, mbgl::android::MapRenderer, void>(jni::Field<mbgl::android::MapRenderer, long> const&)::'lambda'(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&) const&)::'lambda'(_JNIEnv*, jni::jobject*)>(char const*, char const*, auto jni::NativePeerMemberFunctionMethod<void (mbgl::android::MapRenderer::*)(_JNIEnv&), &(mbgl::android::MapRenderer::render(_JNIEnv&))>::operator()<mbgl::android::MapRenderer, mbgl::android::MapRenderer, void>(jni::Field<mbgl::android::MapRenderer, long> const&)::'lambda'(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&) const&, std::__ndk1::enable_if<std::is_class<auto jni::NativePeerMemberFunctionMethod<void (mbgl::android::MapRenderer::*)(_JNIEnv&), &(mbgl::android::MapRenderer::render(_JNIEnv&))>::operator()<mbgl::android::MapRenderer, mbgl::android::MapRenderer, void>(jni::Field<mbgl::android::MapRenderer, long> const&)::'lambda'(_JNIEnv&, jni::Object<mbgl::android::MapRenderer>&)>::value, void>::type*)::'lambda'(_JNIEnv*, auto...)::__invoke<jni::jobject*>(_JNIEnv*, auto...)+44) (BuildId: ecec6e21f8a31a1886cad753bc6dea202d2bbebe)
      #07 pc 000000000037ef70  /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #08 pc 00000000025b79fc  /memfd:jit-cache (deleted) (offset 0x2000000) (org.maplibre.android.maps.renderer.MapRenderer.onDrawFrame+156)
      #09 pc 00000000025cfe4c  /memfd:jit-cache (deleted) (offset 0x2000000) (org.maplibre.android.maps.renderer.textureview.TextureViewMapRenderer.onDrawFrame+108)
      #10 pc 00000000024d184c  /memfd:jit-cache (deleted) (offset 0x2000000) (org.maplibre.android.maps.renderer.textureview.GLTextureViewRenderThread.run+1180)
      #11 pc 0000000000368774  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #12 pc 0000000000353f04  /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+132) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #13 pc 0000000000947a48  /apex/com.android.art/lib64/libart.so (_ZN3art9ArtMethod14InvokeInstanceILc86ETpTncJEEENS_6detail12ShortyTraitsIXT_EE4TypeEPNS_6ThreadENS_6ObjPtrINS_6mirror6ObjectEEEDpNS3_IXT0_EE4TypeE+60) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #14 pc 000000000061afcc  /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+1344) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #15 pc 000000000061aa7c  /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallbackWithUffdGc(void*)+8) (BuildId: 629e0ffca501d809c29dbbeef2f512d3)
      #16 pc 00000000000fd254  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208) (BuildId: 8aaf102cfbdac2f120bf95c648547386)
      #17 pc 0000000000096a04  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68) (BuildId: 8aaf102cfbdac2f120bf95c648547386)
Lost connection to device.

Steps to Reproduce

  1. Checkout this PR chore(mobile): upgrade maplibre immich-app/immich#16739
  2. Uncomment line 57-61 in this file mobile/lib/extensions/maplibrecontroller_extensions.dart
  3. Run and build the application debug mode
  4. When entering the application, double tap on the spinning flower logo to populate the credential of the test instance, or entering the following information
URL: https://demo.immich.app 
email: [email protected]
password: demo
  1. Go to Library > Places > Click on map, the application should crash, if it doesn't navigate back and then reenter the map

Expected Results

Doesn't crash

Actual Results

Crash

Code Sample

 Future<void> reloadAllLayersForMarkers(List<MapMarker> markers) async {
    // Wait for previous reload to complete
    if (!_completer.isCompleted) {
      return _completer.future;
    }
    _completer = Completer();

    // !! Make sure to remove layers before sources else the native
    // maplibre library would crash when removing the source saying that
    // the source is still in use
    final existingLayers = await getLayerIds();
    if (existingLayers.contains(MapUtils.defaultHeatMapLayerId)) {
      await removeLayer(MapUtils.defaultHeatMapLayerId);
    }

    final existingSources = await getSourceIds();
    if (existingSources.contains(MapUtils.defaultSourceId)) {
      await removeSource(MapUtils.defaultSourceId);
    }

    await addGeoJSONSourceForMarkers(markers);

    await addHeatmapLayer(
       MapUtils.defaultSourceId,
       MapUtils.defaultHeatMapLayerId,
       MapUtils.defaultHeatMapLayerProperties,
    );

    _completer.complete();
  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions