Security
Mobile App Permission Cleanup: Remove Capabilities After Features Move
Mobile app permission cleanup starts when an app still asks for camera, contacts, location, Bluetooth, microphone, notification, or file access after the feature that needed it moved, narrowed, or disappeared. The permission prompt may be the only visible part of the waste, but the risk sits deeper: old SDKs, fallback screens, background workers, crash recovery paths, and store review declarations can all preserve access that no current product flow should need.
The useful outcome is not simply a smaller manifest. It is a release-ready permission change with feature evidence, runtime checks, store metadata updates, QA coverage, and a rollback plan. Treat every removed permission as a product and security migration, because mobile permissions affect trust, conversion, incident response, and platform review.
Key takeaways
- Start from user journeys and release channels, not from the manifest alone.
- Prove whether native code, third-party SDKs, background tasks, widgets, and deep links still request the capability.
- Remove permission copy, store declarations, analytics assumptions, and QA cases with the manifest entry.
- Stage high-risk permission removals through beta or internal tracks before broad release.
- Prevent recurrence by requiring a removal owner and review date whenever a new permission is introduced.
Trace Permissions to Screens
Inventory each permission with the feature that justified it, the platform prompt users see, and every caller that can trigger it. A stale permission often survives because the feature owner remembers the main screen but not a dormant import, onboarding branch, or SDK configuration file.
| Permission | Evidence to collect | Cleanup signal |
|---|---|---|
| Location | Screens, background modes, geofencing jobs, analytics dimensions | No foreground or background flow still reads coordinates |
| Camera or microphone | Capture screens, upload flows, support diagnostics, SDK prompts | The capture path was removed or replaced by file upload |
| Contacts | Invite flows, matching jobs, consent copy, server endpoints | No current release sends address book data |
| Notifications | Topic subscriptions, permission prompt timing, message categories | The app no longer sends the related notification type |
Search native modules, dependency configuration, feature flags, and release branches. Runtime telemetry matters too: a permission can be declared but never requested, or requested only by an SDK path the team forgot.
Evidence Before Manifest Changes
Use a review record that separates “declared” from “requested” and “requested” from “needed.”
permission_review:
capability: precise_location
declared_in: android_manifest
current_callers:
- store_locator_screen
- legacy_nearby_offer_sdk
last_runtime_request: none in current stable window
proposed_change: remove sdk caller, downgrade to approximate location
This record proves why the permission is a candidate. It does not prove deletion is safe until QA covers upgrade installs, fresh installs, denied permissions, and users moving between app versions.
Do Not Rush Platform Edge Cases
Do not rush permissions used by background tasks, emergency support tools, enterprise builds, white-label variants, or old app versions that still call shared APIs. Also slow down when permission copy appears in legal disclosures, app store privacy forms, onboarding screenshots, or customer security questionnaires.
For risky capabilities, first stop asking for the permission in the current flow while keeping defensive code for older installs. Then remove declarations after the team has observed release telemetry and crash reports. If a third-party SDK causes the prompt, remove or reconfigure the SDK before changing the manifest so the next build does not recreate the issue.
Prevention
Change the creation path. Every new mobile permission should include the owning feature, user-facing reason, platform declaration, telemetry event for prompt display, and an expiration trigger. Add permission review to release readiness when a feature is retired, not only when a security audit complains. The best cleanup is a manifest where every capability still has a current screen, a current owner, and a current user benefit.
FAQ
Is removing a permission always safe if telemetry shows no requests?
No. Telemetry can miss disabled analytics, enterprise builds, rare deep links, and users on old versions. Pair runtime data with code search and QA.
Should old app versions block cleanup forever?
No. Keep compatibility only for supported versions and document the cutoff. Cleanup becomes safer when mobile support windows are explicit.