• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1--
2-- Copyright 2019 The Android Open Source Project
3--
4-- Licensed under the Apache License, Version 2.0 (the "License");
5-- you may not use this file except in compliance with the License.
6-- You may obtain a copy of the License at
7--
8--     https://www.apache.org/licenses/LICENSE-2.0
9--
10-- Unless required by applicable law or agreed to in writing, software
11-- distributed under the License is distributed on an "AS IS" BASIS,
12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-- See the License for the specific language governing permissions and
14-- limitations under the License.
15--
16SELECT IMPORT('android.battery');
17
18DROP VIEW IF EXISTS battery_view;
19CREATE VIEW battery_view AS
20SELECT * FROM android_battery_charge;
21
22DROP TABLE IF EXISTS android_batt_wakelocks_merged;
23CREATE TABLE android_batt_wakelocks_merged AS
24SELECT
25  MIN(ts) AS ts,
26  MAX(ts_end) AS ts_end
27FROM (
28    SELECT
29      *,
30      SUM(new_group) OVER (ORDER BY ts) AS group_id
31    FROM (
32        SELECT
33          ts,
34          ts + dur AS ts_end,
35          -- There is a new group if there was a gap before this wakelock.
36          -- i.e. the max end timestamp of all preceding wakelocks is before
37          -- the start timestamp of this one.
38          -- The null check is for the first row which is always a new group.
39          IFNULL(
40            MAX(ts + dur) OVER (
41              ORDER BY ts
42              ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
43            ) < ts,
44            TRUE
45          ) AS new_group
46        FROM slice
47        WHERE slice.name GLOB 'WakeLock *' AND dur != -1
48    )
49)
50GROUP BY group_id;
51
52DROP VIEW IF EXISTS suspend_slice_from_minimal;
53CREATE VIEW suspend_slice_from_minimal AS
54SELECT ts, dur
55FROM track t JOIN slice s ON s.track_id = t.id
56WHERE t.name = 'Suspend/Resume Minimal';
57
58DROP TABLE IF EXISTS suspend_slice_;
59CREATE TABLE suspend_slice_ AS
60SELECT ts, dur FROM suspend_slice_from_minimal
61UNION ALL
62SELECT
63  ts,
64  dur
65FROM
66  slice
67JOIN
68  track
69  ON slice.track_id = track.id
70WHERE
71  track.name = 'Suspend/Resume Latency'
72  AND (slice.name = 'syscore_resume(0)' OR slice.name = 'timekeeping_freeze(0)')
73  AND dur != -1
74  AND NOT EXISTS(SELECT * FROM suspend_slice_from_minimal);
75
76DROP VIEW suspend_slice_from_minimal;
77
78SELECT RUN_METRIC('android/counter_span_view_merged.sql',
79  'table_name', 'screen_state',
80  'counter_name', 'ScreenState');
81
82SELECT RUN_METRIC('android/counter_span_view_merged.sql',
83  'table_name', 'doze_light_state',
84  'counter_name', 'DozeLightState');
85
86SELECT RUN_METRIC('android/counter_span_view_merged.sql',
87  'table_name', 'doze_deep_state',
88  'counter_name', 'DozeDeepState');
89
90SELECT RUN_METRIC('android/counter_span_view_merged.sql',
91  'table_name', 'battery_status',
92  'counter_name', 'BatteryStatus');
93
94SELECT RUN_METRIC('android/counter_span_view_merged.sql',
95  'table_name', 'plug_type',
96  'counter_name', 'PlugType');
97
98DROP TABLE IF EXISTS screen_state_span_with_suspend;
99CREATE VIRTUAL TABLE screen_state_span_with_suspend
100USING span_join(screen_state_span, suspend_slice_);
101
102DROP VIEW IF EXISTS android_batt_event;
103CREATE VIEW android_batt_event AS
104SELECT
105  ts,
106  dur,
107  'Suspended' AS slice_name,
108  'Suspend / resume' AS track_name,
109  'slice' AS track_type
110FROM suspend_slice_
111UNION ALL
112SELECT ts,
113       dur,
114       CASE screen_state_val
115       WHEN 1 THEN 'Screen off'
116       WHEN 2 THEN 'Screen on'
117       WHEN 3 THEN 'Always-on display (doze)'
118       ELSE 'unknown'
119       END AS slice_name,
120       'Screen state' AS track_name,
121       'slice' AS track_type
122FROM screen_state_span
123UNION ALL
124-- See DeviceIdleController.java for where these states come from and how
125-- they transition.
126SELECT ts,
127       dur,
128       CASE doze_light_state_val
129       WHEN 0 THEN 'active'
130       WHEN 1 THEN 'inactive'
131       WHEN 4 THEN 'idle'
132       WHEN 5 THEN 'waiting_for_network'
133       WHEN 6 THEN 'idle_maintenance'
134       WHEN 7 THEN 'override'
135       ELSE 'unknown'
136       END AS slice_name,
137       'Doze light state' AS track_name,
138       'slice' AS track_type
139FROM doze_light_state_span
140UNION ALL
141SELECT ts,
142       dur,
143       CASE doze_deep_state_val
144       WHEN 0 THEN 'active'
145       WHEN 1 THEN 'inactive'
146       WHEN 2 THEN 'idle_pending'
147       WHEN 3 THEN 'sensing'
148       WHEN 4 THEN 'locating'
149       WHEN 5 THEN 'idle'
150       WHEN 6 THEN 'idle_maintenance'
151       WHEN 7 THEN 'quick_doze_delay'
152       ELSE 'unknown'
153       END AS slice_name,
154       'Doze deep state' AS track_name,
155       'slice' AS track_type
156FROM doze_deep_state_span
157UNION ALL
158SELECT ts,
159       dur,
160       CASE battery_status_val
161       -- 0 and 1 are both unknown
162       WHEN 2 THEN 'Charging'
163       WHEN 3 THEN 'Discharging'
164       -- special case when charger is present but battery isn't charging
165       WHEN 4 THEN 'Not charging'
166       WHEN 5 THEN 'Full'
167       ELSE 'unknown'
168       END AS slice_name,
169       'Charging state' AS track_name,
170       'slice' AS track_type
171FROM battery_status_span
172UNION ALL
173SELECT ts,
174       dur,
175       CASE plug_type_val
176       WHEN 0 THEN 'None'
177       WHEN 1 THEN 'AC'
178       WHEN 2 THEN 'USB'
179       WHEN 4 THEN 'Wireless'
180       WHEN 8 THEN 'Dock'
181       ELSE 'unknown'
182       END AS slice_name,
183       'Plug type' AS track_name,
184       'slice' AS track_type
185FROM plug_type_span;
186
187DROP VIEW IF EXISTS android_batt_output;
188CREATE VIEW android_batt_output AS
189SELECT AndroidBatteryMetric(
190  'battery_counters', (
191    SELECT RepeatedField(
192      AndroidBatteryMetric_BatteryCounters(
193        'timestamp_ns', ts,
194        'charge_counter_uah', charge_uah,
195        'capacity_percent', capacity_percent,
196        'current_ua', current_ua,
197        'current_avg_ua', current_avg_ua
198      )
199    )
200    FROM android_battery_charge
201  ),
202  'battery_aggregates', (
203    SELECT NULL_IF_EMPTY(AndroidBatteryMetric_BatteryAggregates(
204      'total_screen_off_ns',
205      SUM(CASE WHEN state = 1.0 AND tbl = 'total' THEN dur ELSE 0 END),
206      'total_screen_on_ns',
207      SUM(CASE WHEN state = 2.0 AND tbl = 'total' THEN dur ELSE 0 END),
208      'total_screen_doze_ns',
209      SUM(CASE WHEN state = 3.0 AND tbl = 'total' THEN dur ELSE 0 END),
210      'sleep_ns',
211      (SELECT SUM(dur) FROM suspend_slice_),
212      'sleep_screen_off_ns',
213      SUM(CASE WHEN state = 1.0 AND tbl = 'sleep' THEN dur ELSE 0 END),
214      'sleep_screen_on_ns',
215      SUM(CASE WHEN state = 2.0 AND tbl = 'sleep' THEN dur ELSE 0 END),
216      'sleep_screen_doze_ns',
217      SUM(CASE WHEN state = 3.0 AND tbl = 'sleep' THEN dur ELSE 0 END),
218      'total_wakelock_ns',
219      (SELECT SUM(ts_end - ts) FROM android_batt_wakelocks_merged)
220      ))
221    FROM (
222      SELECT dur, screen_state_val AS state, 'total' AS tbl
223      FROM screen_state_span
224      UNION ALL
225      SELECT dur, screen_state_val AS state, 'sleep' AS tbl
226      FROM screen_state_span_with_suspend
227    )
228  ),
229  'suspend_period', (
230    SELECT RepeatedField(
231      AndroidBatteryMetric_SuspendPeriod(
232        'timestamp_ns', ts,
233        'duration_ns', dur
234      )
235    )
236    FROM suspend_slice_
237  )
238);
239