升级到 Android Gradle 插件 3.4.0 后,基本类不再被混淆。
以下基本步骤可以重现该问题:
- 在 Android Studio 中创建一个新的空项目
- In
app/build.gradle
change minifyEnabled
to true
-
创建以下类,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 + "]");
}
}
-
参考课程来自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);
}
});
}
}
确认它使用的是 Android Gradle 插件 3.4.0build.gradle
- 确认正在使用
gradle-5.1.1
in gradle/wrapper/gradle-wrapper.properties
- 在“终端”选项卡中打开“终端”窗口
- Run
./gradlew clean build
- Run
find . -name mapping.txt | xargs grep "ProguardTestClass -> "
预期输出:
com.example.proguardgradleplugin340.ProguardTestClass -> com.example.proguardgradleplugin340.a:
实际输出:
app/build/outputs/mapping/release/mapping.txt
没有提到任何重命名ProguardTestClass
.
要查看之前的 Android Gradle 插件版本是否可以产生预期的输出,请重复上述步骤,但指向之前版本的 Android Gradle 插件和 Gradle:
- 更改为 Android Gradle 插件 3.3.2 中
build.gradle
- 改成
gradle-4.10.1
in gradle/wrapper/gradle-wrapper.properties
我试图通过调查其他人来进行调查我们以前从 Proguard 获取的诊断文件,但它们不再输出(至少默认情况下不会):
find . -name seeds.txt
find . -name usage.txt
我还检查了 Android Gradle 插件 3.4.0 发行说明,发现它取代了 Proguard,转而采用了一项新技术:“将脱糖、收缩、混淆、优化和去糖化全部集成在一个步骤中”.
尝试设置useProguard false
让插件使用 R8 而不是 ProGuard 来缩小和混淆应用程序的代码和资源。例如。
android {
...
buildTypes {
debug {
minifyEnabled true
useProguard false
}
release {
minifyEnabled true
useProguard false
}
}
}
或者,如果你想坚持使用 ProGuard,你应该禁用 R8gradle.properties
像下面这样:
# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false
并且记得设置useProguard true
.
Edit #1
请在此处查看如何将 Proguard 迁移到 R8:Android/java:从 ProGuard 过渡/迁移到 R8?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)