App架构师实践指南器之性能优化五

针对App包size,如果硬是要牺牲业务或者消耗太多时间且效果也不一定最佳,那就得不偿失了,因此要学会把握这个度。
1、App包Size优化概述
1.1 瘦身目的
App包Size优化,即通过App瘦身来提高App的下载转化率,这是具体业务运营指标,通俗一点理解就是APP包Size越小,用户下载等待时间越短,更适应低存储容量配置的手机,应用下载转化率也就越高。
1.2安装包组成
APP发布时,最终是以安装包的形式提供给用户,如Android中的APK格式、iOS的IPA格式。知晓App安装包具体由哪些内容组成,才能更好地、有针对性地进行包大小的控制和优化,如Android中体积较大的文件一般主要集中在dex、res、assets和lib文件,iOS中的LinkMap文件等。


2、App包Size分析
具体优化App包Size时,需要借助APP包Size分析工具来识别和判断当前APP安装包各个文件等大小,如图9-16所示为常见APP包Size分析工具。
2.1 Android Studio。Android Studio提供了一系列包Size分析优化工具。Analyze APK是Android Studio2.2.3开始集成的APK结构浏览的工具,非常便捷实用,直接将APK拖入Android Studio中即可(或者通过build--->Analyze APK导入APK),能清晰地看出APK中具体文件的大小,方便分析和对比。图9-17所示为微信APK展示结果,总大小为35MB左右。

2.2 APK Size统计。除了Analyze APK可以统计APK大小外,其他还有apkcal等多款工具可以用来统计APK Size。
---apkcal是一款开源的统计APK文件中class、method、field、string数量的工具。

 

---Dxcount Gradle Plugin针对的是库大小统计,通过Gradle插件方式引入和使用。
---NimbleDroid是美国哥伦比亚大学的博士创业团队研发出来的自动化分析Android App性能指标系统,有静态和动态两种方式,其中静态方式可以分析出APK安装包中大文件排行榜,各种知名SDK的大小以及占代码整体的比例,各种类型文件的大小以及占比排行,各种知名SDK的方法数以及占所有dex中方法数的比例等。
---ClassShark是一款APK浏览工具,有APK和桌面(jar)两个版本,运行后可以清晰地看出APK具体文件大小。

2.3资源压缩。资源压缩包括图片等多媒体资源压缩,也包括assets目录下的字体等文件压缩。FontZip是一款不错的开业字体压缩工具,AndroidUn7Zip可以用于代码中对压缩文件解压缩。

2.4 资源优化。
2.4.1 AndResGuard。微信团队开源的一款减小APK大小工具,类似于java proguard,但仅对资源进行分析,不涉及具体编译过程,通过资源混淆缩短resource.arsc内的资源路径、资源类型名、资源名以达到瘦身的目的,例如将冗长的资源路径名res/drawble/wechat变为r/d/a等。
2.4.2 ewswz。Facebook提供的一款针对dex字节码优化开源工具包,可以优化包size的同时提高字节码的加载性能,从而提升App速度。使用该工具需要在Linux环境下编译其C++代码,涉及较多依赖库,其优化项很多,可以自行配置。主要优化项目如下。
---减少和压缩字符串(如类路径、源文件路径、函数名等),将冗长字符串”/path/**/**/ClassX.java“用较短字符串“1”表示,再通过重映射来反向映射还原。
---消除冗余代码。删除源代码中一些冗余不用的四代码,移除空类。
---内联。内联是将被调函数功能移动到其调用函数中,从而减少函数调用开销,去除了一些多级调用中间层级,如func A>static func B>static func C优化成func A>static func C.
---Interdex。一种冷启动的优化方法,需要程序提供冷启动时加载类序列配置文件,按此顺序调整dex中类的顺序,从而提升冷启动速度。

2.5 图片压缩。Android打包时对PNG图片进行的是无损压缩,如果没有特定业务需求,可以对PNG图片进行有损压缩以实现瘦身目的。图片压缩相关工具主要有TinyPNG、pngquant、ImageOptim、mozjpeg等,支持的图片格式略有不同,例如最常见的TinyPNG支持PNG/JPEG图片进行有损压缩,一张4MB的图片,一般可以缩小15%左右的大小。
 


3、App包Size优化
Android APK由以下几部分组成,分别为classes.dex、resources.arsc、res、assets、lib及其他资源(AandroidMainfest、project.properties、proguard.cfg和META-INF)。
3.1 classes.dex源码
---代码混淆。在build.gradle中开启minifyEnable,进行Proguard混淆。
---删除无用代码。使用Android Studio的Inspect Code和Code Cleanup进行静态代码检查,删掉无用代码。
---第三方库/jar包。删除无用库,合并功能重复的库,选择更小的库。
---代码优化。

3.2 resources.arsc。resource.arsc存放的是编译后的二进制文件,以id-name-value方式存储map。
---使用Android Studio的Inspect Code删掉不必要的资源ID.
---使用Google的android-arscblamer工具检查删除不必要的资源映射,如部分空引用。

3.3res。该文件夹是包Size优化大户,存放诸如音视频、图片等多媒体资源。
3.3.1删除无用资源。
---在build.gradle中开启shrinkResource,不打包未使用的资源。
---在build.gradle中通过resConfigs配置业务所需的语言资源,去除无用语言资源。
---借助Android Studio分析Unused Resources,去掉无用res,有多种方式。
(1)使用Analyze。项目右键-->Analyze-->Run Inspection by Name-->输入Unused Resources。
(2)使用Refactor。项目右键-->Refactor-->Remove Unused Resource.
 (3)使用Inspect Code。Analyze-->Inspect Code。
3.3.2适当使用图片压缩。
---使用图9-16中图片压缩相关工具对图片进行有损压缩。
---不考虑透明度业务下可以用JPG图片代替PNG图片,例如背景页、启动页等。
---尝试使用WebP格式代替PNG格式,但注意必须是Android 4.0以上系统。若要兼容Android4.0以下系统,需要引入额外的兼容库,可能得不偿失,且目前Android Studio并不支持WebP布局文件的预览。
---对大大图片资源进行压缩处理,尽可能只保存一份图片资源(建议放xhdpi文件夹)
---关于图片格式的选择,Google官方建议为:使用VectorDrawable;纯色类icon用SVG;两种颜色以上icon用WebP,达不到效果再考虑PNG;图片无alpha通道考虑JPG.
3.3.3 适当使用音视频压缩。采用有损格式(Ogg、MP3、AAC、WMA、Opus等)音频文件代替无损格式(WAV、PCM、ALS、TAC、APE等)音频文件。推荐使用Ogg,淘宝就大量使用了Ogg格式。
3.3.4 资源混淆。集成AndResGuard等工具对资源进行优化处理。
3.3.5代码优化。使用Drawable XML、Color、.9.PNG代替PNG图片,例如渐变背景、纯色背景等;使用tintcolor(Android 5.0+)实现按钮反选效果代替正反两张图片;使用toolbar,减少menu文件;统一应用风格,减少shape数量等。

3.4assets文件
---利用FontZip等工具对字体进行提取优化,删除无用字体。
---减少icon-font使用,使用svg代替icon-font。
---考虑对资源文件进行压缩储存,代码中进行解压缩获取,例如H5页面。

3.5 lib库文件。
---在build.gradle中使用abiFilters按需配置CPU架构(如armeabi-v7a、x86、armeabi、x86-64等),移除不需要兼容的so文件。
---使用更小的库或合并现有库(如C++运行时库统一使用stlport_shared).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值