জেটপ্যাক ওয়েবকিট দিয়ে আপনার ওয়েবভিউ বাস্তবায়ন সহজ করুন

এই নির্দেশিকায় Jetpack Webkit লাইব্রেরির সুবিধাসমূহ, এটি কীভাবে কাজ করে তার ব্যাখ্যা এবং আপনার প্রোজেক্টে কীভাবে এটি প্রয়োগ করতে পারেন তা বর্ণনা করা হয়েছে।

সংক্ষিপ্ত বিবরণ

ওয়েবভিউ অ্যান্ড্রয়েড ডেভেলপমেন্টের একটি অপরিহার্য অংশ, কিন্তু বিভিন্ন অ্যান্ড্রয়েড ওএস সংস্করণে ফিচারের অসামঞ্জস্যতার কারণে এটি পরিচালনা করা কখনও কখনও কঠিন হয়ে পড়ে। প্রতিটি অ্যান্ড্রয়েড ওএস সংস্করণ ওয়েবভিউ এপিআই-এর একটি নির্দিষ্ট সেট প্রদান করে। যেহেতু অ্যান্ড্রয়েড ওয়েবভিউ-এর চেয়ে ধীর গতিতে আপডেট হয়, তাই অ্যান্ড্রয়েড এপিআই-গুলো ওয়েবভিউ-এর প্রতিটি উপলব্ধ ফিচারকে অন্তর্ভুক্ত নাও করতে পারে। এর ফলে ফিচার রোলআউট ধীর হয়ে যায় এবং টেস্টিং খরচ বেড়ে যায়।

Jetpack Webkit একটি কম্প্যাটিবিলিটি লেয়ার হিসেবে কাজ করে এবং ব্যবহারকারীর ডিভাইসে থাকা হালনাগাদ WebView APK-কে কাজে লাগিয়ে এই সমস্যাগুলো সমাধান করে। এতে নতুন ও আধুনিক এপিআই-ও রয়েছে যা শুধুমাত্র এই লাইব্রেরিতেই পাওয়া যায়।

জেটপ্যাক ওয়েবকিট কেন ব্যবহার করবেন?

বিভিন্ন ভার্সনের মধ্যে সামঞ্জস্যতা দেওয়ার পাশাপাশি, জেটপ্যাক ওয়েবকিট নতুন ও আধুনিক এপিআই-ও প্রদান করে যা ডেভেলপমেন্টকে সহজ করতে এবং আপনার অ্যাপের কার্যকারিতা উন্নত করতে পারে:

  • আধুনিক প্রমাণীকরণ সক্ষম করে : WebView নির্বিঘ্নে WebAuthn-এর মতো আধুনিক ওয়েব প্রমাণীকরণ মানগুলি পরিচালনা করতে পারে, যা পাসকি-ভিত্তিক সাইন-ইন সক্ষম করে। androidx.webkit লাইব্রেরিটি আপনাকে WebSettingsCompat.setWebAuthenticationSupport পদ্ধতি ব্যবহার করে এই ইন্টিগ্রেশনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যা ব্যবহার করে আপনি আপনার অ্যাপের জন্য প্রয়োজনীয় সমর্থনের স্তর কনফিগার করতে পারেন।

  • পারফরম্যান্স উন্নত করে : setBackForwardCacheEnabled মতো API ব্যবহার করে WebView-এর পারফরম্যান্স সূক্ষ্মভাবে নিয়ন্ত্রণ করুন, অথবা prefetchUrlAsyncprerenderUrlAsync এর মতো স্পেকুলেটিভ লোডিং API ব্যবহার করে নেভিগেশন ল্যাটেন্সি হ্রাস করুন। আরও তথ্যের জন্য, WebView-তে স্পেকুলেটিভ লোডিং দেখুন।

  • স্থিতিশীলতা বৃদ্ধি করে : ক্র্যাশ না করে আটকে যাওয়া বা সাড়া না দেওয়া রেন্ডারার প্রসেস পুনরুদ্ধার করে। আরও তথ্যের জন্য, WebViewRenderProcess#terminate দেখুন।

  • ব্রাউজিং ডেটার উপর সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে : নির্দিষ্ট অরিজিনের জন্য WebView দ্বারা সংরক্ষিত ব্রাউজিং ডেটা মুছে ফেলতে, WebStorageCompat ক্লাসটি ব্যবহার করুন।

  • উন্নত পেজ নেভিগেশন প্রদান করে : সূক্ষ্ম নেভিগেশন নিয়ন্ত্রণ, হিস্ট্রি এন্ট্রি প্রতিস্থাপন, সেভড স্টেট হেডার সাপোর্ট, এবং NavigationListener ব্যবহার করে কোরিলেটেড লাইফসাইকেল ট্র্যাকিং-এর জন্য WebView.loadUrl এর পরিবর্তে WebViewCompat.navigate ব্যবহার করুন। আরও তথ্যের জন্য, WebViewCompat.navigate-এর মাধ্যমে উন্নত পেজ নেভিগেশন দেখুন।

  • স্টেট ম্যানেজমেন্ট অপ্টিমাইজ করে : স্টেট সিরিয়ালাইজেশনের সময় সর্বোচ্চ বাইট সীমা নির্ধারণ করে TransactionTooLargeException থেকে সুরক্ষা দেয়। আরও তথ্যের জন্য, ‘Manage WebView state efficiently ’ দেখুন।

উপাদানগুলো বুঝুন

Jetpack Webkit কার্যকরভাবে ব্যবহার করতে হলে, আপনাকে নিম্নলিখিত উপাদানগুলোর মধ্যকার সম্পর্ক বুঝতে হবে:

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

  • ফ্রেমওয়ার্ক এপিআই ( android.webkit ) : এই এপিআইগুলো একটি নির্দিষ্ট অ্যান্ড্রয়েড ওএস সংস্করণের জন্য নির্দিষ্ট থাকে। উদাহরণস্বরূপ, অ্যান্ড্রয়েড ১০-এর একটি অ্যাপ শুধুমাত্র সেই এপিআইগুলোই অ্যাক্সেস করতে পারে যা সেই সংস্করণটি প্রকাশের সময় উপলব্ধ ছিল। তাই, এটি সাম্প্রতিক আপডেটগুলিতে WebView APK-তে যোগ করা নতুন ফিচারগুলো ব্যবহার করতে পারে না। উদাহরণস্বরূপ, WebView#getWebViewRenderProcess() ব্যবহার করে একটি অনুত্তরদায়ী রেন্ডারারের নিয়ন্ত্রণ পেতে, আপনি এটি শুধুমাত্র অ্যান্ড্রয়েড ১০ এবং তার পরবর্তী সংস্করণগুলিতেই কল করতে পারবেন।

  • জেটপ্যাক ওয়েবকিট লাইব্রেরি ( androidx.webkit ) : এটি আপনার অ্যাপ্লিকেশনের সাথে বান্ডেল করা একটি ছোট লাইব্রেরি। এই লাইব্রেরিটি একটি সেতু হিসেবে কাজ করে যা অ্যান্ড্রয়েড প্ল্যাটফর্মে সংজ্ঞায়িত এপিআই (API)-কে কল না করে, সরাসরি ওয়েবভিউ এপিকে (WebView APK)-কে কল করে। অ্যান্ড্রয়েড প্ল্যাটফর্মের একটি নির্দিষ্ট ওএস (OS) সংস্করণ রয়েছে। এইভাবে, অ্যান্ড্রয়েড ১০-এর মতো পুরোনো ওএস সংস্করণে চালিত ডিভাইসে অ্যাপ্লিকেশন ইনস্টল করা হলেও, অ্যাপ্লিকেশনটি ওয়েবভিউ-এর সর্বশেষ ফিচারগুলো ব্যবহার করতে পারে। উদাহরণস্বরূপ, WebViewCompat.getWebViewRenderProcess() ফ্রেমওয়ার্ক এপিআই-এর মতোই কাজ করে, তবে এটি অ্যান্ড্রয়েড ১০-এর আগের সমস্ত ওএস সংস্করণেও কল করা যায়।

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

জেটপ্যাক ওয়েবকিট এবং এপিকে ইন্টারঅ্যাকশন

Jetpack Webkit-এর API-গুলো দুটি অংশে বাস্তবায়িত হয়েছে:

  • স্ট্যাটিক জেটপ্যাক ওয়েবকিট : স্ট্যাটিক জেটপ্যাক ওয়েবকিট লাইব্রেরিতে এপিআই বাস্তবায়নের জন্য দায়ী কোডের একটি ক্ষুদ্র অংশ থাকে।

  • WebView APK : WebView APK-তে বেশিরভাগ কোড থাকে।

আপনার অ্যাপ Jetpack Webkit API-কে কল করে, যা পরবর্তীতে WebView APK-কে কল করে।

যদিও আপনি আপনার অ্যাপে Jetpack Webkit ভার্সন নিয়ন্ত্রণ করতে পারেন, ব্যবহারকারীদের ডিভাইসে WebView APK-এর আপডেট আপনি নিয়ন্ত্রণ করতে পারবেন না। সাধারণত, বেশিরভাগ ব্যবহারকারীর কাছে WebView APK-এর হালনাগাদ সংস্করণ থাকে, কিন্তু আপনার অ্যাপকে অবশ্যই সতর্ক থাকতে হবে যাতে এমন কোনো API কল করা না হয় যা WebView APK-এর সেই নির্দিষ্ট সংস্করণটি সমর্থন করে না।

Jetpack Webkit ম্যানুয়ালি WebView ভার্সন চেক করার প্রয়োজনীয়তাও দূর করে। কোনো ফিচার উপলব্ধ আছে কিনা তা জানতে, এর ফিচার কনস্ট্যান্টটি দেখুন। উদাহরণস্বরূপ, WebViewFeature.WEB_AUTHENTICATION

তারা কীভাবে একসাথে কাজ করে

জেটপ্যাক ওয়েবকিট স্ট্যাটিক ফ্রেমওয়ার্ক এপিআই এবং ঘন ঘন আপডেট হওয়া ওয়েবভিউ এপিকে-এর মধ্যকার ব্যবধান পূরণ করে। যখন আপনি ফিচার-ডিটেকশন প্যাটার্নের সাথে জেটপ্যাক ওয়েবকিট এপিআই ব্যবহার করেন, তখন লাইব্রেরিটি পরীক্ষা করে দেখে যে ব্যবহারকারীর ডিভাইসে ইনস্টল করা ওয়েবভিউ এপিকে ফিচারটি সমর্থন করে কি না। এর ফলে অ্যান্ড্রয়েড ওএস (ফ্রেমওয়ার্ক) সংস্করণ পরীক্ষা করার প্রয়োজন হয় না।

WebView APK-টি যথেষ্ট সাম্প্রতিক সংস্করণ হলে, লাইব্রেরিটি ফিচারটি চালু করে। অন্যথায়, এটি জানায় যে ফিচারটি অনুপলব্ধ, যা আপনার অ্যাপকে ক্র্যাশ হওয়া থেকে রক্ষা করে এবং আপনাকে পরিস্থিতিটি সুন্দরভাবে সামাল দেওয়ার সুযোগ দেয়।

Jetpack Webkit এবং Framework API-গুলির তুলনা করুন

এই বিভাগে Jetpack Webkit লাইব্রেরিসহ এবং লাইব্রেরি ছাড়া বাস্তবায়ন পদ্ধতিগুলোর তুলনা করা হয়েছে:

আধুনিক প্রমাণীকরণ (WebAuthn) সক্রিয় করুন

জেটপ্যাক ওয়েবকিট ছাড়া

ফ্রেমওয়ার্ক এপিআই-এর মাধ্যমে সম্ভব নয়।

জেটপ্যাক ওয়েবকিট সহ

সামঞ্জস্যতা যাচাইয়ের জন্য WebViewFeature.WEB_AUTHENTICATION ব্যবহার করে।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
  WebSettingsCompat.setWebAuthenticationSupport(
      webView.settings,
      WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
  )
}

কোনো একটি অরিজিনের (সাইট-নির্দিষ্ট স্টোরেজ) ডেটা মুছে ফেলুন

জেটপ্যাক ওয়েবকিট ছাড়া

নির্দিষ্ট অরিজিন ডেটা মুছে ফেলার জন্য সরাসরি কোনো এপিআই নেই। প্রায়শই সমস্ত ডেটা মুছে ফেলার প্রয়োজন হয়।

জেটপ্যাক ওয়েবকিট দিয়ে

সুনির্দিষ্টভাবে ডেটা মুছে ফেলার জন্য কম্প্যাটিবিলিটি এপিআই ব্যবহার করা হয়। আপনি নিম্নলিখিত বিকল্পগুলির যেকোনো একটি ব্যবহার করতে পারেন:

WebStorageCompat.getInstance().deleteBrowsingData()

অথবা

WebStorageCompat.getInstance().deleteBrowsingDataForSite()

ওয়েবভিউ সংস্করণ পান

জেটপ্যাক ওয়েবকিট ছাড়া

স্ট্যান্ডার্ড ফ্রেমওয়ার্ক ক্লাস ব্যবহার করে।

val webViewPackage = WebView.getCurrentWebViewPackage()

জেটপ্যাক ওয়েবকিট দিয়ে

নিরাপদ পুনরুদ্ধারের জন্য সামঞ্জস্য স্তর ব্যবহার করে।

val webViewPackage = WebViewCompat.getCurrentWebViewPackage()

প্রতিক্রিয়াহীন রেন্ডারার (রেন্ডারার ক্লায়েন্ট) পরিচালনা করুন

জেটপ্যাক ওয়েবকিট ছাড়া

প্রমিত ফ্রেমওয়ার্ক পদ্ধতি ব্যবহার করে।

webView.setWebViewRenderProcessClient(myClient)

জেটপ্যাক ওয়েবকিট দিয়ে

ক্লায়েন্ট সেট করার জন্য WebViewCompat এবং একটি ফিচার চেক ব্যবহার করা হয়।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
  WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}

ক্র্যাশ রিকভারি কৌশল বাস্তবায়নের নির্দেশনার জন্য, “Handle WebView termination” দেখুন। API-এর বিস্তারিত তথ্যের জন্য, androidx.webkit রেফারেন্স ডকুমেন্টেশন দেখুন।

সংরক্ষিত অবস্থা এবং লেনদেনের আকার পরিচালনা করুন

WebViewCompat.saveState API আপনাকে সিরিয়ালাইজেশনের সময় বাইট সীমা প্রয়োগ করতে এবং অগ্রবর্তী ইতিহাস ছেঁটে ফেলতে দেয়, যা অপরিহার্য নেভিগেশন ইতিহাস অক্ষুণ্ণ রেখে TransactionTooLargeException ক্র্যাশ প্রতিরোধ করে।

জেটপ্যাক ওয়েবকিট ছাড়া

এটি স্ট্যান্ডার্ড ফ্রেমওয়ার্ক পদ্ধতি ব্যবহার করে, যা আকারের কোনো সীমাবদ্ধতা ছাড়াই সম্পূর্ণ নেভিগেশন স্ট্যাককে সিরিয়ালাইজ করে এবং পেলোড অ্যান্ড্রয়েডের ১ মেগাবাইট ট্রানজ্যাকশন সীমা অতিক্রম করলে TransactionTooLargeException ট্রিগার করতে পারে।

webView.saveState(outState)

জেটপ্যাক ওয়েবকিট দিয়ে

WebViewCompat ব্যবহার করে সর্বোচ্চ বাইট সীমা প্রয়োগ করা হয় অথবা ফরওয়ার্ড ন্যাভিগেশন এন্ট্রি বাদ দেওয়া হয়, যা ট্রানজ্যাকশন ওভারফ্লো থেকে সুরক্ষা প্রদান করে।

WebViewCompat.saveState(webView, outState, maxSizeBytes)

আরও তথ্যের জন্য, ‘WebView-এর অবস্থা দক্ষতার সাথে পরিচালনা করুন ’ দেখুন।

হিস্ট্রি এন্ট্রি রিপ্লেসমেন্ট, সেভড স্টেট হেডার সাপোর্ট এবং কোরিলেটেড লাইফসাইকেল কলব্যাক সমর্থনযুক্ত ওয়েব পেজ নেভিগেট করতে, WebView.loadUrl এর পরিবর্তে WebViewCompat.navigate ব্যবহার করুন।

জেটপ্যাক ওয়েবকিট ছাড়া

WebView.loadUrl ব্যবহার করা হয়েছে, যা হিস্ট্রি এন্ট্রি রিপ্লেসমেন্ট বা কোরিলেটেড লাইফসাইকেল কলব্যাক ট্র্যাকিং সমর্থন করে না।

webView.loadUrl("https://www.example.com")

জেটপ্যাক ওয়েবকিট দিয়ে

হিস্ট্রি এন্ট্রি প্রতিস্থাপন করতে, সংরক্ষিত অবস্থায় কাস্টম হেডার বজায় রাখতে এবং নেভিগেশন স্টেট ট্র্যাক করতে WebViewCompat.navigate এর সাথে NavigationParameters ব্যবহার করা হয়।

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEBVIEW_NAVIGATE_EXPERIMENTAL_V1)) {
  val params = NavigationParameters.Builder()
      .setShouldReplaceCurrentEntry(true)
      .build()
  val navigation = WebViewCompat.navigate(webView, "https://www.example.com", params)
} else {
  webView.loadUrl("https://www.example.com")
}

ন্যাভিগেশন ট্র্যাকিং এবং প্যারামিটার কনফিগারেশন সম্পর্কে আরও তথ্যের জন্য, WebViewCompat.navigate এর মাধ্যমে উন্নত পেজ ন্যাভিগেশন দেখুন।

আপনার কোডে Jetpack Webkit একীভূত করুন

Jetpack Webkit ব্যবহার করলে স্ট্যান্ডার্ড WebView ক্লাসের কার্যক্ষমতা বৃদ্ধি পায়, কিন্তু এটি মূল WebView ক্লাসটিকে পুরোপুরি প্রতিস্থাপন করে না।

আপনি android.webkit.WebView ক্লাসটি ব্যবহার করা চালিয়ে যেতে পারেন। আপনি এটিকে আপনার XML লেআউটগুলিতে যুক্ত করতে পারেন এবং আপনার কোডে ইনস্ট্যান্সটির একটি রেফারেন্স পেতে পারেন। স্ট্যান্ডার্ড ফ্রেমওয়ার্ক বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য, আপনি এখনও সরাসরি WebView ইনস্ট্যান্স বা এর সেটিংস অবজেক্টের মেথডগুলি কল করতে পারেন।

আধুনিক ফিচারগুলো অ্যাক্সেস করার জন্য, আপনি Jetpack Webkit-এর দেওয়া স্ট্যাটিক হেল্পার মেথডগুলো, যেমন WebViewCompat এবং WebSettingsCompat ব্যবহার করেন। এই মেথডগুলোতে আপনাকে আপনার বিদ্যমান WebView ইনস্ট্যান্সটি পাস করতে হয়।

কোটলিন

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}

জাভা

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}

জেটপ্যাক ওয়েবকিট বাস্তবায়ন করুন

Jetpack Webkit প্রয়োগ করতে নিম্নলিখিত পদ্ধতি অনুসরণ করুন।

ধাপ ১: নির্ভরতা যোগ করুন

আপনার মডিউলের build.gradle.kts অথবা build.gradle ফাইলে Jetpack Webkit যোগ করার জন্য নিম্নলিখিত ডিপেন্ডেন্সিটি অন্তর্ভুক্ত করুন:

Groovy

dependencies {
    implementation "androidx.webkit:webkit:1.16.0"
}

Kotlin

dependencies {
    implementation("androidx.webkit:webkit:1.16.0")
}

জেটপ্যাক ওয়েবকিটে থিন র‍্যাপার থাকায়, আপনার অ্যাপ্লিকেশনের আকারের উপর এর প্রভাব নগণ্য।

ধাপ ২: বৈশিষ্ট্য-শনাক্তকরণ প্যাটার্নটি গ্রহণ করুন

অনুপলব্ধ এপিআই কল করার সময় ক্র্যাশ এড়াতে, ফিচার চেক ব্যবহার করুন। আমরা প্রতিটি এপিআই কলকে একটি ফিচার চেক দিয়ে ঘিরে রাখার পরামর্শ দিই, এবং এপিআই অনুপলব্ধ হলে ফলব্যাক লজিক ব্যবহারের কথাও বিবেচনা করতে বলি।

আধুনিক WebView API ব্যবহারের জন্য আমরা নিম্নলিখিত প্যাটার্নটি সুপারিশ করি:

কোটলিন

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

val webView: WebView = findViewById(R.id.my_webview)

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
    // Optionally, provide a fallback for older WebView versions.
}

জাভা

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

WebView webView = findViewById(R.id.my_webview);

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
    // Optionally, provide a fallback for older WebView versions.
}

এই প্যাটার্নটি অ্যাপ্লিকেশনটিকে শক্তিশালী করতে সাহায্য করে। যেহেতু ফিচার চেকটি প্রথমে চলে, তাই ফিচারটি উপলব্ধ না থাকলেও অ্যাপ্লিকেশনটি ক্র্যাশ করে না। WebViewFeature#isFeatureSupported চেকের পারফরম্যান্স ওভারহেড নগণ্য।