Menguji Link Aplikasi

Saat menerapkan fitur penautan aplikasi, Anda harus menguji fungsi penautan untuk memastikan sistem dapat mengaitkan aplikasi dengan situs Anda, dan menangani permintaan URL, seperti yang Anda harapkan.

Untuk menguji file pernyataan yang ada, Anda dapat menggunakan alat Generator dan Penguji Daftar Pernyataan.

Bagian berikut menjelaskan cara menguji verifikasi Link Aplikasi secara manual. Jika mau, Anda dapat menguji verifikasi dari alat Deep Link Play atau Asisten Link Aplikasi Android Studio.

Mengonfirmasi daftar host yang akan diverifikasi

Saat menguji, Anda harus mengonfirmasi daftar host terkait yang harus diverifikasi sistem untuk aplikasi Anda. Buat daftar semua URL yang filter intent terkaitnya menyertakan atribut dan elemen berikut:

  • Atribut android:scheme dengan nilai http atau https
  • Atribut android:host dengan pola URL domain
  • Elemen tindakan android.intent.action.VIEW
  • Elemen kategori android.intent.category.BROWSABLE

Gunakan daftar ini untuk memeriksa apakah file JSON Digital Asset Links disediakan di setiap host dan subdomain yang disebutkan.

Mengonfirmasi file Digital Asset Links

Untuk setiap situs, gunakan Digital Asset Links API untuk mengonfirmasi bahwa file JSON Digital Asset Links dihosting dan ditentukan dengan benar:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://<var>domain.name</var>:<var>optional_port</var>&amp;
   relation=delegate_permission/common.handle_all_urls

Untuk Link Aplikasi Dinamis, Anda juga dapat memeriksa ekstensi relasi.

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://www.example.com&relation=delegate_permission/common.handle_all_urls&return_relation_extensions=true

Sebagai bagian dari proses pengujian, Anda dapat memeriksa setelan sistem saat ini untuk penanganan link. Gunakan perintah berikut untuk mendapatkan daftar kebijakan penanganan link yang ada untuk semua aplikasi di perangkat terhubung Anda:

adb shell dumpsys package domain-preferred-apps

Perintah berikut melakukan hal yang sama:

adb shell dumpsys package d

Perintah ini menampilkan daftar setiap pengguna atau profil yang ditentukan di perangkat, yang diawali dengan header dalam format berikut:

App linkages for user 0:

Setelah header ini, output menggunakan format berikut untuk mencantumkan setelan penanganan link untuk pengguna tersebut:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

Listingan ini menunjukkan aplikasi mana yang terkait dengan domain mana untuk pengguna tersebut:

  • Package - Mengidentifikasi aplikasi berdasarkan nama paketnya, seperti yang dideklarasikan dalam manifesnya.
  • Domains - Menampilkan daftar lengkap host yang link webnya ditangani oleh aplikasi ini, menggunakan spasi kosong sebagai pembatas.
  • Status - Menampilkan setelan penanganan link saat ini untuk aplikasi ini. Aplikasi yang telah lulus verifikasi, dan yang manifesnya berisi android:autoVerify="true", akan menampilkan status always. Angka heksadesimal setelah status ini terkait dengan data sistem Android tentang preferensi penautan aplikasi pengguna. Nilai ini tidak menunjukkan apakah verifikasi berhasil.

Contoh pengujian

Agar verifikasi link aplikasi berhasil, sistem harus dapat memverifikasi aplikasi Anda dengan setiap situs yang Anda tentukan dalam filter intent tertentu yang memenuhi kriteria untuk link aplikasi. Contoh berikut menunjukkan konfigurasi manifes dengan beberapa link aplikasi yang ditentukan:

<activity android:name="MainActivity">
        <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" />
            <data android:scheme="https" />
            <data android:host="www.example.com" />
            <data android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.com" />
        </intent-filter>
    </activity>

    <activity android:name="SecondActivity">
        <intent-filter>
            <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" />
            <data android:host="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name="ThirdActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

Daftar host yang akan dicoba diverifikasi oleh platform dari manifes sebelumnya adalah:

www.example.com
mobile.example.com
www.example2.com
account.example.com

Daftar host yang tidak akan dicoba diverifikasi oleh platform dari manifes sebelumnya adalah:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

Untuk mempelajari lebih lanjut daftar pernyataan, lihat Membuat Daftar Pernyataan.

Mulai Android 17, Anda dapat menggunakan flag --debug-link dengan perintah pengelola aktivitas (am start) untuk mendiagnosis cara sistem me-resolve URL tertentu. Alat ini memberikan perincian mendetail tentang aplikasi kandidat yang cocok dengan intent, beserta aturan spesifik dari manifes aplikasi dan file assetlinks.json (untuk Link Aplikasi Dinamis) yang dievaluasi selama resolusi.

Untuk menguji resolusi link untuk URL tertentu, jalankan perintah berikut di jendela terminal:

adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"

Output diagnostik dicetak di bawah header App Link Resolution Debug dan berisi bagian berikut untuk membantu Anda memahami proses penyelesaian:

  • Detail target: Mengidentifikasi setiap aplikasi kandidat yang cocok berdasarkan nama paket dan aktivitas targetnya.
  • Kecocokan Filter Intent (AndroidManifest.xml): Menunjukkan atribut statis mana dalam filter intent manifes (seperti scheme, host, path, pathPrefix, atau pathPattern) yang cocok dengan URI.
  • Verifikasi Link Aplikasi: Menampilkan status verifikasi domain saat ini (seperti STATE_SUCCESS).
  • Link Aplikasi Dinamis: Jika aplikasi menggunakan aturan pencocokan Link Aplikasi Dinamis dalam file assetlinks.json-nya, bagian ini mencantumkan setiap aturan yang dievaluasi terhadap URI. Setiap aturan menunjukkan filter URI yang cocok (seperti awalan atau pola jalur) dan kolom allow:
    • allow = 0: Aturan izinkan/penyertaan (allow: true). Jika aturan ini cocok, aplikasi diizinkan untuk membuka URI.
    • allow = 1: Aturan pemblokiran/pengecualian (allow: false / exclude: true). Jika aturan ini cocok, aplikasi akan dicegah membuka URI.
    • Catatan: String filter kosong (filter =) menunjukkan awalan jalur kosong yang cocok dengan semua jalur di domain (bertindak sebagai karakter pengganti atau penangkap semua).

Contoh output debug

Pertimbangkan aplikasi (com.example.xyzapp) yang terkait dengan domain https://xyz.com yang menentukan aturan dinamis dalam file assetlinks.json untuk mengecualikan /foo* sekaligus mengizinkan semua jalur lainnya:

[
  {
    "relation": [
      "delegate_permission/common.handle_all_urls"
    ],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.xyzapp",
      "sha256_cert_fingerprints": ["..."]
    },
    "relation_extensions": {
      "delegate_permission/common.handle_all_urls": {
        "dynamic_app_link_components": [
          {"/": "/foo*", "exclude": true},
          {"/": "*"}
        ]
      }
    }
  }
]

Saat mendiagnosis URL https://xyz.com/foo menggunakan --debug-link:

adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"

Output perintah menghasilkan perincian diagnostik berikut:

--- App Link Resolution Debug ---

URI: https://xyz.com/foo
Resolution: Ambiguous (Multiple apps or Browser fallback)
This usually happens when multiple apps can handle the link and no default is set.

All Matching Candidates:

Target:
  Package: com.example.xyzapp
  Activity: com.example.xyzapp.MainActivity

  Intent Filter Match (AndroidManifest.xml)
    Scheme: 'https' matched android:scheme="https"
    Host: 'xyz.com' matched android:host="xyz.com"

App Link Verification:
  Verification status: STATE_SUCCESS
  Dynamic App Links:
    -> Matched Rule 0: UriRelativeFilterGroup { allow = 1, uri_filters = {UriRelativeFilter { uriPart = PATH, patternType = PREFIX, filter = /foo }},  }
    -> Matched Rule 1: UriRelativeFilterGroup { allow = 0, uri_filters = {UriRelativeFilter { uriPart = PATH, patternType = PREFIX, filter =  }},  }

Target:
  Package: org.chromium.webview_shell
  Activity: org.chromium.webview_shell.WebViewBrowserActivity

  Intent Filter Match (AndroidManifest.xml)
    Scheme: 'https' matched android:scheme="https"

---------------------------------

Starting: Intent { act=android.intent.action.VIEW dat=https://xyz.com/foo }

Dalam contoh ini, sistem mengevaluasi dua aturan Link Aplikasi Dinamis dari assetlinks.json:

  • Aturan 0 (allow = 1, filter = /foo): Dibuat dari {"/": "/foo*", "exclude": true}, ini adalah aturan pengecualian (allow: false) yang memblokir URL yang diawali dengan awalan jalur /foo.
  • Aturan 1 (allow = 0, filter =): Dibuat dari {"/": "*"}, ini adalah aturan penyertaan (allow: true) dengan awalan jalur kosong (filter =), yang cocok dengan semua jalur di bagian xyz.com (tangkap semua).

Cara kerja penyelesaian dalam skenario ini:

  1. Aturan 0 dan Aturan 1 cocok dengan URL https://xyz.com/foo.
  2. Aturan Link Aplikasi Dinamis dievaluasi dalam urutan berurutan dari atas ke bawah (aturan pertama yang cocok akan menang).
  3. Karena Aturan 0 muncul pertama dalam daftar pernyataan dan merupakan aturan pengecualian (allow = 1), aturan ini lebih diutamakan daripada aturan izin umum (Aturan 1).
  4. Oleh karena itu, aplikasi dikecualikan dari penanganan https://xyz.com/foo, sehingga sistem akan beralih ke browser atau menampilkan dialog disambiguasi.