If you've ever needed to change which URLs open in your app vs the browser, you know the pain. Update the manifest, rebuild, go through review, wait for users to update. A simple change could take weeks to reach all users.
Android 15's Dynamic App Links fix this. You configure deep linking rules in a JSON file on your server, and changes take effect immediately for Android 15+ devices.
The Old Problem
With traditional App Links, your manifest defines everything:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="example.com" />
</intent-filter>
If marketing wants to exclude a campaign landing page that works better in the browser? App update. Legal needs /terms to open in a web view instead of the app? App update. Wrong URL pattern causing crashes? You guessed it - app update.
How Dynamic App Links Work
Instead of (or in addition to) manifest configuration, you add rules to your Digital Asset Links JSON file at /.well-known/assetlinks.json:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourapp.android",
"sha256_cert_fingerprints": ["AA:BB:CC:..."]
},
"include": {
"paths": ["/products/*", "/articles/*", "/user/*"]
},
"exclude": {
"paths": ["/legal/*", "/press/*", "/admin/*"],
"query_parameters": ["web_only=true"]
}
}
]
Update this file, and Android 15+ devices see the changes within minutes. No app update needed.
What You Can Actually Do
Exclude paths that shouldn't open the app. Legal disclaimers, press releases, investor relations - content that doesn't have app screens. Before, these would awkwardly try to open your app. Now you can exclude them cleanly.
Control by query parameter. Run A/B tests by excluding ?variant=web, keeping those users in the browser while others open the app. Track which performs better.
Fix problems instantly. Discovered a URL pattern that crashes? Exclude it in 5 minutes instead of pushing an emergency release.
Temporary exclusions for campaigns. Marketing has a landing page that needs web tracking? Exclude it for the campaign duration, then remove the exclusion.
Basic Setup
If you already have App Links working, adding dynamic rules is straightforward.
Your existing manifest stays the same. You just enhance your assetlinks.json:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourapp.android",
"sha256_cert_fingerprints": ["YOUR_SHA256_FINGERPRINT"]
},
"include": {
"paths": ["/products/*", "/cart/*", "/account/*"]
},
"exclude": {
"paths": ["/checkout/*", "/legal/*"],
"query_parameters": ["utm_source=email"]
}
}
]
Test with ADB:
adb shell am start -a android.intent.action.VIEW \
-d "https://yourapp.com/products/123"
Real Examples
E-commerce app:
- Include: Product pages, cart, account
- Exclude: Checkout (keep in browser for payment security), size guides, shipping info
News app:
- Include: Articles, user profiles
- Exclude: Subscription pages (web conversion funnel works better), advertiser landing pages
Banking app:
- Include: Account summary, transactions, transfers
- Exclude: Document uploads (security), regulatory disclosures (need specific formatting)
Gotchas
Only works on Android 15+. Older devices still use your manifest configuration. You need both to work.
Caching exists. Changes propagate quickly but not instantly. Give it a few minutes.
Wildcards can be too broad. /* matches everything. Be specific about what you want to include.
Test your exclusions. An overly broad exclusion rule can prevent links that should open the app from working. Test both the positive and negative cases.
Debugging
If links aren't opening the app:
- Check your assetlinks.json is accessible at
https://yourdomain.com/.well-known/assetlinks.json - Verify the SHA-256 fingerprint matches your signing key
- Make sure you're testing on Android 15+
- Check for exclusion rules that might match
If links that should stay in the browser are opening the app:
- Check your exclusion paths for typos
- Verify query parameter exclusions match exactly
- Make sure the path isn't also in your include list
Use Google's Digital Asset Links tester to validate your configuration.
Worth the Migration?
If you're already using App Links and frequently need to adjust which URLs open in the app, absolutely. The ability to make changes without app updates is a significant operational improvement.
If your linking strategy is simple and rarely changes, the existing manifest approach works fine. But adding basic dynamic support doesn't hurt - you'll have the flexibility when you eventually need it.
For new apps targeting Android 15+, build Dynamic App Links in from the start. Design your URL structure with this capability in mind.
Based on the official Android Developers Blog post.