Collect: Collect crashes when user selects Mapbox Maps SDK on ARM64 device

Created on 11 Jun 2019  Â·  5Comments  Â·  Source: getodk/collect

Software and hardware versions

Collect v1.22.2
Android v8.1

Problem description

Collect crashes when user selects Mapbox Maps SDK

Steps to reproduce the problem

  1. The user goes to General Settings > User interface
  2. The user opens the Mapping SDK dialog
  3. The user selects Mapbox Maps SDK

Expected behavior

Collect does not crash

Crash

2019-06-11 10:43:59.696 25431-25431/org.odk.collect.android E/Mbgl-LibraryLoader: Failed to load native shared library. java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/org.odk.collect.android/app_lib/libmapbox-gl.so" is 32-bit instead of 64-bit at java.lang.Runtime.load0(Runtime.java:928) at java.lang.System.load(System.java:1621) at com.getkeepsafe.relinker.SystemLibraryLoader.loadPath(SystemLibraryLoader.java:29) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:204) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:136) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:92) at com.mapbox.mapboxsdk.module.loader.LibraryLoaderProviderImpl$ReLinkerLibraryLoader.load(LibraryLoaderProviderImpl.java:38) at com.mapbox.mapboxsdk.LibraryLoader.load(LibraryLoader.java:43) at com.mapbox.mapboxsdk.net.NativeConnectivityListener.<clinit>(NativeConnectivityListener.java:13) at com.mapbox.mapboxsdk.net.ConnectivityReceiver.instance(ConnectivityReceiver.java:43) at com.mapbox.mapboxsdk.Mapbox.getInstance(Mapbox.java:60) at org.odk.collect.android.map.MapboxUtils.initMapbox(MapboxUtils.java:30) at org.odk.collect.android.preferences.UserInterfacePreferences.lambda$initMapPrefs$4$UserInterfacePreferences(UserInterfacePreferences.java:228) at org.odk.collect.android.preferences.-$$Lambda$UserInterfacePreferences$7x5hXs_yrA1xCufJDOUBgbAG8Nk.onPreferenceChange(Unknown Source:6) at android.preference.Preference.callChangeListener(Preference.java:1080) at android.preference.ListPreference.onDialogClosed(ListPreference.java:282) at android.preference.DialogPreference.onDismiss(DialogPreference.java:395) at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1361) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 2019-06-11 10:43:59.697 25431-25431/org.odk.collect.android E/zygote64: No implementation found for void com.mapbox.mapboxsdk.net.NativeConnectivityListener.initialize() (tried Java_com_mapbox_mapboxsdk_net_NativeConnectivityListener_initialize and Java_com_mapbox_mapboxsdk_net_NativeConnectivityListener_initialize__) 2019-06-11 10:43:59.699 25431-25431/org.odk.collect.android E/AndroidRuntime: FATAL EXCEPTION: main Process: org.odk.collect.android, PID: 25431 java.lang.UnsatisfiedLinkError: No implementation found for void com.mapbox.mapboxsdk.net.NativeConnectivityListener.initialize() (tried Java_com_mapbox_mapboxsdk_net_NativeConnectivityListener_initialize and Java_com_mapbox_mapboxsdk_net_NativeConnectivityListener_initialize__) at com.mapbox.mapboxsdk.net.NativeConnectivityListener.initialize(Native Method) at com.mapbox.mapboxsdk.net.NativeConnectivityListener.<init>(NativeConnectivityListener.java:27) at com.mapbox.mapboxsdk.net.ConnectivityReceiver.instance(ConnectivityReceiver.java:43) at com.mapbox.mapboxsdk.Mapbox.getInstance(Mapbox.java:60) at org.odk.collect.android.map.MapboxUtils.initMapbox(MapboxUtils.java:30) at org.odk.collect.android.preferences.UserInterfacePreferences.lambda$initMapPrefs$4$UserInterfacePreferences(UserInterfacePreferences.java:228) at org.odk.collect.android.preferences.-$$Lambda$UserInterfacePreferences$7x5hXs_yrA1xCufJDOUBgbAG8Nk.onPreferenceChange(Unknown Source:6) at android.preference.Preference.callChangeListener(Preference.java:1080) at android.preference.ListPreference.onDialogClosed(ListPreference.java:282) at android.preference.DialogPreference.onDismiss(DialogPreference.java:395) at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1361) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

in progress

Most helpful comment

I agree with what @grzesiek2010 did there. It would actually be fine in production to even make that a catch-all clause (catch (Exception e)) — ideally I'd prefer it that way in production because if Mapbox doesn't init, there's nothing we can do to make it init, and we never want it to crash when it can't init.

All 5 comments

Now that is annoying. @mmarciniak90 very good to know you have an ARM64 device -- which one is it? @yanokwa @zestyping @seadowg I thought we'd get a fall back to 32-bit libs. Was that generally the expectation or not?

Hmmm. Looks like it depends on how the lib is being loaded according to this SO post here.

As was discussed in #3097 we have to ship with 64 bit starting in August anyway so maybe we just need to take the size hit?

@grzesiek2010's solution at #3146 of catching the exception looks reasonable to me. Given we don't have anything user-facing merged, I propose we do another hot fix, but in our next release (which will have more mapping goodness) we add 64-bit support.

I agree with what @grzesiek2010 did there. It would actually be fine in production to even make that a catch-all clause (catch (Exception e)) — ideally I'd prefer it that way in production because if Mapbox doesn't init, there's nothing we can do to make it init, and we never want it to crash when it can't init.

very good to know you have an ARM64 device -- which one is it?

@lognaturel it is Nexus 5X

Was this page helpful?
0 / 5 - 0 ratings

Related issues

lognaturel picture lognaturel  Â·  3Comments

pranavgupta1234 picture pranavgupta1234  Â·  4Comments

nap2000 picture nap2000  Â·  6Comments

seadowg picture seadowg  Â·  4Comments

mateusmedeiros picture mateusmedeiros  Â·  4Comments