Почему R8 не переименовывает все методы и классы? - PullRequest
0 голосов
/ 03 ноября 2019

Я впервые пробую версию Android Studio с R8, которая выполняет запутывание и оптимизацию кода.

Как гласит официальная документация :

Запутать ваш код

Цель запутывания - уменьшить размер вашего приложения путем сокращения имен классов, методов и полей вашего приложения.

IЯ думаю, что R8 переименует все имена методов и классов, но если я проанализирую APK через «Build -> Analyze APK ...», я смогу прочитать большинство оригинальных имен методов и классов.

enter image description here enter image description here

Contenuti - это действие, упомянутое в manifest.xml.

mostraView и nascondiView - методы, созданныея, их нет ни в одной библиотеке, они ничего не расширяют, поэтому я ожидал увидеть, как изменилось их имя.

void mostraView(View v)
{
     v.setVisibility(View.VISIBLE);
}
void nascondiView(View v)
{
     v.setVisibility(View.GONE);
}

Правильно ли поведение этого R8?

Как настроить R8, чтобы скрыть их всех или хотя бы эти два?

Большое спасибо!

1 Ответ

2 голосов
/ 06 ноября 2019

Это правило по умолчанию может быть причиной:

# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}

Я получил это с помощью диагностических переключателей -printseeds и -printconfiguration.

Соответствующий метод будет (а) определенв классе, расширяющем Activity, и (b) иметь сигнатуру метода, совпадающую с шаблоном (практически любое имя и параметр View).

Однако единственный способ воспроизвести вашу проблему - это если я изменил модификатор доступа, чтобы включитьpublic как в:

public void mostraView(View v)
{
    v.setVisibility(View.VISIBLE);
}

Обратите внимание на добавление ключевого слова public. Поэтому, если ваш опубликованный код дословно, тогда модификатором доступа по умолчанию является пакет друга, который не будет соответствовать шаблону.

В любом случае, насколько я могу судить, - удалось воспроизвести проблему с указанной модификацией и при условии возможногообъяснение на основе -keeps по умолчанию.

Обратите внимание, что термин "keep" перегружен тем, что он также применяется к запутыванию.

...