Emmagee(二)-软件启动时间

来源:互联网 发布:unix编程艺术 pdf 编辑:程序博客网 时间:2024/06/05 01:19

参考文章


Android 性能测试初探(二)
Android中级篇之区分系统程序和安装程序

原理


其实在前面的文章Emmagee-Cpu读取的实现分析 没有提到,当我们点击界面的开始测试时,程序会启动EmmageeService,之后所有的数据统计以及更新都是EmmageeService进行处理的。 EmmageeService会启动一个线程,进行数据的更新同时会尝试从logcat中获取到软件的启动时间。下来我们来看看实现的代码

/**     * Try to get start time from logcat.     */    private void getStartTimeFromLogcat() {        //先判断是否已经获取到启动时间的值,后者说获取的次数大于5次则不继续往下执行        if (!isGetStartTime || getStartTimeCount >= MAX_START_TIME_COUNT) {            return;        }        try {            // filter logcat by Tag:ActivityManager and Level:Info            // 输出标记为“ActivityManager”且优先级大于等于“Info”             String logcatCommand = "logcat -v time -d ActivityManager:I *:S";            Process process = Runtime.getRuntime().exec(logcatCommand);            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));            StringBuilder strBuilder = new StringBuilder();            String line = BLANK_STRING;            while ((line = bufferedReader.readLine()) != null) {                strBuilder.append(line);                strBuilder.append(Constants.LINE_END);                //通过正则表达式过滤出启动的时间,并且用toast显示                String regex = ".*Displayed.*" + startActivity + ".*\\+(.*)ms.*";                if (line.matches(regex)) {                    Log.w("my logs", line);                    if (line.contains("total")) {                        line = line.substring(0, line.indexOf("total"));                    }                    startTime = line.substring(line.lastIndexOf("+") + 1, line.lastIndexOf("ms") + 2);                    Toast.makeText(EmmageeService.this, getString(R.string.start_time) + startTime, Toast.LENGTH_LONG).show();                    isGetStartTime = false;                    break;                }            }            getStartTimeCount++;        } catch (IOException e) {            Log.d(LOG_TAG, e.getMessage());        }    }

获取的软件启动时间其实挺简单的,主要还是靠ActivityManger来获取时间。但是问题出来了在4.1以上的系统上执行时,发现无法读取到内容,但是通过cmd执行logcat的时候仍然能够获取到。我们在Emmagee的wiki里面找到了答案Emmageee-wiki

From Jelly Bean, Emmagee can not get launched time, because READ_LOGS permission is not granted to 3rd party applications from Jelly Bean

大体的意思就是从4.1开始,google考虑到安全性的问题,所以禁止了第三方的应用拥有READ_LOGS 的权限了。

其实我们在写cvs文件的时候,Emmagee也是做了判断的。

if (isGrantedReadLogsPermission()) {    bw.write(START_TIME);}

也只有系统允许读取log权限时,Emmagee才会运行写软件的启动时间

遇到的坑


这里说下在使用过程中遇到的一个问题,Emmagee在默认加载软件列表的时候实际上回过滤掉我们系统的软件,只显示第三方的应用程序。这样子会导致很多可能我们需要测试的软件都没加载出来。
ProcessInfo.java

for (ApplicationInfo appinfo : getPackagesInfo(context)) {            Programe programe = new Programe();            if (((appinfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) || ((appinfo.processName != null) && (appinfo.processName.equals(PACKAGE_NAME)))) {                continue;            }    ....}

所以我们如果需要测试系统的应用程序时,记得要注释掉这行代码

结论

软件启动时间计算:logcat -v time -d ActivityManager:I *:S 找出对应的Displayed的Activity 当然另外也有其他方法,可以看参考文章。

0 0
原创粉丝点击