SuriDevs Logo
Dynamic App Links in Android 15: Finally, Server-Side Deep Link Control

Dynamic App Links in Android 15: Finally, Server-Side Deep Link Control

By Sagar Maiyad  Oct 22, 2025

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.

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:

  1. Check your assetlinks.json is accessible at https://yourdomain.com/.well-known/assetlinks.json
  2. Verify the SHA-256 fingerprint matches your signing key
  3. Make sure you're testing on Android 15+
  4. Check for exclusion rules that might match

If links that should stay in the browser are opening the app:

  1. Check your exclusion paths for typos
  2. Verify query parameter exclusions match exactly
  3. 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.

Android App Links Deep Linking Android 15

Author

Sagar Maiyad
Written By
Sagar Maiyad

Sagar Maiyad - Android developer specializing in Kotlin, Jetpack Compose, and modern Android architecture. Sharing practical tutorials and real-world development insights.

View All Posts →

Latest Post

Latest Tags