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