After upgrading to Android Gradle plugin 3.4.0, a basic class no longer gets obfuscated.
The following basic steps can reproduce the problem:
The solution from @shizhen is what I accepted as the solution to the problem. But I wanted to document an alternative in case anyone else runs into this problem.
I was able to make R8 obfuscate the class by actually instantiating the class. Notice how my original code for ProguardTestClass
contained no constructor and I used it in a fairly static way. But when I added a constructor and instantiated it from MainActivity.java
, that gave R8 a reason to obfuscate it I guess.
Revised ProguardTestClass
that made R8 perform the obfuscation:
public class ProguardTestClass {
//
// NEW CODE: BEGIN
//
private int avar;
public ProguardTestClass(int avar) {
this.avar = avar;
}
public int incrementValue() {
return ++avar;
}
//
// NEW CODE: END
//
public interface ProguardTestInnerInterface {
void proguardTestCallback(String message);
}
public static void proguardTestMethod(String input, ProguardTestInnerInterface impl) {
impl.proguardTestCallback("proguardTestMethod received input=[" + input + "]");
}
}
Then in MainActivity.java
I instantiated and called the ProguardTestClass
on onCreate()
:
proguardTestClass = new ProguardTestClass(3);
Log.d(TAG, "Proguard test: " + proguardTestClass.incrementValue());
Try to set useProguard false
to let the plugin use R8 instead of ProGuard to shrink and obfuscate your app’s code and resources. E.g.
android {
...
buildTypes {
debug {
minifyEnabled true
useProguard false
}
release {
minifyEnabled true
useProguard false
}
}
}
Or alternatively, if you want to stick to ProGuard, you should disable R8 from gradle.properties
like below:
# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false
And remember to set useProguard true
.
Edit #1
Check here for how to migrate Proguard to R8: Android/java: Transition / Migration from ProGuard to R8?