简单可行的安装包/APK瘦身方案

前言

随着业务的发展,App的功能越来越多,代码量越来越大,不断增加的第三方库......
APK的体积也越来越大,如何对安装包瘦身成了我们优化应用的新挑战。本文就为大家带来一个简单可行、立杆见影的Android安装包瘦身方案。

瘦身之旅

一、安装包的结构
我们下载了最具代表性的BAT看家应用:微信、淘宝、手机百度的APK,使用Android Studio的Analyze apk功能对这些应用进行分析,结果如下:

简单可行的安装包/APK瘦身方案_第1张图片
微信.png

简单可行的安装包/APK瘦身方案_第2张图片
手机淘宝.png

简单可行的安装包/APK瘦身方案_第3张图片
手机百度.png

这里可以看到各家应用APK的构成,还有直观的百分比,不妨对自己的APK也分析一下。可以看到,安装包体积大头基本就是lib(so库),assets、res(图片)、classes.dex(代码文件,包括导入的jar包)。

二、精简 jniLibs
lib目录下存放so库,细心的朋友可能已经发现,我们分析的三个APP的lib目录下都只有一个'armeabi'文件夹。
我们知道,其他NDK的ABI还有 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'等,这些都是限定支持不同的芯片架构的库文件夹。如果so全部都放一份对应的文件,兼容性当然是最好的了,代价就是apk体积成倍增长。可以看到BAT不约而同地精简到仅保留'armeabi'下的so库,是因为除了可以忽略的'x86', 'x86_64'架构,'armeabi'作为较早、基础的平台,兼容性最好。那么我们在做APK瘦身时就可以删除其他目录,效仿BAT仅保留armeabi文件夹,一般应用不需要兼容到很低的Android版本,推荐仅保留armeabi-v7a文件夹就可以了。
具体操作如下:
jniLibs下仅保留armeabi-v7a目录,若某些第三方没有提供armeabi-v7a,可以把armeabi下的类库复制到armeabi-v7a,测试一下,兼容性一般都没有问题。

defaultConfig {
        ...
        ndk {
            abiFilters 'armeabi-v7a' //gradle中指定支持的NDK架构
        }
        ...
    }

三、精简 drawable
Android Studio在创建项目时,默认创建了多个drawable目录,如'drawable-hdpi','drawable-xhdpi','drawable-xxhdpi',不同目录对应着不同dpi的手机,目前基本上很少720P以下分辨率的手机,所以只保留一份份'drawable-xxhdpi'上的一套图片资源即可(dp为单位时一般都会自动缩放),个别图片差异过大时,再做单独处理。推荐使用多个dimens.xml文件来适配不同的手机尺寸,这样就保证兼顾了应用体积与UI适配的问题。
四、优化帧动画
动画是APP中必不可少的元素了,而帧动画作为最古老的一个类型也饱受诟病,快退出历史舞台了吧?要性能没性能,关键还占内存,原则是能不用就不要用,采用View动画、属性动画来替代。如果因为某些原因不得不用的时候也要优化一下,毕竟连续多张相似图片的体积可不容忽视。

  
  
      
      
      
      
      
      
      
      

从上面代码可以看到,我们一共使用了8张图片实现了一个loading效果,如果连续图片之间的差异不大,那么完全可以隔张剔除,仅保留一半。这样,不仅不影响动画效果又可以减少apk体积。
五、代码优化
classes.dex中包含了我们的代码,但是也有可能是我们没用到的代码,特别是一些体积大,方法多的第三方库。因此,在项目中应当定期清理过期的代码、去掉无用的模块。
另外,还可以通过使用ProGuard来对代码进行混淆、优化、压缩等工作,通过Android Studio自带的 “Remove Unused Resources”来找出那些已经没有使用的资源。官方参考:压缩代码和资源

buildTypes {
        release {
            minifyEnabled true      //开启混淆
            shrinkResources true    //忽略不使用的资源
            ...
        }
    }

六、精简多国语言支持
很多时候我们的应用根本就不需要支持多国语言,这个时候我们可以根据自身情况手动限定只支持简体中文、英文等语言,这个精简还是比较明显的,特别是在strings资源比较多的情况下,基本上也可以精简个几百K吧!build.gradle中配置如下:

defaultConfig {
        ...
        resConfigs "zh"
        ...
    }

七、图片资源压缩
图片资源在APK中占用的分量绝对不轻,而UI的切图一般不会帮我们压缩处理,这里推荐一个在线PNG压缩网站TinyPng简单好用!随意选取了几张图片上传压缩,压缩比例如下:

简单可行的安装包/APK瘦身方案_第4张图片
压缩效果.png

压缩过后的图片对比,肉眼几乎分辨不出的区别,体积却减小了69%!
简单可行的安装包/APK瘦身方案_第5张图片
压缩前后对比.png

平均压缩比例可以达到50%以上,效果就是图片资源占用直接减半,立竿见影!另外,png格式的图片是要比jpg格式的要大的多,也可以将一些图片替换成jpg格式,或者WebP格式,详细对比可见: WebP 相对于 PNG、JPG 有什么优势?

结语

在本文之前,虽然也有不少关于安装包瘦身的文章,但技术是常读常新,贵在亲身实践。以上都经过实战验证,最重要的是简单有效,操作性强。没疗效不要钱,有疗效就点个赞呗!
最后,本次安装包瘦身之旅就先到这里了。

你可能感兴趣的:(简单可行的安装包/APK瘦身方案)