apk、ipa包size优化晋级手段

前言:

安装包大小对于产品很重要 ,因为安装包的大小一般从一定程度决定了一个产品带给用户的用户体验,因为一个成功的产品除了有市场价值,同时,站在用户的角度来说,还要有好的用户使用体验,一款软件,不一定功能要如何如何强大,只要能给用户带来方便以及极佳的用户体验,就是一款成功的产品。而作为开发者,我们就需要的就是如何提高用户的使用体验,APP的size就是其中重要的一项指标。

在我们常用的软件中,比如qq,微信,淘宝,天猫,京东,抖音.....等等常用的应运行软件,他们功能都十分强大,用户体验都十分的人性化,但是,他们APP的size确才不到100m,别人是如何做到的了,这是值得我们总结和学习的地方。

APP size过大,对产品带来的影响原因如下:

1、手机APP安装包的大小会影响用户是否愿意花费流量来下载此APP;

2、包体越大下载过程越长,用户取消下载的可能性越大;

3、在手机空间不足,用户需要清理手机空间时,包体越大的软件被清理的可能性越大;

4、一些预装软件,合作厂商会限定软件大小;

5、APP经过多次版本迭代,产生不少冗余代码和无用资源,会带来更高的学习和维护成本,也更容易出错。

知道了,APP size过大,对产品造成影响的原因,下面,我们来分析一下影响APP size的具体原因和实施有效的手段,杜绝size过大问题。

APP size过大的主要原因:

  • Android设备 dpi 的多样化 ([l|m|tv|h|x|xx|xxx]dpi)
  • Android平台的进化,开发工具的改进以及开源类库生态系统的丰富
  • 用户对高质量UI的期待
  • 其他原因

APP size优化有效手段

知道了size过大的原因,就该给我们APP动手术了,在动手术之前,我们随便反编译一款软件,看看打包后APP的内部构造。 说简单点,一个apk文件就是包含一些文件的压缩包。作为开发者,我们通过使用 unzip 命令解压这个apk文件一探apk的内部结构。下面的文件结构就是我们使用 test .apk这个命令所获得的:

/lib
  /armeabi
  /armeabi-v7a
  /x86
  /mips
/META-INF
  MANIFEST.MF
  CERT.RSA
  CERT.SF
/res
AndroidManifest.xml
classes.dex
resources.arsc

我们可能对上面大部分的文件和目录都很熟悉。它们和我们在实际开发app的时候所看到得项目结构一样,包含了: /assets, /lib, /res, AndroidManifest.xml. 还有一些文件可能是我们第一次看到。一般说来,classes.dex, 它包含了我们所写的Java代码经过编译后class文件;resources.arsc 包含了预编译之后的资源文件(比如values文件,XML drawables 文件等。)。

由于apk文件只是一个简单地压缩文件,这就意味着它有两种大小:即压缩前的大小和压缩后的大小。减少apk文件大小可以从以下几个方面入手。

  1. 删除冗余代码和资源
  2. 能简单用代码画的图形,不使用图片
  3. 能使用系统API自己实现的,不使用第三方库。第三方库一般会考虑通用的情形,实际上不会用上它的全部功能。
  4. 重构 
    • 抽离类似的代码做成通用的模块,减少复制粘贴出来的代码。
    • 删除过度设计的代码:看似抽象分层做得很好,但实际不会有作用的代码。(例如,只有一个子类的基类)
    • 算法优化,使用更少的代码来实现同一功能。
  5. 启动图:不使用多张图片来匹配不同分辨率,而是在UI设计上居中,用代码来实现
  6. 分包:不常用的功能做成插件包,可后续下载安装
  7. 使用网页代替原生页面来展示数据:把数据通过url传参,由WebView来显示数据
  8. 使用编译后size较小的语言 
    • swift因为把运行时库也继承到包里,所以非常大
    • C,C++,Objective-C的编译结果是逐渐增大的
    • Android上,C++因为有多个CPU架构,虽然性能高,但size比java大
  9. 压缩资源 
    • 图片、视频有损压缩,但不影响清晰度。使用压缩率高的文件格式。
    • 使用9-patch或stretch图片
    • 资源压缩,首次运行再解压出来
    • 在深层次路径的,首次运行再下载
    • minify或uglify json、xml等文本型资源(即去除换行、空白符、简化变量名等)
  10. 用代码实现代替可反序列化布局文件。xib、storyboard、xml等
  11. 编译参数优化(参见java、llvm或gcc等工具链的说明) 
    • size最优化,编译或运行速度次要
    • 对不得不使用的第三方库做精简
    • 去除symbol
    • 去除不需要支持的CPU架构
    • 去除没使用到的代码
    • 去除调试代码,例如log
    • 混淆

   12.巧妙的使用混淆

   13.插件化或者动态加载第三方库,在需要的时候去远程服务器动态下载,而不是一次性,引入第三方在本地lib库中,然后在打包。

发布了49 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ljx1400052550/article/details/80956144