Collect v1.22.2
Android v8.1
Collect crashes when user selects Mapbox Maps SDK
General Settings > User interfaceMapping SDK dialogMapbox Maps SDKCollect does not 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)
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
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.