WebView-এর স্ট্যাটাস দক্ষতার সাথে ম্যানেজ করুন

Android অ্যাপের লাইফসাইকেল ম্যানেজ করার সময়, ব্যাকগ্রাউন্ড রিসোর্স রিক্লেমেশনের সময় ব্যবহারকারীর স্টেট প্রিজার্ভ করা হল নির্বিঘ্ন ব্যবহারকারীর অভিজ্ঞতার একটি মূল উপাদান। ওয়েব ওয়ার্কফ্লো অন্তর্ভুক্ত করে এমন অ্যাপের জন্য, WebView.saveState(Bundle) আপনাকে Bundle-এ WebView-এর নেভিগেশন ইতিহাস ও স্ট্যাটাস সিরিয়ালাইজ করতে দেয়। এই ডেটা পরে WebView.restoreState(Bundle) ব্যবহার করে ফিরিয়ে আনা যাবে।

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

১ এমবি ট্রানজ্যাকশন সীমা এবং স্টেট ওয়াইপিং

Android, savedInstanceState-এর মধ্যে স্টোর করা যেতে পারে এমন ডেটার মোট ভলিউমের উপর ১ এমবির কঠোর সীমা আরোপ করে। এই ১ এমবি বাজেট সম্পূর্ণ অ্যাপ প্রসেস জুড়ে শেয়ার করা হয়। কোনও অ্যাপে একাধিক WebView ইনস্ট্যান্স থাকলে, তাদের সম্মিলিত নেভিগেশন স্টেট ও ইতিহাস অবশ্যই এই একক শেয়ার করা অ্যালোকেশনের মধ্যে ফিট হতে হবে। এই সীমা অতিক্রম করলে TransactionTooLargeException ট্রিগার হয়, যার ফলে অ্যাপ ক্র্যাশ করে।

একটি সাধারণ কিন্তু সমস্যাযুক্ত প্রশমন কৌশলের মধ্যে রয়েছে WebView স্টেট বান্ডেলের সাইজ মনিটর করা এবং এটি একটি নির্বিচারে নিরাপত্তা থ্রেশহোল্ড (যেমন ৩০০KB) অতিক্রম করলে WebView ইতিহাস সম্পূর্ণরূপে মুছে ফেলা। এটি ক্র্যাশ হওয়া আটকায়, তবে ব্যবহারকারীর অভিজ্ঞতায় গুরুতর রিগ্রেশন নিয়ে আসে:

  • ব্যাকওয়ার্ড নেভিগেশন হারিয়ে যাওয়া: Android প্রায়ই ব্যাকগ্রাউন্ড অ্যাপ প্রসেস বন্ধ করে দেয় যাতে অন্যান্য টাস্কের জন্য মেমরি খালি করা যায়। নেভিগেশন ইতিহাস সংরক্ষণ করতে আপনি onSaveInstanceState() লাইফসাইকেল কলব্যাকের মধ্যে saveState(Bundle) ব্যবহার করতে পারেন। ১ এমবি ট্রানজ্যাকশন সীমা এড়াতে আপনি এই ইতিহাস মুছে দিলে, পুরো নেভিগেশন স্ট্যাক মুছে যাবে। ব্যবহারকারী অ্যাপে ফিরে এলে, সিস্টেমের 'ফিরে যান' বোতামটি অবিলম্বে কম্পোনেন্ট বা অ্যাপ থেকে বেরিয়ে যায় কারণ ব্যাকওয়ার্ড নেভিগেশনকে সাপোর্ট করার জন্য কোনও ঐতিহাসিক প্রসঙ্গ অবশিষ্ট থাকে না, প্রসেস রিস্টার্ট হয়েছে কিনা তা নির্বিশেষে।

  • BFCache বাতিল করা: ইতিহাস মুছে দিলে অ্যাপটি ব্যাক-ফরওয়ার্ড ক্যাশে (BFCache) ব্যবহার করতে পারে না, যার ফলে আগে দেখা পৃষ্ঠাগুলি তাৎক্ষণিকভাবে রেন্ডার করার ক্ষমতা হারিয়ে যায়।

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

আর্কিটেকচারাল মিটিগেশন স্ট্র্যাটেজি

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

স্টেট সিরিয়ালাইজেশনে সাইজের সীমা প্রয়োগ করুন

নেভিগেশন স্ট্যাক খুব বড় হয়ে গেলে সম্পূর্ণভাবে মুছে ফেলার পরিবর্তে, পুরনো ডেটা ট্রাঙ্কেট করা আরও কার্যকর প্যাটার্ন:

  • টার্গেট করা ড্রপ নীতি: নির্দিষ্ট বাইট সীমা (যেমন, WebViewCompat.saveState(webView, outState, maxSizeBytes)) এনফোর্স করার সময় স্টেট সিরিয়ালাইজ করতে WebViewCompat.saveState() ব্যবহার করুন। এই API অটোমেটিক পুরনো নেভিগেশন এন্ট্রি ক্রমানুসারে ড্রপ করে যতক্ষণ না মোট পে-লোড আপনার নির্ধারিত বরাদ্দের মধ্যে ফিট করে। গুরুত্বপূর্ণভাবে, এটি অ্যাক্টিভ WebView-এর লাইভ ইতিহাস পরিবর্তন বা মুছে না দিয়ে শুধুমাত্র সিরিয়ালাইজ করা Bundle-কে ট্রাঙ্কেট করে, যাতে অবিলম্বে ব্যাকওয়ার্ড নেভিগেশন সম্পূর্ণ অক্ষত থাকে।

  • এগিয়ে যাওয়ার এন্ট্রি সরানো: অ্যাপ্লিকেশন ইন্টারফেসে ফিরে যাওয়ার বোতাম থাকলেও এগিয়ে যাওয়ার জন্য নির্দিষ্ট নেভিগেশন বোতাম না থাকলে, saveState API-এর includeForwardState প্যারামিটার false-এ সেট করে আপনি এগিয়ে যাওয়ার সব নেভিগেশন এন্ট্রি বাতিল করতে পারবেন। এটি ব্যবহারকারীর উপলভ্য নেভিগেশন পাথকে প্রভাবিত না করেই পে-লোডের সাইজ উল্লেখযোগ্যভাবে কমিয়ে দেয়।

HTTP Cache Quota API-এর মাধ্যমে রিসোর্স লেটেন্সি ম্যানেজ করা

saveState ক্ষণস্থায়ী নেভিগেশন ইতিহাসের জন্য ১ এমবি Bundle সীমা ম্যানেজ করে, HTTP Cache Quota API প্রোফাইল প্রতি ভিত্তিতে স্থায়ী ওয়েব রিসোর্স (ডিস্ক ক্যাশে) ম্যানুয়ালি নিয়ন্ত্রণ করে। এটি স্বল্প-মেয়াদী নেভিগেশন কন্টেক্সট এবং দীর্ঘ-মেয়াদী ক্যাশে করা অ্যাসেটের মধ্যে স্পষ্ট পার্থক্য তৈরি করে।

উপযুক্ত কোটা বেছে নেওয়ার অর্থ হল পারফর্ম্যান্সের সাথে আপোষ করা:

  • আরও বেশি কোটা ডিস্কে আরও বেশি অ্যাসেট রেখে অফলাইন উপলভ্যতা এবং রিসোর্স লোডিং লেটেন্সি উন্নত করে।
  • কম কোটা অ্যাপের ডিস্ক ফুটপ্রিন্ট কম করে এবং OS-এর মাধ্যমে অন্যান্য গুরুত্বপূর্ণ অ্যাপ ডেটার ক্যাশে মুছে দেওয়া আটকায়।

অ্যাপ রিস্টার্ট করার পরেও এইসব সেটিংস বজায় থাকে এবং মূল থ্রেড থেকে কনফিগার করতে হবে।

নিচে দেওয়া প্রয়োগ থেকে বোঝা যাবে যে ডিফল্ট প্রোফাইলের জন্য ডিস্ক ক্যাশে কোটা কীভাবে কনফিগার করতে হয়:

Kotlin

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE) &&
    WebViewFeature.isFeatureSupported(WebViewFeature.HTTP_CACHE)) {
    val defaultProfile = ProfileStore.getInstance()
        .getOrCreateProfile(Profile.DEFAULT_PROFILE_NAME)
    val httpCache = defaultProfile.httpCache

    // Set explicit cache size to 50MB (50 * 1024 * 1024 bytes)
    httpCache.setQuotaBytes(50L * 1024 * 1024)
}

জাভা

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE) &&
    WebViewFeature.isFeatureSupported(WebViewFeature.HTTP_CACHE)) {
    Profile defaultProfile = ProfileStore.getInstance()
        .getOrCreateProfile(Profile.DEFAULT_PROFILE_NAME);
    HttpCache httpCache = defaultProfile.getHttpCache();

    // Set explicit cache size to 50MB (50 * 1024 * 1024 bytes)
    httpCache.setQuotaBytes(50L * 1024 * 1024);
}

কোটার সাইজ নির্ধারণের স্ট্র্যাটেজি, লাইফসাইকেল ম্যানেজমেন্ট ও প্রোফাইলের সীমানা সম্পর্কে আরও জানতে, WebView-তে HTTP ক্যাশ কোটা ম্যানেজ করা দেখুন।

পারফর্ম্যান্স সংক্রান্ত গুরুত্বপূর্ণ বিষয়

নিম্নলিখিত পয়েন্টগুলি WebView-এর স্টেট সংক্রান্ত আচরণ নিয়ন্ত্রণকারী প্রযুক্তিগত সীমাবদ্ধতা এবং ইন্টার্নাল ডেটার আচরণ হাইলাইট করে:

  • অস্বচ্ছ PageState ব্লব: saveState-এর সেভ করা ডেটার প্রায় ৭০% রেন্ডারিং ইঞ্জিন থেকে পাওয়া ইন্টার্নাল PageState ব্লব নিয়ে গঠিত। এই ডেটা ফর্ম ইনপুট ও iframe স্ক্রল পজিশন সহ সেশনের গ্র্যানুলার অবস্থা ক্যাপচার করে। এইসব ব্লব থেকে ম্যানুয়ালি পার্স করা বা স্বতন্ত্র সেগমেন্ট স্ট্রিপ করার চেষ্টা করবেন না, কারণ এটি করলে গুরুতর নিরাপত্তা সংক্রান্ত ঝুঁকি তৈরি হয় এবং সেশন রিস্টোরেশন ইন্টিগ্রিটি ভেঙে যায়।

  • গ্র্যানুলার ইতিহাস ম্যানেজমেন্ট: স্ট্যান্ডার্ড WebBackForwardList API নেটিভভাবে ব্যক্তিগত ঐতিহাসিক এলিমেন্ট ইচ্ছামতো সরানোর সুবিধা দেয় না। কঠোর স্টেট ম্যানেজমেন্টের জন্য, আর্কিটেকচারাল নিরাপত্তা নিশ্চিত করতে আপনাকে অবশ্যই WebViewCompat.saveState()-এর মধ্যে maxSizeBytes এবং includeForwardState প্যারামিটার ব্যবহার করে ট্রাঙ্কেশন স্ট্র্যাটেজি প্রয়োগ করতে হবে।