After upgrading to Android Gradle plugin 3.4.0, a basic class no longer gets obfuscated.
The following basic steps can reproduce the problem:
- In Android Studio create a new empty project
- In
app/build.gradle
changeminifyEnabled
totrue
Create the following class,
ProguardTestClass.java
:public class ProguardTestClass { public interface ProguardTestInnerInterface { void proguardTestCallback(String message); } public static void proguardTestMethod(String input, ProguardTestInnerInterface impl) { impl.proguardTestCallback("proguardTestMethod received input=[" + input + "]"); } }
Refer to the class from
MainActivity.java
:public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ProguardTestClass.proguardTestMethod("MainActivity's ProguardTestClass", new ProguardTestClass.ProguardTestInnerInterface() { @Override public void proguardTestCallback(String message) { Log.d(TAG, "Proguard test: " + message); } }); } }
Confirm that it's using Android Gradle plugin 3.4.0 in
build.gradle
- Confirm that it's using
gradle-5.1.1
ingradle/wrapper/gradle-wrapper.properties
- Open a Terminal window in the Terminal tab
- Run
./gradlew clean build
- Run
find . -name mapping.txt | xargs grep "ProguardTestClass -> "
Expected output:
com.example.proguardgradleplugin340.ProguardTestClass -> com.example.proguardgradleplugin340.a:
Actual output:
app/build/outputs/mapping/release/mapping.txt
does not mention any renaming of ProguardTestClass
.
To see that prior Android Gradle plugin versions could produce the expected output, repeat the steps above but point to prior versions of Android Gradle plugin and Gradle:
- Change to Android Gradle plugin 3.3.2 in
build.gradle
- Change to
gradle-4.10.1
ingradle/wrapper/gradle-wrapper.properties
I tried to investigate by looking into other diagnostic files that we used to get from Proguard, but they're no longer output (at least not by default anyway):
find . -name seeds.txt
find . -name usage.txt
I also checked the Android Gradle plugin 3.4.0 release notes and found out that it replaced Proguard in favor of a new technology that "integrates desugaring, shrinking, obfuscating, optimizing, and dexing all in one step".
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?
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());
来源:https://stackoverflow.com/questions/56032152/class-no-longer-obfuscated-after-upgrading-to-android-gradle-plugin-3-4-0