Есть ли способ предотвратить изменение номера строки в приложении Android R8?
Android Studio недавно начала использовать R8 вместо ProGuard по умолчанию.
Трассировки стека от ProGuard довольно легко понять без использования каких-либо инструментов, несмотря на то, что код запутан. Давайте использовать следующий пример:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
at net.foo.anroid.Foo.wb.d(SourceFile:453)
at net.foo.anroid.Foo.wb.a(SourceFile:213)
at net.foo.anroid.Foo.wb.n(SourceFile:103)
at net.foo.anroid.Foo.qa.run(Unknown Source:2)
at java.lang.Thread.run(Thread.java:764)
Обычно я точно знаю, какому файлу net.foo.anroid.Foo.wb соответствует, а номера строк (например, 453, 213...) являются фактическими номерами строк в исходном файле для ProGuard.
Однако для R8 единственный способ выяснить, какая строка ищет их в mapping.txt.
Это действительно серьезная неприятность. Если нет хорошего способа быстро найти исходный код из трассировки стека, я вернусь к ProGuard только по этой причине.
Есть ли способ предотвратить изменение номеров строк в R8?
2 ответа
Это время от времени обсуждалось в команде R8, и мы постоянно оптимизировали номера строк по ряду причин:
- Сохранено в районе 5% от размера dex
- Для сборок релизов, в которых включены оптимизации, такие как встраивание, в любом случае требуется обратный просмотр для расширения встроенных фреймов.
- Это на один вариант меньше в матрице тестирования
Прямо сейчас он всегда отключен для отладочных сборок и для сборок релизов, когда в конфигурации заданы оба параметра -dontoptimize (подразумевает отсутствие встраивания) и -dontobfuscate.
Когда вы используете retrace (не забудьте использовать тот из Proguard версии 6 или новее), вам не нужно вырезать трассировку стека, так как retrace пропустит не трассировочные линии стека через неизмененные.
В настоящее время в приложении нет библиотеки для этого, и поскольку для этого требуется, чтобы файл сопоставления был включен в приложение, что лишает цель сделать apks маленьким.
Установите их в конфигурации ProGuard:
-keepattributes SourceFile,LineNumberTable
затем используйте ReTrace jar:
ReTrace может прочитать обфусцированную трассировку стека и восстановить ее так, как бы она выглядела без запутывания. Восстановление основано на файле сопоставления, который ProGuard может записать во время запутывания. Файл сопоставления связывает исходные имена классов и членов классов с их запутанными именами.
java -jar retrace.jar [options...] mapping_file [stacktrace_file]
например:
java -jar retrace.jar mapping.txt stacktrace.log