为啥 minifyEnabled 在默认情况下在发布版本中为 false?

Posted

技术标签:

【中文标题】为啥 minifyEnabled 在默认情况下在发布版本中为 false?【英文标题】:Why is minifyEnabled is false in release builds by default?为什么 minifyEnabled 在默认情况下在发布版本中为 false? 【发布时间】:2020-08-24 10:40:14 【问题描述】:

在 build.gradle (app) 文件中我们默认有这个,

buildTypes 
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    

根据https://developer.android.com/studio/build/shrink-code,

我知道使用minifyEnabled true 会延长编译时间,但通常调试版本用于开发和测试,无论如何都不受影响。

我正在寻找的是,在运行时使用minifyEnabled true 会导致哪些缺点(例如性能影响)。我不担心发布版本的构建时间。

Google Play Console 也建议我们启用它,因此我想知道为什么 minifyEnabled 默认被禁用。

【问题讨论】:

1) 不,它确实使它更“安全”——它只是让检查变得更加乏味; 2)它确实需要更长的时间,所以这是一个立即的粉笔; 3)这只是一个默认值,“为什么”要么在历史中[丢失] [例如邮件列表],要么是分配它的人的偏好; 4) 查看相关的 shrinkResources 文档和/或提出一个明确关注此类的 [新] 问题。 @user2864740 感谢您的回复。那么您是否建议通过启用它没有副作用?我还是有点失落。我其实很担心运行时性能。 从之前的评论中得出的结论很尴尬.. @user2864740 这可能有点晚了,但是使用 minifyEnabled 构建应用程序确实需要更长的时间。这在中低端 PC 上非常明显。 【参考方案1】:

通过在您的发布版本中添加 minifyEnabled true 您可以混淆代码,但在发布版本中默认设置为 false 因为如果设置为 true 则需要编写 proguard 规则来告诉编译器在混淆时哪些类将被忽略代码。如果 minifyEnabled 默认设置为 true,开发者忘记添加 proguard 规则,可能会导致运行时崩溃。

但是,将 minifyEnabled 设置为 true 并将 shrinkResources 设置为 true 可以减小您的 apk 大小。

【讨论】:

【参考方案2】:

正如 NIKHIL AGGARWAL 所说,将 minifyEnabled 设置为 true 会导致运行时崩溃。

您应该研究每个使用过的库,以便将它们的 ProGuard 规则包含到您的项目中。有时在 Gradle 或库升级后,您应该再次检查 ProGuard 规则并在您的项目中相应地更新它们。

您应该将网络模型的数据类添加到 ProGuard。

您应该检查您的release 构建在具有不同 Android 版本的多个设备/模拟器上,以了解它可能在哪里崩溃。在release 构建中进行调试很困难,而且混淆后会变成一场噩梦。

但是,在您设置 minifyEnabled = true 并避免崩溃后,您将减小 apk 大小并阻止破解尝试。

【讨论】:

以上是关于为啥 minifyEnabled 在默认情况下在发布版本中为 false?的主要内容,如果未能解决你的问题,请参考以下文章

为啥浮点数据类型在没有类型转换 4.7 的情况下在此代码中不起作用? [复制]

为啥使用“minifyEnabled true”时 Proguard 不起作用?

未明确编写脚本的 buildType 的 minifyEnabled 的默认值是啥?

默认情况下在 UICollectionView 中滚动 UISearchBar

默认情况下在日期选择器中设置特定日期

默认情况下在我的 android 应用中启用所有通知设置