Khi triển khai tính năng liên kết ứng dụng, bạn nên kiểm thử chức năng liên kết để đảm bảo hệ thống có thể liên kết ứng dụng của bạn với các trang web và xử lý các yêu cầu URL như mong đợi.
Để kiểm thử một tệp khai báo hiện có, bạn có thể sử dụng công cụ Statement List Generator and Tester (Trình tạo và kiểm thử danh sách khai báo).
Các phần sau đây mô tả cách kiểm thử quy trình xác minh Đường liên kết đến ứng dụng theo cách thủ công. Nếu muốn, bạn có thể kiểm thử quy trình xác minh bằng công cụ Đường liên kết sâu của Play hoặc Trợ lý App Links của Android Studio.
Xác nhận danh sách máy chủ lưu trữ cần xác minh
Khi kiểm thử, bạn nên xác nhận danh sách các máy chủ lưu trữ được liên kết mà hệ thống sẽ xác minh cho ứng dụng của bạn. Hãy lập danh sách tất cả các URL mà bộ lọc ý định tương ứng bao gồm các thuộc tính và phần tử sau:
- Thuộc tính
android:schemecó giá trịhttphoặchttps android:hostcó mẫu URL miền- Phần tử thao tác
android.intent.action.VIEW - Phần tử danh mục
android.intent.category.BROWSABLE
Sử dụng danh sách này để kiểm tra xem tệp JSON chứa Đường liên kết đến tài sản kỹ thuật số có được cung cấp trên mỗi máy chủ lưu trữ và miền phụ được đặt tên hay không.
Xác nhận tệp Digital Asset Links
Đối với mỗi trang web, hãy sử dụng Digital Asset Links API để xác nhận rằng tệp JSON chứa Digital Asset Links được lưu trữ và xác định đúng cách:
https://digitalassetlinks.googleapis.com/v1/statements:list?
source.web.site=https://<var>domain.name</var>:<var>optional_port</var>&
relation=delegate_permission/common.handle_all_urls
Đối với Đường liên kết động đến ứng dụng, bạn cũng có thể kiểm tra các tiện ích liên kết.
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
Kiểm tra chính sách liên kết
Trong quá trình kiểm thử, bạn có thể kiểm tra chế độ cài đặt hệ thống hiện tại để xử lý đường liên kết. Sử dụng lệnh sau để xem danh sách các chính sách hiện có về việc xử lý đường liên kết cho tất cả ứng dụng trên thiết bị được kết nối:
adb shell dumpsys package domain-preferred-apps
Lệnh sau đây cũng thực hiện việc tương tự:
adb shell dumpsys package d
Lệnh này trả về danh sách từng người dùng hoặc hồ sơ được xác định trên thiết bị, trước đó là tiêu đề ở định dạng sau:
App linkages for user 0:
Sau tiêu đề này, đầu ra sẽ sử dụng định dạng sau để liệt kê các chế độ cài đặt xử lý đường liên kết cho người dùng đó:
Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002
Danh sách này cho biết ứng dụng nào được liên kết với miền nào đối với người dùng đó:
Package– Xác định một ứng dụng bằng tên gói của ứng dụng đó, như được khai báo trong tệp kê khai.Domains– Hiện danh sách đầy đủ các máy chủ mà ứng dụng này xử lý đường liên kết trên web, sử dụng khoảng trắng làm dấu phân cách.Status– Cho biết chế độ cài đặt hiện tại về việc xử lý đường liên kết cho ứng dụng này. Một ứng dụng đã vượt qua quy trình xác minh và có tệp kê khai chứaandroid:autoVerify="true"sẽ cho thấy trạng tháialways. Số thập lục phân sau trạng thái này có liên quan đến bản ghi của hệ thống Android về các lựa chọn ưu tiên liên kết ứng dụng của người dùng. Giá trị này không cho biết liệu quá trình xác minh có thành công hay không.
Ví dụ về kiểm thử
Để xác minh đường liên kết đến ứng dụng thành công, hệ thống phải có thể xác minh ứng dụng của bạn với từng trang web mà bạn chỉ định trong một bộ lọc ý định nhất định đáp ứng các tiêu chí cho đường liên kết đến ứng dụng. Ví dụ sau đây cho thấy một cấu hình tệp kê khai có một số đường liên kết đến ứng dụng được xác định:
<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>
Sau đây là danh sách các máy chủ mà nền tảng sẽ cố gắng xác minh từ tệp kê khai trước đó:
www.example.com
mobile.example.com
www.example2.com
account.example.com
Sau đây là danh sách các máy chủ mà nền tảng sẽ không cố gắng xác minh từ tệp kê khai trước đó:
map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)
Để tìm hiểu thêm về danh sách câu lệnh, hãy xem phần Tạo danh sách câu lệnh.
Chẩn đoán quá trình phân giải đường liên kết bằng cờ debug-link
Kể từ Android 17, bạn có thể dùng cờ --debug-link với lệnh trình quản lý hoạt động (am start) để chẩn đoán cách hệ thống phân giải một URL cụ thể. Công cụ này cung cấp thông tin chi tiết về các ứng dụng đề xuất phù hợp với ý định, cùng với các quy tắc cụ thể trong tệp kê khai ứng dụng và tệp assetlinks.json (đối với Đường liên kết động đến ứng dụng) đã được đánh giá trong quá trình phân giải.
Để kiểm thử tính năng phân giải đường liên kết cho một URL cụ thể, hãy chạy lệnh sau trong cửa sổ dòng lệnh:
adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"
Đầu ra chẩn đoán được in trong tiêu đề App Link Resolution Debug và chứa các phần sau đây để giúp bạn hiểu quy trình giải quyết:
- Thông tin chi tiết về mục tiêu: Xác định từng ứng dụng đề xuất phù hợp theo tên gói và hoạt động mục tiêu.
- So khớp bộ lọc ý định (
AndroidManifest.xml): Cho biết thuộc tính tĩnh nào trong bộ lọc ý định của tệp kê khai (chẳng hạn nhưscheme,host,path,pathPrefixhoặcpathPattern) khớp với URI. - Xác minh đường liên kết đến ứng dụng: Cho biết trạng thái xác minh miền hiện tại (chẳng hạn như
STATE_SUCCESS). - Đường liên kết động đến ứng dụng: Nếu ứng dụng sử dụng các quy tắc so khớp Đường liên kết động đến ứng dụng trong tệp
assetlinks.json, thì phần này sẽ liệt kê mọi quy tắc đã được đánh giá dựa trên URI. Mỗi quy tắc cho biết các bộ lọc URI được so khớp (chẳng hạn như tiền tố hoặc mẫu đường dẫn) và một trườngallow:allow = 0: Một quy tắc cho phép/bao gồm (allow: true). Nếu quy tắc này khớp, ứng dụng sẽ được phép mở URI.allow = 1: Một quy tắc chặn/loại trừ (allow: false/exclude: true). Nếu quy tắc này khớp, ứng dụng sẽ không mở được URI.- Lưu ý: Chuỗi bộ lọc trống (
filter =) cho biết tiền tố đường dẫn trống khớp với tất cả đường dẫn trong miền (đóng vai trò là ký tự đại diện hoặc ký tự khớp với mọi đường dẫn).
Ví dụ về kết quả gỡ lỗi
Hãy xem xét một ứng dụng (com.example.xyzapp) được liên kết với miền https://xyz.com xác định các quy tắc linh động trong tệp assetlinks.json để loại trừ /foo* trong khi cho phép tất cả các đường dẫn khác:
[
{
"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},
{"/": "*"}
]
}
}
}
]
Khi chẩn đoán URL https://xyz.com/foo bằng --debug-link:
adb shell am start --debug-link -a android.intent.action.VIEW -d "https://xyz.com/foo"
Lệnh này xuất ra thông tin chẩn đoán chi tiết sau:
--- 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 }
Trong ví dụ này, hệ thống đã đánh giá 2 quy tắc Đường liên kết động trong ứng dụng từ assetlinks.json:
- Quy tắc 0 (
allow = 1,filter = /foo): Được tạo từ{"/": "/foo*", "exclude": true}, đây là một quy tắc loại trừ (allow: false) chặn các URL bắt đầu bằng tiền tố đường dẫn/foo. - Quy tắc 1 (
allow = 0,filter =): Được tạo từ{"/": "*"}, đây là một quy tắc bao gồm (allow: true) có tiền tố đường dẫn trống (filter =), khớp với tất cả các đường dẫn trongxyz.com(quy tắc chung).
Cách giải quyết trong tình huống này:
- Cả Quy tắc 0 và Quy tắc 1 đều khớp với URL
https://xyz.com/foo. - Các quy tắc về Đường liên kết đến ứng dụng động được đánh giá theo thứ tự tuần tự từ trên xuống dưới (quy tắc khớp đầu tiên sẽ được áp dụng).
- Vì Quy tắc 0 xuất hiện đầu tiên trong danh sách câu lệnh và là một quy tắc loại trừ (
allow = 1), nên quy tắc này sẽ được ưu tiên hơn quy tắc cho phép chung (Quy tắc 1). - Do đó, ứng dụng sẽ không xử lý
https://xyz.com/foo, khiến hệ thống quay lại trình duyệt hoặc hiển thị hộp thoại phân biệt.