问题
I'm using ProGuard in AndroidStudio 1.2.1.1 with Gradle 1.2.3.
My Gradle's release build is configured like so:
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
I would like the private fields of classes to be obfuscated.
Here is my proguard config file (after many tries) as of now:
-allowaccessmodification
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-verbose
[...]
But I end up, after decompiling with androdd
from AndroidGuard, with:
private com.google.android.gms.common.api.GoogleApiClient googleApiClient;
I know the use of this obfuscation is limited, but I would like googleApiClient
to be renamed by ProGuard. How to do so?
Here is the refcard.
Is there any way to do the opposite of -keepclassmembernames
?
回答1:
Getting from this: How to tell ProGuard to keep private fields without specifying each field
According to ProGuard documenation the wildcard matches any field.
Top of that, You can use negators (!). (http://proguard.sourceforge.net/#manual/usage.html)
Attribute names can contain ?, *, and ** wildcards, and they can be preceded by the ! negator.
I am not so experienced in this field, so rather it is a guess, but easier to write in a new comment. Something like this should do the job (NOT TESTED):
-keepclassmembers class * { //should find all classes
!private <fields>;
<methods>;
<init>; //and keep every field, method, constructor apart from private fields
}
May be you can use like this, but do not sure how it works with a negator first:
-keepclassmembers class * { //should find all classes
!private <fields>;
*; //should exclude everything except private fields, which should be obfuscated.
}
来源:https://stackoverflow.com/questions/30526173/obfuscate-private-fields-using-proguard