Обфускация закрытых полей с помощью ProGuard

Я использую ProGuard в AndroidStudio 1.2.1.1 с Gradle 1.2.3.

Сборка релиза моего Gradle настроена так:

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

Я хотел бы, чтобы частные поля классов были запутаны.

Вот мой конфигурационный файл proguard (после многих попыток) на данный момент:

-allowaccessmodification
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-verbose
[...]

Но после декомпиляции с помощью androdd из AndroidGuard я получаю:

private com.google.android.gms.common.api.GoogleApiClient googleApiClient;

Я знаю, что использование этой обфускации ограничено, но я бы хотел, чтобы ProGuard переименовал googleApiClient. Как это сделать?

Вот справочная карта.

Есть ли способ сделать противоположное -keepclassmembernames?


person shkschneider    schedule 29.05.2015    source источник
comment
является ли googleApiClient единственным незапутанным полем или оно одинаково для всех полей?   -  person yohann.martineau    schedule 01.06.2015
comment
Я хотел бы это для всех частных полей.   -  person shkschneider    schedule 01.06.2015


Ответы (1)


Из этого: Как сообщить ProGuard сохранить закрытые поля без указания каждого поля

Согласно документации ProGuard, подстановочный знак соответствует любому полю.

Кроме того, вы можете использовать отрицатели (!). (http://proguard.sourceforge.net/#manual/usage.html)

Имена атрибутов могут содержать подстановочные знаки ?, * и **, и им может предшествовать символ ! отрицатель.

Я не настолько опытен в этой области, поэтому скорее это догадки, а проще написать в новом комментарии. Что-то вроде этого должно выполнять эту работу (НЕ ПРОВЕРЕНО):

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    <methods>;
    <init>; //and keep every field, method, constructor apart from private fields
}

Может быть, вы можете использовать это, но сначала не знаете, как это работает с отрицателем:

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    *; //should exclude everything except private fields, which should be obfuscated.
}
person czupe    schedule 05.06.2015
comment
Я использовал -keepclassmembers class my.package { !private <fields>; protected <field>; public <fields>; <methods>; } и получил то, что хотел: поля с именами a, b, c и т. д. Я знал, что это связано с отрицателями, спасибо, что привели меня к правильному использованию. Я уточню для личного использования, но это ответ, который я искал. - person shkschneider; 08.06.2015
comment
Вот мой последний файл ProGuard, который работает с ошибкой Android № 78377: /а> - person shkschneider; 08.06.2015
comment
Спасибо за ответ и за награду! Я рад, что вы сработали, основываясь на моих подсказках, также спасибо за то, что выложили на github, для меня это тоже был хороший опыт. - person czupe; 09.06.2015