Documentation
¶
Overview ¶
Package parseutils contains the state machine logic to analyze battery history.
Index ¶
- Constants
- Variables
- func BatteryLevelSummariesToCSV(buf io.Writer, summaries *[]ActivitySummary, printDimensions bool)
- type ActivitySummary
- type AnalysisReport
- type AppCPUUsage
- type DCPU
- type DPST
- type DeviceState
- type Dist
- type MultiDist
- type PackageUIDMapping
- type PowerState
- type ServiceUID
- type SortByTimeAndCount
- type Voter
Constants ¶
const ( FormatBatteryLevel = "batteryLevel" FormatTotalTime = "totalTime" BatteryStatsCheckinVersion = "9" HistoryStringPool = "hsp" HistoryData = "h" // Battery history event names. BatteryLevel = "Battery Level" Charging = "Charging on" Foreground = "Foreground process" LongWakelocks = "Long Wakelocks" Plugged = "Plugged" Top = "Top app" )
These constants should be kept consistent with BatteryStats.java.
Variables ¶
var ( // ResetRE is a regular expression to match RESET event. ResetRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "(?P<timeDelta>\\d+)" + ":RESET:TIME:(?P<timeStamp>\\d+)") // ShutdownRE is a regular expression to match SHUTDOWN event. ShutdownRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "(?P<timeDelta>\\d+)" + ":SHUTDOWN") // StartRE is a regular expression to match START event. StartRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "(?P<timeDelta>\\d+):" + "START") // TimeRE is a regular expression to match TIME event. TimeRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "(?P<timeDelta>\\d+)" + ":TIME:(?P<timeStamp>\\d+)") // GenericHistoryLineRE is a regular expression to match any of the history lines. GenericHistoryLineRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "(?P<timeDelta>\\d+).*") // GenericHistoryStringPoolLineRE is a regular expression to match any of the history string pool lines. GenericHistoryStringPoolLineRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryStringPool + "," + "(?P<index>\\d+),(?P<uid>-?\\d+),(?P<service>.+)") // VersionLineRE is a regular expression to match the vers statement in the history log. VersionLineRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + `,\d+,i,vers,(?P<version>\d+),\d+,.*`) // DataRE is a regular expression to match the data event log. DataRE = regexp.MustCompile("(?P<transition>[+-]?)" + "(?P<key>\\w+)" + "(,?(=?(?P<value>\\S+))?)") // OverflowRE is a regular expression that matches OVERFLOW event. OverflowRE = regexp.MustCompile("^" + BatteryStatsCheckinVersion + "," + HistoryData + "," + "\\d+:\\*OVERFLOW\\*") // CheckinApkLineRE is a regular expression that matches the "apk" line in a checkin log. CheckinApkLineRE = regexp.MustCompile("(\\d+,)?(?P<uid>\\d+),l,apk,\\d+,(?P<pkgName>[^,]+),.*") )
Functions ¶
func BatteryLevelSummariesToCSV ¶
func BatteryLevelSummariesToCSV(buf io.Writer, summaries *[]ActivitySummary, printDimensions bool)
BatteryLevelSummariesToCSV writes level summary CSV for the visualization.
Types ¶
type ActivitySummary ¶
type ActivitySummary struct {
Reason string
Active bool
StartTimeMs int64 // Millis
EndTimeMs int64 // Millis
InitialBatteryLevel int
FinalBatteryLevel int
SummaryFormat string
PluggedInSummary Dist
ScreenOnSummary Dist
MobileRadioOnSummary Dist
WifiOnSummary Dist
CPURunningSummary Dist
GpsOnSummary Dist
SensorOnSummary Dist
WifiScanSummary Dist
WifiFullLockSummary Dist
WifiRadioSummary Dist
WifiRunningSummary Dist
WifiMulticastOnSummary Dist
AudioOnSummary Dist
CameraOnSummary Dist
VideoOnSummary Dist
LowPowerModeOnSummary Dist
FlashlightOnSummary Dist
ChargingOnSummary Dist
PhoneCallSummary Dist
PhoneScanSummary Dist
BLEScanSummary Dist
// Stats for total syncs without breaking down by apps.
TotalSyncSummary Dist
// Stats for each individual state.
DataConnectionSummary map[string]Dist // LTE, HSPA
ConnectivitySummary map[string]Dist
ForegroundProcessSummary map[string]Dist
ActiveProcessSummary map[string]Dist
LongWakelockSummary map[string]Dist
TopApplicationSummary map[string]Dist
PerAppSyncSummary map[string]Dist
WakeupReasonSummary map[string]Dist
ScheduledJobSummary map[string]Dist
TmpWhiteListSummary map[string]Dist
IdleModeSummary map[string]Dist
HealthSummary map[string]Dist
PlugTypeSummary map[string]Dist
ChargingStatusSummary map[string]Dist // c, d, n, f
PhoneStateSummary map[string]Dist
WakeLockSummary map[string]Dist
WakeLockDetailedSummary map[string]Dist
WifiSupplSummary map[string]Dist
PhoneSignalStrengthSummary map[string]Dist
WifiSignalStrengthSummary map[string]Dist
UserRunningSummary map[string]Dist
UserForegroundSummary map[string]Dist
// DpstStatsSummary and DcpuStatsSummary shows details of
// app cpu usage and proc stats in each battery steps.
DpstStatsSummary []DPST
DcpuStatsSummary []DCPU
PowerStateSummary []PowerState
// An aggregated summary for DpstStatsSummary and
// DcpuStatsSummary in the whole summary duration.
DpstOverallSummary map[string]time.Duration
DcpuOverallSummary map[string]time.Duration
PowerStateOverallSummary map[string]PowerState
// device state for debug
AlarmSummary map[string]Dist
Date string
}
ActivitySummary contains battery statistics during an aggregation interval. Each entry in here should have a corresponding value in session.proto:Summary.
func (*ActivitySummary) Print ¶
func (s *ActivitySummary) Print(b io.Writer)
Print outputs a string containing aggregated battery stats.
type AnalysisReport ¶
type AnalysisReport struct {
ReportVersion int32
Summaries []ActivitySummary
TimestampsAltered bool
OutputBuffer bytes.Buffer
IdxMap map[string]ServiceUID
Errs []error
OverflowMs int64
// The keys are the unix timestamp in ms, and the values are the human readable time deltas.
TimeToDelta map[string]string
}
AnalysisReport contains fields that are created as a result of analyzing and parsing a history.
func AnalyzeHistory ¶
func AnalyzeHistory(csvWriter io.Writer, history, format string, pum PackageUIDMapping, scrubPII bool) *AnalysisReport
AnalyzeHistory takes as input a complete history log and desired summary format. It then analyzes the log line by line (delimited by newline characters). No summaries (before an OVERFLOW line) are excluded/filtered out.
type AppCPUUsage ¶
type AppCPUUsage struct {
UID string
UserTime time.Duration
SystemTime time.Duration
// contains filtered or unexported fields
}
AppCPUUsage is per app cpu usage in DCPU. It also implements the csv.EntryState interface.
func (*AppCPUUsage) GetKey ¶
func (p *AppCPUUsage) GetKey(metric string) csv.Key
GetKey returns the unique identifier for the entry.
func (*AppCPUUsage) GetStartTime ¶
func (p *AppCPUUsage) GetStartTime() int64
GetStartTime returns the start time of the entry.
func (*AppCPUUsage) GetType ¶
func (p *AppCPUUsage) GetType() string
GetType returns the type of the entry.
func (*AppCPUUsage) GetValue ¶
func (p *AppCPUUsage) GetValue() string
GetValue returns the stored value of the entry.
type DCPU ¶
type DCPU struct {
BatteryLevel int // BatteryLevel here is the starting battery level before battery drop.
Start int64
Duration time.Duration
// We name the following fields exactly the same as in BatteryStats.java.
// In Battery History, time spent in user space and the kernel since the last step.
UserTime time.Duration
SystemTime time.Duration
// Top three apps using CPU in the last step.
CPUUtilizers []AppCPUUsage
}
DCPU are CPU related statistics that detail the entire previous discharge step. Each DCPU comes after the change of Battery Level, it records detailed information about app and corresponding userTime and systemTime for each battery level step.
type DPST ¶
type DPST struct {
BatteryLevel int // BatteryLevel here is the starting battery level before battery drop.
Start int64
Duration time.Duration
// We name the following fields exactly the same as in BatteryStats.java.
// Information from /proc/stat.
StatUserTime time.Duration
StatSystemTime time.Duration
StatIOWaitTime time.Duration
StatIrqTime time.Duration
StatSoftIrqTime time.Duration
StatIdlTime time.Duration
}
DPST are Process related statistics that detail the entire previous discharge step. Each DPST comes after the change of Battery Level, it records detailed information about Proc/stats for each battery level step.
type DeviceState ¶
type DeviceState struct {
CurrentTime int64
LastWakeupTime int64 // To deal with asynchronous arrival of wake reasons
LastWakeupDuration time.Duration // To deal with asynchronous arrival
// The power state summary is printed as an aggregate since boot, so we need to track
// the cummulative in order to split the summary per battery level or discharge session.
CummulativePowerState map[string]*PowerState
// The first Power State value logged in the report. Used to provide a base reference for the timeline values.
InitialPowerState map[string]*PowerState
// Instanteous state
Temperature tsInt
Voltage tsInt
BatteryLevel tsInt
Brightness tsInt
CoulombCharge tsInt
PhoneState tsString
DataConnection tsString // hspa, hspap, lte
PlugType tsString
ChargingStatus tsString
Health tsString
WifiSuppl tsString // dsc, scan, group, compl
PhoneSignalStrength tsString
WifiSignalStrength tsString
UserRunning tsString
UserForeground tsString
IdleMode tsString
// Device State metrics from BatteryStats
CPURunning tsBool
SensorOn tsBool
GpsOn tsBool
WifiFullLock tsBool
WifiScan tsBool
WifiMulticastOn tsBool
MobileRadioOn tsBool
WifiOn tsBool
WifiRadio tsBool
WifiRunning tsBool
PhoneScanning tsBool
BLEScanning tsBool
ScreenOn tsBool
Plugged tsBool
PhoneInCall tsBool
WakeLockHeld tsBool
FlashlightOn tsBool
ChargingOn tsBool
CameraOn tsBool
VideoOn tsBool
AudioOn tsBool
LowPowerModeOn tsBool
WakeLockHolder ServiceUID
WakeupReason ServiceUID
// Map of uid -> serviceUID for all active entities
ActiveProcessMap map[string]*ServiceUID
AppSyncingMap map[string]*ServiceUID
ForegroundProcessMap map[string]*ServiceUID
TopApplicationMap map[string]*ServiceUID // There can only be one on top, so the map will have just one entry
// Connectivity changes are represented in the history log like other applications.
// For example, we get lines like 9,hsp,3,1,"CONNECTED" and 9,hsp,28,1,"DISCONNECTED",
// so they are processed and read into ServiceUID objects by the code down in
// analyzeHistoryLine. So even though changes aren't specific to an app, for the sake
// of simplicity, they are processed like the rest.
ConnectivityMap map[string]*ServiceUID
LongWakelockMap map[string]*ServiceUID
ScheduledJobMap map[string]*ServiceUID
TmpWhiteListMap map[string]*ServiceUID // TmpWhiteList contains apps that are given temporary network access after receiving a high priority GCM message.
// If wakelock_in events are not available, then only the first entity to acquire a
// wakelock gets charged, so the map will have just one entry
WakeLockMap map[string]*ServiceUID
// device state for a debugging event
AlarmMap map[string]*ServiceUID
// Statistics that detail the entire previous discharge step
DpstStats DPST
DcpuStats DCPU
// Not implemented yet
BluetoothOn tsBool
// contains filtered or unexported fields
}
DeviceState maintains the instantaneous state of the device created using battery history events.
All fields of this type must have corresponding initialization code in initStartTimeForAllStates()
type PackageUIDMapping ¶
type PackageUIDMapping struct {
// contains filtered or unexported fields
}
PackageUIDMapping contains a series of mapping between package names and their UIDs.
func UIDAndPackageNameMapping ¶
func UIDAndPackageNameMapping(checkin string, pkgs []*usagepb.PackageInfo) (PackageUIDMapping, []error)
UIDAndPackageNameMapping builds a mapping of UIDs to package names and package names to UIDs. For shared UIDs in the UID to package name map, package names will be combined and delineated by ';'. For logs with multiple users, the package name to UID map will only include the app UID (which excludes the user ID).
type PowerState ¶
type PowerState struct {
// Level of the power state. A higher level represents a deeper (less power consuming) state.
Level int32
// Name of the power state.
Name string
// Voters for this particular power state.
Voters []Voter
// Time spent in this state
Time time.Duration
// Count is how many times this state was entered.
Count int32
// contains filtered or unexported fields
}
PowerState represents one of the low power states that the CPU can go into.
func (*PowerState) GetKey ¶
func (p *PowerState) GetKey(metric string) csv.Key
GetKey returns the unique identifier for the entry.
func (*PowerState) GetStartTime ¶
func (p *PowerState) GetStartTime() int64
GetStartTime returns the start time of the entry.
func (*PowerState) GetType ¶
func (p *PowerState) GetType() string
GetType returns the type of the entry.
func (*PowerState) GetValue ¶
func (p *PowerState) GetValue() string
GetValue returns the stored value of the entry.
type ServiceUID ¶
type ServiceUID struct {
Start int64
// We are treating UIDs as strings.
Service, UID string
Pkg *usagepb.PackageInfo
}
ServiceUID contains the identifying service for battery operations.
func (*ServiceUID) GetKey ¶
func (s *ServiceUID) GetKey(desc string) csv.Key
GetKey returns the unique identifier for the entry. UIDs can have multiple service names, and different UIDs can use the same service name, so we use the UID/Service name pair as the key.
func (*ServiceUID) GetStartTime ¶
func (s *ServiceUID) GetStartTime() int64
GetStartTime returns the start time of the entry.
func (*ServiceUID) GetType ¶
func (s *ServiceUID) GetType() string
GetType returns the type of the entry.
func (*ServiceUID) GetValue ¶
func (s *ServiceUID) GetValue() string
GetValue returns the stored service for the entry.
type SortByTimeAndCount ¶
type SortByTimeAndCount []MultiDist
SortByTimeAndCount sorts MultiDist in descending order of TotalDuration.
func (SortByTimeAndCount) Len ¶
func (a SortByTimeAndCount) Len() int
func (SortByTimeAndCount) Less ¶
func (a SortByTimeAndCount) Less(i, j int) bool
func (SortByTimeAndCount) Swap ¶
func (a SortByTimeAndCount) Swap(i, j int)