当所有配置选项都被禁用时,“minifyEnabled=true”有什么作用?

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

提问人:Stoberdo 提问时间:3/15/2022 最后编辑:Stoberdo 更新时间:5/3/2022 访问量:3745

问:

我有一个复杂的 android 应用程序构建设置,它基本上由一个普通的 android 应用程序和一个 Xamarin/Mono 项目融合在一起,以包含一个重要的 C# 库(如下所示:https://github.com/royd/KotlinAppWithXamarinDependency)

一切正常,除非我通过应用程序在我的应用程序中启用缩小,否则启动时会立即崩溃,因为 Mono-runtime 找不到肯定包含在 apk 中的本机程序集。app/build.gradleminifyEnabled true

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

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

一切正常,所以我尝试禁用我的所有配置选项:minifyEnabled falseproguard-rules.pro

-dontobfuscate
-dontoptimize
-dontshrink

我还将以下行添加到我的app/build.gradle

packagingOptions {
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}

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

我还反编译了一个工作和一个损坏的apk来比较字节码。它似乎完全相同,除了一些无关紧要的优化。dex2jarenum

根据 Logcat 中的错误消息,该错误似乎是从原生库抛出的。libmonodroid.so

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

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

Android xamarin.android android-gradle-plugin proguard android-r8

评论


答:

0赞 Liyun Zhang - MSFT 3/16/2022 #1

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

还有一些其他文件,例如 and 等等。因此,此错误可能是由于将设置设置为 true 时本机库丢失所致。AAR libraries: <library-dir>/proguard.txtJAR libraries: <library-dir>/META-INF/proguard/minifyenabled

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

此外,您可以检查“proguard-android-optimize.txt”,当您添加 to 可能会导致冲突。-dontoptimizeproguard-rules.pro

评论

0赞 Stoberdo 3/17/2022
感谢您的提示,但不幸的是,添加更多 proguard 配置无济于事。我用我发现的内容编辑了我的问题:似乎 AGP vom 4.0.1 到 4.1.0 的更改导致了我的错误,但我不知道确切的变化是什么。
0赞 Liyun Zhang - MSFT 3/17/2022
问题与原生 Gradle 插件有关,您可以发布带有 Android Studio 和 Gradle Plugin 标签的新问题。
0赞 Liyun Zhang - MSFT 3/17/2022
通常,您在 Logcat 中收到的消息应该意味着在将 minifyenabled 设置为 true 后,您的项目中遗漏了一个库。
0赞 Stoberdo 5/3/2022 #2

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

android.useNewApkCreator=false

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

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