Uygulama bağlantılarını test etme

Uygulama bağlantısı özelliğini uygularken sistemin uygulamanızı web sitelerinizle ilişkilendirebildiğinden ve URL isteklerini beklediğiniz gibi işleyebildiğinden emin olmak için bağlantı işlevini test etmeniz gerekir.

Mevcut bir ekstre dosyasını test etmek için Ekstre Listesi Oluşturucu ve Test Aracı'nı kullanabilirsiniz.

Aşağıdaki bölümlerde, uygulama bağlantısı doğrulamanızı manuel olarak nasıl test edeceğiniz açıklanmaktadır. İsterseniz doğrulamayı Play Derin Bağlantılar aracından veya Android Studio App Links Assistant'tan da test edebilirsiniz.

Doğrulanacak ana makinelerin listesini onaylama

Test sırasında, sistemin uygulamanız için doğrulayacağı ilişkili ana makine listesini onaylamanız gerekir. Aşağıdaki özellikler ve öğeleri içeren karşılık gelen intent filtrelerinin bulunduğu tüm URL'lerin bir listesini oluşturun:

  • android:scheme özelliği, http veya https değeriyle
  • Alan URL'si kalıbı içeren android:host özelliği
  • android.intent.action.VIEW işlem öğesi
  • android.intent.category.BROWSABLE kategori öğesi

Bu listeyi kullanarak, adlandırılmış her ana makinede ve alt alanda bir Digital Asset Links JSON dosyası sağlandığını kontrol edin.

Digital Asset Links dosyalarını onaylama

Her web sitesi için Digital Asset Links JSON dosyasının düzgün şekilde barındırıldığını ve tanımlandığını doğrulamak üzere Digital Asset Links API'yi kullanın:

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

Dinamik uygulama bağlantıları için ilişki uzantılarını da kontrol edebilirsiniz.

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

Test sürecinizin bir parçası olarak, bağlantı işleme ile ilgili mevcut sistem ayarlarını kontrol edebilirsiniz. Bağlı cihazınızdaki tüm uygulamalar için mevcut bağlantı işleme politikalarının listesini almak üzere aşağıdaki komutu kullanın:

adb shell dumpsys package domain-preferred-apps

Aşağıdaki komut da aynı işlemi yapar:

adb shell dumpsys package d

Komut, cihazda tanımlanan her kullanıcının veya profilin listesini döndürür. Liste, aşağıdaki biçimde bir başlıkla başlar:

App linkages for user 0:

Bu başlığın ardından, çıkışta söz konusu kullanıcının bağlantı işleme ayarlarını listelemek için aşağıdaki biçim kullanılır:

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

Bu listede, söz konusu kullanıcı için hangi uygulamaların hangi alanlarla ilişkilendirildiği gösterilir:

  • Package: Bir uygulamayı, manifestinde belirtildiği şekilde paket adına göre tanımlar.
  • Domains: Bu uygulamanın web bağlantılarını işlediği ana makinelerin tam listesini, sınırlayıcı olarak boşlukları kullanarak gösterir.
  • Status - Bu uygulamanın mevcut bağlantı işleme ayarını gösterir. Doğrulamayı geçen ve manifestinde android:autoVerify="true" bulunan bir uygulamanın durumu always olarak gösterilir. Bu durumdan sonraki onaltılık sayı, Android sisteminin kullanıcının uygulama bağlantısı tercihlerine ilişkin kaydıyla ilgilidir. Bu değer, doğrulamanın başarılı olup olmadığını göstermez.

Test örneği

Uygulama bağlantısı doğrulamasının başarılı olması için sistemin, uygulama bağlantıları ölçütlerini karşılayan belirli bir intent filtresinde belirttiğiniz web sitelerinin her biriyle uygulamanızı doğrulayabilmesi gerekir. Aşağıdaki örnekte, birkaç uygulama bağlantısının tanımlandığı bir manifest yapılandırması gösterilmektedir:

<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>

Platformun önceki manifestten doğrulamaya çalışacağı ana makinelerin listesi:

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

Platformun önceki manifest dosyasından doğrulamaya çalışmayacağı ana makinelerin listesi:

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

Bildirim listeleri hakkında daha fazla bilgi edinmek için Bildirim Listesi Oluşturma başlıklı makaleyi inceleyin.

Android 17'den itibaren, sistemin belirli bir URL'yi nasıl çözdüğünü teşhis etmek için etkinlik yöneticisi (am start) komutuyla --debug-link işaretini kullanabilirsiniz. Bu araç, amaçla eşleşen aday uygulamaların ayrıntılı bir dökümünü, uygulama manifestindeki ve çözümleme sırasında değerlendirilen assetlinks.json dosyasındaki (dinamik uygulama bağlantıları için) belirli kurallarla birlikte sağlar.

Belirli bir URL için bağlantı çözümlemeyi test etmek üzere bir terminal penceresinde aşağıdaki komutu çalıştırın:

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

Teşhis çıktısı App Link Resolution Debug başlığı altında yazdırılır ve çözüm sürecini anlamanıza yardımcı olmak için aşağıdaki bölümleri içerir:

  • Hedef ayrıntıları: Eşleşen her aday uygulamayı paket adına ve hedef etkinliğe göre tanımlar.
  • Intent Filtresi Eşleşmesi (AndroidManifest.xml): URI ile hangi statik özelliklerin eşleştiğini gösterir (ör. manifest intent filtresindeki scheme, host, path, pathPrefix veya pathPattern).
  • Uygulama bağlantısı doğrulaması: Mevcut alan doğrulaması durumunu (ör. STATE_SUCCESS) gösterir.
  • Dinamik uygulama bağlantıları: Uygulama, assetlinks.json dosyasında eşleşen dinamik uygulama bağlantısı kuralları kullanıyorsa bu bölümde, URI'ye göre değerlendirilen tüm kurallar listelenir. Her kural, eşleşen URI filtrelerini (ör. yol ön ekleri veya kalıpları) ve bir allow alanını gösterir:
    • allow = 0: Bir izin verme/dahil etme kuralı (allow: true). Bu kural eşleşirse uygulamanın URI'yi açmasına izin verilir.
    • allow = 1: Engelleme/hariç tutma kuralı (allow: false / exclude: true). Bu kural eşleşirse uygulamanın URI'yi açması engellenir.
    • Not: Boş bir filtre dizesi (filter =), alanın altındaki tüm yollarla eşleşen boş bir yol önekini (joker karakter veya her şeyi yakalama olarak işlev görür) gösterir.

Örnek hata ayıklama çıkışı

com.example.xyzapp alanıyla ilişkili bir uygulamayı (com.example.xyzapp) ele alalım. Bu uygulama, assetlinks.json dosyasında /foo*'ü hariç tutarken diğer tüm yollara izin veren dinamik kurallar tanımlıyor:https://xyz.com

[
  {
    "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},
          {"/": "*"}
        ]
      }
    }
  }
]

https://xyz.com/foo URL'si --debug-link kullanılarak teşhis edildiğinde:

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

Komut, aşağıdaki teşhis dökümünü verir:

--- 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 }

Bu örnekte sistem, assetlinks.json adresindeki iki Dinamik Uygulama Bağlantısı kuralını değerlendirdi:

  • 0. Kural (allow = 1, filter = /foo): {"/": "/foo*", "exclude": true} kaynağından oluşturulan bu kural, /foo yolu önekiyle başlayan URL'leri engelleyen bir hariç tutma kuralıdır (allow: false).
  • 1. kural (allow = 0, filter =): {"/": "*"} öğesinden oluşturulan bu kural, boş bir yol önekine (filter =) sahip bir dahil etme kuralıdır (allow: true). Bu kural, xyz.com altındaki tüm yollarla (her şeyi yakalama) eşleşir.

Bu senaryoda çözünürlüğün işleyiş şekli:

  1. Hem Kural 0 hem de Kural 1, https://xyz.com/foo URL'siyle eşleşiyor.
  2. Dinamik uygulama bağlantısı kuralları yukarıdan aşağıya doğru sıralı olarak değerlendirilir (eşleşen ilk kural geçerli olur).
  3. Kural 0, ifade listesinde ilk sırada göründüğü ve bir hariç tutma kuralı (allow = 1) olduğu için genel izin verme kuralına (Kural 1) göre önceliklidir.
  4. Bu nedenle uygulama, https://xyz.com/foo işleme sürecinin dışında bırakılır. Bu durum, sistemin tarayıcıya geri dönmesine veya bir belirsizliği giderme iletişim kutusu göstermesine neden olur.