禁用所有配置选项后,'minifyEnabled=true'会执行哪些操作?



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

一切都很好,除非我通过minifyEnabled trueapp/build.gradle中启用缩小,否则应用程序在启动时会立即崩溃,因为Mono运行时找不到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,以比较字节码。除了一些不重要的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/等等。因此,当您将minifyenabled设置为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拉链存储外部。NET程序集作为DEFLATEDzip条目而不是STORED,这就是monodroid无法读取它们的原因。

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

最新更新