Как отключить определенное правило Proguard / R8 для сторонней библиотеки

#android #gradle #proguard #android-r8

#Android #gradle #proguard #android-r8

Вопрос:

Я использую minifyEnabled true в build.gradle (для целей запутывания и уменьшения размера).

У меня есть эти proguard-rules.pro:

 -keep class com.some3rdpartylibrary.** { *; } // otherwise it crashes

# repack obfuscated classes into single package so it would be hard to find their original package
-repackageclasses ''
-allowaccessmodification // this one is causing run-time crash in the 3rd party library
  

Как я могу указать proguard / R8 dontallowaccessmodification только для com.some3rdpartylibrary.** ?

Комментарии:

1. Я из команды R8. Невозможно ограничить область действия -allowaccessmodification . Это глобальный флаг. Текущая реализация -allowaccessmodification в R8 сделает все не сохраняемые элементы общедоступными, и это может вызвать проблемы с закрытыми для пакетов конечными методами, которые могут привести к ошибкам во время выполнения — вероятно, то, что вы видите. На данный момент единственным обходным путем является сохранение методов, вызывающих проблемы. Если возможно, откройте проблему на issuetracker.google.com/issues /… ? Возможно, с более подробной информацией об ошибке времени выполнения.

2. @sgjesse Как я могу сохранить этот метод? Ошибка Caused by: java.lang.LinkageError: Method void com.some3rdpartylibrary.screens.payoutCard.presentation.cardInput.presentation.CardInputViewModel.clear() overrides final method in class Lxf; (declaration of 'com.some3rdpartylibrary.screens.payoutCard.presentation.cardInput.presentation.CardInputViewModel' appears in base.apk) .

3. Чтобы просто сохранить com.some3rdpartylibrary.screens.payoutCard.presentation.cardInput.presentation.CardInputViewModel.clear() , вы можете использовать -keep class com.some3rdpartylibrary.screens.payoutCard.presentation.cardInput.presentation.CardInputViewModel { clear(); } . Решает ли это единственное сохранение проблему?

4. @sgjesse интересно, что сбой сохраняется с тем же сообщением журнала. Если я удалю -allowaccessmodification , это сработает. Кроме того, поскольку у меня есть правило -keep class com.some3rdpartylibrary.** { *; } , не должно ли это уже включать com.some3rdpartylibrary.screens.payoutCard.presentation.cardInput.presentation.CardInputViewModel { clear(); } ?