In order to manage custom applications, MANAGED INFO must be set as a companion in the AMAPI policy. This can be achieved either through extensionConfig, or the new ROLE application policy setting.
Without this configured, MANAGED INFO cannot install (or remove) packages.
This document explains how to configure your EMM to deploy APK packages to devices using MANAGED INFO.
MANAGED INFO includes a built-in Package manager which handles downloading, validating, installing, updating, and uninstalling APKs via Android Management API (AMAPI) custom app deployment.
Administrators only need to configure the policy and define managed configuration correctly; the package manager does the rest.
The Package manager treats the managed configuration as the source of truth for which apps should be present on the device.
On every run (config change or scheduled reconcile), it:
The package manager runs:
No manual intervention is required.
MANAGED INFO uses the Android Management API command client on the device to install and uninstall APKs as custom apps. For this to work reliably, your AMAPI policy must:
COMPANION_APP role, as described in the Android Management API application roles documentation.A minimal example AMAPI policy snippet might look like:
{
"applications": [
{
"packageName": "org.bayton.managedinfo",
"installType": "REQUIRED_FOR_SETUP",
"defaultPermissionPolicy": "GRANT",
"signingKeyCerts": [
{
"signingKeyCertFingerprintSha256": "<base64-encoded SHA-256 of MANAGED INFO signing cert>"
}
],
"roles": [
{ "roleType": "COMPANION_APP" }
],
"managedConfiguration": {
"<package_manager_configuration_keys_go_here>": "<values>"
}
},
{
"packageName": "com.example.customapp",
"installType": "CUSTOM",
"defaultPermissionPolicy": "GRANT",
"signingKeyCerts": [
{
"signingKeyCertFingerprintSha256": "<base64-encoded SHA-256 of custom app signing cert>"
}
],
"customAppConfig": {
"userUninstallSettings": "DISALLOW_UNINSTALL_BY_USER"
}
}
]
}
The above clearly omits any managed configuration, which should be handled through the EMM.
applications array as custom apps (using installType": "CUSTOM" and customAppConfig), as described in the Manage custom apps with AMAPI guide. MANAGED INFO then uses InstallCustomApp device commands against those declared custom apps.BLOCKED entries for packages you plan to deploy with MANAGED INFO, or global restrictions that would prevent the app from installing non-Play custom APKs.Each APK entry in the managed configuration must contain the following fields:
Package name (required)
The Android package name, e.g. com.example.myapp
APK download URL (required)
A direct HTTPS link to the APK file. the package manager fetches and stages this in its internal cache.
Note: The application size of MANAGED INFO will increase in line with all cached packages. This is not an issue, but do ensure the device has enough space to hold effectively two copies of the same package while the file remains in cache.
Version code (recommended)
The versionCode the package manager should ensure is installed.
Behaviour:
Signing certificate SHA-256 (optional but strongly recommended)
The SHA-256 fingerprint of the APK’s signing certificate.
Supports:
The package manager normalises and validates it before install.
APK file SHA-256 (optional)
Hash of the APK file itself. Ensures the downloaded file matches what you intended to deploy.
When an entry is present:
InstallCustomApp command.pmStatusKey(pkg) (SUCCESS, FAILURE, PENDING)pmStatusMsgKey(pkg) (human-readable explanation)PM_ASSIGNED_INDEX (list of managed apps)If the install succeeds, the app is added to the index.
If it fails, the error is recorded but the entry stays in the index so future reconcile cycles can retry.
Updates require only bumping the versionCode in the EMM.
The package manager will:
If the installed version is already higher than what you configured, MANAGED INFO does not downgrade it.
When an app is removed from managed config:
UninstallCustomApp.Outcomes:
Successful uninstall
AMAPI refuses uninstall (e.g. STATUS_FAILURE_NOT_CUSTOM)
App manually uninstalled
Single APK entry
packageName: "com.example.app"
apkUrl: "https://downloads.example.com/app-release-42.apk"
versionCode: 42
certSha256: "A1:B2:C3:...:FF"
apkSha256: "1234abcd..."
Multiple APK entries
Provide each app as its own row/entry in the EMM.
The package manager handles them independently, so one app failing will not block others.
MANAGED INFO includes several safeguards to prevent repeated or unnecessary downloads of APK files. These optimisations are crucial when devices operate on limited bandwidth networks, metered mobile data, or environments where large file transfer costs accumulate.
To keep network usage efficient, the package manager:
Only downloads when a change is detected Before attempting any download, the package manager checks:
versionCode in the managed configuration is higher.If the installed version is already equal to or newer than what the configuration requests, the package manager skips all network operations.
Caches staged APKs where possible
Downloaded APKs are saved into the custom APK staging directory.
When the package manager runs again, it checks:
If both are true, the package manager bypasses downloading and reuses the existing staged file.
Avoids re-downloading on certificate mismatch retries If a certificate or file hash mismatch occurs:
This prevents “retry storms” caused by servers returning transient or mismatched builds.
Uses index-based reconciliation instead of re-fetching
The package manager uses an index to determine what has already been handled.
This means:
..then the package manager does not download the APK again, even during periodic reconciles.
Periodic runs never force a download Scheduled reconciles (those triggered by the EMM policy rather than a config change) only verify:
They do not trigger downloads unless a valid install is required.
These measures ensure APK deployment is efficient, predictable, and safe for environments where bandwidth or data cost must be tightly controlled.
Hash mismatch Check you’re providing:
Uninstall consistently fails Most common cause:
MANAGED INFO will show:
Uninstall rejected by AMAPI (likely not installed as a custom app)
In this case, remove the app using your normal EMM app policy or via other remediation.
APK does not download Check:
Are you in need of further help, or would you like to raise a feature request? You can: