Proguard (R8) скрывает пользовательские имена представлений - PullRequest
0 голосов
/ 19 июня 2020

Я использую R8 в своем приложении и имею несколько настраиваемых представлений (на которые есть ссылки в xml макетах), их имена вообще не запутываются. Есть ли способ добиться этого? Я использую стандартные правила Gradle:

release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

И также пробовал с android.enableR8.fullMode=true, но это то же самое.

1 Ответ

0 голосов
/ 19 июня 2020

Я использую R8 в своем приложении и имею несколько настраиваемых представлений (на которые есть ссылки в макетах xml), но их имена вообще не запутываются.

Это потому, что proguard- android -optimize.txt имеет следующее правило:

# keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
    void set*(***);
    *** get*();
}

Таким образом, ваши пользовательские представления или любые представления не будут иметь запутанных имен по умолчанию.

Теперь вопрос в том, может ли R8 переименовать пользовательские представления в вашем приложении? И ответ: не совсем .

Вы можете добавить -applymapping myCustomMapping.txt, скопировав содержимое <root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt и заменив все ссылки на ваши пользовательские представления, которые НЕ запутываются скрытыми именами. Примерно так:

  1. Скопируйте содержимое <root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt в новый файл <root_dir>/app/myCustomMapping.txt
  2. Перед тем, как что-либо менять, это будет выглядеть так:
my.app.package.CustomView -> my.app.package.CustomView :
    13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
    15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
    43:46:void customMethod() -> c

Вам нужно изменить только эту строку, которая имеет отображение классов верхнего уровня. Обратите внимание, что он не изменился из-за правил android proguard. Измените его на любое запутанное имя, которое хотите, например:
my.app.package.CustomView -> my.app.package.youcantseemeatall :
    13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
    15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
    43:46:void customMethod() -> c
Наконец, добавьте эти строки в ваш proguard-rules.pro файл
-applymapping myCustomMapping.txt
-printmapping mapping.txt

Эти шаги приведут к изменению ваших файлов .class на обфускацию CustomView на youcantseemeatall, НО ваши файлы ресурсов по-прежнему будут ссылаться на исходное CustomView имя, и ваше приложение будет сканировать sh во время выполнения.

Заключение:

К сожалению, на самом деле нет способа сделать то, что ваш запрос с помощью proguard или любого инструмента, который поставляется с Android Studio. Может быть собственный плагин Gradle, который изменяет все пользовательские имена представлений перед сборкой приложения, но я не смог найти его, просто погуглил сейчас.

...