#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(); }
?