Обфускация частных полей с помощью 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;

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

Вот refcard.

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

Ответ 1

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

В соответствии с Proguard documenation подстановочный знак соответствует любому поле.

В верхней части этого можно использовать отрицатели (!). (http://proguard.sourceforge.net/#manual/usage.html)

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

Я не настолько опытен в этой области, так что это скорее догадка, но легче написать в новом комментарии. Что-то вроде этого должно выполнить работу (НЕ ИСПЫТАТЬ):

-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.
}