当禁用所有配置选项时,'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.pro
和 app/build.gradle
来缩小、混淆和优化您的应用程序。
还有一些其他文件,例如 AAR libraries: <library-dir>/proguard.txt
和
JAR 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
我有一个复杂的 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.pro
和 app/build.gradle
来缩小、混淆和优化您的应用程序。
还有一些其他文件,例如 AAR libraries: <library-dir>/proguard.txt
和
JAR 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