Status Update
Comments
ra...@google.com <ra...@google.com> #2
Translation:
Component used:StartupTimingMetric
Version used: 1.1.0-alpha13
Devices/Android versions reproduced on:R
Test engineering description:
The test project is a multi-process project, the package name is com.example.demo, but all UI interfaces of the application are implemented in the com.example.demo:ui process.
Analysis of the cause of the problem:
In the getMetrics method, the StartupTimingQuery.getFrameSubMetrics parameter is called and the PackageName is passed in, and the parameter source is
Marcobenchmark.kt
val iterationResult = userspaceTrace("extract metrics") {
metrics
// capture list of Map<String,Long> per metric
.map { it.getMetrics(Metric.CaptureInfo(
targetPackageName = packageName,
testPackageName = macrobenchPackageName,
startupMode = startupModeMetricHint,
apiLevel = Build.VERSION.SDK_INT
), tracePath) }
// merge into one map
.reduce { sum, element -> sum + element }
}
Query statement: val queryResult = PerfettoTraceProcessor.rawQuery(
absoluteTracePath = absoluteTracePath,
query = getFullQuery(
testProcessName = testPackageName,
targetProcessName = targetPackageName
)
)
private fun getFullQuery(testProcessName: String, targetProcessName: String) = """
------ Select all startup-relevant slices from slice table
SELECT
slice.name as name,
slice.ts as ts,
slice.dur as dur
FROM slice
INNER JOIN thread_track on slice.track_id = thread_track.id
INNER JOIN thread USING(utid)
INNER JOIN process USING(upid)
WHERE (
(process.name LIKE "$testProcessName" AND slice.name LIKE "startActivityAndWait") OR
(
process.name LIKE "$targetProcessName" AND (
(slice.name LIKE "activityResume" AND process.pid LIKE thread.tid) OR
(slice.name LIKE "Choreographer#doFrame%" AND process.pid LIKE thread.tid) OR
(slice.name LIKE "reportFullyDrawn() for %" AND process.pid LIKE thread.tid) OR
(slice.name LIKE "DrawFrame%" AND thread.name LIKE "RenderThread")
)
) OR
(
-- Signals beginning of launch event, only present in API 29+
process.name LIKE "system_server" AND
slice.name LIKE "MetricsLogger:launchObserverNotifyIntentStarted"
)
)
------ Add in async slices
UNION
SELECT
slice.name as name,
slice.ts as ts,
slice.dur as dur
FROM slice
INNER JOIN process_track on slice.track_id = process_track.id
INNER JOIN process USING(upid)
WHERE (
-- API 23+: "launching: <target>"
-- API 19-22: "launching"
slice.name LIKE "launching%" AND process.name LIKE "system_server"
)
ORDER BY ts ASC
""".trimIndent()
The packagename will be used as a restriction, resulting in no query results.
For users, this parameter cannot be modified to achieve the purpose of querying the correct process.
Proposed changes:
(1) When the Metric object is a specific process, the open parameter is passed in the specified process name (the default value is the package name). For example: FrameTimingGfxInfoMetric, FrameTimingMetric, StartupTimingMetric.
(2) At present, Metric is sealed, it is recommended to open it to users to give users more space to customize Metric.
cc...@google.com <cc...@google.com> #3
Would the following change to app process.name
matching work for your scenario, to make it match your :ui
process?
(process.name LIKE "$targetProcessName") OR (process.name LIKE "$targetProcessName:%")
(I should probably also rename that variable targetPackageName since it's not process name).
I'd like to avoid adding an API for this if we can, so it will simply work for multiprocess apps.
We do plan to open up other means of constructing your own metric, but are focusing on getting to a stable release first.
wu...@gmail.com <wu...@gmail.com> #4
通过一段时间对Macrobench的使用,发现他是一个很好的工具,也希望稳定版本能够尽早推出。
ap...@google.com <ap...@google.com> #5
Branch: androidx-main
commit 7f32b0df3abea8533bd1d926dd3058fe961e113e
Author: Chris Craik <ccraik@google.com>
Date: Mon Feb 14 17:19:06 2022
Support metrics from named UI subprocesses in multi-process apps
Fixes: 215988434
Relnote: Support metrics from named UI subprocesses in multi-process apps
Test: SeparateProcessBenchmark
Change-Id: Ice6c0360953f464641774b0a1056af7015ecf8de
M benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/FrameTimingQuery.kt
A benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/benchmark/integration/macrobenchmark/target/SeparateProcessActivity.kt
A benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SeparateProcessBenchmark.kt
M benchmark/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
M benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/PerfettoTraceProcessor.kt
M benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/StartupTimingQuery.kt
cc...@google.com <cc...@google.com> #6
Re
To your earlier point, about opening up the metrics APIs, I agree, and we'll be looking into that for 1.2 -
Thanks for the bug report!
Description
Version used:1.1.0-alpha13
Devices/Android versions reproduced on:R
测试工程说明:
测试项目为多进程项目,包名com.example.demo, 但是应用的所有UI界面实现在com.example.demo:ui进程。
问题原因分析:
getMetrics方法中调用StartupTimingQuery.getFrameSubMetrics 参数传入的是PackageName,参数来源是
Marcobenchmark.kt
val iterationResult = userspaceTrace("extract metrics") {
metrics
// capture list of Map<String,Long> per metric
.map { it.getMetrics(Metric.CaptureInfo(
targetPackageName = packageName,
testPackageName = macrobenchPackageName,
startupMode = startupModeMetricHint,
apiLevel = Build.VERSION.SDK_INT
), tracePath) }
// merge into one map
.reduce { sum, element -> sum + element }
}
查询语句:val queryResult = PerfettoTraceProcessor.rawQuery(
absoluteTracePath = absoluteTracePath,
query = getFullQuery(
testProcessName = testPackageName,
targetProcessName = targetPackageName
)
)
private fun getFullQuery(testProcessName: String, targetProcessName: String) = """
------ Select all startup-relevant slices from slice table
SELECT
slice.ts as ts,
slice.dur as dur
FROM slice
INNER JOIN thread_track on slice.track_id =
INNER JOIN thread USING(utid)
INNER JOIN process USING(upid)
WHERE (
(
(
(
(
(
(
)
) OR
(
-- Signals beginning of launch event, only present in API 29+
)
)
------ Add in async slices
UNION
SELECT
slice.ts as ts,
slice.dur as dur
FROM slice
INNER JOIN process_track on slice.track_id =
INNER JOIN process USING(upid)
WHERE (
-- API 23+: "launching: <target>"
-- API 19-22: "launching"
)
ORDER BY ts ASC
""".trimIndent()
会将packagename 作为限制条件,导致查询不到结果。
对于用户,不能修改这个参数,来达到查询正确进程的目的。
修改建议:
(1)对于Metric 对象是特定进程的时候,开放参数传入指定进程名(默认值是包名)。比如:FrameTimingGfxInfoMetric,FrameTimingMetric,StartupTimingMetric。
(2)目前Metric 是sealed的,建议开放给用户,给用户更多自定义Metric 的空间。