Есть ли способ предотвратить изменение номера строки в приложении Android R8? - PullRequest
2 голосов
/ 08 мая 2019

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 ]

3 голосов
/ 09 мая 2019

Это время от времени обсуждалось в команде R8, и мы постоянно оптимизировали номера строк по ряду причин:

  • Это сэкономило в области 5% на dexразмер
  • Для выпусков, в которых включены оптимизации, такие как встраивание, в любом случае требуется расширение, чтобы расширить встроенные фреймы
  • Это одна опция меньше в матрице тестирования

Прямо сейчас он всегда отключен для отладочных сборок и для сборок релизов, когда в конфигурации заданы оба параметра -dontoptimize (подразумевает отсутствие встраивания) и -dontobfuscate.

Когда вы используете retrace (не забудьте использовать тот изProguard версии 6 или более поздней) вам не нужно вырезать трассировку стека, так как при восстановлении линии трассировки не из стека будут проходить через неизмененные.

В настоящее время в приложении нет библиотеки, которая могла бы сделать это, и для этого требуетсяфайл сопоставления, который будет включен в приложение, который побеждает цель сделать apks маленьким.

1 голос
/ 08 мая 2019

Установите их в конфигурации 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
...