Есть ли способ предотвратить изменение номера строки в приложении 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
Другие вопросы по тегам