Device Trust from Android Enterprise - Available signals

  • Device Trust from Android Enterprise provides device posture signals to registered applications for computing a device trust score.

  • Access to device trust signals is restricted via an allowlist, requiring registration.

  • Available signals include OS version, pending updates, security patch levels, critical app details, device model/brand, screen lock complexity, management state, disk encryption, network state, Google Play Protect status, DNS over TLS status, and WebView package.

  • The management state signals vary depending on whether the application is running within the personal or work profile and the device ownership type.

  • Specific management state signals like Device.WorkProfileState are available starting from particular AMAPI SDK versions.

Device Trust from Android Enterprise makes available a set of device posture signals on Device that authorized applications—including applications on the allowlist and apps assigned the COMPANION_APP role (see Manage application roles and Policy Configuration)—can access to compute a trust score for the device.

Each signal field on Device and its nested model classes includes a corresponding get*Metadata() method returning Metadata, which reports any Metadata.DataIssue encountered when retrieving the signal (such as missing manifest permissions).

For information on how to integrate the Android Management API SDK in your application, see Device Trust from Android Enterprise - Integration guide.

Signals
OS Version
Device#getSoftwareInfo() returns a SoftwareInfo object containing OS version details (older OS versions typically have more vulnerabilities):
Android Device Policy version
SoftwareInfo#getAndroidDevicePolicyVersionCode() and SoftwareInfo#getAndroidDevicePolicyVersionName() return the version code and user-visible version name of the Android Device Policy app on the device.
Does the device have pending OTA
SoftwareInfo#getSystemUpdateInfo() returns a SoftwareInfo.SystemUpdateInfo indicating whether there is a pending OS update for the device (a proxy for whether the device is vulnerable to exploits):
Device Security Patch Level
SoftwareInfo#getDeviceSecurityPatchInfos() returns a list of SoftwareInfo.SecurityPatchInfo objects (with getComponent() and getSecurityPatchLevel() returning a list of SecurityPatchLevel objects) for the current security patch level of the device across updatable SecurityPatchComponent types:
Published Security Patch Level
SoftwareInfo#getPublishedSecurityPatchInfos() returns a list of SoftwareInfo.SecurityPatchInfo objects (with getComponent() and getSecurityPatchLevel() returning a list of SecurityPatchLevel objects) for the current published security patch level across updatable SecurityPatchComponent types:
Critical App Details
Device#getApplicationReports() returns details on all installed applications to extensibility apps and calling applications with role COMPANION_APP on an AMAPI-managed device (see Manage application roles and Policy Configuration; when called inside a work profile, reports are limited to apps installed in the work profile). For all other callers (such as applications on the allowlist), Device#getApplicationReports() returns details only on the following critical apps:
  • com.android.chrome
  • com.google.android.gms
  • com.google.android.apps.work.clouddpc
  • com.android.vending
  • The device's current WebView package (such as com.google.android.webview)
Details are returned as a list of ApplicationReport objects exposing:
Device Hardware Info
Device#getHardwareInfo() returns a HardwareInfo object exposing:
Screen lock complexity
Device#getDeviceSettings() provides DeviceSettings#getScreenLockComplexity(), returning a DeviceSettings.ScreenLockComplexity value indicating how complex the current user's or profile's screen lock is.
Management State (and managing app)
The returned information depends on the profile the application is running in. For details, see the Management state table.
Disk encryption
DeviceSettings#getEncryptionStatus() returns a DeviceSettings.EncryptionStatus value indicating whether the device's storage is encrypted.
Access Network State (Network state and Wi-Fi state)
Device#getNetworkInfo() returns a NetworkInfo object, and NetworkInfo#getNetworkParams() returns a list of NetworkInfo.NetworkParams objects with details about all active networks on the device:
Google Play Protect VerifyApps
Is DNS over TLS enabled
NetworkParams#getPrivateDnsState() returns a PrivateDnsState value indicating whether private DNS is used on the network.
WebView package
SoftwareInfo#getWebviewPackage() returns the name of the current WebView package.
Human-readable business name of the management provider
On AMAPI-managed devices, Device#getManagementProviderInfo() returns a ManagementProviderInfo object whose getBusinessName() method provides the human-readable business name of the management provider. This field isn't set on non-managed devices or devices managed by a custom DPC.

Management state

The values returned for the management signals depend on the profile that your application is running in. Accessing signals from within the Personal Profile, on a non-managed device, or on a device managed by a custom DPC requires your application to be on the allowlist. On an AMAPI-managed fully managed device or from within a Work Profile, applications assigned the COMPANION_APP role can also access these signals without being on the allowlist (limited to signals from the work profile when called inside a work profile).

Management state Signals when called from within the Personal Profile Signals when called from within the Work Profile
Non-managed device ownership: PERSONALLY_OWNED
managementMode: UNMANAGED
managementAppPackageName: N/A
workProfileState:
N/A
Work Profile on personally-owned device (BYOD) ownership: PERSONALLY_OWNED
managementMode: UNMANAGED
managementAppPackageName: N/A
workProfileState:
ownership: PERSONALLY_OWNED
managementMode: PROFILE_OWNER
managementAppPackageName: Package name of the Profile Owner application
workProfileState:
Work Profile on company-owned device ownership: COMPANY_OWNED
managementMode: UNMANAGED
managementAppPackageName:N/A
workProfileState:
ownership: COMPANY_OWNED
managementMode: PROFILE_OWNER
managementAppPackageName: Package name of the Profile Owner application
workProfileState:
Fully managed device N/A ownership: COMPANY_OWNED
managementMode: DEVICE_OWNER
managementAppPackageName: Package name of the Device Owner application
workProfileState: