【问题标题】:How to reduce APK file size如何减小 APK 文件大小
【发布时间】:2017-12-20 10:28:14
【问题描述】:

面试时有人问我如何减小 APK 文件大小,我的回答是管理资源以及管理我正在使用的库并删除任何未使用的库,但他告诉我还有其他方法可以减少APK 文件大小

谁能告诉我这些方法是什么?

【问题讨论】:

标签: android apk


【解决方案1】:

您可以使用以下方式减小 APk 的大小。

  1. 删除未使用的资源
  2. 尽量减少图书馆的资源使用
  3. 仅支持特定密度
  4. 使用可绘制对象
  5. 重用资源
  6. 从代码渲染
  7. 压缩 PNG 文件
  8. 压缩 PNG 和 JPEG 文件
  9. 使用 WebP 文件格式
  10. 使用矢量图形
  11. 为动画图像使用矢量图形
  12. 删除不必要的生成代码
  13. 减小本机二进制文件的大小
  14. 维护多个精简 APK
  15. 代码混淆

【讨论】:

    【解决方案2】:

    按照这些步骤来减小您的 APK 文件大小。

    第一步

    确保您在release buildType in build.gradle 文件中启用了 minify

    buildTypes {
    
        release {
            minifyEnabled true
        }
    
    }
    

    通过这样做,您还启用了 proguard,因此您需要添加 proguard 规则以在项目中使用库。例如,这是改造 2 的保护规则:

    -dontwarn okio.**
    -dontwarn javax.annotation.**
    

    您可以在proguard-rules.pro 文件中添加这两条规则。

    第二步

    确保您已在 build.gradle 文件中的 release buildType 中启用资源收缩:

    buildTypes {
    
        release {
            shrinkResources true
        }
    
    }
    

    所以build.gradle 文件中的最终release 范围应如下所示:

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    

    第三步

    您可能在项目中使用过的一些库包含一些针对不同国家和语言的额外资源。例如,一个库可能有两个 string.xml 文件,一个用于英语,一个用于日语。但是您的应用程序仅支持英语,因此您不需要那些日语字符串。

    为此打开您的 build.gradle 文件并添加以下行:

    resConfigs "en"
    

    到你在 android 范围下的 defaultConfig 范围:

    android {
    
        ...
    
        defaultConfig {
    
            ...
            resConfigs "en"
    
        }
    
    }
    

    第四步

    • 使用 vectorDrawables 代替 png 文件
    • 使用 webp 图片代替 png 文件

    【讨论】:

      【解决方案3】:

      我只有这些方法!希望对你有帮助

      1. 检查您的代码或资源
      2. png 图片到 webp
      3. minfyEnabled true

      【讨论】:

        【解决方案4】:

        请按照以下步骤,

        1.使用 .svg 格式图标集

        是时候告别 PNG 并欢迎 矢量绘图了。使用它们有几个好处。我们不必担心不同的设备 DPI,它还有助于减小 apk 大小。使用支持库 23.2,我们现在可以使用 ImageView 的 app:srcCompat 属性而不是 android:src 来使其向后兼容。 当您从 Google 的 Material Design 图标库下载系统应用图标集时,请下载 .svg 格式而不是 .pngs。这帮助我们将应用大小减少了 1 Mb。

        2。压缩 PNG

        我们正在为所有屏幕密度的演练屏幕使用 PNG。 PNG 的质量和大小都非常高,这只会扩大我们的应用程序大小!在 Weather Stream v1.2 中,当我们开始优化我们的应用程序大小时,我们压缩了我们的演练屏幕和繁荣!演练屏幕的大小约为以前的 1/10! (是的!1/10)。太疯狂了!我们快速创建了一个版本并检查了不同屏幕密度下的图像质量,看起来都一样。快速的 Google 搜索将为您提供许多工具来帮助您压缩 PNG。看到谷歌设计团队分享的Device Metrics,我们也把ldpi资源去掉了。

        3.仅使用特定的 Google Play 服务库。

        在 Google Play Services 6.5 之前,我们必须编译整个包。但是现在我们可以有选择地将它编译到我们的应用程序中。我们现在只使用 Google Cloud Messaging、Google Maps 和 Google Location API。

        4.使用 Proguard

        Proguard 用于代码混淆,它还从依赖项中删除未使用的 Java 代码。使用 Proguard 后的结果是较小的 apk 文件大小,难以进行逆向工程。启用proguard:

        build.gradle

        android {
            ...
            buildTypes {
                release {
                    minifyEnabled true
                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                }
            }
        }
        

        5.收缩资源

        Android Gradle 插件支持在构建过程中使用 shrinkResources gradle 属性自动排除未使用资源的功能。仅此一项就将 apk 大小减少了约 0.5 Mb。要在您的发布版本中利用这一点,只需将 shrinkResources true 添加到您的发布配置中。

        build.gradle

        android {
            ...
            buildTypes {
                release {
                    shrinkResources true
                    minifyEnabled true
                    ...
                   //Other parameters
                   debuggable false
                   jniDebuggable false
                   renderscriptDebuggable false
                }
            }
        }
        

        6. res Confing

        “resConfigs” 属性将在构建应用程序时删除所有其他本地化资源。在我们的例子中,“防盗锁屏”只支持英文。虽然所有支持库都可能具有其他语言的本地化文件夹。我们不需要。因此,添加以下行以仅允许在 APK 文件中添加英文资源。

        defaultConfig {
            //...
            //...
            //...
        
            //strip other than english resources
            resConfigs "en"
        }
        

        【讨论】:

          【解决方案5】:

          我能想到的还有 3 种方法:

          1. 通过定义minifyEnabled true,代码的混淆也会缩小你的apk大小
          2. 在运行时下载库 - 不推荐,而且相当 hack,但可以。
          3. 使用 lint 删除未使用的代码:分析 -> 检查代码

          【讨论】:

            【解决方案6】:

            将此添加到您的 gradle 文件中

            buildTypes {
                release {
                    minifyEnabled true
                    shrinkResources true
                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                }
            }
            

            【讨论】:

              最近更新 更多