美文网首页
想提高应用程序的用户满意度——APK体积包优化少不了

想提高应用程序的用户满意度——APK体积包优化少不了

作者: 艾瑞败类 | 来源:发表于2023-05-08 13:39 被阅读0次

    作者:子不语Any

    前言

    减少应用程序安装包的大小,不仅仅减少用户的网络数据流量,还减少了下载等待的时间。毋庸置疑,尽量减少程序安装包的大小是十分有必要的。

    通常来说,减少程序安装包的大小有两条规律:要么减少程序资源的大小,要么就是减少程序的代码量。

    一、应用APK构成

    在开始优化技巧之前,先来看一下APK的组成结构。可以用 Android Studio 中的 APK Analyzer 打开 APK 查看。

    可以看到 APK 由以下主要部分组成:

    文件/目录 描述
    lib/ 存放 so 文件,可能会有 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持 armabi 与 x86 的架构即可
    res/ 存放编译后的资源文件,例如:drawable、layout 等等
    assets/ 应用程序的资源,应用程序可以使用 AssetManager 来检索该资源
    META-INF/ 该文件夹一般存放于已经签名的 APK 中,它包含了 APK 中所有文件的签名摘要等信息
    classes(n).dex classes 文件是 Java Class,被 DEX 编译后可供 Dalvik/ART 虚拟机所理解的文件格式
    resources.arsc 编译后的二进制资源文件
    AndroidManifest.xml Android 的清单文件,格式为 AXML,用于描述应用程序的名称、版本、所需权限、注册的四大组件

    二、优化代码

    1.压缩代码

    通过开启 ProGuard 来实现代码压缩,可以在 build.gradle 文件相应的构建类型中添加 minifyEnabled true

    打开这个编译属性之后,程序在打包的时候就不会把没有引用到的代码编译进来,以此达到减少安装包大小的目的。

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

    除了 minifyEnabled 属性外,还有用于定义 ProGuard 规则的 proguardFiles 属性:

    • getDefaultProguardFile(‘proguard-android.txt') 是从Android SDK tools/proguard/ 文件夹获取默认 ProGuard 设置。
    • proguard-rules.pro 文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)。

    2.减少 ENUM 的使用

    官方建议:Remove Enumerations,每减少一个 ENUM 可以减少大约 1.0 到 1.4 KB大小。

    3.精简类库jar

    有些引入到工程中的 jar 文件可能并不是专门针对移动端 App 而设计,最开始可能是运用在 Server 上的。使用这部分类库不仅额外增加包大小,还增加了编译时间。

    依靠 Proguard 可能无法完全移除那些使用不到的方法,最佳的方式是使用一些更加轻量化,专门为移动 App 设计的 jar。

    4.精简 so 资源

    Android系 统目前支持以下七种不同的 CPU 架构:x86、MIPS、ARMv8、MIPS64 和 x86_64。

    每一个 CPU 架构对应一个 ABI:armeabi、armeabi_v7a、x86、mips、mips64、x86_64。

    所有 x86、x86_64、armeabi_v7a、arm64_v8a 设备都支持 armeabi 架构的 so 文件,x86 设备能够很好的运行 ARM 类型函数库,但并不保证 100% 不发生 Crash,特别是对旧设备。

    一般应用完全可以根据自己业务需求选择使用 armeabi 或者 armeabi_v7a 一种支持就行。

    假设只支持了 armeabi,如果有特殊要求(比如视频应用)需要用到部分 armeabi_v7a 的 so,可以通过改名放到 armeabi 文件夹中,根据手机实际情况选择加载。

    • 动态下发

    比较大的 so 可以选择动态下发的形式延迟加载,代码上需要加一些判断逻辑。

    5.精简语言资源

    大部分应用其实并不需要支持几十种语言的国际化支持。gradle支持语言的配置,比如国内应用只支持中文:

    android {
        defaultConfig {
            resConfigs "zh"
        }
    }
    

    6.安装包拆分

    设想一下,一个 low dpi,API<14 的用户手机下载安装的 APK 里面却包含了大量 xxhdpi 的资源文件,对于这个用户来说,这个 APK 是存在很大的资源浪费。

    Android 平台提供了拆分 APK 的方法,它能够根据 API Level,屏幕大小以及 GPU 版本的不同进行拆分,使得对应平台的用户下载到最合适自己手机的安装包。

    更多关于安装包拆分的信息,请查看 Configure APK Splits 。

    三、优化资源文件

    1.移除未使用的资源

    在 build.gradle 文件中配置 shrinkResources 的属性,这个属性可以帮助移除那些在程序中使用不到的资源文件,帮助减少 App 的安装包大小。

    android {
      buildTypes {
        release {
          shrinkResources true
        }
      }
    }
    

    有选择性的提供对应分辨率的图片资源,系统会自动匹配最合适分辨率的图片并执行拉伸或者压缩的处理。

    2.压缩图片

    Android 打包本身会对 PNG 进行无损压缩,Tinypng 以尽量少的失真换来图片大小的锐减,效果非常好,强烈推荐这个工具。

    3.推荐使用矢量图 VectorDrawable

    在符合条件的情况下,使用Vertor Drawable替代传统的PNG/JPEG图片,能够极大的减少图片资源的大小。 一般针对不同 DPI 的手机都需要提供一套 PNG/JPEG 的图片,而如果使用 Vector Drawable 的话,只需要一个 XML 文件即可。 还有一点:尽量复用已经存在的资源图片,使用代码的方式对已有的资源进行复用。

    相关文章

      网友评论

          本文标题:想提高应用程序的用户满意度——APK体积包优化少不了

          本文链接:https://www.haomeiwen.com/subject/nnxmjdtx.html