当禁用所有配置选项时,'minifyEnabled=true' 会做什么?

What does 'minifyEnabled=true' do when all configuration options are disabled?

我有一个复杂的 android 应用程序构建设置,它基本上由一个普通的 android 应用程序和一个 Xamarin/Mono 项目组成,以包含一个重要的 C# 库(像这样:https://github.com/royd/KotlinAppWithXamarinDependency)

一切正常,除非我通过 minifyEnabled true 在我的 app/build.gradle 中启用缩小应用程序在启动时立即崩溃,因为 Mono-runtime 找不到明确包含在apk.

这是我在 Logcat 中收到的消息:

A/monodroid: No assemblies found in '(null)' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...

使用 minifyEnabled false 一切正常所以我尝试禁用 proguard-rules.pro:

中的所有配置选项
-dontobfuscate
-dontoptimize
-dontshrink

而且我还在 app/build.gradle

中添加了以下几行
packagingOptions {
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}

不幸的是,这一切都无济于事。

我还使用 dex2jar 反编译了一个正常运行的 apk 和一个损坏的 apk 来比较字节码。除了一些无关紧要的 enum 优化外,它似乎完全相同。

根据 Logcat 中的错误消息,错误似乎是从本机库 libmonodroid.so.

中抛出的

所以我的问题是:当所有这些配置选项都被禁用时,minifyenabled 标志有什么作用?

编辑: 我发现当我使用 Android Gradle 插件的 4.0.1 版时(从 2020 年 7 月开始),缩小会按预期工作。将版本升级到 4.1.0(2020 年 8 月)会破坏我的应用程序。现在的问题是这两个版本之间发生了什么变化?

当您将 minifyenabled 设置为 true 时。 r8 将选择配置文件,而不仅仅是 proguard-rules.proapp/build.gradle 来缩小、混淆和优化您的应用程序。

还有一些其他文件,例如 AAR libraries: <library-dir>/proguard.txtJAR libraries: <library-dir>/META-INF/proguard/ 等等。所以这个错误可能是你设置set the minifyenabled as true.

时本地库丢失引起的

如需更多信息,请查看官方文档:https://developer.android.com/studio/build/shrink-code#enable

此外,您可以检查'proguard-android-optimize.txt',当您将-dontoptimize添加到proguard-rules.pro时可能会导致冲突。

我发现,在 Android Gradle 插件版本 3.6.0 到 4.1.0 中,他们切换到一个名为 zipflinger 的更高性能的 apk 构建工具。 可以通过将此行添加到我的 gradle.properties:

来禁用此工具
android.useNewApkCreator=false

构建 apk 时,zipflinger 将外部 .NET 程序集存储为 DEFLATED zip 条目而不是 STORED,这就是 monodroid 无法读取它们的原因。

参考文献:
https://github.com/xamarin/xamarin-android/issues/6838#issuecomment-1110816027 https://copyfuture.com/blogs-details/20210119115509664T