yandex / mapkit-android-demo

MapKit Android demo
Other
121 stars 59 forks source link

mapkit 3.3.1 and app bundle abi splitting #96

Closed nurjan84 closed 3 years ago

nurjan84 commented 5 years ago

Создал и опубликовал приложение (через app bundle) в плэй маркете. На следующий день крашлитикс показал мне ошибки, которые прилетели, возможно, от гугла и возможно от автомат. тестирования (nexus 5x, vivo x9, Android 6.0.1). На всех моих девайсах и эмуляторах yandex map работает нормально. Не пойму что за краши.

краш на строчке:

MapKitFactory.initialize(this)
Fatal Exception: java.lang.UnsatisfiedLinkError
Couldn't load c++_shared

com.yandex.runtime.Runtime.loadLibrary (Runtime.java:124)
com.yandex.runtime.Runtime.init (Runtime.java:99)
com.yandex.mapkit.MapKitFactory.initialize (MapKitFactory.java:20)
com.citrusbit.zmart.mvvm.views.MapActivity.onCreate (MapActivity.java:77)

в build.gradle есть такая штука:

bundle {
     language {
            enableSplit = true
        }
        density {
            enableSplit = true
        }
        abi {
            enableSplit = true
        }
}
ckesc commented 5 years ago

Дубль https://github.com/yandex/mapkit-android-demo/issues/74 Предлагаю этот тикет закрыть

dmitriigriazin commented 4 years ago

Нужно больше информации, в тикетах потенциально могут быть разные ошибки.

maxim-pandra commented 4 years ago

Тоже появляются такие креши на разных устройствах, при включении appbundle со сплитом по архитектурам.

MapKit 3.4

conquest-S11 Android 7, Meizu 16th Android 8.1, ZenFone 2 (ZE551ML) 6.01, Redmi Note 5 Pro Android 9

username4564 commented 4 years ago

MapKit 3.5, в проекте включен app bundle c abi splitting

LGE Nexus 5X Android 8.1.0, Pixel 3 XL Android 10

Fatal Exception: java.lang.UnsatisfiedLinkError: Couldn't load c++_shared at com.yandex.runtime.Runtime.loadLibrary(Runtime.java:124) at com.yandex.runtime.Runtime.init(Runtime.java:99) at com.yandex.mapkit.MapKitFactory.initialize(MapKitFactory.java:25) at ....App.onCreate(App.java:62) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5740) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 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(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

CBBBrother commented 4 years ago

Скорее всего ошибка, с тем что не может найти библиотеку c++_shared. Вы уверены, что на девайсах, на которых происходят падения, прилетела эта библиотека?

username4564 commented 4 years ago

Скорее всего ошибка, с тем что не может найти библиотеку c++_shared. Вы уверены, что на девайсах, на которых происходят падения, прилетела эта библиотека?

Краши приходят в crashlytics, соотвественно могу судить только по стек трейсу.

Тем временем количество пострадавших увеличивается: samsung Galaxy J2 Core Android 8.1.0, Huawei Huawei Enjoy 9s Android 5.1, Xiaomi Redmi Note 8T Android 10.0, Trend TaintArt for x86 Android 7.1.2, vivo vivo S1 Android 5.1

maxim-pandra commented 4 years ago

@username4564 а у вас случайно не включен флаг android.bundle.enableUncompressedNativeLibs=false? Не уверен что это может влиять, но у нас он был включен, когда мы пытались раскатать appbundle

username4564 commented 4 years ago

@maxim-pandra нет, не включен. Этот флаг может помочь вылечить проблему?

maxim-pandra commented 4 years ago

Если вы его не используете, то вряд-ли. Потому что у нас как раз с таким флагом краши есть. Думал что может это из-за него.

maxim-pandra commented 3 years ago

Обнаружил как воспроизвести проблему.

В случае если собрать apk, поставить breakpoint в классе ReLinker.loadLibrary(...) в строке System.loadLibrary(library); и бросить там исключение, то фолбек в catch отрабатывает нормально, библиотеки загружаются, карта работает. В папке app_lib появляется библиотека при загрузки которой произошло исключение.

В случае если собрать appbundle со split по архитектуре и флагом android.bundle.enableUncompressedNativeLibs=false (без флага поведение то же не работает), то при вызове исключения в указанном месте, фолбек отрабатывает не корректно, библиотеки не загружаются и карта не работает. В папке app_lib нет нативной бибиотеки.


Эта проблема не позволяет использовать мапкит с appbundle, а скро это станет обязательным для всех. Да или лимит +50мб дает.

P.S. Устанавливать бандлы на устройство можно так:

brew install bundletool
bundletool build-apks --bundle=./app.aab --output=./app.apks
bundletool install-apks --apks=app.apks
maxim-pandra commented 3 years ago

Похожую проблему исправляли в SoLoader https://github.com/facebook/SoLoader/pull/26 Может как-то поможет

maxim-pandra commented 3 years ago

А вот как это поправили в ReLinker котоый похоже и используется в кратах

https://github.com/KeepSafe/ReLinker/commit/9bc6d1709f8f51ab34ed0dca0650fefd6b839c16

Правда странно почему это влияет на андроиды 5+, как я понял реликер и солоадер решают проблемы только до android 5, а дальше loadLibrary должен нормально работать.

CBBBrother commented 3 years ago

Есть утилита https://developer.android.com/studio/command-line/bundletool, она позволяет локально собрать бандлы, можно проверить, попадает ли в них нужные библиотеки, если нет, то поиграться с параметрами, по которым происходит сплит.

CBBBrother commented 3 years ago

Недавно вышла новая версия, в ней библиотека c++_shared статически влинкована. Проблема должна пропасть.

https://yandex.ru/dev/maps/mapkit/doc/dg/concepts/versions-docpage/

maxim-pandra commented 3 years ago

Да, я проверил все варианты. и бибилотеки попадают все 4 вида апк v7a, v8a, x86, x86_64. Параметр управляющий сплитом по abi в bundletool один.

        abi {
            enableSplit = true
        }

А может ли проблема в устаревшей версии релинкера?

--

Спасибо! попробуем новую версию