Apk 全面瘦身详解

Posted xyTianZhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apk 全面瘦身详解相关的知识,希望对你有一定的参考价值。

Apk 全面瘦身详解

android 开发的都有经历过,项目的体积大小随着开发时间增长,包体积也会随之增长。
想想一个经历过5-6年的项目,如果不做包体积方面的控制和优化,最起码现在得有百兆了,还是一个简单的应用。

随着 apk 的体积增大,相应的弊端也就暴露出来了,这也就是我们为什么要进行 apk 瘦身的原因

  • 安装包过大,导致很多用户不愿更新和下载
  • 安装包过大,导致新用户不愿下载
  • 安装包过大,流量使用增多,无端增加了许多边际成本

所以这里我们来看看对于 apk 包体积优化都可以从哪些方面入手。

Apk 包结构分析

首先我们来分析一个 apk 的包,看看在 apk 中都有哪些东西。直接将相应的 apk 文件拖到 AndroidStudio 中即可看到

可以看到 AS 替我们将 apk 中的文件,已经按照文件大小从上到下罗列出来了。来看一下 apk 中各个文件、文件夹都代表什么意思,存放那些资源

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

我们在优化的时候,可以从上往下,按照 AS 给我们罗列的顺序,毕竟大文件优化起来效果最好。

当然这种方式有一种无序性,容易忽略一些东西。下面我们就根据一定的顺序对 apk 大小进行优化。

优化方式

图片资源优化

开发过程中避免不了要使用图片资源,我们常见的图片资源有以下几类,矢量图片、WebP、png、jpg。以上排序有优先使用顺序

矢量图片 SVG

Android 自带了许多矢量图,这种资源我们只需要放置一份就可以了。

我们来看看通过 AS 创建矢量图:

优点:只需要放置一份,不用各个分辨率都创建
缺点:图片绘制时间长,设计制作复杂度高

WebP

WebP 格式我们也可以通过 AS 将相应的图片进行转换

最后这张效果就可以看出。原图和转换后的图肉眼基本看不出差别,但是大小却只有原大小的25%。压缩率还是很高的。

优点:体积更小
缺点:4.2.1+才支持透明度

这里附上 转换 WebP 的官方工具

png、jpg

png 和 jpg 格式是我们经常使用的,无甚多说。不过这里提供一个可以压缩的站点:tinypng

其他图片优化

  • 纯色图片可以用代码实现
  • 减少图片资源放置份数
    一般只需要放置 xhdpi、xxhdpi就可以了
  • 能用代码实现的图片,尽量采用代码实现
    比如:圆形图片、环形图片、渐变等都可以采用代码实现

资源压缩

开启资源压缩和无用资源的剔除

android
    buildTypes
        release
            //开启混淆
            shrinkResourses true
            //开启了代码压缩后,资源压缩才会生效
            minifyEnabled true
            //开启代码混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    

也可以使用微信开源的资源压缩,可以对资源进一步压缩,具体使用方法,这里不多说,可以参考微信开源官网:AndResGuard

冗余代码优化

随着开发时间的加长,重复代码越来越多。产生冗余代码无非以下两个原因

  • 写代码使用四键大法好:Ctrl+c、Ctrl+V
  • 对项目不熟悉,重复造轮子

这个可以使用 AS 自带的 Lint 检测工具,根据检测出来的结果进行相应的优化

其他优化

压缩存储文件

在我们的 Assets 文件中存放的文件都不会进行压缩,会将文件原封不动的打入 apk 文件中。

我们可以将 Assets 中的相应文件使用 7zip 进行压缩,然后通过代码在进行解压缩到相应的目录进行使用。这样也可以节省相应的空间。

其他资源优化

语言资源优化

在 build 配置中配置 resConfig 指定需要的语言类型

defaultConfig
    resConfig "zh","en"

xml 中定义的重复 color、string 资源
  • 过滤重复的 string 资源
  • 定义唯一的 color 名
减少 Enum 的使用
  • 每减少一个 Enum 文件,可以减少 1k 左右的大小
  • 采用常量进行定义

移除无用的依赖库

开发中不可避免使用第三方 SDK,而第三方的 SDK 又依赖了其他相关的 SDK,这样就会导致有些无用的库会被打进 apk 中

我们可以从以下几个方面进行优化:

  • 剔除不在使用的库
  • 优化过时的库
  • 仅仅提取使用的代码
  • 选用更小的外部库

so 库优化

lib 目录下的相关 so 库其实占了很大一部分,这里的优化有如下两个方式

  • 指定 abi
    Gradle 中指定相应的 abiFilter

    ndk 
        abiFilters 'armeabi', 'arm64-v8a', 'armeabi-v7a'
    
    
  • 相关 so 库动态下发
    其实有的 so 库我们可以在程序打开后从服务端进行下载,然后动态进行加载使用。当然,这种方式只能下发延迟使用的相关 so 库。
    这里动态下发需要考虑的东西比较多,比如下载失败怎么办,有什么兜底逻辑。还有安全问题,怎么保证下载的 so 库没有被篡改等

以上是关于Apk 全面瘦身详解的主要内容,如果未能解决你的问题,请参考以下文章

Android APK瘦身全面总结——如何从32.6M到13.6M

Android性能优化之APK瘦身详解(瘦身73%)

Android 性能优化--apk瘦身优化

Android 性能优化--apk瘦身优化

Android 性能优化--apk瘦身优化

Android 性能优化--apk瘦身优化