android之cpu使用率曲线效果的实现!

Android性能优化高阶:卡顿、ANR、死锁,线上如何监控? 一、前言 最近参加了几轮面试,发现很多5-7年工作经验的候选人在性能优化这一块,基本上只能说出传统的分析方式,例如ANR分析,是通过查看/data/anr/ 下的log,分析主线程堆栈、cpu、锁信息等, 然而,这种方法有一定的局限性,并不是每次都奏效,很多时候是没有堆栈信息给你分析的,例如有些高版本设备需要root权限才能访问/data/anr/ 目录,或者是线上用户的反馈,只有一张ANR的截图加上一句话描述。 假如你的App没有实现ANR监控上报,那么你大概率会把这个问题当成“未复现”处理掉,而没有真正 阅读详情

最近做一个效果:在手机设置里面“关于手机”里面添加一项来显示当前手机cpu使用率的曲线!其实现效果如下图所示:

上图关于手机的第一项就是我要实现的效果!今天来讲讲这个曲线的view(cpu_speedcurve_view)是如何实现的!

首先要注意以下几点:

(1)由于我设计的cpu_speedcurve_view不仅仅显示动态的曲线,还需要用textview显示一些cpu相关信息!所以,我选择cpu_speedcurve_view继承一个viewgroup,这里我选择的是FrameLayout

(3)曲线的怎么绘制?

           这里我是在cpu_speedcurve_view的public void draw(Canvas canvas)里面用Canvas的drawPath来绘制的。具体代码如下:

	public void draw(Canvas canvas) {
		super.draw(canvas);

		//mPaint.setColor(coordinateColor);
		//mPaint.setStrokeWidth(mStrokeSize*2);	
		//canvas.drawPath(m_path_coordinate, mPaint);
		//canvas.clipRect(10, 10, 5, 5);
		if(flag_start){
			if(m_path_0 == null && m_path_1 == null){
				//Start_run_CpuTracker_to_show_curve();
			}else{
				mPaint.setColor(curveColor);
				mPaint.setStrokeWidth(mStrokeSize);

				if(m_path_0 != null){
					// Log.d("speedcurve", "cpu_speedcurve_view  draw  (m_path != null) ");
					if(!m_path_0.isEmpty()){
						canvas.drawPath(m_path_0, mPaint);
					}
				}
				if(m_path_1 != null){
					// Log.d("speedcurve", "cpu_speedcurve_view  draw  (m_path != null) ");
					if(!m_path_1.isEmpty()){
						canvas.drawPath(m_path_1, mPaint);
					}
				}

			}
		}

	}
      从上面代码可以看到,这里居然有两个Path,从上面的效果图可以看出只是一条曲线呀!为什么这里有两个Path呢?

	private Path m_path_0;
	private Path m_path_1;

      的确我定义了两个Path,那是因为一个Path的曲线长度不是无线的,总是会溢出的!所以我就设计了两个曲线(Path),当m_path_0使用一段时间后,就启动另一个曲线m_path_1,使其重叠显示,直到m_path_1长度超过这个view显示的宽度时候,把m_path_0给清除掉。整个运行的机制就是这样反复。

(2)对于曲线的动态显示,我的办法是定义一个Handler定时的自动发送信息来更新cpu运行的数据,最后用invalidate();来刷新曲线:

	private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 000: 
					m_CpuTracker.update();
					TotalCpuPercent = m_CpuTracker.getTotalCpuPercent();
					int h = view_h - 2;

					//int CpuPercent_po = (int) (h * TotalCpuPercent);
					if(flag_num < 400){
						if(m_path_0 == null){
							m_path_0 = new Path();
							m_path_0.moveTo(view_w+4, h - TotalCpuPercent);
						}

						if(flag_num > 200){
							if(m_path_1 == null){
								m_path_1 = new Path();
								m_path_1.moveTo(view_w+4, h - TotalCpuPercent);
							}

						}else{
							m_path_1 = null;
						}
					}else if(flag_num < 600){
						m_path_0 = null;
						if(m_path_1 == null){
							m_path_1 = new Path();
							m_path_1.moveTo(view_w+4, h - TotalCpuPercent);
						}

					}else if(flag_num < 800){
						if(m_path_0 == null){
							m_path_0 = new Path();
							m_path_0.moveTo(view_w+4, h - TotalCpuPercent);
						}

					}else{
						flag_num = 0;
					}
					
					if(m_path_0 != null){
						m_path_0.lineTo(view_w+4, h - TotalCpuPercent);
						matrix.setTranslate(-4,0);
						m_path_0.transform(matrix);
					}
					
					if(m_path_1 != null){
						m_path_1.lineTo(view_w+4, h - TotalCpuPercent);
						matrix.setTranslate(-4,0);
						m_path_1.transform(matrix);
					}

				//	Log.d("speedcurve", "cpu_speedcurve_view  handleMessage  msg.what=000 flag_num="+flag_num);
				//	Log.d("speedcurve", "cpu_speedcurve_view  handleMessage  TotalCpuPercent="+TotalCpuPercent+"view_h="+view_h+"getCurCpuFreq()="+Cpu_info_manager.getCurCpuFreq());
				    if(flag_start){
						mHandler.sendEmptyMessageDelayed(000,300);
						invalidate();
						flag_num++;
					}else{
						Stop_run_CpuTracker_to_show_curve();
					}
					break;
                case 111: 

                	break;
            }
        }
    };
       从上面的代码可以知道:首先获取当前cpu使用的百分率,再通过这个百分率来计算出曲线高度!最后通过path的moveTo来完成曲线的绘制保存。

(3)如何获取cpu的使用率呢?

      用android提供的ProcessCpuTracker就可以了。

m_CpuTracker = new ProcessCpuTracker(false);
   实际上在ProcessCpuTracker里面就是在/proc/stat 去读取cpu的信息(user time /nice time/sys time/idle time/iowait time等)来计算出使用率的百分比的!

(4)最后记得 在这个里面 protected void onDetachedFromWindow()停止运行就可以了!


就这样问题就基本解决了!如果要实现如上的效果图的则需要定义一个PreferenceGroup:

		PreferenceGroup mCPUStatusPref = (PreferenceGroup) findPreference("cpu_key");      
		mCPUStatusPref.setLayoutResource(R.layout.cpu_curve_preference); 
在layout: cpu_curve_preference就可以布局成上面的效果了!
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="85dip"
    android:gravity="center_vertical"
    android:paddingStart="@*android:dimen/preference_item_padding_side"
    android:paddingEnd="?android:attr/scrollbarSize"
    android:background="?android:attr/selectableItemBackground"
    android:paddingTop="6dip"
    android:paddingBottom="6dip">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="6dip"
        android:paddingBottom="6dip">

        <TextView
            android:id="@+android:id/title"
            android:text="@string/XunHu_Setting_Cpu_Info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/usage_type_cpu_foreground"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:visibility="gone"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="4" />

    </RelativeLayout>

    <com.android.settings.widget.cpu_speedcurve_view
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:minWidth="180dip"
        android:background="@drawable/cpu_curve_bg"
        android:layout_marginBottom="8dip"
        android:layout_marginTop="8dip"
        >

	 <TextView
		 android:id="@+android:id/cpu_speedcurve_view_title"
		 android:text="@string/XunHu_Setting_Cpu_Info_util"	
		 android:layout_width="wrap_content"
		 android:layout_height="wrap_content"
		 android:singleLine="true"
		 android:ellipsize="marquee"
		 android:fadingEdge="horizontal" />

	 </com.android.settings.widget.cpu_speedcurve_view>

</LinearLayout>


Python 如何获取Android应用内存使用和CPU占用信息,并且时时展示曲线图形。 Python 如何获取Android应用内存使用和CPU占用信息,并且时时展示曲线图形。最近测试公司产品时发现进入聊天界面后再退出,内存占用没有减小。考虑到其他测试人员没有产品源代码查看权限,又不懂怎么使用Android Studio ,如果需要测试某些地方的内存和CPU占用情况,可能需要另外的辅助工具,一边测试一边查看内存和CPU占用情况,能够快速的找到某些操作会导致内存增加了而且没有释放掉。在下 阅读详情

相关推荐

Android调用OpenGL绘制曲线入门手册

 Android调用OpenGL绘制曲线入门手册  Android  OpenGL ES2.0 JNI  Cmake简介:该手册内容仅作为Android调用OpenGL实现绘制曲线图的入门手册,深入学习请参考手册推荐书籍。本手册针对采用jni接口实现java调用C++代码完成OpenGL在Android中的曲线绘制做了详细流程介绍,最终实现效果为在Android平台绘制正弦曲线。 撰写人:武斌(1...

菜鸟博客 3793

android框架_5.0的SystemUI获取CPU负载以及进程cpu时间_014

一、ProcessStats类;1、Android源生系统中有一个叫ProcessStats类,用来获取系统的负载情况及进程时间;public final class ProcessStats implements Parcelable { static final String TAG = "ProcessStats"; static final boolean DEBUG = ...

小伍的专栏 2298

安卓APP性能深度体检:使用SoloPi监控CPU、内存与网络流量

在移动应用开发中,性能监控是保障用户体验的关键环节。其核心原理在于通过实时采集应用的运行时数据,量化评估其资源消耗与效率。这项技术的价值在于,它能将主观的“卡顿”、“耗电”感受转化为客观的CPU使用率、内存占用和网络流量等指标,帮助开发者精准定位性能瓶颈。在实际的工程实践中,性能监控广泛应用于应用启动优化、列表流畅度保障、内存泄漏排查及后台行为分析等场景。本文将聚焦于安卓平台,详细介绍如何利用阿里巴巴开源的SoloPi工具,对应用进行全方位的性能“体检”。通过实战演示,你将学会如何监控CPU使用率以揪出计算

weixin_33766805的博客 378

ANR系列之一:ANR显示和日志生成原理讲解

序言 前几天有人问我,什么时候会触发ANR?随口回答,主线程卡顿并且有输入操作未被响应的时候,会触发ANR,这应该也是网上标准的答案了。但是仔细想一想,好像debug调试的时候没有点击也会出现应用没有响应的问题。好吧,那我们就带着这个问题,去一步一步的看一下,安卓什么时候会触发ANR。 一.程序无响应Dialog的入口 排查这个问题,我们首先要找到排查问题的入口。造一个程序无响应的场景,然后打开uiautomatorviewer工具查看布局。首先我们看到的是下面这样一个场...

分享+记录 7527

Android开发进阶:贝塞尔曲线原理、绘制与动画实战

在计算机图形学与UI开发中,参数曲线是定义平滑路径的核心数学工具,它通过控制点来精确描述复杂形状。其原理基于线性插值与德卡斯特里奥算法,实现了用少量数据点生成光滑曲线的能力,这为矢量图形、字体渲染和动画轨迹提供了技术基础。在工程实践中,贝塞尔曲线被广泛应用于SVG、Canvas和Android Path等图形系统中,用于绘制自定义图标、进度条和灵动动画。本文聚焦于Android平台,深入解析二阶与三阶贝塞尔曲线的公式推导、几何意义及在Path.quadTo和Path.cubicTo中的实战应用,并探讨其在动

weixin_33739541的博客 356

vc画动态曲线图

vc画动态曲线图,就任务管理器中的cpu利用率图一样

Android 性能优化——ANR监控与解决

ANR(Application Not responding):如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误。如果应用位于前台,系统会向用户显示一个对话框。ANR 对话框会为用户提供强制退出应用的选项。 ANR 是一个问题,因为负责更新界面的应用主线程无法处理用户输入事件或绘制操作,这会引起用户的不满

maniuT的博客 2643

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发进程渐渐成为了当前科技领域的热点。全球各国已纷纷将目光投向了充满想象的6G时代。本文将探讨全球6G技术研发的最新进展,以及6G技术的核心创新与潜在应用。

fiberroad的博客 2424

Android应用ANR分析

一.ANR是什么 Application Not Responding,字面意思就是应用无响应,稍加解释就是用户的一些操作无法从应用中获取反馈。在实际的应用中应当去避免这种现象,虽然他暂时不会造成应用崩溃,但是却极大的损坏了用户体验。 二.ANR的触发原因 出现ANR之后一个直观现象就是系统会展示出一个ANR对话框,大概是这样。 谷歌文档中对ANR产生的原因是这么描述的: Andro...

baidu_32472003的博客 832

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8630

一篇文章教小白会Python 绘制Android CPU和内存增长曲线

一篇文章教小白会Python 绘制Android CPU和内存增长曲线????️‍????目录????️‍????1、实现效果????️‍????2、具体逻辑实现详解????2.1、CPU图表的Python实现????2.2、内存图表的Python实现????️‍????3、 实现说明????3.1、实现过程中遇到的问题????️‍????4、编码导致的异常????️‍????5、保存的文件格式限制????️‍????6、python-tk 依赖????️‍????7、 Agg画布初始化配置????️‍??

苏州程序大白的博客 1806

集成电路模拟版图入门-版图基础学习笔记(四)

第三部分:版图的准备 2. 设计规则 3) Design Rule 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.2 PO(Poly) 2. 设计规则 4) 规则定义 4.3 M1(Metal1) 2. 设计规则 4) 规则定义 4.4 VIA 3. DRC文件 3.1 DRC:Design Rule Check,设计规则检查。 3.2 DRC程序了解有关

weixin_52955333的博客 6736

安卓动态曲线的绘制

WRAP_CONTENT时,在实际界面上只显示第一张图,在这里可根据手 //

apple_51426592的博客 467

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6068

YOLOv11缝合改进Conv | SAConv在YOLOv11中的应用可切换空洞卷积与性能提升(附代码)

在本篇文章中,我们将深入探讨如何通过引入**SAConv**(Switchable Atrous Convolution,可切换空洞卷积)来优化YOLOv11网络结构,特别是在卷积操作方面的创新。我们会解析SAConv的核心原理和架构设计。

一键难忘的博客 953

实现高端UI效果,还是得靠贝塞尔曲线呀

贝塞尔曲线是一种通过数学公式去计算并绘制的平滑曲线,它的本质是使用很少的控制点来生成视觉效果极佳的曲线效果,在Android自定义View的开发当中属于比较高端的技术。不...

郭霖 1764

数控系统(CNC)系列:Hurco VMX42SR_(11).加工准备流程

在开始使用Hurco VMX42SR进行加工之前,首先需要对机床进行初始设置。这包括机床的水平调整、电源连接和控制系统的基本配置。正确的初始设置是确保加工精度和机床安全运行的前提。

2401_87715305的博客 841

从JavaScript到Kotlin:移植Hilbert曲线图片混淆到安卓的经历

贴吧论坛常用的小番茄图片混淆,网页解图太麻烦。我自己做了一个安卓App,把混淆算法搬到手机上,离线可用、不用上传图片。本文记录了完整的移植过程和技术实现,文末附APK下载地址。

brogna的博客 5405

手把手教你学pcie--内存管理和保护机制(一):MPU与其他内存管理和保护机制详解

MPU(Memory Protection Unit)是一种专门用于 ​。,这些机制通常协同工作,形成多层防御体系,兼顾安全性、性能和灵活性。

MHD0815的博客 279

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android 自定义View贝塞尔曲线实现波浪动画

先看效果图: 下面我们来研究研究他是如何实现的。为了方便我们观察,再来看下面这张动图: 有感受到些什么吗?其实,我们需要做的是同时创建多条贝塞尔曲线,然后移动每条曲线上的起点和终点就能实现波浪效果了。 例如在上面图中,黑色的点是贝塞尔曲线上的起点与终点,蓝色的点是贝塞尔曲线的控制点。控制点x的坐标其实是由起点和终点决定的。控制点x坐标计算公式是:x=(起点的x+终点的x)/2,控制点y的坐标我们可以任意取值,从而来达到最好的效果。 所以,移动贝塞尔曲线的起点和终点后,它的控制点也会跟着移动。

zz51233273的博客 941

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android平台上基于View Canvas实现高效平滑手绘效果的技术实践

本文介绍了一种高效的Android手绘实现方案,通过多级优化提升绘制体验。文章首先分析了触摸点过密、重复绘制、路径平滑和渲染性能四大核心问题,然后提出包括内存优化、绘制优化和算法优化的综合解决方案。架构设计上采用分层处理,包含触摸事件处理、点采样优化、路径平滑和实时渲染等模块。通过对象池复用、动态采样率调整、局部重绘等技术手段,实现了FPS提升至55+、内存占用降低40%、CPU使用减少25%的显著优化效果。方案还提供了完整的类图设计和Kotlin代码实现框架,包括绘图视图、控制器、路径优化器等核心组件,为

技术的学习与积累是个技术活 921

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线,大家肯定都不陌生,网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图。以下两个是比较经典的动图了。二阶贝塞尔曲线:三阶贝塞尔曲线:由于在工作中经常要和贝塞尔曲线打交道,所以简单说一下自己的理解:现在假设我们要在坐标系中绘制一条直线,直线的方程很简单,就是 y=x ,很容易得到下图:现在我们限制一下 x 的取值范围为 0~1 的闭区间,那么可以得出 y 的取值范围也是 0~1。而在...

weixin_28989055的博客 162

最新安卓版本对照表,API对照表(持续更新,更新到安卓17)

话不多说,直接上表,持续更新(更新到安卓16)。 列出了所有记录的可能会影响应用开发者的功能和行为变更。请使用此列表查找影响您的变更,然后点击相应的链接以阅读文档。下表列出了所有记录的可能会影响应用开发者的功能和行为变更。请使用此列表查找影响您的变更,然后点击相应的链接以阅读文档。Java 和 OpenJDK 是 Oracle 及/或其关联公司的商标或注册商标。

雨季余静的博客 9万+

Android基于绘制缓冲实现烟花效果

简单说下SurfaceView的问题,性能最好,但其不适合在滑动的页面调用,因为有些设备会出现画面漂移和缩放的问题,另外不支持clipchildren等,理论上也是适合本篇的,但是如果app回到后台,其Surface会自动销毁,因此,控制线程的逻辑就会有些复杂。不过,在这里我们还需要注意的是,这里我们使用HLS,这是一种色彩空间,和RGB不一样的是,他有Hue(色调)、饱和度、亮度为基准,因此,有利于亮色的表示,因此适合获取强调亮度的色彩。不过,当时,我在这篇文章中着重强调了一件事。

chinaherolts2008的博客 276
上一篇: android之Fragment的bug解决
下一篇: Android之图片Bitmap的特殊处理
狂发飘飘
博客等级 码龄15年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值