SystemHealth
SystemHealth provides access to data about how various system resources are used by applications.
Summary
CPU/GPU headroom APIs are designed to be best used by applications with consistent and intense workload such as games to query the remaining capacity headroom over a short period and perform optimization accordingly. Due to the nature of the fast job scheduling and frequency scaling of CPU and GPU, the headroom by nature will have "TOCTOU" problem which makes it less suitable for apps with inconsistent or low workload to take any useful action but simply monitoring. And to avoid oscillation it's not recommended to adjust workload too frequent (on each polling request) or too aggressively. As the headroom calculation is more based on reflecting past history usage than predicting future capacity. Take game as an example, if the API returns CPU headroom of 0 in one scenario (especially if it's constant across multiple calls), or some value significantly smaller than other scenarios, then it can reason that the recent performance result is more CPU bottlenecked. Then reducing the CPU workload intensity can help reserve some headroom to handle the load variance better, which can result in less frame drops or smooth FPS value. On the other hand, if the API returns large CPU headroom constantly, the app can be more confident to increase the workload and expect higher possibility of device meeting its performance expectation. App can also use thermal APIs to read the current thermal status and headroom first, then poll the CPU and GPU headroom if the device is (about to) getting thermal throttled. If the CPU/GPU headrooms provide enough significance such as one valued at 0 while the other at 100, then it can be used to infer that reducing CPU workload could be more efficient to cool down the device. There is a caveat that the power controller may scale down the frequency of the CPU and GPU due to thermal and other reasons, which can result in a higher than usual percentage usage of the capacity.
        Enumerations | 
    |
|---|---|
        ACpuHeadroomCalculationType{
       | 
      enum | 
        AGpuHeadroomCalculationType{
       | 
      enum | 
        Typedefs | 
    |
|---|---|
        ACpuHeadroomCalculationType
       | 
      typedef | 
        ACpuHeadroomParams
       | 
      typedefstruct ACpuHeadroomParams
        Params used to customize the calculation of CPU headroom.   | 
    
        AGpuHeadroomCalculationType
       | 
      typedef | 
        AGpuHeadroomParams
       | 
      typedefstruct AGpuHeadroomParams
        Params used to customize the calculation of GPU headroom.   | 
    
        Functions | 
    |
|---|---|
        ACpuHeadroomParams_create(void)
       | 
      
        ACpuHeadroomParams *_Nonnull
        Creates a new instance of ACpuHeadroomParams.  
       | 
    
        ACpuHeadroomParams_destroy(ACpuHeadroomParams *_Nullable params)
       | 
      
        void
        Deletes the ACpuHeadroomParams instance.  
       | 
    
        ACpuHeadroomParams_getCalculationType(ACpuHeadroomParams *_Nonnull params)
       | 
      
        
         Gets the CPU headroom calculation type in ACpuHeadroomParams.  
       | 
    
        ACpuHeadroomParams_getCalculationWindowMillis(ACpuHeadroomParams *_Nonnull params)
       | 
      
        int
        Gets the CPU headroom calculation window size in milliseconds.  
       | 
    
        ACpuHeadroomParams_setCalculationType(ACpuHeadroomParams *_Nonnull params, ACpuHeadroomCalculationType calculationType)
       | 
      
        void
        Sets the CPU headroom calculation type in ACpuHeadroomParams.  
       | 
    
        ACpuHeadroomParams_setCalculationWindowMillis(ACpuHeadroomParams *_Nonnull params, int windowMillis)
       | 
      
        void
        Sets the CPU headroom calculation window size in milliseconds.  
       | 
    
        ACpuHeadroomParams_setTids(ACpuHeadroomParams *_Nonnull params, const int *_Nonnull tids, size_t tidsSize)
       | 
      
        void
        Sets the thread TIDs to track in ACpuHeadroomParams.  
       | 
    
        AGpuHeadroomParams_create(void)
       | 
      
        AGpuHeadroomParams *_Nonnull
        Creates a new instance of AGpuHeadroomParams.  
       | 
    
        AGpuHeadroomParams_destroy(AGpuHeadroomParams *_Nullable params)
       | 
      
        void
        Deletes the AGpuHeadroomParams instance.  
       | 
    
        AGpuHeadroomParams_getCalculationType(AGpuHeadroomParams *_Nonnull params)
       | 
      
        
         Gets the GPU headroom calculation type in AGpuHeadroomParams.  
       | 
    
        AGpuHeadroomParams_getCalculationWindowMillis(AGpuHeadroomParams *_Nonnull params)
       | 
      
        int
        Gets the GPU headroom calculation window size in milliseconds.  
       | 
    
        AGpuHeadroomParams_setCalculationType(AGpuHeadroomParams *_Nonnull params, AGpuHeadroomCalculationType calculationType)
       | 
      
        void
        Sets the GPU headroom calculation type in AGpuHeadroomParams.  
       | 
    
        AGpuHeadroomParams_setCalculationWindowMillis(AGpuHeadroomParams *_Nonnull params, int windowMillis)
       | 
      
        void
        Sets the GPU headroom calculation window size in milliseconds.  
       | 
    
        ASystemHealth_getCpuHeadroom(const ACpuHeadroomParams *_Nullable params, float *_Nonnull outHeadroom)
       | 
      
        int
        Provides an estimate of available CPU capacity headroom of the device.  
       | 
    
        ASystemHealth_getCpuHeadroomCalculationWindowRange(int32_t *_Nonnull outMinMillis, int32_t *_Nonnull outMaxMillis)
       | 
      
        int
        Gets the range of the calculation window size for CPU headroom.  
       | 
    
        ASystemHealth_getCpuHeadroomMinIntervalMillis(int64_t *_Nonnull outMinIntervalMillis)
       | 
      
        int
        Gets minimum polling interval for calling ASystemHealth_getCpuHeadroom in milliseconds.  
       | 
    
        ASystemHealth_getGpuHeadroom(const AGpuHeadroomParams *_Nullable params, float *_Nonnull outHeadroom)
       | 
      
        int
        Provides an estimate of available GPU capacity headroom of the device.  
       | 
    
        ASystemHealth_getGpuHeadroomCalculationWindowRange(int32_t *_Nonnull outMinMillis, int32_t *_Nonnull outMaxMillis)
       | 
      
        int
        Gets the range of the calculation window size for GPU headroom.  
       | 
    
        ASystemHealth_getGpuHeadroomMinIntervalMillis(int64_t *_Nonnull outMinIntervalMillis)
       | 
      
        int
        Gets minimum polling interval for calling ASystemHealth_getGpuHeadroom in milliseconds.  
       | 
    
        ASystemHealth_getMaxCpuHeadroomTidsSize(size_t *_Nonnull outSize)
       | 
      
        int
        Gets the maximum number of TIDs this device supports for getting CPU headroom.  
       | 
    
Enumerations
ACpuHeadroomCalculationType
Declared inandroid/system_health.h
    ACpuHeadroomCalculationType
AGpuHeadroomCalculationType
Declared inandroid/system_health.h
    AGpuHeadroomCalculationType
Typedefs
ACpuHeadroomCalculationType
Declared inandroid/system_health.h
    enum ACpuHeadroomCalculationType ACpuHeadroomCalculationType
ACpuHeadroomParams
Declared inandroid/system_health.h
    struct ACpuHeadroomParams ACpuHeadroomParams
Params used to customize the calculation of CPU headroom.
Also see ASystemHealth_getCpuHeadroom.
AGpuHeadroomCalculationType
Declared inandroid/system_health.h
    enum AGpuHeadroomCalculationType AGpuHeadroomCalculationType
AGpuHeadroomParams
Declared inandroid/system_health.h
    struct AGpuHeadroomParams AGpuHeadroomParams
Params used to customize the calculation of GPU headroom.
Also see ASystemHealth_getGpuHeadroom.
Functions
ACpuHeadroomParams_create
Declared inandroid/system_health.h
    ACpuHeadroomParams *_Nonnull ACpuHeadroomParams_create( void )
Creates a new instance of ACpuHeadroomParams.
When the client finishes using ACpuHeadroomParams, ACpuHeadroomParams_destroy must be called to destroy and free up the resources associated with ACpuHeadroomParams.
Available since API level 36.
| Details | |
|---|---|
| Returns | 
               A new instance of ACpuHeadroomParams.  
             | 
          
ACpuHeadroomParams_destroy
Declared inandroid/system_health.h
    void ACpuHeadroomParams_destroy( ACpuHeadroomParams *_Nullable params )
Deletes the ACpuHeadroomParams instance.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          
ACpuHeadroomParams_getCalculationType
Declared inandroid/system_health.h
    ACpuHeadroomCalculationType ACpuHeadroomParams_getCalculationType( ACpuHeadroomParams *_Nonnull params )
Gets the CPU headroom calculation type in ACpuHeadroomParams.
This will return the default value chosen by the device if not set.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               The headroom calculation type.  
             | 
          
ACpuHeadroomParams_getCalculationWindowMillis
Declared inandroid/system_health.h
    int ACpuHeadroomParams_getCalculationWindowMillis( ACpuHeadroomParams *_Nonnull params )
Gets the CPU headroom calculation window size in milliseconds.
This will return the default value chosen by the device if not set.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               This will return the default value chosen by the device if the params is not set.  
             | 
          
ACpuHeadroomParams_setCalculationType
Declared inandroid/system_health.h
    void ACpuHeadroomParams_setCalculationType( ACpuHeadroomParams *_Nonnull params, ACpuHeadroomCalculationType calculationType )
Sets the CPU headroom calculation type in ACpuHeadroomParams.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          
ACpuHeadroomParams_setCalculationWindowMillis
Declared inandroid/system_health.h
    void ACpuHeadroomParams_setCalculationWindowMillis( ACpuHeadroomParams *_Nonnull params, int windowMillis )
Sets the CPU headroom calculation window size in milliseconds.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          
ACpuHeadroomParams_setTids
Declared inandroid/system_health.h
    void ACpuHeadroomParams_setTids( ACpuHeadroomParams *_Nonnull params, const int *_Nonnull tids, size_t tidsSize )
Sets the thread TIDs to track in ACpuHeadroomParams.
The TIDs should belong to the same of the process that will make the headroom call. And they should not have different core affinity.
If not set or set to empty, the headroom will be based on the PID of the process making the call.
Available since API level 36.
| Details | |||||||
|---|---|---|---|---|---|---|---|
| Parameters | 
              
  | 
          
AGpuHeadroomParams_create
Declared inandroid/system_health.h
    AGpuHeadroomParams *_Nonnull AGpuHeadroomParams_create( void )
Creates a new instance of AGpuHeadroomParams.
When the client finishes using AGpuHeadroomParams, AGpuHeadroomParams_destroy must be called to destroy and free up the resources associated with AGpuHeadroomParams.
Available since API level 36.
| Details | |
|---|---|
| Returns | 
               A new instance of AGpuHeadroomParams.  
             | 
          
AGpuHeadroomParams_destroy
Declared inandroid/system_health.h
    void AGpuHeadroomParams_destroy( AGpuHeadroomParams *_Nullable params )
Deletes the AGpuHeadroomParams instance.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          
AGpuHeadroomParams_getCalculationType
Declared inandroid/system_health.h
    AGpuHeadroomCalculationType AGpuHeadroomParams_getCalculationType( AGpuHeadroomParams *_Nonnull params )
Gets the GPU headroom calculation type in AGpuHeadroomParams.
This will return the default value chosen by the device if not set.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               The headroom calculation type.  
             | 
          
AGpuHeadroomParams_getCalculationWindowMillis
Declared inandroid/system_health.h
    int AGpuHeadroomParams_getCalculationWindowMillis( AGpuHeadroomParams *_Nonnull params )
Gets the GPU headroom calculation window size in milliseconds.
This will return the default value chosen by the device if not set.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               This will return the default value chosen by the device if the params is not set.  
             | 
          
AGpuHeadroomParams_setCalculationType
Declared inandroid/system_health.h
    void AGpuHeadroomParams_setCalculationType( AGpuHeadroomParams *_Nonnull params, AGpuHeadroomCalculationType calculationType )
Sets the GPU headroom calculation type in AGpuHeadroomParams.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          
AGpuHeadroomParams_setCalculationWindowMillis
Declared inandroid/system_health.h
    void AGpuHeadroomParams_setCalculationWindowMillis( AGpuHeadroomParams *_Nonnull params, int windowMillis )
Sets the GPU headroom calculation window size in milliseconds.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          
ASystemHealth_getCpuHeadroom
Declared inandroid/system_health.h
    int ASystemHealth_getCpuHeadroom( const ACpuHeadroomParams *_Nullable params, float *_Nonnull outHeadroom )
Provides an estimate of available CPU capacity headroom of the device.
The value can be used by the calling application to determine if the workload was CPU bound and then take action accordingly to ensure that the workload can be completed smoothly. It can also be used with the thermal status and headroom to determine if reducing the CPU bound workload can help reduce the device temperature to avoid thermal throttling.
If the params are valid, each call will perform at least one synchronous binder transaction that can take more than 1ms. So it's not recommended to call or wait for this on critical threads. Some devices may implement this as an on-demand API with lazy initialization, so the caller should expect higher latency when making the first call (especially with non-default params) since app starts or after changing params, as the device may need to change its data collection.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          ||||
| Returns | 
               0 on success. EPIPE if failed to get the CPU headroom. EPERM if the TIDs do not belong to the same process. ENOTSUP if API or requested params is unsupported.  
             | 
          
ASystemHealth_getCpuHeadroomCalculationWindowRange
Declared inandroid/system_health.h
    int ASystemHealth_getCpuHeadroomCalculationWindowRange( int32_t *_Nonnull outMinMillis, int32_t *_Nonnull outMaxMillis )
Gets the range of the calculation window size for CPU headroom.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          ||||
| Returns | 
               0 on success. ENOTSUP if API is unsupported.  
             | 
          
ASystemHealth_getCpuHeadroomMinIntervalMillis
Declared inandroid/system_health.h
    int ASystemHealth_getCpuHeadroomMinIntervalMillis( int64_t *_Nonnull outMinIntervalMillis )
Gets minimum polling interval for calling ASystemHealth_getCpuHeadroom in milliseconds.
The ASystemHealth_getCpuHeadroom API may return cached result if called more frequently than the interval.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               0 on success. ENOTSUP if API is unsupported.  
             | 
          
ASystemHealth_getGpuHeadroom
Declared inandroid/system_health.h
    int ASystemHealth_getGpuHeadroom( const AGpuHeadroomParams *_Nullable params, float *_Nonnull outHeadroom )
Provides an estimate of available GPU capacity headroom of the device.
The value can be used by the calling application to determine if the workload was GPU bound and then take action accordingly to ensure that the workload can be completed smoothly. It can also be used with the thermal status and headroom to determine if reducing the GPU bound workload can help reduce the device temperature to avoid thermal throttling.
If the params are valid, each call will perform at least one synchronous binder transaction that can take more than 1ms. So it's not recommended to call or wait for this on critical threads. Some devices may implement this as an on-demand API with lazy initialization, so the caller should expect higher latency when making the first call (especially with non-default params) since app starts or after changing params, as the device may need to change its data collection.
Available since API level 36
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          ||||
| Returns | 
               0 on success. EPIPE if failed to get the GPU headroom. ENOTSUP if API or requested params is unsupported.  
             | 
          
ASystemHealth_getGpuHeadroomCalculationWindowRange
Declared inandroid/system_health.h
    int ASystemHealth_getGpuHeadroomCalculationWindowRange( int32_t *_Nonnull outMinMillis, int32_t *_Nonnull outMaxMillis )
Gets the range of the calculation window size for GPU headroom.
Available since API level 36.
| Details | |||||
|---|---|---|---|---|---|
| Parameters | 
              
  | 
          ||||
| Returns | 
               0 on success. ENOTSUP if API is unsupported.  
             | 
          
ASystemHealth_getGpuHeadroomMinIntervalMillis
Declared inandroid/system_health.h
    int ASystemHealth_getGpuHeadroomMinIntervalMillis( int64_t *_Nonnull outMinIntervalMillis )
Gets minimum polling interval for calling ASystemHealth_getGpuHeadroom in milliseconds.
The ASystemHealth_getGpuHeadroom API may return cached result if called more frequently than the interval.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               0 on success. ENOTSUP if API is unsupported.  
             | 
          
ASystemHealth_getMaxCpuHeadroomTidsSize
Declared inandroid/system_health.h
    int ASystemHealth_getMaxCpuHeadroomTidsSize( size_t *_Nonnull outSize )
Gets the maximum number of TIDs this device supports for getting CPU headroom.
See ACpuHeadroomParams_setTids.
Available since API level 36.
| Details | |||
|---|---|---|---|
| Parameters | 
              
  | 
          ||
| Returns | 
               0 on success. ENOTSUP if the CPU headroom API is unsupported.  
             |