学习:Android性能优化典范

Android/JAVA性能优化:从入门到精通(万字讲解!!!) 在当今快速发展的移动应用市场中,用户体验是决定应用成功与否的关键因素之一。无论是在Android还是其他平台上,应用的性能表现直接影响用户的满意度和应用的市场竞争力。作为开发者,掌握Java性能优化的技巧不仅能够提升应用的流畅度,还能延长应用的生命周期,从而在激烈的市场竞争中脱颖而出。本文将从内存管理、线程与并发、代码优化、网络优化、数据库优化等多个方面,深入探讨Java性能优化的策略和技巧,帮助开发者在实际开发中提升应用性能,优化用户体验。提示:以下是本篇文章正文内容,下面案例可供参考。 阅读详情

android性能优化
创建更快更优秀的android应用
渲染机制、内存与GC、电量优化

0)render performance
大多数用户所感知的卡顿问题最重要的根源都是因为渲染性能
Android系统无法及时完成复杂界面渲染操作
Android系统每隔16ms发出VSYNC信号,触发UI渲染
只有每次渲染成功,才能够达到流畅画面所需要的60fps的帧率,这也就意味着程序的大多数操作都必须在16ms内完成
如果你的某个操作超过16ms,系统得到VSYNC信号的时候就无法进行正常渲染,出现丢帧现象
在这里插入图片描述
在这里插入图片描述
用户容易在UI执行动画或者滑动listView的时候感知到卡顿不流畅,是因为这里的操作相对复杂,容易发生丢帧的现象,从而感觉卡顿。
有很多原因可以导致丢帧,
1.也许是因为你的layout太过复杂,无法在16ms内完成渲染,
2.有可能因为你的UI上有层叠太多的绘制单元,
3.还有可能是因为动画执行的次数过多。这些都会导致CPU或者GPU负载过重。

可以使用辅助工具定位问题
可以使用HierarchyViewer来查找Activity中的布局是否过于复杂,
也可以使用手机设置里面的开发者选项,打开Show GPU Overdraw等选项进行观察。
你还可以使用TraceView来观察CPU的执行情况,更加快捷的找到性能瓶颈

1)Understanding Overdraw
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源

在这里插入图片描述

当设计上追求更华丽的视觉效果的时候,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。这很容易导致大量的性能问题,为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。

幸运的是,我们可以通过手机设置里面的开发者选项,打开ShowGPU Overdraw的选项,可以观察UI上的Overdraw情况。
在这里插入图片描述
蓝色,淡绿,淡红,深红代表了4种不同程度Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为必须得重叠背景。例如某个Activity有个一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加蓝色区域的占比。这一措施能够显著提升程序性能。

2)Understanding VSYNC

为了理解App是如何进行渲染的,我们必须了解手机硬件是如何工作,那么就必须理解什么是VSYNC。
在讲解VSYNC之前,我们需要了解两个相关的概念:

Refresh Rate :代表了屏幕在一秒内的刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。
Frame Rate :代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。

GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,他们两者不停的进行协作。

在这里插入图片描述

在这里插入图片描述

理解图像渲染里面的两重与三重缓存机制,这个概念比较复杂,请移步查看这里:
http://source.android.com/devices/graphics/index.html,还有这里http://article.yeeyan.org/view/37503/304664。

通常来说,帧率超过刷新频率只是一种理想的状况,在超过60fps的情况下,GPU所产生的帧数据会因为等待VSYNC的刷新信息而被Hold住,这样能够保持每次刷新都有实际的新数据可以显示。但是我们遇到更多的情况是帧率小于刷新频率。

在这里插入图片描述在这种情况下,某些帧显示的画面会与上一帧的画面相同。更糟糕的事情是,帧率从超过60fps突然掉到60fps以下,这样就会发生LAG,JANK,HITCHING等卡顿掉帧的的不顺滑的情况。这也是用户感受不好的原因所在。

3)Tool:Profile GPU Rendering
性能的问题如此的麻烦,幸好我们可以有工具进行调试。打开手机的开发者选项,选择Profile GPU Rendering,选中 On Screen as bars的选项。
在这里插入图片描述
选择了这样以后,我们可以在手机画面上看到丰富的GPU绘制图形信息,分别关于StatusBar,NavBar,激活的程序Activity区域的GPU Rendering信息。

在这里插入图片描述
随着界面的刷新,界面上会滚动垂直的柱状图来表示每帧画面所需要渲染的时间,柱状图越高表示花费的渲染时间越长。

在这里插入图片描述
中间有一根绿色的横线,代表16ms,我们需要确保每一帧花费的总时间都低于这条横线,这样才能够避免出现卡顿的问题。

在这里插入图片描述每一条柱状线都包含三部分,蓝色代表测量绘制DisplayList的时间,红色代表OpenGL渲染DisplayList所需要的时间,黄色代表CPU等待GPU处理的时间。

4)Why 60fps?
我们通常都会提到60fps与16ms,可是知道为何是以程序是否达到60fps来作为App性能的衡量标准吗?这是因为人眼与大脑之间的协作无法感知草果60fps的画面更新。

12fps大概类似手动快速翻动书籍的频率,这明显是可以改知道不够顺滑的。24fps使得人眼感知的是连续线性运动,这其实是归功于运动模糊的效果。24fps是电影胶卷圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然好过60fps是没有必要的。
开发app的性能就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。

5)Android,UI and the GPU
了解Android是如何利用GPU进行画面渲染有助于我们更好的理解性能问题。那么一个最实际的问题是:activity的画面是如何绘制到哦屏幕上的?那些复杂的xml布局文件又是如何能够被识别并绘制出来的?
在这里插入图片描述
Resterization栅格化是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作。它把那些组件拆分到不同的像素上进行显示。这是一个很费时操作,GPU的引入就是为了加快栅格化的操作。

CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。

在这里插入图片描述然而每次从CPU转移到GPU是一件很麻烦的事情,所幸的是OpenGL ES可以把那些需要渲染的纹理Hold在GPU Memory里面,在下次需要渲染的时候直接进行操作。所以你更新了GPU所hold住的纹理内容,那么之前保存的状态就丢失了。

在android里面那些由主题所提供的资源,例如Bitmaps,Drawables都是一起打包到统一的Texture纹理当中,然后再传递到GPU里面,这意味着每次你需要使用这些资源的时候,都是直接从纹理里面进行获取渲染的。当然随着UI组件的越来越丰富,有了更多演变形态。例如显示图片的时候,需要先经过CPU的计算加载到内存中,然后传递给GPU进行渲染。文字的显示更加复杂,需要先经过CPU换算成纹理,然后再交给GPU进行渲染,回到CPU绘制单个字符的时候,再重新引用经过GPU渲染的内容。动画则是一个更加复杂的操作流程。

为了能够使得App流畅,我们需要再每一帧16ms以内处理完所有的CPU与GPU计算,绘制,渲染等等操作。

6)Invalidations,Layouts,and Performance

顺滑精妙的动画是app设计里面最重要的元素之一,这些动画能够显著提升用户体验。下面会讲解android系统是如何处理UI组件的更新操作的。

通常来说,Android需要把XML布局文件转换成GPU能够识别并绘制的对象。这个操作实在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。

在某个View第一次需要被渲染时,DisplayList会因此而被创建,当这个View要显示到屏幕上时,我们会执行GPU的绘制指令来进行渲染。如果你在后续有执行勒事移动这个View的位置等操作需要再次渲染这个View时,我们就仅仅需要额外操作一次渲染指令就够了。然而如果你修改了View中的某些可见组件,那么之前的DisplayList就无法继续使用了,我们需要从头创建一个DisplayList并且重新执行渲染指令并更新到屏幕上。
在这里插入图片描述

需要注意的是:任何时候View中的绘制内容发生变化时,都重新执行创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。举个例子,假设某个按钮的Button需要增到到目前的两倍,在增到Button大小之前需要通过父View重新计算并摆放其他子Viw饿位置。修改Vie的大小浍出发整个HierarcyView重新计算大小的操作。如果是修改View的位置则会触发HierarchView重新计算其他View的位置。如果布局很复杂,这就会很容导致严重的性能问题。我们需要尽量减少Overdraw

在这里插入图片描述
我们可以通过前面介绍的Monitor GPU Rendering来查看渲染的表现性能如何,另外也可以通过开发者选项里面的Show GPU view updates来查看时图更新的操作,最后我们还可以通过HierarchyViewer这个工具来查看布局,使得布局尽量扁平化,移除非必须的UI组件,这些操作能够减少Measure,Layout的计算时间。

7)Overdraw,Cliprect,QuickReject
引起性能问题的一个很重要的方面是因为过多复杂的绘制操作。我们可以通过工具来检查并修复标准UI组件Overdraw 问题,但是针对高度自定义的UI组件则显得有些力不从心。

又一个窍门是我们通过执行几个APIs方法来显著提神绘制操作的性能。前面有提到过,非可见UI组件绘制更新会导致Overdraw。例如NavDrawer从前置可见的Activity滑出后,如果哈继续绘制那些在Nav Drawer里面不可见组件,这就导致了Overdraw。为了解决这个问你题,Android系统会通过避免绘制那些完全不可见的组件来尽量减少Overdraw。那些Nav Drawer里面不可见的View就不会被执行浪费资源
在这里插入图片描述

但是不幸的是,对于那些过于复杂的自定义View(重写了onDraw方法),Android系统无法检测具体在onDraw里面会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮组那些多组重叠组件的第一View来控制显示的区域。同时cliprect方法还可以帮组节约CPU与GPU资源,在clipRect区域之外的绘制指令都不会被执行,那些部分内容在矩形区域内的组件,仍然会等到绘制。

在这里插入图片描述

出了clipRect方法之外,我们还可以使用canvas。quickreject()来判断是否没和某个据悉区域相交,从而跳过那些非居心区域内的绘制操作。做了哪些优化之后,我们可以通过上面介绍的ShowGPU Overdraw来查看效果。

Android 内存优化实战指南 在移动应用开发中,内存优化一直是提升性能、避免崩溃、改善用户体验的重要任务。尤其在内存有限的 Android 设备上,优化内存使用能有效避免 ANR(应用无响应)和 OOM(内存溢出)问题。本文将结合常见场景和实际案例,带你深入探讨 Android 内存优化的核心技术和实用方法。内存优化的意义在于降低内存使用峰值,减少内存泄漏,并提升应用的流畅度。OOM 崩溃: 应用分配的内存超过限制,直接导致崩溃。UI 卡顿:垃圾回收(GC)频繁触发,暂停应用线程,用户体验下降。 阅读详情

相关推荐

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

Android面试必备!知乎千赞的《Android 性能优化实战篇》

使用过Android手机的同学都会有所体会,随着时间的推移,手机系统运行会逐渐变得缓慢,打开APP的速度也会越来越慢。这主要是由于以下原因:首先,Android系统的源代码是开放的,各大手机厂商会根据自己的需求对系统进行定制开发。虽然这带来了系统碎片化等问题,使得不同设备之间的系统差异较大,影响了用户体验。其次,APP开发人员需要针对不同的系统进行各种适配,而开发人员的水平参差不齐,导致开发出来的APP可能会出现各种问题,包括性能问题。

bugyinyin的博客 2118

Python爬取天天基金网历史数据

前言 最近开始学习基金????,感觉需要收集一些数据统计分析才靠谱????毕竟给A股交学费的感觉可不好受???? 网上有很多公开的数据,我这里选择的是天天基金网进行爬取 页面分析 接口我分析过了,有些验证不太好获取数据,所以直接从html提取 在天天基金网中随便选择一款基金,然后点击进入历史数据页面 容易定位出日增长率的css选择器 还有翻页按钮 程序编写 使用selenium打开chrome浏览器进行爬取,全代码如下 from selenium import webdriver from sel

JiajunBernoulli的博客 2949

Anddroid 性能优化——ANR 实践集锦

本文意在记录个人在学习和做项目过程中遇到的 ANR 问题以及如何解决这些 ANR 问题的个人心得。应用的卡顿、ANR 性能问题除了和我们编码息息相关,设备等级、系统环境因素也占据了半壁江山。对于“系统问题”,我们是否无作为就好了?其实我们可以在应用层面做好最佳编码姿势~

xiaobaaidaba123的专栏 3610

奇迹MU单机版开服全流程:从零搭建到分辨率调整(附GM工具使用技巧)

本文详细介绍了奇迹MU单机版从零搭建到分辨率调整的完整流程,包括环境配置、服务端启动、GM工具使用技巧等关键步骤。特别针对现代高分辨率显示器提供了优化方案,帮助玩家轻松搭建个性化游戏环境,重温经典MMORPG的独特魅力。

b3n4m5q6w7的博客 676

STM32驱动LED矩阵:IS31FL3731与查理复用技术实践

LED矩阵显示是嵌入式系统中常见的人机交互方式,其核心在于高效的驱动技术。查理复用(Charlieplexing)作为一种创新的矩阵扫描方式,通过引脚复用技术,用N个引脚驱动N²-N个LED,大幅提升了硬件资源利用率。IS31FL3731驱动芯片集成了这一技术,配合STM32F410RB微控制器的强大性能,可实现144个LED的精准控制。这种组合在艺术装置、信息展示等场景中展现出独特优势,既能呈现丰富的视觉效果,又能通过内置PWM调光实现256级亮度控制。通过I2C接口通信,开发者可以轻松实现字符显示、图像

weixin_29193359的博客 279

我的 Android 性能书上架了!内附书籍介绍

大家好,我是拭心。很高兴地向大家宣布,我的新书《Android 性能优化入门与实战》上架了!点击下面的小程序进行购买:封面介绍这本书的封面来自之前的投票文章# 投票啦!最新安卓进阶书籍封面由你来定,从四个方案里选出了呼声最大的一张。核心是一只啄木鸟,寓意是:希望大家看完这本书,能像啄木鸟一样多抓性能 bug,同时也要以啄木鸟为戒,不要过度优化损害项目。内容介绍书籍内容主要包括「市场需求、认识性能...

安卓进化论 541

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(块设备驱动结构分析)块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。 按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间...

Radia的专栏 1万+

Android性能优化典范(二)

 Google于不久前发布了Android性能优化典范第2季课程,共有20个短视频,内容涵盖电量优化、Android Wear上如何做优化、LRU Cache、Bitmap的缩放、提升设置alpha之后View的渲染性能等。本文是对这些课程的总结摘要。 Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化、网络优化、Android

samwangzhibo 855

DeepSeek如何构建可扩展的 AI 驱动交易系统,基于 MetaTrader 5 与 Python 利用先进的数据处理、机器学习和容器化部署来优化算法交易。

MT5 Python API 架构设计分为三层:通信层:利用异步消息传递(例如 ZeroMQ 或标准套接字编程)支持每秒数万个数据请求。转换层: C++ 动态库有效地将 MT5 命令转换为 Python 对象(反之亦然),从而优化速度和内存使用率。接口层:提供Pythonic API,封装了所有终端功能,包括:1)实时价格订阅(滴答或秒级更新)2)历史数据检索(从M1到更高的时间范围)3)订单流监控(交易详情和市场深度)4)策略执行引擎(用于算法交易)

iCloudEnd的博客 1378

《30天入门 SAP BTP 开发》教程的目录和使用说明,建议收藏

本教程分为两部分:第一部分为SAP BTP入门系列,包含从基础概念到操作步骤的系统性学习内容,建议零基础用户按顺序学习;第二部分为专题文章集合,涵盖SAP BTP的多个技术点,适合已有基础的用户按需查阅。教程包含账号申请、Global Account操作、Java应用开发、AI工具使用等丰富内容,同时解答常见问题并提供实战案例。所有文章均附带详细链接,便于读者系统学习或针对性查阅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4376

Android性能优化典范

原文转载地址 2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个方面展开,Android的渲染机制,内存与GC,电量优化。下面是对这些问题和建议

zyxNobita专栏 876

【小程序抓取】解决痛点:如何用 AI-RPA 工具抓取无法获取 URL 的微信小程序数据?

本文探讨了传统爬虫技术在微信小程序数据采集中的局限性,并提出了AI-RPA(人工智能驱动的机器人流程自动化)这一前沿解决方案。随着微信小程序安全防护体系的全面升级(包括证书锁定、加密传输和三级防御机制),传统"抓包-模拟请求"的方式已基本失效。文章对比了Reqable、Fiddler等主流抓包工具的优劣,通过某程旅行小程序案例展示了传统抓包的技术流程和动态参数处理的难点。最终指出,2026年最有效的解决方案是采用AI-RPA技术,通过视觉识别、鼠标键盘模拟、OCR和AI智能体编排的组合方案,直接从小程序UI

ZDQ58818的博客 123

android性能优化 胡凯,Android性能优化典范 - 第1季 阅读笔记

该文章是自己在阅读 Android性能优化典范-第1季 时的读书笔记,Android性能优化典范主要讲了Android的渲染机制、内存和GC以及电量优化方面相关的内容,因为内容比较庞杂,加上一些知识点需要花心思去理解,所以在阅读的时候,顺便记录一下自己的阅读理解。笔记条目1、Android系统每隔16ms发出VSYNC信号,触发硬件对UI的渲染。2、1秒=1000ms所以基于上...

weixin_35531655的博客 424

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化。下面是对这些问题和建议的总结梳理。

阎魔爱的博客 2627

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android性能优化典范——总纲

Google已经发布了关于Android性能优化典范的六篇专题,这些专题旨在帮助开发者创建更快更优秀的Android App。其中第一篇发布于2015年伊始, 一共16个短视频,每个3-5分钟。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化。第二篇一共2

o190847959的专栏 501

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android程序员:Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化。下面是对这些问题和建议的总结梳理。 0)Ren...

weixin_45258969的博客 223

Android性能优化典范 - 第6季

涉及的内容主要有:程序启动时间相关的三个方面:activity的创建过程,臃肿的application启动对象,主题启动显屏。另外还介绍了减少安装包大小的checklist以及如何使用VectorDrawable来减少安装包的大小

JackChan 2976

[转]Android性能优化典范

[转]Android性能优化典范 2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化。...

dmyi30166的博客 136
上一篇: 回望2019,觅见2020
下一篇: Android 日常开发(32) WebView视频全屏播放
像一只小蜗牛
博客等级 码龄8年 33粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值