如何理解Android SDK配置文件traceview ...?

时间:2012-01-19 21:41:07

标签: android profiling android-traceview

我有一些代码使用Jsoup来获取和解析一些html页面,然后在将其传递给绘制它的WebView之前操作html树。如果我绕过我的操作,代码会在Android SDK模拟器上以可接受的时间(2-3秒)运行,但是当我进行操作时,时间会跳到不可接受的状态(只需加载一页就可以~60秒!)。

使用Eclipse和Android SDK我有一个运行配置文件,现在我正在尝试解释结果。从这里http://android-developers.blogspot.com/2010/10/traceview-war-story.html获取提示在“独占CPU时间%”上排序配置文件。令我惊讶的是,我自己的代码甚至没有列出1%。消费者最大的时间是android.view.ViewGroup.drawChild(),占11.9%。列出的第一个非android函数(由独占cpu%排序)是java.lang.ref.Reference.get(),它的列表为0.4%。

但我觉得最奇怪的是我自己的代码,我只能找到我的AsyncTask的doInBackground();反过来调用的函数甚至不存在,即使我可以通过调试输出看到它们被调用。为什么没有列出?

我不明白该怎么做。任何提示都非常感谢。

1 个答案:

答案 0 :(得分:2)

虽然我手边没有参考资料,但我认为可以安全地假设Android在优先级为android.os.Process.THREAD_PRIORITY_BACKGROUND的线程中执行AsyncTask.doInBackground()

这意味着这个线程是在Linux cgroup(调度类)的上下文中调度的 - 总是或在频繁的情况下,我不确定并且已经阅读了各种声明 - 常见CPU时间的上限5%或10% - 再次,不同来源提出不同的主张 - 适用。

换句话说,所有后台线程必须共享可用CPU时间的5%或10%。再一次,我已经读过声称如果前台和实时任务空闲,这是动态调整的,但我很乐意自己指出一个可信的来源。此外,我不会指望它,因为用户可以在使用我的应用程序时收听实时音频流。

如果您调整后台线程的优先级,如下所示:

private static final int bgThreadPrio = Process.THREAD_PRIORITY_BACKGROUND +
                                        Process.THREAD_PRIORITY_MORE_FAVORABLE;
protected YourReturnType doInBackground() {
    Process.setThreadPriority(bgThreadPrio);
    ....
}

然后你实现了两件事。

  • 您将线程移出后台cgroup,这样它就不必与其他后台线程共享10%的CPU时间(至少目前,直到Android在这方面更改其策略)。
  • 您为线程分配优先级,这通常不会对用户界面和实时线程产生极其严重的影响,因为THREAD_PRIORITY_DEFAULT为0而THREAD_PRIORITY_BACKGROUND为10.因此您的线程将以优先级9运行,这比0差得多但它会避免后台任务的人为限制。

但是,您也可能更改底层AsyncTask执行程序为您的AsyncTask提供的Thread的优先级。此线程将被回收,它可以是单个线程或从池中选择。因此,在应用程序的所有AsyncTasks中的所有doInBackground()方法中设置优先级可能是个好主意。