浅谈Android的流畅性优化——案例分享

简介: 学习了前文的归因分析,本篇文章就带大家以实际的案例进行浅要的分析和给出具体的优化策略,具体的案例来自于网络,如有错误,还请指出。

前置知识

前言

学习了前文的归因分析,本篇文章就带大家以实际的案例进行浅要的分析和给出具体的优化策略,具体的案例来自于网络,如有错误,还请指出。

前文回顾

前文中,我们讲到了流畅性优化中一个布局从 xml 到成为一个 View 对象有哪些耗时的问题。我们可以回顾一下,如下图,我们可以把上文中 View 对象的创建以及其渲染等耗时问题分为以下的三点,包括 UI 构建数据绑定 以及 View 的显示。对于上述这三点,我们可以逐个进行优化。

1.webp.jpg

UI 构建

UI 的构建问题中,我们有遇到诸如:载入 XML 的 IO 问题、class 的反射问题、创建 View 的问题、Asset 大锁问题。这些耗时都是由于在主线程中发生,所以导致其影响我们的流畅性。对此,Google 有提出一种异步加载布局的方案:AsyncLayoutInflater

  • AsyncLayoutInflater 解决方案
    这个方案可以对布局进行异步的加载,其可以应用在提前知晓布局的显示,以及对布局显示的速度没有要求的情况下进行使用。例如弹窗布局放置于异步操作就没有问题,它可以提前在异步准备好操作。但是这类解决方案的劣势即是无法即时响应,且我们没有那么多情况下是可以提前知晓、准备好布局的展示。
// 异步加载 xml, 在 Activity.onCreate(xxx) 里面
AsyncLayoutInflater(this).inflate(R.layout.activity_try_everything, null, object : AsyncLayoutInflater.OnInflateFinishedListener {
      override fun onInflateFinished(view: View, p1: Int, p2: ViewGroup?) {
           setContentView(view)
      }
})
复制代码
  • 所以说,这个 Google 的方案是不能适用于我们大部分的使用场景的,下面我们可以看一下抖音的优化方案。
  • 抖音的解决方案
  • 使用 X2C 解决 xml 的性能问题。
    直接把 xml 在编译阶段转化为 java 代码,这样就无需访问 IO 做反射生成布局了。
  • 高优先级的启动预加载方案。
    Application#onCreate() 阶段对布局进行预加载,到了 setContentView() 时候就直接使用预加载好的布局即可。
  • 随时预加载,不与具体的逻辑绑定,生命周期存货,可自定义清理生命周期。
    使用并发和字节码方式对其动态的生成

数据绑定

由于当下的 App 会有大量的网络请求,所以对网络请求数据的优化也是能带来很大收益的。

  • Gson 解析优化
    对于 Gson 的解析,我们每次使用已创建好的对象或者每次创建新的对象解析所带来的时间差异也是巨大的。
//with Cache
Gson gson = new Gson();
for(...){
    gson.from(...);
}
//without Cache
for(...){
    new Gson().from(...);
}
复制代码
  • 对于上述两种情况,其耗时如下,可见使用 Cache 带来的收益是很大的。
  • 1.webp.jpg
  • 数据协议优化:json -> protobuf
    protobuf 对于数据无论是压缩或者是不压缩的时候,由于其体积小使得传输时间远比 json 要小得多,其带来的收益是很大的。
  • 1.webp.jpg

View的渲染问题

对于 View 的渲染优化,我们可以有以下点

  • 移除不必要的背景图
  • 修改不合理的布局
  • 写高效的合理布局
  • 移除默认的 Window 布局
  • 绘制层级的优化

对于上述的这些渲染中出现的耗时点,我们可以使用将绘制、渲染放置于异步操作,交互放置于主线程中。对于这个问题,不同的公司有不同的解决方案。

  • Google
  • SurfaceView
    采用独立的线程进行绘制和渲染,自行控制生命周期。SurfaceView详解
  • jetpack Compose
    这是另一套 View 逻辑,用于替代现有的View。其使用组合优于继承的思想,重构出一套解耦的 UI 框架,这使得 View 更容易在异步进行绘制。
  • FaceBookLitho:在Android上构建高效UI的声明性框架。可以应用于复杂 UI 下进行高性能渲染。
  • 扁平化:其使用异步线程提前执行 measure 和 draw 方法,通过将布局系统与传统的Android View系统分离,Litho可以摆脱Android强加的UI线程限制。且 Litho 使用 Yoga 进行布局,并自动减少 UI 中包含的 ViewGroup 数(扁平化思想)。除了Litho的文本优化之外,这还允许更小的视图层次结构,并提高了内存和滚动性能。
    1.webp.jpg
  • 组件化:Litho 使用 Drawable 作为 Node 的绘制单元,实现了布局细粒度复用(使用Litho,每个UI项(如文本、图像或视频)都会单独回收。一旦一个项目离开屏幕,它就可以在UI中的任何地方重用,并与其他项目拼凑在一起,以创建新的UI元素。)和异步计算布局的能力。
  • 声明式 UI :需要重学,重构这套 UI 的编写,这也是其中的缺点。
  • 抖音
  • SurfaceView 和 TexureView 一起使用。前者是可以有单独层级,后者就是和 DecorView 一个层级。
    1.webp.jpg



相关文章
|
27天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
1月前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
36 4
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
2月前
|
搜索推荐 安全 Android开发
如何优化安卓应用的用户体验
【2月更文挑战第9天】在当今移动互联网时代,安卓应用已成为人们日常生活中不可或缺的一部分。然而,用户对应用的使用体验越来越苛刻,一个不好的应用体验很容易导致用户的流失。本文将介绍如何从多个方面优化安卓应用的用户体验。
|
3月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
86 0
|
25天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
2天前
android-agent-web中js-bridge案例
android-agent-web中js-bridge案例
10 2
|
2天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
8天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
8 0