Wawasan

How to Preload Apps on Android Devices at Scale

How an application actually reaches a fleet and stays current — the delivery route onto the device, the difference between a preloaded app and a system app, and who owns the signing key, the version and the rollback once the batch has shipped.

Diterbitkan
Diperbarui
Preloading apps on Android devices at scale in a staging workflow
Panduan
Dirancang berdasarkan kondisi penerapan nyata

The Short Answer

Putting an application on a fleet is two decisions, not one, and projects that treat it as one decision usually pay for the second later. The first decision is the delivery route: how the package physically arrives on the device — installed by a management platform after enrolment, staged during provisioning at the bench, written into the shipped image so it is present at first boot, or integrated into a system partition with elevated standing. The second decision is update ownership: who holds the signing key, who decides that a new version ships, how a version is pinned in the build record, and what has to happen physically and commercially for a bad build to be pulled back. The two constrain each other. The deeper an application sits in the build, the more it can do and the more expensive it becomes to change, because a change stops being a store publication and becomes a firmware event with an OEM in the loop. That trade is the whole subject of this page. One boundary is worth stating at the start: this guide covers routes onto the device, not the question of which distribution channel carries the package — public Google Play, managed Google Play or a privately hosted APK is a related decision with its own constraints, and it is settled separately from the placement decisions below.

How an App Reaches the Device: Four Route Families

The routes look interchangeable in a requirements document and behave very differently in the field. A managed install happens after the device enrols: the device policy controller (DPC), set as device owner at provisioning, installs the app on instruction from the management platform, which is also how the app is later updated, replaced or removed. Provisioning-time staging installs the package during the staging run itself, before the unit is boxed, so the device leaves with the app present whether or not it will hold an ongoing management relationship. A factory preload writes the package into the shipped image, which is the route to reach for when the application has to be present at first boot on a device that may never enrol and may never see a network. System integration goes a level further and places the app on a system partition, which is a different thing from a preload and is treated in its own section below. Managed routes are the cheapest to change and the easiest to prove, so the useful discipline is to justify anything heavier rather than default to it; the standard managed distribution behaviours, including install types that block the user-facing uninstall path, are documented in the Android Management API application guidance. Every route below is OEM- and platform-dependent and confirmed per model rather than assumed from a family name.

Delivery routes onto the device — control, update mechanism, removability and the evidence each route owes the sample.
Delivery routeWho controls itHow it updatesUser can uninstall?Survives a factory reset?What the sample must prove
Managed install, force-installed after enrolmentThe management platform and the DPC set as device ownerA new version published to the managed channel and applied at the next check-inNo — the install type blocks the user-facing uninstall path while the policy holdsNot directly; the device re-enrols through the same provisioning route and the app is reinstalledThe app arrives unattended within the agreed window from a clean device, and the uninstall entry is genuinely absent in launcher, settings and app info
Managed install, offered as availableThe management platform, with the user choosing when to installSame managed channel, but only on a device where the user installed itYes — the user may remove it and may never install itNo — reinstall depends on the user acting againThat the workflow tolerates devices where the app is absent, and how that state is detected
Provisioning-time staging at the benchThe staging process; ownership passes to the customer at handoverNothing automatic — a later version needs a management channel, a store or a return to the benchYes, unless a device-owner policy blocks uninstallNo — a reset removes it unless the provisioning route reapplies the whole configurationThe staged unit matches the reference sample package name, version code and signer, verified unit by unit
Factory preload into the data area from an OEM preload regionThe OEM build, agreed in the build specificationStore or managed channel if one exists; otherwise a firmware eventUsually yes — it behaves like a normal installed app once first boot has copied it inTypically yes — the reset restores it from the preload region, which is OEM-dependentThat it is present at first boot with no network, and that it reappears after a documented factory reset
Pre-installed system app on a read-only partitionThe OEM build only — the app team supplies a package, not a placementAn update installs over it into the data area; the factory version stays underneathNo — the user can remove the update and revert to the factory version, and may be able to disable itYes — the partition is untouched by a reset, so the factory version returnsThat the shipped version is the approved one, that an update installs cleanly over it, and that reverting lands on a working build
Privileged or platform-signed system appThe OEM build and the OEM signing processFirmware-level change, or a data-area update that keeps the elevated placement only under defined conditionsNo — removal is not offered; disable behaviour is build-dependentYes — it is part of the imageThat the elevated permissions are actually granted on the shipped build, and that the build boots and passes its compatibility run with the app present

App Preload vs System App Integration

This is the distinction that most often goes unexamined, because both are described in meetings as "the app is preloaded". They are different engineering commitments with different owners. A preload is a placement of an ordinary application so that it is present when the user first switches the device on. A system app integration changes what the application is: its partition, its permission standing, its uninstall behaviour and its relationship to every future firmware build. Five placements are worth separating, and they escalate. A normal installed app lives in the data area, is signed by the app team, is uninstallable unless policy blocks it, and disappears on a factory reset — the app team owns it end to end. A preload staged into the data area at first boot, sourced from an OEM preload or customisation region, looks identical to the user but is restored by a reset; the app team still owns the package and the OEM owns the placement. A pre-installed system app sits on a read-only partition such as the system or product image: the user is not offered an uninstall, only removal of any later update, and the factory version returns after a reset because the partition is never wiped. A privileged application goes further again — placed in the privileged application directory, it may hold permissions the framework will not grant to an ordinary app, and those permissions must appear in the build's privileged permission allowlist, a mechanism documented in the AOSP privileged permission allowlist reference. When enforcement is switched on, a build whose privileged application requests a permission missing from that allowlist can refuse to boot, which is a firmware-level failure discovered on the bench, not a bug report from the field. A platform-signed application is the last step: it is signed with the OEM's platform key, which the OEM controls and rarely shares, and which binds the application to signature-level permissions and to that vendor's builds. Three consequences deserve to be stated plainly before anyone commits. First, everything beyond a normal install needs OEM build participation — the app team can no longer ship the artefact on its own, and the placement is only as available as the OEM's willingness and schedule. Second, each tier re-validates on every firmware change: a security patch, an Android version upgrade or a regional build variant reopens the question of whether the placement, the permissions and the allowlist survived, which is why system integration is recorded as a maintenance obligation rather than a completed task. Third, each tier forecloses something. A platform-signed build ties the application to one vendor and complicates any move to second-source hardware. A privileged placement narrows the device shortlist to vendors that will run the integration at all, and it can affect the build's compatibility submission. And a system placement changes the rollback story: an ordinary app is rolled back by shipping a corrected version, whereas a system placement that is wrong in the image is corrected by a firmware release, a return to the bench, or in the worst case a batch that ships with a known limitation attached. The honest planning rule is to keep the application at the lightest tier that meets the requirement, escalate only against a written requirement that the tier below demonstrably cannot hold, and treat the escalation as a device-selection decision rather than a software one — the broader version of that argument is set out in MDM vs custom Android ROM.

Placement tiers — who must do the work, what signing is required, and what each tier forecloses.
Placement tierWho must do the workSigning requiredUser removal or disableWhat an OS or firmware update does to itWhat it forecloses, and how it is rolled back
Normal installed app (data area)App team alone; no OEM involvementThe app team's own release key, consistent across versionsUninstallable unless a device-owner policy blocks itSurvives the update as an ordinary app; behaviour changes come from the new API level, not the placementForecloses nothing. Rollback is a corrected version published through the same channel
Preload staged into the data area at first bootApp team supplies the package; OEM places it in the buildApp team's release key — but it must match the key used by whatever channel updates it laterUsually removable once first boot has copied it in; a reset restores itGenerally retained, but the preload region is OEM-specific and is re-confirmed on each buildForecloses last-minute version changes once the image is frozen. Rollback means a new image or a channel update over the top
Pre-installed system app (read-only partition)OEM build engineering, against an agreed build specificationApp team key accepted by the OEM build; the key is then fixed for the life of that imageNo uninstall offered; the user can remove a later update and may be able to disable itThe factory copy is replaced by the new image; whether a data-area update is retained depends on version code and the update processForecloses independent hotfixes below the current image version. Rollback to a working state means reverting the update, or a firmware release
Privileged system app (privileged directory plus permission allowlist)OEM build engineering, with a permission allowlist entry per privileged permissionApp team key fixed in the image, plus allowlist entries tied to that signerNo uninstall; disable behaviour is build-dependent and confirmed on the sampleRe-validated on every build — an allowlist omission can stop the build booting when enforcement is onForecloses a wide device shortlist and affects the build's compatibility submission. Rollback is a firmware event with OEM lead time
Platform-signed appOEM build engineering plus the OEM's platform signing processThe OEM platform key, held by the OEM and rarely releasedNo uninstall; the app is part of the platform trust boundaryMust be re-signed and re-integrated for each build the OEM producesForecloses second-source hardware and independent distribution of the same signed artefact. Rollback is a firmware event, and any key change is a migration project

Package Prerequisites That Decide Which Routes Stay Open

Before a route can be chosen, the package has to be understood, because several package properties silently close routes. The package name and the signing identity must be stable across versions: they are what binds an update to an existing installation, and a mismatch does not degrade gracefully — an update signed by a different key than the copy already on the device is refused, so a preload signed with a development key can be permanently unreachable by the production update channel. Runtime permissions matter twice: once for what the app needs to function, and once because a device-owner policy can grant or deny some of them silently, which changes what a first-run test actually proves. Dependence on Google Play services is a route decision rather than a detail, since a package that assumes them will behave differently on a build without them; the GMS vs AOSP comparison covers what that choice removes. Native libraries have to match the device CPU architecture, and a package built only for one architecture quietly excludes part of a device shortlist. Target API level, background execution assumptions, foreground service types and any reliance on being the default handler for an intent all need checking against the exact Android version on the target build rather than the version the app was developed against. None of these are exotic; they are simply the properties that decide whether the lightest route works, and each one is cheaper to confirm in the first week than to discover during a staging run. The full pre-flight list an application team should work through is set out in the app-ready Android device checklist.

  • Package name and signing identity stable across versions and matched to the update channel
  • Runtime permissions reviewed against least-privilege expectations and against what policy grants silently
  • Play services dependence resolved against a GMS or AOSP target before the device shortlist is fixed
  • Native libraries matched to the device CPU architecture across every model in scope
  • Target API level, background execution and default-handler assumptions checked on the exact build

Who Owns the Update After Delivery

Delivery is the easy half. The half that decides whether a fleet stays healthy is who owns the version once units are in the field, and it resolves into four concrete questions that belong in a contract rather than a conversation. The first is key custody. Whoever holds the signing key holds the ability to ship an update at all, because the platform will only accept a new version signed by the same identity as the installed one. If the application is distributed through a store that manages the signing key on the publisher's behalf, the artefact handed to the factory for preload must be the one that store will distribute, not a locally signed build of the same source — otherwise the preloaded copy and the store copy are two different applications as far as the device is concerned, and the store update will not install over the preload. The mechanics, including the difference between an upload key and the signing key and the narrow circumstances in which a key can be rotated, are documented in the Android application signing guide. Key custody also has an exit question attached: if the relationship with the integrator, the OEM or the distributor ends, who can still sign a release. The second question is version pinning. A rollout is only reproducible if the approved version is written down as an exact version code and build identity in the device build specification, alongside the firmware build it was accepted against. A build specification that names an application without pinning its version has not pinned anything, because the artefact will move. Pinning also gives the batch a check that can be performed rather than assumed: every staged unit reports a version, and that version either matches the record or the unit stops. The third question is rollback, and it is the one most often assumed rather than designed. On Android, an installed application will not normally accept a package with a lower version code, and the platform-level rollback support that does exist is narrow and dependent on the installer. In practice, rolling back means publishing a higher version code that contains the previous code — which is only possible if the previous code is still buildable, still signable and still compatible with whatever backend state the bad version created. For a preloaded application the situation is harder again, because the copy in the image does not move: reverting an update returns the device to the factory version, which may be older than the fleet expects, and correcting the image itself is a firmware event with OEM lead time. A rollback plan that survives contact with reality names the artefact, the person who can sign it, the channel that carries it, the expected time to reach a device, and what the fleet does in the interval. The fourth question is the one to test rather than believe: "the app updates itself". That sentence can mean a store-managed update, a management-platform-driven update, an in-app updater that downloads its own package, or nothing at all on a build without the component the updater depends on. Self-update paths frequently need an install permission the device-owner policy has restricted, network access a locked-down configuration does not permit, or a store component that is absent from the target build. Treat it as a claim with a test attached: on the accepted sample, on the accepted build, publish a new version and observe whether it arrives, how long it takes, whether the device needs to be unlocked or attended, and what happens when the update lands mid-shift while a user is in the middle of a task. Update ownership is also a handover item, because the fleet outlives the project: name the person who publishes, the person who approves, and the person who is called when a release goes wrong.

  • Key custody named, including who can still sign a release if the commercial relationship ends
  • Exact version code and build identity pinned in the build specification against a named firmware build
  • Rollback designed as a forward release of the previous code, with a named signer, channel and expected arrival time
  • Self-update behaviour tested on the accepted build rather than accepted as a product statement
  • Publisher, approver and escalation contact named before handover, not after the first bad release

Proving Delivery and Update on the Version-Controlled Sample

A delivery route is a hypothesis until one unit demonstrates it. The version-controlled sample fixes the exact model and regional SKU, the Android version and firmware build, the application package name, version code and signer, the provisioning route and the policy version, so that every statement on this page is attached to something reproducible instead of to a device family. Delivery evidence is behavioural and it starts from a clean device: factory reset the unit, run the intended provisioning route, and time how long it takes for the application to be present and usable without anyone touching it. Then test the states that actually occur — a device that boots with no network, a device that is switched on for the first time weeks after staging, an interrupted first-run setup, a low-storage unit, and a device the user tries to remove the application from. Update evidence needs a second act on the same unit: publish a new version, observe it arriving, confirm the version reported on the device matches what was published, then revert to the previous version by whatever route the rollback plan names and confirm the device is still usable. Removal evidence closes the loop: block the uninstall, then attempt it from the launcher, from settings, from application info and from any file manager or handler the configuration permits, and record what is offered. Results belong in a structured record rather than in a chat thread, which is the purpose of the sample acceptance matrix — scenario, expected behaviour, observed behaviour, verdict, owner — with anything that cannot be closed written into the known-limitations library so the approver sees it before signing. Batch staging then reproduces the accepted state rather than reinventing it: the same image, the same package and version code, the same provisioning route, checked unit by unit against the reference sample with a stop rule when a unit deviates, as described in batch-staged Android devices before delivery. This is why programs are quoted from around 500 units upward with a pilot tranche of twenty to a hundred devices inside the program: the pilot is where the delivery and update routes are confirmed under real conditions, and the remaining units are staged only once that evidence exists.

  • One version-controlled sample fixes model, SKU, firmware build, package, version code, signer, provisioning route and policy version
  • Delivery is timed from a factory-reset device through the real provisioning route, unattended
  • Update and rollback are both exercised on the same unit, not just the first install
  • Uninstall is attempted from every surface the configuration leaves reachable, and the result recorded
  • Batch staging reproduces the accepted state and stops when a unit deviates from the reference

Handling Code and Credentials in the Delivery Chain

Preparing a fleet means handling someone else's code and, often, their credentials. The controls are unremarkable and they are still the ones that get skipped. Package transfer is controlled and the artefact is checked before it enters a build or a staging flow, with the received file matched against a checksum the app team published rather than against a filename. Test accounts use least-privilege credentials issued for the project and revoked at handover, never production secrets, because a staging bench is a shared environment and an APK containing an embedded production token is a longer-lived problem than a failed test. What the application can reach on the device is scoped deliberately through the permissions it requests and the policy applied around it, and any elevated placement is justified in writing rather than granted because it was convenient. These are working practices applied and validated during the build, with results recorded alongside the rest of the acceptance evidence — they are described here as controls, not as an assurance that any deployment is free of risk.

  • Controlled package transfer with a checksum matched against what the app team published
  • Least-privilege project credentials for test accounts, revoked at handover
  • Application data access scoped through requested permissions and applied policy
  • Elevated placement justified in writing rather than granted for convenience

Known Limitations of Preload Routes

The framework above is a planning tool, and it is worth naming where it stops being tidy. Route availability is OEM-, Android-version-, EMM- and hardware-dependent throughout, so a route confirmed on one model is not confirmed on its successor or on a different regional build of the same model.

  • Anything beyond a normal install requires OEM build participation, and is only as available as that OEM's schedule and willingness.
  • System and privileged placements re-validate on every firmware change, including security patches and regional build variants.
  • A signing-key mismatch between a preloaded copy and the update channel is not recoverable in place — the application has to be replaced.
  • A factory reset wipes the data area: managed and bench-staged installs do not survive it, while system-partition placements do.
  • Store and management-platform policies for preinstalled applications change over time and are re-checked per build, not assumed from a previous program.
  • A device that never checks in keeps the version it shipped with; new releases queue and never arrive, and a stale last-seen timestamp can look like a healthy device.

Decide the Route Before the Image Is Frozen

The cheapest moment to correct a delivery decision is before the build is frozen, because after that the same correction is a firmware release rather than a publication. Bring the requirement rather than the preferred mechanism: whether the application must be present with no network on first power-on, whether the user may remove it, whether it must return after a factory reset, what it needs to do that an ordinary application cannot, how often it will change, who will hold the signing key, and the quantity range under discussion. Vantora maps those lines onto a delivery route and a placement tier, states which parts are enforced and which are merely present, confirms the route on a version-controlled sample and records the residual limitations before anything is committed — the provisioning routes that carry the app onto the device are compared in Android device provisioning methods, and the integration work itself sits in App, MDM and Kiosk Integration.

Pertanyaan Umum

Can users uninstall a preloaded app?

It depends entirely on the placement tier, which is why the question is worth asking precisely. An application force-installed by a device policy controller set as device owner has its user-facing uninstall path blocked while that policy holds. An application pre-installed on a read-only system partition offers no uninstall at all — the user can remove a later update and revert to the factory version, and may be able to disable it depending on the build. An application copied into the data area from an OEM preload region usually behaves like an ordinary installed app and can be removed, though a factory reset typically restores it. Each of these is OEM- and platform-dependent and is confirmed on the sample by attempting removal from every surface the configuration leaves reachable, rather than inferred from the route name.

What happens to a preloaded app after a factory reset?

A factory reset wipes the data area and leaves the system partitions intact, so the answer follows the placement. An application on a system partition returns, because it was never removed. An application staged at the bench or installed by a management platform does not return by itself — it comes back only if the provisioning route re-runs and re-enrols the device, which is why the reset scenario belongs in the acceptance matrix as a tested case with a documented recovery time. An application copied from an OEM preload region is typically restored by the reset, but that behaviour is OEM-specific and confirmed per model. A reset also removes the device owner on a standard configuration, so any policy that was blocking uninstall is gone with it until the device re-provisions.

Does a preloaded app survive an OS or firmware update?

Presence usually survives; behaviour is what needs re-checking. A system-partition application is replaced by whatever version the new image carries, so a fleet that had been updating the application through a channel can find itself with a different factory version underneath. A privileged application re-validates on every build, because its permission allowlist entries travel with the image and an omission can stop the build booting when enforcement is on. A platform-signed application must be re-signed and re-integrated for each build. Even for an ordinary installed application, an Android version change can alter background execution, permission and default-handler behaviour. The practical rule is to treat any firmware change as a revalidation trigger with a named owner rather than as a continuation.

Who should hold the app signing key?

Normally the software owner, because the key is what makes a future release possible: the platform accepts a new version only when it is signed by the same identity as the installed one. The point to settle early is that the artefact handed over for preload must be the same signed artefact the update channel will distribute — a locally signed build of the same source is a different application to the device, and the channel update will not install over it. Where a store manages the signing key on the publisher's behalf, that store-signed artefact is the one to preload. The custody question also has an exit clause worth writing down: if the commercial relationship ends, who can still sign and publish a release for devices already in the field.

Can a preloaded app auto-start after first boot?

Auto-start is configurable for MDM/EMM and, for a system-placed application, can be arranged in the build, but it is not a property to assume. Android background execution and battery optimisation behaviour varies by version and by OEM, and several vendors add their own start-up management on top of the framework. A device-owner configuration gives more options than an unmanaged one — a locked-task or kiosk configuration can hold the device in the application from boot — and the exact behaviour is subject to technical validation on the target device and build. Test it the way it will be used: cold boot, boot after a battery-flat shutdown, and boot with no network available.

Can apps be updated offline?

Offline-capable update paths can be arranged — packages staged during a provisioning run, a local update source on the site network, or a return-to-bench cycle for a small fleet — but a store-driven or management-platform-driven update generally needs a network path to the tenant or the store. A device that never connects keeps the version it shipped with and will not report that it is stale, so a fleet with genuinely disconnected sites needs an agreed offline window and a stated method for getting a new version onto those units. The workable approach is confirmed for the specific deployment during validation and written into the acceptance record rather than assumed from the route.

Ceritakan alur kerja dan aturan Anda.

Kami mengubah persyaratan menjadi perangkat yang siap diterapkan.