Как избежать удаления собственных символов кода для приложения Android

Я получаю sigsegv 11 в нативном коде, и мне нужно избегать зачистки, чтобы понять, что не так. Приложение использует библиотеку (aar), и мне удалось избежать удаления для aar с помощью «cmd-strip» взломать. Но в apk урезанная версия .so все равно используется, поэтому приложение удаляет символы, возможно, во время выполнения задачи transformNative_libsWithStripDebugSymbolForDebug gradle. Любые изменения, чтобы избежать этого?

PS. Найден похожий вопрос на SO, но это немного по-другому (в моем случае здесь используется aar с неразделенными символами).


person 4ntoine    schedule 01.11.2016    source источник
comment
IMO, вы должны дважды подумать, если вам действительно нужно отправлять неразрезанные двоичные файлы с вашим APK. Минусы — чрезвычайно увеличенный размер разделяемых библиотек и слабая защита от обратного проектирования. Если вы просто хотите найти где-нибудь неразрезанные двоичные файлы - ищите под obj/local/. Подробнее см. здесь.   -  person Sergio    schedule 01.11.2016
comment
это просто для решения проблемы, а не для распространения   -  person 4ntoine    schedule 01.11.2016
comment
Если это так - ndk-build создает неразделенные файлы вместе с уже очищенными. Смотрите мой предыдущий комментарий.   -  person Sergio    schedule 01.11.2016
comment
они не удаляются при сборке aar, но удаляются при сборке приложения. см. мой вопрос   -  person 4ntoine    schedule 01.11.2016


Ответы (2)


В packageOptions есть недокументированный метод doNotStrip, просто добавьте следующие строки в свой build.gradle

packagingOptions{
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}
person Wayne Cai    schedule 16.02.2017
comment
Вы не должны этого делать. Это сделает ваш APK огромным и ненужным. Смотрите мой ответ о том, как символизировать ваши трассировки стека. - person Dan Albert; 26.04.2017
comment
это необходимо только потому, что некоторые файлы .so зашифрованы и будут повреждены, если их раздеть. - person Wayne Cai; 16.06.2017
comment
fwiw, у меня прямо противоположная проблема с Android Studio 3.1/3.2 и gradle 4.4. Он больше не удаляет символы отладки, и я не могу найти способ принудительного удаления! не ЛОЛ. - person 3c71; 02.02.2018
comment
@3c71: Эта ошибка была исправлена ​​в 3.2 canary 4: issuetracker.google.com/72752164 - person Dan Albert; 27.02.2018
comment
@DanAlbert Я действительно открыл эту проблему;) - person 3c71; 28.02.2018
comment
Хех, не заметил дату. Спасибо, что сообщили о проблеме! - person Dan Albert; 01.03.2018
comment
Ты великолепен! Это также устраняет ту же проблему с помощью NDK 17. - person Lucas Lima; 16.05.2018
comment
Ну, это требуется при профилировании приложения с помощью simpleperf, как описано здесь, потому что без этого символы отсутствуют в отчете профиля. Кроме того, при использовании собственного профилировщика Android Studio он не отображает символы даже, если собственные библиотеки не удалены, что означает, что он не использует simpleperf внутри... - person DoDo; 22.08.2018

К счастью, вам не нужно хранить символы в приложении. NDK поставляет инструмент под названием ndk-stack (он находится в корне NDK), который может символизировать для вас трассировку стека: https://developer.android.com/ndk/guides/ndk-stack.html

person Dan Albert    schedule 01.11.2016
comment
Кажется, doNotStrip нужен для просмотра символов в logcat в случае сбоя и для выполнения отладки с помощью lldb в Android Studio. - person aberaud; 04.11.2019
comment
Первое обрабатывается ndk-stack, а второе неверно. Если вы видите последнее, это ошибка, и вы должны ее зарегистрировать. - person Dan Albert; 05.11.2019
comment
Мы не смогли найти способ использовать какую-либо отладку с lldb без doNotStrip. Нет имен символов в стеке отладки, нет имен локальных переменных, нет точек останова и т. д. (с бета-версией NDK 21 и Android Studio). Куда сообщить об ошибке (NDK или Android Studio)? Кроме того, использование ndk-stack очень громоздко по сравнению с простым просмотром обратной трассировки в logcat. Может быть, Android Studio может автоматизировать это? Спасибо - person aberaud; 06.11.2019
comment
Это будет ошибка Android Studio. Подпишитесь на source.android.com/setup/contribute/report-bugs. - person Dan Albert; 07.11.2019
comment
Кроме того, использование ndk-stack очень громоздко по сравнению с простым просмотром обратной трассировки в logcat. Может быть, Android Studio может автоматизировать это? Да, это было бы хорошо. Если вы подадите FR, я могу помочь найти для него владельца. - person Dan Albert; 07.11.2019
comment