android透明色_类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

面试官: 类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

心理分析:面试官是非常注重性能优化的,考求职者是否具备APK压缩技能。

**求职者:**应该从每一步压缩开始,压缩的过程本质是挤牙膏的过程,一步一步挤。将Apk压缩分为8个步骤

简介

随着项目的不断迭代,代码量跟资源文件不断增多。那么就会出现打包后的 APK 文件越来越大,如果突然有一天你们老板或领导叫你优化 APK 大小,你还不知道怎么优化那就有点说不过去了,这篇文章咱们就来一起分析并优化 APK 体积大小吧。

分析 APK 资源占用

注意:

我是在 GitHub 找了一个人气比较高的开源项目,需要的话自己可以点击下载,自己动手尝试一番.

016ab800c92f710395a69b1b8b0d29df.png

分析工具直接用的 AS Build/Analyze APK

从上面图中得出 assets > classes.dex > res > lib 其中资源文件占用最大。

下面我们就来看看怎么减小 APK 大小吧,

优化 APK 体积八大步

1. 将图片转换为 webp 格式

Webp 概念

WebP 是一种同时提供了有损压缩与无损压缩的图片文件格式,派生自视频编码格式 VP8。WebP 最初在2010年发布,目标是减少文件大小,但达到 和 JEPG 格式相同的图片质量,希望能够减少图片档在网络上的发送时间。2011年11月8日,Google 开始让 WebP 支持无损压缩和透明色的功能。

根据 Google 较早的测试,WebP 的无损压缩比网络上找到的 PNG 档少了 45% 的文件大小,即使这些 PNG 档在使用 PNGCRUSH 和 PNGOUT 处理过,WebP 还是可以减少 28% 的文件大小。就目前而言,Webp 可以让图片大小平均减少 70% 。WebP 是未来图片格式的发展趋势。

PNG / JPG to Webp

4fa5f1855948e15cdd5b84228b72e2bf.gif

点击图片或者文件夹右键选择 Convert to Webp 格式,将 png / jpg 图片压缩为 webp 格式图片.

e0630377af1f3cf2bea2706723f6b9af.png

最后我们只减少了不到 200 kb 左右,有可能项目图片资源本来就没有多大,只是太多小图片导致的。

应用场景及优势

  • 客户端软件,内嵌了基于 Chromium 的 webview,这类浏览器中应用的网页是可以完全使用WebP 格式,提升加载渲染速度,不考虑兼容。
  • 用 node-webkit 开发的程序,用 WebP 可以减少文件包的体积。
  • 移动应用 或 网页游戏 ,界面需要大量图片,可以嵌入 WebP 的解码包,能够节省用户流量,提升访问速度优势:
  • 对于 PNG 图片,WebP 比 PNG 小了45%。

2. 去除多语言

在 app/build.gradle 添加

android{ ... defaultConfig{ ... //只保留英语 resConfigs "en" }}复制代码
fdccd0fbb9169a5467dae4d623f297f0.png

这里我们发现减少了大概 200 kb

3. 去除不必要 so 库

通过反编译 Android 微信版本 得知,微信也只适配了 armeabi-v7a 架构,那么我们删掉其它库的支持吧。

android{ ... defaultConfig{ ... ndk { //设置支持的SO库架构 abiFilters "armeabi-v7a" }}}复制代码
84b4a886ec9f729803a34cdbf8f8f589.png

又优化了差不多 600 kb ,继续。

4. 去除无用资源 Link 检查(谨慎删除)

概念

Lint 是 Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构 / 质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。

怎么使用 Link 检查

打开 AS 工具,找到 Analyze > Run Inspection By Name > unused resources

优化

ced8f0bad6e4793c2035e96afbcbd8ef.png

发现我们 link 大概优化了 700 kb继续。

注意

因为 link 是检查有没有引用来做的判断是否使用了资源,那么如果是这种方式勒,所以在删除的时候一定要谨慎。

//动态获取资源 id , 未直接使用 R.xx.xx ,则这个 id 代表的资源会被认为没有使用过(类似不能混淆反射类)int indetifier =getResources().getIdentifier("img_bubble_receive
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值