অ্যাপ লিঙ্ক পরীক্ষা করা

অ্যাপ লিঙ্কিং ফিচার প্রয়োগ করার সময়, সিস্টেম আপনার অ্যাপকে আপনার ওয়েবসাইটের সাথে অ্যাসোসিয়েট করতে পারছে কিনা এবং আপনার প্রত্যাশা অনুযায়ী URL অনুরোধ ম্যানেজ করতে পারছে কিনা তা নিশ্চিত করতে আপনাকে লিঙ্কিং কার্যকারিতা পরীক্ষা করতে হবে।

আগে থেকে থাকা স্টেটমেন্ট ফাইল টেস্ট করতে, আপনি স্টেটমেন্ট লিস্ট জেনারেটর ও টেস্টার টুল ব্যবহার করতে পারেন।

নিম্নলিখিত বিভাগে আপনার অ্যাপ লিঙ্কের যাচাইকরণ ম্যানুয়ালি কীভাবে পরীক্ষা করবেন তা বর্ণনা করা হয়েছে। আপনি চাইলে, Play ডিপ লিঙ্ক টুল বা Android Studio অ্যাপ লিঙ্ক অ্যাসিস্ট্যান্ট থেকে যাচাইকরণ পরীক্ষা করতে পারেন।

যাচাই করার জন্য হোস্টের তালিকা কনফার্ম করুন

পরীক্ষা করার সময়, সিস্টেম আপনার অ্যাপের জন্য যেসব সংশ্লিষ্ট হোস্ট যাচাই করবে, আপনাকে সেই তালিকা কনফার্ম করতে হবে। এমন সব URL-এর তালিকা তৈরি করুন, যেগুলির সংশ্লিষ্ট ইনটেন্ট ফিল্টারে নিম্নলিখিত অ্যাট্রিবিউট ও এলিমেন্ট অন্তর্ভুক্ত আছে:

  • http বা https ভ্যালু সহ android:scheme অ্যাট্রিবিউট
  • ডোমেন URL প্যাটার্ন সহ android:host অ্যাট্রিবিউট
  • android.intent.action.VIEWটি অ্যাকশন এলিমেন্ট
  • android.intent.category.BROWSABLEটি বিভাগের এলিমেন্ট

প্রতিটি নামযুক্ত হোস্ট এবং সাবডোমেনে ডিজিটাল অ্যাসেট লিঙ্ক JSON ফাইল প্রদান করা হয়েছে কিনা তা চেক করতে এই তালিকাটি ব্যবহার করুন।

ডিজিটাল অ্যাসেট লিঙ্ক ফাইল কনফার্ম করুন

প্রতিটি ওয়েবসাইটের জন্য, ডিজিটাল অ্যাসেট লিঙ্ক JSON ফাইল সঠিকভাবে হোস্ট ও সংজ্ঞায়িত করা হয়েছে কিনা তা কনফার্ম করতে, ডিজিটাল অ্যাসেট লিঙ্ক API ব্যবহার করুন:

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

ডায়নামিক অ্যাপ লিঙ্কের জন্য, আপনি রিলেশন এক্সটেনশনও চেক করতে পারেন।

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

আপনার টেস্টিং প্রসেসের অংশ হিসেবে, আপনি লিঙ্ক ম্যানেজ করার জন্য বর্তমান সিস্টেম সেটিংস চেক করতে পারেন। আপনার কানেক্ট করা ডিভাইসে সব অ্যাপের জন্য আগে থেকে থাকা লিঙ্ক-হ্যান্ডলিং নীতির তালিকা পেতে নিম্নলিখিত কমান্ড ব্যবহার করুন:

adb shell dumpsys package domain-preferred-apps

নিম্নলিখিত কমান্ড একই কাজ করে:

adb shell dumpsys package d

কমান্ডটি ডিভাইসে সংজ্ঞায়িত প্রতিটি ব্যবহারকারী বা প্রোফাইলের একটি তালিকা প্রদান করে, নিম্নলিখিত ফর্ম্যাটে একটি হেডার দ্বারা পূর্বে:

App linkages for user 0:

এই হেডারের পরে, আউটপুট নিম্নলিখিত ফর্ম্যাট ব্যবহার করে সেই ব্যবহারকারীর জন্য লিঙ্ক-ম্যানেজমেন্ট সেটিংস তালিকাভুক্ত করে:

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

এই তালিকা থেকে বোঝা যায় যে কোন অ্যাপ কোন ডোমেনের সাথে যুক্ত, যাতে ব্যবহারকারী সেই অ্যাপ ব্যবহার করতে পারেন।

  • Package - অ্যাপের ম্যানিফেস্টে উল্লেখ করা প্যাকেজের নাম অনুযায়ী অ্যাপ শনাক্ত করে।
  • Domains - এই অ্যাপ যেসব হোস্টের ওয়েব লিঙ্ক ম্যানেজ করে, তাদের সম্পূর্ণ তালিকা দেখায়, ডিলিমিটার হিসেবে ফাঁকা জায়গা ব্যবহার করে।
  • Status - এই অ্যাপের জন্য বর্তমান লিঙ্ক-হ্যান্ডলিং সেটিং দেখায়। যে অ্যাপ যাচাইকরণে পাস করেছে এবং যার ম্যানিফেস্টে android:autoVerify="true" আছে, সেটি always স্ট্যাটাস দেখায়। এই স্ট্যাটাসের পরে হেক্সাডেসিমাল নম্বরটি ব্যবহারকারীর অ্যাপ লিঙ্কেজ সংক্রান্ত পছন্দের Android সিস্টেমের রেকর্ডের সাথে সম্পর্কিত। এই ভ্যালু থেকে যাচাইকরণ সফল হয়েছে কিনা তা জানা যায় না।

টেস্ট উদাহরণ

অ্যাপ লিঙ্ক যাচাইকরণ সফল করতে, সিস্টেমকে অবশ্যই আপনার অ্যাপটি প্রতিটি ওয়েবসাইটের সাথে যাচাই করতে হবে যা আপনি একটি নির্দিষ্ট ইনটেন্ট ফিল্টারে উল্লেখ করেছেন যা অ্যাপ লিঙ্কের মানদণ্ড পূরণ করে। নিম্নলিখিত উদাহরণে একাধিক অ্যাপ লিঙ্ক সহ ম্যানিফেস্ট কনফিগারেশন দেখানো হয়েছে:

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

পূর্ববর্তী ম্যানিফেস্ট থেকে প্ল্যাটফর্মটি যে হোস্টগুলির তালিকা যাচাই করার চেষ্টা করবে তা হল:

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

পূর্ববর্তী ম্যানিফেস্ট থেকে প্ল্যাটফর্ম যেসব হোস্ট যাচাই করার চেষ্টা করবে না, তার তালিকা:

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

স্টেটমেন্ট লিস্ট সম্পর্কে আরও জানতে, স্টেটমেন্ট লিস্ট তৈরি করা দেখুন।

Android 17 থেকে শুরু করে, সিস্টেম কীভাবে কোনও নির্দিষ্ট URL-এর সমস্যার সমাধান করে তা ডায়াগনসিস করতে, আপনি অ্যাক্টিভিটি ম্যানেজার (am start) কমান্ডের সাথে --debug-link ফ্ল্যাগ ব্যবহার করতে পারবেন। এই টুলটি ইনটেন্টের সাথে মিলে যাওয়া সম্ভাব্য অ্যাপের বিস্তারিত ব্রেকডাউন প্রদান করে, সাথে অ্যাপ ম্যানিফেস্ট থেকে নির্দিষ্ট নিয়ম এবং assetlinks.json ফাইল (ডায়নামিক অ্যাপ লিঙ্কের জন্য) যা রেজোলিউশনের সময় মূল্যায়ন করা হয়েছিল।

কোনও নির্দিষ্ট URL-এর জন্য লিঙ্ক রেজোলিউশন টেস্ট করতে, টার্মিনাল উইন্ডোতে এই কমান্ড রান করুন:

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

ডায়াগনস্টিক আউটপুট App Link Resolution Debug হেডারের নিচে প্রিন্ট করা হয় এবং রেজোলিউশন প্রসেস বুঝতে আপনাকে সাহায্য করার জন্য নিম্নলিখিত বিভাগগুলি থাকে:

  • টার্গেট সংক্রান্ত বিবরণ: প্যাকেজের নাম ও টার্গেট অ্যাক্টিভিটি অনুযায়ী প্রতিটি ম্যাচিং ক্যান্ডিডেট অ্যাপ শনাক্ত করে।
  • ইনটেন্ট ফিল্টার ম্যাচ (AndroidManifest.xml): ম্যানিফেস্ট ইনটেন্ট ফিল্টারে কোন স্ট্যাটিক অ্যাট্রিবিউট (যেমন scheme, host, path, pathPrefix বা pathPattern) URI-এর সাথে ম্যাচ করেছে তা দেখায়।
  • অ্যাপ লিঙ্ক যাচাইকরণ: বর্তমান ডোমেন যাচাইকরণের স্ট্যাটাস দেখায় (যেমন STATE_SUCCESS)।
  • ডায়নামিক অ্যাপ লিঙ্ক: অ্যাপটি যদি তার assetlinks.json ফাইলে ডায়নামিক অ্যাপ লিঙ্ক ম্যাচিং নিয়ম ব্যবহার করে, তাহলে এই বিভাগে URI-এর বিপরীতে মূল্যায়ন করা প্রতিটি নিয়মের তালিকা থাকে। প্রতিটি নিয়ম ম্যাচ করা URI ফিল্টার (যেমন, পাথ প্রিফিক্স বা প্যাটার্ন) এবং একটি allow ফিল্ড নির্দেশ করে:
    • allow = 0: একটি অনুমতি/অন্তর্ভুক্তি সংক্রান্ত নিয়ম (allow: true)। এই নিয়ম মিলে গেলে, অ্যাপটি URI খোলার অনুমতি পায়।
    • allow = 1: একটি ব্লক/বাদ দেওয়া সংক্রান্ত নিয়ম (allow: false / exclude: true)। এই নিয়ম ম্যাচ করলে, অ্যাপটি URI খুলতে পারবে না।
    • মনে রাখবেন: খালি ফিল্টার স্ট্রিং (filter =) খালি পাথ প্রিফিক্সকে নির্দেশ করে যা ডোমেনের অধীনে সব পাথের সাথে মিলে যায় (ওয়াইল্ডকার্ড বা ক্যাচ-অল হিসেবে কাজ করে)।

ডিবাগ আউটপুটের উদাহরণ

https://xyz.com ডোমেনের সাথে যুক্ত একটি অ্যাপ (com.example.xyzapp) বিবেচনা করুন যা তার assetlinks.json ফাইলে ডাইনামিক নিয়ম নির্ধারণ করে /foo* বাদ দেওয়ার জন্য, যেখানে অন্যান্য সব পাথকে অনুমতি দেওয়া হয়:

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

--debug-link ব্যবহার করে https://xyz.com/foo URL ডায়াগনসিস করার সময়:

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

কমান্ডটি নিম্নলিখিত ডায়াগনস্টিক ব্রেকডাউন আউটপুট করে:

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

এই উদাহরণে, সিস্টেম assetlinks.json থেকে দুটি ডায়নামিক অ্যাপ লিঙ্ক নিয়ম মূল্যায়ন করেছে:

  • নিয়ম ০ (allow = 1, filter = /foo): {"/": "/foo*", "exclude": true} থেকে জেনারেট করা হয়েছে, এটি একটি বাদ দেওয়ার নিয়ম (allow: false) যা /foo পাথ প্রিফিক্স দিয়ে শুরু হওয়া URL ব্লক করে।
  • নিয়ম ১ (allow = 0, filter =): {"/": "*"} থেকে তৈরি করা হয়েছে, এটি একটি ইনক্লুশন নিয়ম (allow: true) যার পাথ প্রিফিক্স (filter =) খালি আছে, যা xyz.com-এর অধীনে সব পাথের সাথে ম্যাচ করে (ক্যাচ-অল)।

এই পরিস্থিতিতে কীভাবে সমাধান করা হয়:

  1. নিয়ম ০ এবং নিয়ম ১, দুটিই URL https://xyz.com/foo-এর সাথে ম্যাচ করে।
  2. ডায়নামিক অ্যাপ লিঙ্ক সংক্রান্ত নিয়ম উপর থেকে নিচে ক্রমানুসারে মূল্যায়ন করা হয় (প্রথম যে নিয়মটি মিলে যায় সেটিই প্রয়োগ করা হয়)।
  3. কারণ নিয়ম ০ স্টেটমেন্টের তালিকায় প্রথমে আছে এবং এটি বাদ দেওয়ার নিয়ম (allow = 1), তাই এটি সাধারণ অনুমোদনের নিয়মের (নিয়ম ১) চেয়ে বেশি অগ্রাধিকার পায়।
  4. তাই অ্যাপটি https://xyz.com/foo ম্যানেজ করার থেকে বাদ দেওয়া হয়েছে, যার ফলে সিস্টেমটি ব্রাউজারে ফিরে যায় বা একটি দ্ব্যর্থতা নিরসন ডায়ালগ দেখায়।