This browser tool reads an AndroidManifest.xml and identifies permission lines that trigger an extra Google Play Console declaration or an Android 14+ foreground service permission. For each relevant line, it names the declaration or permission form Play asks you to complete. The manifest is processed in your browser; nothing is uploaded.
Reads AndroidManifest.xml and names every line that forces an extra Google Play Console declaration or an Android 14+ foreground-service permission, with the form Play will ask you to fill. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
VS Code MarketplacenpmMCP server (npx)Docker Hubext install ReadyStack.play-declaration-gap-lint npx @readystack/play-declaration-gap-lint <file> npx @readystack/play-declaration-gap-lint --mcp
Team? One key for every ReadyStack linter, 5 seats, $149 once
Sweep every manifest in the workspace, library and SDK modules included, and write a dated playDecl-report.md declaration worksheet you keep in the repository
One payment, one licence key for this tool. The key is shown right after payment.
A freelance Android release engineer bills $60-$120 an hour; reading a multi-module app's manifests against every current Play declaration is most of a working day
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.
A 58-line AndroidManifest.xml comes back with 19 findings — 15 of them errors — the moment an Android developer measures it against what Google Play asks to be declared, rather than against the Android SDK.
That is what the 15 checks in Play Declaration Gap Lint return on the sample manifest shipped with the extension: 17 permissions, 3 services, 58 lines, 19 findings, 15 errors, 4 warnings. All 15 checks fire on that file, naming 14 Play Console surfaces plus one thing that is not a form at all.
Android Lint measures your manifest against the SDK: is the attribute spelled right, is the permission known, is the component exported. It says nothing about the second life a manifest line has — some permissions open a form in Play Console that a human reviewer reads before your update ships. QUERY_ALL_PACKAGES opens the App visibility declaration; MANAGE_EXTERNAL_STORAGE opens All files access; ACCESS_BACKGROUND_LOCATION opens the Location permissions declaration and wants a video of the feature. READ_SMS, READ_MEDIA_IMAGES, the android.permission.health.* family, exact alarms and the advertising ID each have their own answer waiting in the console. None of them stop the build.
One check is different. Since Android 14 (API 34) a foreground service must declare its type, and each type needs its own permission: foregroundServiceType="location" needs FOREGROUND_SERVICE_LOCATION, "camera" needs FOREGROUND_SERVICE_CAMERA, "specialUse" needs FOREGROUND_SERVICE_SPECIAL_USE and a PROPERTY_SPECIAL_USE_FGS_SUBTYPE property inside the same service element. When the permission is missing the app compiles, installs, and throws a SecurityException the first time the service starts. In the sample manifest three services trip exactly that, which is why the run returns 15 errors rather than 12.
This is the failure mode of generated code: an assistant writes the permission the feature needs, not the declaration behind it, and it cannot see which service Play will ask about. The manifest looks finished. The upload is where it is not.
Timing matters this year: Google Play's yearly target API requirement lands on 2026-08-31, when updates have to target API 36. An app sitting on an older target crosses the API 34 and API 35 foreground service rules on the way there, all at once.
The free part is the whole job on one file: open an AndroidManifest.xml, run "Play Declaration Gap: Check this file", and every triggering line is marked in the Problems panel with its line number and the Play surface it belongs to. No key, no limit, no watermark. The identical engine runs in the browser on the product page, so a reviewer without VS Code can paste a manifest; nothing is uploaded. On the clean sample manifest — 44 lines, a <queries> block, a dataSync service with its permission in place — the run returns 0 errors and 1 warning: that service still needs a use case in the foreground service declaration.
The licensed part changes the scope, not the depth: it sweeps every manifest the workspace holds — app module, library modules, the merged manifests SDKs bring in — into a dated playDecl-report.md, one block per manifest, so whoever fills in Play Console reads a file instead of a screenshot. That sweep asks for a licence key, $29 once, one key per person or CI seat.
For comparison: a freelance Android release engineer bills $60-$120 an hour, and walking a multi-module app's manifests against every current Play declaration is most of a working day.
It reads an AndroidManifest.xml and marks every line that Google Play treats as a declaration, not just a permission. The 15 checks cover app visibility, all files access, background location, SMS and call log, install unknown apps, photo and video, Health Connect, full-screen intent, exact alarms, the advertising ID, accessibility bindings, and the three foreground service rules.
Android developers and release engineers who upload to Google Play, and the person who reviews a manifest before a release branch is cut. It is most useful on manifests assembled by an assistant or merged in from an SDK, where a permission arrives without anyone deciding who will answer the Play Console form behind it.
Android Lint checks the manifest against the SDK, not against Play policy, so it stays quiet about declaration forms. A chatbot cannot see your file and will not know that your specialUse service is missing its subtype property. This runs on the file itself, offline, and prints a line number for each of the 15 checks.
The file open in your editor is free forever, with no key, no limit and no watermark: all 15 checks, marked in the Problems panel and listed in the output channel. The licensed part is scope and ownership - sweeping every manifest in the workspace, library modules included, into a dated playDecl-report.md you keep.
A freelance Android release engineer bills roughly $60-$120 an hour, and walking a multi-module app's manifests against every current Play declaration takes most of a working day. A single policy rejection costs more than the hours: the release waits for a re-review while the fix sits in a build queue.
A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Play Declaration Gap Lint (AndroidManifest) checks the file you open against 15 rules from a rule set dated 2026-09-20, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →