Last reviewed: 31 August 2026 · HappyMynds · 5 min read
ADB and intent URLs you can build in a tab (and still run on a device)
DroidXP will print adb and intent:// strings. Platform-tools and a phone still do the work. This guide is the handoff we use so QA does not confuse a green parse with a working campaign link.
What the browser will not do
No WebUSB ADB. No pairing codes. No Digital Asset Links fetch. The ADB command generator concatenates flags and quotes paths. The Intent URL generator builds a Chrome intent:// fragment. The Deep link tester parses lines and emits am start. That is all. If the page ever looks like a device panel, it is a bug — write us on Contact.
Desk sequence
- Install platform-tools. Confirm
adb versionprints a build, not “command not found.” adb deviceson your machine. Unauthorized devices showunauthorizeduntil you accept the RSA prompt. Copy the serial into the generator if more than one device is attached (emulator-5554vs a physical serial).- Confirm the installed package:
adb shell pm list packages | findstr notes(Windows) orgrep notes. Debug flavors often installcom.example.notes.debugwhile the marketing URL still usespackage=com.example.notes. - Build or paste the https / custom-scheme / intent URL. Syntax-check the sheet in the tester. A missing
://or a space in the host is a parse error, not an Android bug. - If you need a Chrome fallback, generate
S.browser_fallback_url. Percent-encode it. A raw&inside the fallback will truncate the intent extras. - Run the emitted
am start -a android.intent.action.VIEW -d '…'on the device that has the matchingapplicationId. - Then tap the same URL from Notes, Gmail, and Chrome. Those three disagree often enough to matter. Record which one failed in the ticket — “deep link broken” is not a repro.
Worked example
Intent URL (production id):
intent://app.example.com/note/42#Intent;scheme=https;package=com.example.notes;S.browser_fallback_url=https%3A%2F%2Fapp.example.com%2Fnote%2F42;end
ADB line the tester will approximate:
adb -s emulator-5554 shell am start -a android.intent.action.VIEW -d "https://app.example.com/note/42"
If the emulator has com.example.notes.debug installed, package=com.example.notes falls through to the fallback in Chrome, while am start with the https URL may still open the debug app if the intent-filter host matches. That is the bug report we keep writing. Put the flavor id in the ticket.
Expected success from am start looks like Starting: Intent { act=android.intent.action.VIEW dat=https://app.example.com/... }. Error: Activity not started, unable to resolve Intent means no exported activity claimed that data. Fix the filter or the exported flag — do not add more query parameters hoping Android will guess.
Debug vs release applicationId
Flavor suffixes are the most common “it works on my emulator.” applicationIdSuffix ".debug" changes the listing identity. Intent URLs that hard-code package= must match the installed id, not the source namespace. The activity that owns the filter must also be android:exported="true" on API 31+. A missing attribute installs on older emulators and dies on a Pixel 14. See exported after Android 12.
Check the merged text manifest (apktool or CI artifact), not only app/src/main/AndroidManifest.xml. Library manifests merge VIEW filters you did not write. The Manifest Validator will accept well-formed XML that still fails the exported rule — it does not walk every component yet.
Why ADB is not Gmail
am start asks the package manager to resolve a VIEW intent. Chrome’s intent:// parser and email clients add their own rules (rewrites, preview crawlers, blocked custom schemes). Gmail on Android often wraps links in a redirector. The filter must match the final https URL after every hop, not the campaign short link you pasted into the tester.
A QR printed from a short-link must be tested after every redirect. Custom schemes (notes://) fail in many mail clients and in Chrome unless you also ship an https App Link. We treat custom schemes as debug-only unless you have a documented exception.
App Links vs “it opened once”
Verified App Links need android:autoVerify="true", an https filter, and a live /.well-known/assetlinks.json that lists the app signing cert — the cert Play uses on devices, not necessarily your upload key. See Play hashes. DroidXP does not fetch Digital Asset Links. A green syntax check is not verification.
On the device: Settings → Apps → Your app → Open by default. If the host is missing, verification failed. Fix JSON and the signing cert, then reinstall. Do not keep tapping Chrome and calling it flaky.
Mistakes
- Running
am startwithout quoting the URL.?and&are shell metacharacters. - Testing only the emulator default browser. Samsung Internet and Firefox Custom Tabs disagree on
intent://. - Putting extras in the http URL and expecting
intent://to copy them withoutS.extras in the fragment. - Using the ADB generator’s
adb installline on an.aab. Install APKs from bundletool or Studio.
When to leave the tab
Wireless debugging UI, adb pair, Play’s App Links verification, and assetlinks.json hosting. Studio’s App Links Assistant is fine; it is not required if you can read a manifest and run two commands. Pair this guide with browser vs apktool when the next question is “what is even in this APK.”