升级到 Android Gradle 插件 3.4.0 后类不再混淆

Mic*_*sky 3 android android-gradle-plugin android-proguard

升级到 Android Gradle 插件 3.4.0 后,基本类不再被混淆。

以下基本步骤可以重现该问题:

  1. 在 Android Studio 中创建一个新的空项目
  2. app/build.gradle更改minifyEnabledtrue
  3. 创建以下类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 + "]");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 请参阅以下课程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);
                    }
                });
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 确认它在使用 Android Gradle 插件 3.4.0 build.gradle

  6. 确认它的使用gradle-5.1.1gradle/wrapper/gradle-wrapper.properties
  7. 在终端选项卡中打开终端窗口
  8. ./gradlew clean build
  9. find . -name mapping.txt | xargs grep "ProguardTestClass -> "

预期输出:

com.example.proguardgradleplugin340.ProguardTestClass -> com.example.proguardgradleplugin340.a:
Run Code Online (Sandbox Code Playgroud)

实际输出:

app/build/outputs/mapping/release/mapping.txt没有提到ProguardTestClass.

要查看之前的 Android Gradle 插件版本可以产生预期的输出,请重复上述步骤,但要指向之前版本的 Android Gradle 插件和 Gradle:

  1. 更改为 Android Gradle 插件 3.3.2 in build.gradle
  2. 更改为gradle-4.10.1gradle/wrapper/gradle-wrapper.properties

我试图通过查看我们过去从 Proguard 获取的其他诊断文件进行调查,但它们不再输出(至少在默认情况下不会):

find . -name seeds.txt find . -name usage.txt

我还查看了 Android Gradle 插件 3.4.0 发行说明,发现它取代了 Proguard,取而代之的是一种“一步集成去糖、收缩、混淆、优化和 dexing”的新技术。

shi*_*hen 5

尝试设置useProguard false让插件使用 R8 而不是 ProGuard 来缩小和混淆应用程序的代码和资源。例如

android {
    ...
    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
        }
        release {
            minifyEnabled true
            useProguard false 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想坚持使用 ProGuard,你应该从gradle.properties下面禁用 R8 :

# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false
Run Code Online (Sandbox Code Playgroud)

并记得设置useProguard true.


编辑 #1

在此处查看如何将 Proguard 迁移到 R8:Android/java:Transition/Migration from ProGuard to R8?