android 监控app 读写,Android端 APP性能监控实践
如今大部分的APP测试工作关注点主要集中在功能的逻辑与交互上,由于各种原因(比如测试时间不够,测试手段有限等等),对APP客户端的性能数据往往比较忽视,然而经过移动互联网爆发式发展后,许多App功能差别不大,同质化问题泛滥,这个时候APP的性能优劣很大程度的影响了用户体验,对用户的选择有着直接的影响。因此,在项目发展到一定阶段,用户量增长到较大的数量级后,对APP客户端的性能关注需要越发重视了。
目前,对于Android端的APP性能监控,GT、Emmagee等工具都具备针对某个应用的监控,通用性强,但缺少定制和灵活性。抱着试一试的心态,我尝试着自己来实现:
1.能够实时监控并展现 指定应用的CPU、PSS、流量、应用大小等数据;
2.能够在手工测试时配合使用,也能与自动化测试结合使用
3.能支持2个版本的数据比对
一、数据采集方法
1.CPU数据的采集
方法:使用adb shell执行top命令过滤包名查看进程,获取返回的数据,提取CPU占用率
adb shell "top -n 1 | grep com.xxxxx"
如有多个进程,需合并多个进程的数据.
示例代码:
String TOP_CPUINFO = "adb shell \"top -n 1 | grep " + packageName + "\"";
InputStream is = Runtime.getRuntime().exec(TOP_CPUINFO).getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String temp = "";
while ((temp = br.readLine()) != null) {
line += temp + "\n";
}
2.PSS 数据的采集
方法:使用adb shell执行dumpsys meminfo app进程查看内存信息,获取返回的数据,提取TOTAL PSS占用
adb shell "dumpsys meminfo com.xxxxxx|grep TOTAL"
如有多个进程,需合并多个进程的数据
示例代码:
String TOP_PSSINFO = "adb shell \"dumpsys meminfo " + packageName + "|grep TOTAL\" ";
InputStream is = Runtime.getRuntime().exec(TOP_PSSINFO).getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String temp = "";
while ((temp = br.readLine()) != null) {
line += temp + "\n";
}
Pss = Float.parseFloat(line.split("\\s+")[2]);
3.流量数据采集
方法:需要编写一个数据监控apk来完成,通过apk运行实时采集数据保存到文件,再使用adb shell读取文件的内容。Apk中通过Android SDK提供的网络类TrafficStats相应方法获取 应用发送和接受的总流量。
示例代码:
UID = getPackageManager().getApplicationInfo(AppPackageName, 0).uid;
/** 获取指定 UID 对应的应用程序通过所有网络方式收发的字节流量总数(包括 wifi) */
totalTraffic = TrafficStats.getUidRxBytes(UID) + TrafficStats.getUidTxBytes(UID);
// android 7.0 用以上的方法拿不到数据,只能从文件中拿 /proc/uid_stat/
if (totalTraffic == 0 || (TrafficStats.getUidRxBytes(UID) == -1) && (TrafficStats.getUidTxBytes(UID) == -1)) {
totalTraffic = getTotalBytesFromFile(UID);
}
//保留2位小数
Total = (float) (Math.round(totalTraffic / (float) (1024) * 100)) / 100;
//输出到文件
writeFileSdcard(AppTrafficFile, Total + " KB");
private Long getTotalBytesFromFile(int localUid){
File uidFileDir = new File("/proc/uid_stat/" + String.valueOf(localUid));
BufferedReader brReceived = new BufferedReader(new FileReader(new File(uidFileDir, "tcp_rcv")));
BufferedReader brSent = new BufferedReader(new FileReader(new File(uidFileDir, "tcp_snd")));
return Long.valueOf(brReceived).longValue() + Long.valueOf(brSent).longValue();
}
4.应用大小
方法:同流量的采集(利用数据监控apk来完成),通过apk运行实时采集数据保存到文件,再使用adb shell读取文件的内容。 安装包的大小信息封装在PackageStats类中,但在AndroidSDK中并没有显示提供方法来获得该对象,只能通过AIDL,然后利用Java的反射机制去调用该方法(getPackageSizeInfo)。
示例代码:
Method method = PackageManager.class.getMethod("getPackageSizeInfo",new Class[] { String.class, IPackageStatsObserver.class });
// 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
method.invoke(context.getPackageManager(),
pkgName, new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException{
// 从pStats中提取各个所需数据
cachesize = Formatter.formatFileSize(context, pStats.cacheSize); //缓存大小
datasize = Formatter.formatFileSize(context, pStats.dataSize); //数据大小
codesize = Formatter.formatFileSize(context, pStats.codeSize); //应用程序大小
totalsize = Formatter.formatFileSize(context, pStats.cacheSize + pStats.dataSize + pStats.codeSize);
//输出到文件
writeFileSdcard(AppSizeFile, "缓存大小=" + cachesize + "\n数据大小=" + datasize + "\n程序大小=" + codesize + "\n总大小=" + totalsize);
}
});
需要的2个aidl文件,包名为:android.content.pm,工程结构:
2个aidl的内容:
IPackageStatusObserver.aidl文件
package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver{
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
PackageStats.aidl文件
package android.content.pm;
parcelable PackageStats;
在manifest中需要添加权限:
二、使用方式
数据采集代码可导出为jar包,配置成jenkins任务随时调用,根据测试需要手动或自动触发。
三、展现效果
采集得到的数据通过js图表以网页形式展现,读取数据文件后使用Chart.js绘制曲线图,并支持2个数据文件的对比展示。
选择单次测试采集文件展现:
选择2次相同场景的测试采集文件对比展现:
本文来自网易实践者社区,经作者李琼授权发布。
android 监控app 读写,Android端 APP性能监控实践相关推荐
- 为什么九大头部APP都选择U-APM 应用性能监控平台?
01 贝乐虎 02 车来了 03 墨迹天气 04 猎豹移动 05 小伴龙 06 虎扑 07 薄荷健康 08 小天才 09 某音视频APP U-APM核心技术与优势 为什么选择U-APM 应用性能监控 ...
- 传统APP与微信端APP十大优劣对比
随着微信公众平台的开放,经过二次开发的微信端APP涌现市场,老蔡的团队最近为很多传统企业开发了微信端的APP应用.在很多场合,都有人咨询老蔡:微信端APP是否会替代传统的APP应用?两者的优劣如何? ...
- mongodb 监控权限_分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记
公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...
- android 挂载system 读写,android使用mount挂载/system/app为读写权限,删除或替换系统应用...
注意:以下代码中#开头的则为需要执行的shell命令,其他的为打印的结果.#代表需要使用ROOT权限(su)执行,所以想要修改您android手机某个目录挂载为读写,首先需要有ROOT权限! 先要得到 ...
- vue开发android tv,h5做APP TV(电视端APP vue框架)-Go语言中文社区
先px转rem,然后把psd上传蓝湖,把尺寸改为750的图纸,按照上面的尺寸来写代码 1.安装px2rem-loader npm install px2rem-loader 2.配置px2rem-lo ...
- Android自绘控件开发与性能优化实践——以录音波浪动画为例
前言 本文实战性较强,主要目的是通过一个自定义控件的开发,引出我对自定义控件性能优化的一些思考和实践,欢迎各位喜欢移动开发的小伙伴来拍砖~ 本文由于篇幅有限,只讲解思路,并没有放出大量源代码,如果对本 ...
- 体育直播app/原生双端app/体育赛事OBS直播系统/体育直播源码/NBA直播/电竞直播app
体育直播源码简介: 功能完善系统包含热门球赛.即时比分.赛程类别.比赛直播.赛事解说.赛程列表 多端源码包含电脑PC端+苹果APP+安卓APP 开发周期短,源码是成品,搭建部署快,只需对接好赛事数据即 ...
- android 文件并发读写,Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?...
有个功能需要同时上传N个文件.代码如下: ApiService as = ApiManager.getApiService(); final ExecutorService es = Executor ...
- h5做APP TV(电视端APP vue框架)
先px转rem,然后把psd上传蓝湖,把尺寸改为750的图纸,按照上面的尺寸来写代码 1.安装px2rem-loader npm install px2rem-loader 2.配置px2rem-lo ...
最新文章
- Vivado 随笔(5) 行为仿真(Behavior Simulation)相关事宜?
- ROS2学习(五).ROS概念 - ROS_DOMAIN_ID
- npm install
- set集合 结构体_Redis底层数据结构
- 京东国际宣布国际超模刘雯担任品牌代言人
- C++ 判断进程是否退出 代码封装
- 计算机句法分析的研究现状,计算机理论论文融合语义和句型信息的中文句法分析方法研究与实现...
- 一张程序员人生图,很有意思
- 趣图:秃头程序员一问二十岁
- Mac上配置svn diff为kdiff3
- FPGA实现AXI4总线的读写
- 【Hadoop学习笔记】大数据框架原理及主要工具概述
- flutter开发的ios应用没法通过爱思等工具浏览文件目录Document
- ppt护理文书流程图_病案管理试题及答案
- 33款可用来抓数据的开源爬虫软件工具
- 汽车SoC芯片IP供应商
- linux内核panic
- 搭建开发环境RN React Native
- 谈谈一些感触——自我反思和总结
- python OGR库读取矢量文件——OGR shp操作