Я использую 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
и заменив все ссылки на ваши пользовательские представления, которые НЕ запутываются скрытыми именами. Примерно так:
- Скопируйте содержимое
<root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt
в новый файл <root_dir>/app/myCustomMapping.txt
- Перед тем, как что-либо менять, это будет выглядеть так:
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, который изменяет все пользовательские имена представлений перед сборкой приложения, но я не смог найти его, просто погуглил сейчас.