APK瘦身三步曲

作者: 黄俊彬 | 来源:发表于2018-11-28 15:28 被阅读51次

    前言

    背景

    115于2009年推出的网络数据在线存储服务,一直以来都有阶段性对应用进行安装包的体积优化,因为公司也没有硬性的指标规定,所以这块的重视程度也一直不高。对比了目前竞品的一个情况,如下:

    应用 版本号 大小
    115 V8.1.1 50.26M
    微云 V6.6.4 37.67MB
    百度云 V9.0.2 48.3MB

    使用Android Studio的APK Analyzer具体详细分析如下:

    目录 115 微云 百度云
    res 31.8M +assert 10.2M +assert 17.4M
    lib 7M 18.2M 13.1M
    classes 7.3M 6.8M 13.9M
    resource.arsc 1.9M 1.6M 2.2M

    分析

    虽然各个应用的功能集不一致,但是主要都是提供存储服务,这里的对比也是从某个层面进行比较。通过分析对比表可以得知。

    1. 微云体积最少,百度云次之,115最大
    2. 115体积主要最大的地方在res图片资源这块
    3. 115的lib及classes是最小的

    所以从分析的结果上来看,115的体积优化的主要方向要从res图片资源入手。

    瘦身三步曲(删除、压缩、混淆)

    删除

    删除无用的代码

    删除无用的代码,这个放在第一位是因为这个是问题的根源。

    随着项目版本的迭代及业务快速的更迭,有时候为了赶时间,废弃的代码及资源都不会及时清理,日积月累的堆积,慢慢APK的体积就会越来越臃肿。

    如果属于这种情况,应该先自己进行人工的整理及清除。这个时候可以先不管资源(后面用工具进行清理),但是类相关的调用及无用的类要及时进行清理。否则后面的图片及资源也会照样被识别为有引用,打包进APK。

    Lint工具检查

    Android Studio给我们提供了强大的检查工具。只需要选中res目录,右键选择Refactor然后再选择Remove Unused Resources。
    建议先使用Preview,然后再进行删除。

    Lint使用 Lint Preview

    这里需要注意,特别有使用第三方的SDK,有些代码是在jar包里面,但是资源独立拷贝进工程,这样也会被识别成无引用的资源。但是这类资源一般都有特定的命名格式。

    Grdle配置

    android {
            buildTypes {
                release {
                    minifyEnabled true //是否开启混淆
                    shrinkResources true //压缩
                    zipAlignEnabled true ////去掉无用的resourse文件
                }
            }
        }
    

    启用shrinkResources,gradle在打包的时候会自动进行资源的清理。

    压缩

    PNG压缩优化

    推荐使用tinypng

    tinypng通过合并图片中相似的颜色,通过将 24 位的 PNG 图片压缩成小得多的 8 位色值的图片,并且去掉了图片中不必要的 metadata(元数据,从 Photoshop 等工具中导出的图片都会带有此类信息),这种方式几乎能完美支持原图片的透明度。有部分文档指出tinypng同时采用了pngquant、optipng、advpng几种脚本。图片的压缩率能达到50%以上。

    webp使用

    WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。无损压缩比PNG文件小45%,即使PNG已经过其他的优化,也能达到28%。缺点,加载比PNG慢。

    Android Studio自带了对WebP的转换支持。选中资源,右键Convert to WebP。

    PNG 转 WebP

    通过删除及压缩前两步的操作,115的优化情况如下:

    目录 115 115优化
    res 31.8M 26.1MM
    lib 7M 7M
    classes 7.3M 7.3M
    resource.arsc 1.9M 1.8M

    优化情况分析:优化后为44.46M,约节省5.8M,优化11%

    混淆

    Proguard代码混淆

    1. 删除注释和无用的代码
    2. 将java文件文件名及方法名改成短名 a.java

    支持的方式也很简单,Gradle默认支持

    android {
            buildTypes {
                release {
                    minifyEnabled true //是否开启混淆
                     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                }
            }
        }
    

    资源混淆

    AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。

    具体的原理可参看安装包立减1M--微信Android资源混淆打包工具

    集成也非常简单,详细参看Github中的使用说明则可。

    通过资源混淆后,115的优化情况如下:

    目录 115 115优化 115资源混淆
    res 31.8M 26.1MM 25.4M
    lib 7M 7M 6.7M
    classes 7.3M 7.3M 6.9M
    resource.arsc 1.9M 1.8M 280.3KB

    优化情况分析:优化后为41.32M,相比没做资源混淆,约节省3.14M,体积优化7%

    总结

    经过瘦身三步曲的优化后,最终115应用的一个优化情况如下:

    目录 115 115最终优化版本
    res 31.8M 25.4M
    lib 7M 6.7M
    classes 7.3M 6.9M
    resource.arsc 1.9M 280.3KB

    优化情况分析:优化后为41.32M,相比没做优化前,约节省8.94M,体积优化17.7%

    115的APK体积优化,现阶段只能说是做了一个初步优化,特别是对于第一步的删除,由于历史的遗留原因。对于一些遗留的代码还待进一步的整理和清除,体积也是还有继续优化的空间。

    其他方案

    除了常规的瘦身三步曲,对于APK体积当然还有其他的方案。如:

    1. 资源动态加载(如表情包动态下载)
    2. 插件化(动态加载)

    方案当然还有很多,本文只介绍常规使用的一些方法,有兴趣的伙伴可以继续深入了解。

    参考资料

    tinypng

    AndResGuard

    安装包立减1M--微信Android资源混淆打包工具

    相关文章

      网友评论

      本文标题:APK瘦身三步曲

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