【mie haha的博客】转载请注明出处(万分感谢!):
https://blog.csdn.net/qq_40315080/article/details/98610748
写一个测试各个app/手机性能的小工具app。
功能:
- 打开app得到手机中已有的应用列表,点击可以跳转进入。
- 上方标题栏上有选择菜单,可以选择打开,刷新,关闭浮窗,浮窗可以拖动。
- 打开浮窗后,浮窗将显示顶层(当前所在)app的cpu占用、内存、流量,手机总cpu占用、电量数据,每几秒实时更新数据。
- 一个开关按钮,点击控制数据导入数据库和SD卡或停止导入。(可选)
- 一个选择按钮,点击控制监测限定某个app或监测顶层app的数据。(可选)
- 点击浮窗返回该小工具app界面。(可选)
(标记可选的与主要功能无关,只是使使用稍微更方便,可以选择性添加)
主要功能代码:
首先小工具app打开是手机中app列表,需要先得到app列表。
1.获取app列表:
每个app有它对应的名称,包名,进程号(pid),uid。
【pid:每个app运行时都会开启一个进程来实际运行,用pid来标识这个进程,有的app可能会开启多个进程。
在利用android自带的方法获得数据时都是通过pid获取数据,对于多进程app需要把所有进程的数据相加。】
【uid:像一个身份证,唯一地标识某个app。】
【一般包名和名称相比pid和uid更容易得到。】
将app的信息封装在一个类中方便使用。再用该类创建一个列表来保存所有的app信息。最后将这个列表显示在界面上即可得到app列表。
(1)封装app信息:
(2)创建列表,把获得的app信息加入列表(以下代码写在MainActivity中):
app信息列表用LisView来显示,每一项包括app图标,app名称,包名。这需要给ListView添加适配器,用适配器来指定每一项的形式和内容。
(3)适配器:
并给ListView列表添加适配器:
(4)最后,实现点击跳转,需要给ListView添加点击监听器:
2. 打开,关闭,刷新浮窗(可拖动):
(1)首先把打开浮窗,浮窗显示信息,浮窗跟随手移动都写在一个方法中,这样在界面上直接调用这个方法就好。
在浮窗上显示信息其实就是在浮窗上显示一个文本框TextView,可被拖动就是给TextView添加触摸监听器,每次得到手触摸的位置坐标并按照该坐标更新TextView的显示坐标即可。
(2)完成了打开浮窗的方法,接下来调用即可。但不是所有手机都可以允许app打开浮窗,这需要提前判断是否有打开浮窗的权限,如果没有权限,需要跳转到权限界面打开权限,再打开浮窗;如果有打开权限直接打开。
手机安装的sdk版本不同,有不同的默认权限设置。sdk高于23的手机一般默认没有打开浮窗权限,需要跳转权限界面打开。低于23的手机一般有权限,可直接打开。
浮窗已经有了雏形,但是缺少数据信息来显示。
因为要检测顶层app(即当前app)的数据,需要得到顶层app。
3. 获得顶层app:
因为不同信息获取要用到的app信息不一样,取得顶层app时要取得app包名,名称,pid。uid。
包名:
名称:
pid:
uid:
4. 获得cpu总占用率:
获得总体cpu占用率比获取某个app的cpu占用率简单。手机的性能数据都保存在系统中,我们只需要输入命令来调取即可。先来看一下系统中怎么保存的cpu信息:
我们需要的数据信息全部保存在/proc文件下。数据根据系统自动更新。
连接手机,在命令行输入adb shell进入shell模式,再输入cat进行 /proc/stat文件 的查看。可以看到:
(图片来自https://www.jianshu.com/p/6bf564f7cdf0)
第一行是总cpu使用情况。一个手机可能有多个cpu,下面几行是多个cpu的各自使用情况。由cpu0—cpu3可知该连接的手机共有4个cpu处理内核。cpu数据的单位是jiffies,jiffies 是内核中的一个全局变量,用来记录系统启动以来产生的节拍数,根据不同的linux系统在1ms 到 10ms 之间。
用获取的信息计算使用率:
公式:totalCPUrate = (非空闲cpu时间2-非空闲cpu时间1)/(cpu总时间2-cpu总时间1)x100%
一般在较短时间内进行2次取样,计算。
取得的cpu数据是10元组,包括user、nice、system、idle、iowait、irq、softirq、stealstolen、guest、guest_nice。
代码:
5. 获得某个app的cpu占用率:
用获取到的顶层cpu信息,取相应的数据获得某app的cpu使用率。
2.中已经得到了顶层app的pid,用pid获取该app的cpu信息:
最后规定下显示的小数形式。
6. 获得某个app的内存:
由app的包名得到app占用的全部内存:
7. 获得某个app的流量:
流量是接受量和发送量的总和。
由app的uid获得流量使用量:
(app的uid的获得方法在2.中)
8. 把数据信息显示到浮窗,并实时刷新:
要实时刷新,就是要不停重新获取数据。这就需要使用线程,把设置显示信息的语句放到线程中执行。安卓中不能直接写在Thread的run()方法中然后调用.start(),而要借助Handler,把更新数据语句写在的post()方法中,再调用.start()。否则会卡顿严重。
代码:
然后在主界面(MainActivity)调用,开始线程即可:
9. 把数据导入数据库:
导入数据库是指以数据库文件.db形式导入到手机sd卡中,没有安装查看软件的手机无法直接点开.db文件查看,但是可以方柏霓导出到其他设备进行分析。
因为信息是实时更新,实时更新是在线程中实现的,所以导入数据库的语句也写在线程中。
把7.中的run方法稍作修改:
10. 把数据以.txt形式导入手机sd卡:
比数据库文件形式导入更简单:
仍然在线程中修改,添加如下语句:
修改后的导入.db和.txt文件到sd卡的线程代码:
测试手机/某app性能的小工具完成。
以上代码全部完整,工程代码已上传。
仍在入门,如有错误,欢迎指出