我如何改进此 bash 命令以从 ActivityManager 获取 UI 渲染时间?

How can I improve this bash command to get UI rendering times from ActivityManager?

我正在开发一个基于 Fire App Builder 的示例应用程序,我想以编程方式测量绘制 Activity 所需的时间(以毫秒为单位)。此信息包含在 ActivityManager 日志中:

I/ActivityManager( 1843): Displayed com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +656ms

超过一秒的时间如下所示:

I/ActivityManager( 1843): Displayed com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +1s001ms

但是,Android 的设计使得应用程序只能读取自己的日志。因此,Runtime.getRuntime().exec("logcat -d ActivityManager:I *:S") 不会显示任何内容。我可以使用 shell 命令读取日志,但我的正则表达式没有提供我想要的内容。

以下命令

adb logcat -d ActivityManager:I *:S | sed -n 's/ContentBrowseActivity:\s+\+\([0-9].*\)ms//p'

匹配,但是因为 sed 不支持非贪婪表达式,所以打印了整行:

I/ActivityManager( 1843): Displayed com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.656

我想赶时间。跟踪另一个 grep 命令获取数据:

adb logcat -d ActivityManager:I *:S | sed -n 's/ContentBrowseActivity:\s+\+\([0-9].*\)ms//p' | grep -Po [0-9]+

对于超过一秒的时间,我只想将第一个数字乘以 1,000,然后将其加到第二个数字上。

然而,这非常 hacky 并且还捕获了 I/ActivityManager(####) 中的数字。另一个知道更优雅的解决方案?

$ echo 'I/ActivityManager( 1843): Displayed com.amazon.android.calypso/com.amazon.android.tv.tenfoot.ui.activities.ContentBrowseActivity: +1s001ms' | sed -e 's/^.*: +\(.*\)ms$//' -e 's/s//'
1001