浅谈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



相关文章
|
4月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
67 10
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
68 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
51 4
|
23天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
3月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
64 2
|
3月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
4月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
197 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
3月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
75 0
|
3月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
153 0
|
4月前
|
存储 缓存 前端开发
安卓开发中的自定义控件实现及优化策略
【8月更文挑战第31天】在安卓应用的界面设计中,自定义控件是提升用户体验和实现特定功能的关键。本文将引导你理解自定义控件的核心概念,并逐步展示如何创建一个简单的自定义控件,同时分享一些性能优化的技巧。无论你是初学者还是有一定经验的开发者,这篇文章都会让你对自定义控件有更深的认识和应用。