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



相关文章
|
17天前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
29 2
|
2月前
|
移动开发 安全 Android开发
构建高效Android应用:Kotlin协程的实践与优化策略
【5月更文挑战第30天】 在移动开发领域,性能优化始终是关键议题之一。特别是对于Android开发者来说,如何在保证应用流畅性的同时,提升代码的执行效率,已成为不断探索的主题。近年来,Kotlin语言凭借其简洁、安全和实用的特性,在Android开发中得到了广泛的应用。其中,Kotlin协程作为一种新的并发处理机制,为编写异步、非阻塞性的代码提供了强大工具。本文将深入探讨Kotlin协程在Android开发中的应用实践,以及如何通过协程优化应用性能,帮助开发者构建更高效的Android应用。
|
1月前
|
ARouter IDE 开发工具
Android面试题之App的启动流程和启动速度优化
App启动流程概括: 当用户点击App图标,Launcher通过Binder IPC请求system_server启动Activity。system_server指示Zygote fork新进程,接着App进程向system_server申请启动Activity。经过Binder通信,Activity创建并回调生命周期方法。启动状态分为冷启动、温启动和热启动,其中冷启动耗时最长。优化技巧包括异步初始化、避免主线程I/O、类加载优化和简化布局。
38 3
Android面试题之App的启动流程和启动速度优化
|
17天前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
22 3
|
29天前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
44 9
|
1月前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
28 3
|
29天前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
51 1
|
18天前
|
安全 Java 数据处理
Android多线程编程实践与优化技巧
Android多线程编程实践与优化技巧
|
1月前
|
缓存 编解码 安全
探索Android 12的新特性与优化技巧
【6月更文挑战第7天】本文将深入探讨Android 12带来的创新功能和改进,包括用户界面的更新、隐私保护的加强以及性能的提升。同时,我们还将分享一些实用的优化技巧,帮助用户更好地利用这些新特性,提升手机的使用体验。
|
20天前
|
安全 Java 数据处理
Android多线程编程实践与优化技巧
Android多线程编程实践与优化技巧