乐趣区

关于android:Android高级进阶之路七Android性能优化总结

安卓开发大军浩浩荡荡,通过近十年的倒退,Android 技术优化日异月新,现在 Android 9.0 曾经公布,Android 零碎性能也曾经十分晦涩,能够在体验上齐全媲美 iOS。
然而,到了各大厂商手里,改源码、自定义零碎,使得 Android 原生零碎变得泥沙俱下,而后到了不同档次的开发工程师手里,因为技术水平的参差不齐,即便很多手机在跑分软件性能十分高,关上利用仍然存在卡顿景象。另外,随着产品内容迭代,性能越来越简单,UI 页面也越来越丰盛,也成为晦涩运行的一种妨碍。综上所述,对 APP 进行性能优化已成为开发者该有的一种综合素质,也是开发者可能实现高质量应用程序作品的保障。

在 Android 利用优化方面,咱们次要从以下 4 个方面进行优化:

  1. 稳固(内存溢出、解体)
  2. 晦涩(卡顿)
  3. 耗损(耗电、流量、网络)
  4. 安装包(APK 瘦身)

内存优化


因为 Android 利用的沙箱机制,每个利用所调配的内存大小是有限度的,内存太低就会触发 LMK(Low Memory Killer)机制,进而会呈现闪退景象。如果要对内存进行优化,就须要先搞懂 java 的内存是如何调配和回收的,对于这方面,能够重点参考上面的内容:
Java 垃圾回收器的 GC 机制,看这一篇就够了
Android 内存透露常见案例及剖析
Android 利用内存透露的定位、剖析与解决策略

剖析工具


Memory Monitor 工具

Memory Monitor 是 Android Studio 自带的一个内存监督工具,它能够很好地帮忙咱们进行内存实时剖析。通过点击 Android Studio 右下角的 Memory Monitor 标签,关上工具能够看见较浅蓝色代表 free 的内存,而深色的局部代表应用的内存从内存变换的走势图变换,能够判断对于内存的应用状态,例如当内存继续增高时,可能产生内存透露;当内存忽然缩小时,可能产生 GC 等。

Memory Analyzer 工具

MAT 是一个疾速,功能丰富的 Java Heap 剖析工具,通过剖析 Java 过程的内存快照 HPROF 剖析,从泛滥的对象中剖析,疾速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并能够通过视图直观地查看可能造成这种后果的对象。

LeakCanary 工具

LeakCanary 是一个内存监测工具,该工具是 Square 公司出品的,所谓 Square 出品必属精品,LeakCanary 的官网地址为 https://github.com/square/lea…,咱们能够在 Gradle 里援用它。

Android Lint 工具

Android Lint 是 Android Sutido 种集成的一个 Android 代码提醒工具,它能够给布局、代码提供十分弱小的帮忙。如果在布局文件中写了三层冗余的 LinearLayout 布局,就会在编辑器左边看到提醒。当然这个是一个简略的举例,Lint 的性能十分弱小,大家应该养成写完代码查看 Lint 的习惯,这不仅让你及时发现代码种暗藏的一些问题,更能让你养成良好的代码格调,要晓得,这些 Lint 提醒可都是 Google 大牛们汗水合智慧的结晶。

其余倡议

在 Android 利用开发中,影响稳定性的起因很多,比方内存应用不合理、代码异样场景考虑不周全、代码逻辑不合理等,都会对利用的稳定性造成影响。
其中最常见的两个场景是:Crash 和 ANR,这两个谬误将会使得程序无奈应用。所以做好 Crash 监控,把解体信息、异样信息收集记录起来,以便后续剖析;正当应用主线程解决业务,不要在主线程中做耗时操作,避免 ANR 程序无响应产生。
具体能够参考上面的文章链接:
Android 零碎稳定性问题总结

交互优化


交互是与用户体验最间接的方面,交互场景大略能够分为四个局部:UI 绘制、利用启动、页面跳转、事件响应。对于下面四个方面,大抵能够从以下两个方面来进行优化:

  • 界面绘制:次要起因是绘制的层级深、页面简单、刷新不合理,因为这些起因导致卡顿的场景更多呈现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
  • 数据处理:导致这种卡顿场景的起因是数据处理量太大,个别分为三种状况,一是数据在解决 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到工夫片,三是内存减少导致 GC 频繁,从而引起卡顿。

咱们晓得,Android 的绘制须要通过 onMeasure、onLayout、onDraw 等几个步骤,所以布局的层级越深、元素越多、耗时也就越长。还有就是 Android 零碎每隔 16ms 收回 VSYNC 信号,触发对 UI 进行渲染,如果每次渲染都胜利,这样就可能达到晦涩的画面所需的 60FPS。如果某个操作破费的工夫是 24ms,零碎在失去 VSYNC 信号时就无奈失常进行失常渲染,这样就产生了丢帧景象。

之所以呈现卡顿景象,是因为有两个起因:

  • 绘制工作太重,绘制一帧内容耗时太长
  • 主线程太忙,依据零碎传递过去的 VSYNC 信号来时还没筹备好数据导致丢帧

基于问题产生的起因,咱们能够从以下几个方面进行优化:

布局优化

在 Android 种系统对 View 进行测量、布局和绘制时,都是通过对 View 数的遍从来进行操作的。如果一个 View 数的高度太高就会重大影响测量、布局和绘制的速度。Google 也在其 API 文档中倡议 View 高度不宜哦过 10 层。当初版本种 Google 应用 RelativeLayout 代替 LineraLayout 作为默认根布局,目标就是升高 LineraLayout 嵌套产生布局树的高度,从而进步 UI 渲染的效率。
在布局优化方面,咱们能够从以下几个方面进行优化:

  • 布局复用,应用 <include> 标签重用 layout;
  • 进步显示速度,应用 <ViewStub> 提早 View 加载;
  • 缩小层级,应用 <merge> 标签替换父级布局;
  • 留神应用 wrap\_content,会减少 measure 计算成本;
  • 删除控件中无用属性;

渲染优化

适度绘制是指在屏幕上的某个像素在同一帧的工夫内被绘制了屡次。在多层次重叠的 UI 构造中,如果不可见的 UI 也在做绘制的操作,就会导致某些像素区域被绘制了屡次,从而节约了多余的 CPU 以及 GPU 资源。咱们能够通过开启手机的过渡绘制性能来检测页面是否被适度绘制。

为了防止适度绘制,咱们能够从以下几个方面进行优化:

  • 布局上的优化,移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片。
  • 自定义 View 优化,应用 canvas.clipRect()来帮忙零碎辨认那些可见的区域,只有在这个区域内才会被绘制。

启动优化

利用个别都有闪屏页,优化闪屏页的 UI 布局,能够通过 Profile GPU Rendering 检测丢帧状况。
也能够通过启动加载逻辑优化。能够采纳散布加载、异步加载、延期加载策略来进步利用启动速度。
数据筹备。数据初始化剖析,加载数据能够思考用线程初始化等策略。

刷新优化

Android 开发中,通常是异步操作页面的,因而须要能够从刷新优化上来优化利用,次要有两个准则:

  • 缩小刷新次数;
  • 放大刷新区域;

动画优化

在实现动画成果时,须要依据不同场景抉择适合的动画框架来实现。有些状况下,能够用硬件加速形式来提供晦涩度。

耗电优化

在挪动设施中,电池的重要性显而易见,没有电什么都干不成。对于操作系统和设施开发商来说,耗电优化统一没有进行,去谋求更长的待机时间,而对于一款利用来说,并不是能够疏忽电量应用问题,特地是那些被归为“电池杀手”的利用,最终的后果是被卸载。因而,利用开发者在实现需求的同时,须要尽量减少电量的耗费。

在 Android5.0 以前,在利用中测试电量耗费比拟麻烦,也不精确,5.0 之后专门引入了一个获取设施上电量耗费信息的 API,即 Battery Historian。Battery Historian 是一款由 Google 提供的 Android 零碎电量剖析工具,和 Systrace 一样,是一款图形化数据分析工具,直观地展现出手机的电量耗费过程,通过输出电量剖析文件,显示耗费状况,最初提供一些可供参考电量优化的办法。

网络优化

对于网络的优化,能够从以下几个方面着手进行:

图片网络优化

例如,针对网络状况,返回不同的图片数据,一种是高清大图,一种是失常图片,一种是缩略小图。当用户处于 wifi 下给控件设置高清大图,当 4g 或者 3g 模式下加载失常图片,当弱网条件下加载缩略图。

网络数据优化

挪动端获取网络数据优化能够从以下几点着手:

  • 连贯复用:节俭连贯建设工夫,如开启 keep-alive。
    对于 Android 来说默认状况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:Android HttpURLConnection 及 HttpClient 抉择
  • 申请合并:行将多个申请合并为一个进行申请,比拟常见的就是网页中的 CSS Image Sprites。如果某个页面内申请过多,也能够思考做肯定的申请合并。
  • 缩小申请数据的大小:对于 post 申请,body 能够做 gzip 压缩的,header 也能够做数据压缩。返回数据的 body 也能够做 gzip 压缩,body 数据体积能够放大到原来的 30% 左右。

异样拦挡优化

在获取数据的流程中,拜访接口和解析数据时都有可能会出错,咱们能够通过拦截器在这两层拦挡谬误。

  • 在拜访接口时,咱们不必设置拦截器,因为一旦呈现谬误,Retrofit 会主动抛出异样。比方,常见申请异样 404,500,503 等等。
  • 在解析数据时,咱们设置一个拦截器,判断 Result 外面的 code 是否为胜利,如果不胜利,则要依据与服务器约定好的错误码来抛出对应的异样。比方,token 生效,禁用同账号登陆多台设施,短少参数,参数传递异样等等。

APK 瘦身


利用安装包大小对利用应用没有影响,但利用的安装包越大,用户下载的门槛越高,特地是在挪动网络状况下,用户在下载利用时,对安装包大小的要求更高,因而,减小安装包大小能够让更多用户违心下载和体验产品。

在 Android Studio 工具栏里,关上 build–>Analyze APK, 抉择要剖析的 APK 包,能够看到 apk 的相干信息,如下所示:

Android 的 apk 次要有以下信息形成:

  • assets 文件夹。寄存一些配置文件、资源文件,assets 不会主动生成对应的 ID,而是通过 AssetManager 类的接口获取。
  • res。res 是 resource 的缩写,这个目录寄存资源文件,会主动生成对应的 ID 并映射到 .R 文件中,拜访间接应用资源 ID。
  • META-INF。保留利用的签名信息,签名信息能够验证 APK 文件的完整性。
  • AndroidManifest.xml。这个文件用来形容 Android 利用的配置信息,一些组件的注册信息、可应用权限等。
  • classes.dex。Dalvik 字节码程序,让 Dalvik 虚拟机可执行,个别状况下,Android 利用在打包时通过 Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节码。
  • resources.arsc。记录着资源文件和资源 ID 之间的映射关系,用来依据资源 ID 寻找资源。

基于下面的组成部分,那么优化也能够从以下几个方面着手:

  • 代码混同。应用 proGuard 代码混同器工具,它包含压缩、优化、混同等性能。
  • 资源优化。比方应用 Android Lint 删除冗余资源,资源文件起码化等。
  • 图片优化。比方利用 AAPT 工具对 PNG 格局的图片做压缩解决,升高图片色调位数等。
  • 防止反复性能的库,应用 WebP 图片格式等。
  • 插件化,比方功能模块放在服务器上,按需下载,能够缩小安装包大小。

本文转自 https://blog.csdn.net/xiangzhihong8/article/details/92800490,如有侵权,请分割删除。

相干视频:

【2021 最新版】Android studio 装置教程 +Android(安卓)零基础教程视频(适宜 Android 0 根底,Android 初学入门)_哔哩哔哩_bilibili

Android 高级 UI 性能优化——FlowLayout 流式布局我的项目实战长_哔哩哔哩_bilibili

Android 高级 UI 性能优化——View 的 Measure 原理利用与 xml 解析过程原理解说_哔哩哔哩_bilibili

Android 高级 UI 性能优化——LayoutInflater.inflate 函数意义与参数阐明_哔哩哔哩_bilibili

Android 高级 UI 性能优化——ViewPager 嵌套 Fragment UI 模式性能优化_哔哩哔哩_bilibili

退出移动版