Исходный авария на базе Android от/system/framework/arm/boot.oat

После недавнего обновления моего приложения в Google Play я начал получать множество отчетов о сбоях, все они от устройств Samsung с Android 5. Более низкие версии Android отлично работают, а устройства других производителей с Android 5 тоже работают отлично.

У меня нет устройства, где я мог бы воспроизвести проблему, поэтому я не могу делиться пополам. Я пытаюсь вывести, что может быть неправильно из отчета о сбоях и из списка изменений с момента моей последней рабочей версии (что, к сожалению, долго).

Все отчеты о сбоях выглядят следующим образом (только адреса немного отличаются между устройствами):

Build fingerprint: 'samsung/kltektt/kltektt:5.0/LRX21T/G900KKTU1BOB1:user/release-keys'
Revision: '15'
ABI: 'arm'
pid: 26265, tid: 26265, name: mt.AnnelidsDemo >>> cz.gdmt.AnnelidsDemo <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x76f57e84
r0 00000800 r1 0000004b r2 b4aa9f9a r3 00000000
r4 1426e019 r5 76f57e80 r6 0000012c r7 76e6b040
r8 00000019 r9 76f57d54 sl 000007ff fp b4e1b330
ip b4aa9f70 sp bea94b50 lr b4bc72c1 pc b4c0d9b8 cpsr 00070030

backtrace:
#00 pc 001099b8 /system/lib/libart.so (art::TypeLookupTable::Lookup(char const*) const+59)
#01 pc 000c32bd /system/lib/libart.so (art::ClassLinker::LookupClassFromImage(char const*, art::gc::space::ImageSpace*)+64)
#02 pc 000d27c1 /system/lib/libart.so (art::ClassLinker::DefineClass(char const*, art::Handle<art::mirror::ClassLoader>, art::DexFile const&, art::DexFile::ClassDef const&)+320)
#03 pc 000d2d89 /system/lib/libart.so (art::ClassLinker::FindClassInPathClassLoader(art::ScopedObjectAccessAlreadyRunnable&, art::Thread*, char const*, art::Handle<art::mirror::ClassLoader>)+452)
#04 pc 001fe20b /system/lib/libart.so (art::VMClassLoader_findLoadedClass(_JNIEnv*, _jclass*, _jobject*, _jstring*)+254)
#05 pc 0001b179 /system/framework/arm/boot.oat

Я узнал, что art::TypeLookupTable является модификацией Samsung в области ART и нет доступных источников.

Обе эти и последние рабочие версии создаются с использованием того же SDK и Android SDK (цель - андроид-19), изменений в коде Java нет, есть много изменений в собственном коде и в данных. Я начал использовать LTO при создании собственного кода. Я начал использовать параметр -z (Zopfli) zipalign.

В моем приложении используется JNI, поэтому это, вероятно, первый подозреваемый. Однако CheckJNI не сообщает о каких-либо проблемах. Тот же код работает без каких-либо сбоев на других устройствах Android, в IOS и Linux. Он не показывает никаких эров в valgrind. Поэтому я думаю, что некоторая случайная коррупция памяти маловероятна.

Я думаю, что мой код Java в порядке, но даже если он имел ошибки, он не должен вызывать segfault во время выполнения Java...

Пользователи сообщают, что приложение вылетает во время запуска, даже показывая что-либо.


Я спросил на форуме разработчиков Samsung, до сих пор без ответа.


У меня есть два вопроса:

  • Задняя часть начинается с boot.oat и продолжается в libart.so. Что происходит в boot.oat? Возможно ли, что он сработает, даже до того, как он достигнет моего кода? (Это указывает на ошибку в Samsung ART.)

  • Любая идея, что может быть неправильным, что я могу попробовать?

Ответы

Ответ 1

Вместе с одним другим разработчиком, который получал такой же крах в своем приложении, мы обнаружили, что он запускается с помощью параметра -z инструмента zipalign. (Recompress с помощью Zopfli)

Точно так же APK вылетает при выравнивании и повторном сжатии с Zopfli и не сбрасывается при выравнивании без повторного сжатия.

Я могу только догадываться, что Samsung внесла некоторые изменения в Android 5 и представил некоторые странные ошибки в коде, который читает APK. Пока это не будет исправлено или я не получу лучшего объяснения, не используя -z в zipalign, решает проблему.