সফট রিস্টার্ট (<= AOSP 14)

অ্যান্ড্রয়েড ১১ সফট রিস্টার্ট সমর্থন করে, যা হলো ইউজার স্পেসের প্রসেসগুলোর রানটাইম রিস্টার্ট। এটি এমন সব আপডেট প্রয়োগ করতে ব্যবহৃত হয় যেগুলোর জন্য রিবুট প্রয়োজন (উদাহরণস্বরূপ, APEX প্যাকেজের আপডেট)। বর্তমানে, সফট রিস্টার্ট শুধুমাত্র সেইসব প্রসেসের মধ্যে সীমাবদ্ধ, যেগুলো userdata মাউন্ট হওয়ার পরে চালু হয়েছে।

নিম্নলিখিত উপায়ে একটি সফট রিস্টার্টের অনুরোধ করা হয়:

  • PowerManager থেকে, PowerManager.reboot(PowerManager.REBOOT_USERSPACE) কল করে

  • শেল থেকে, adb shell svc power reboot userspace অথবা adb reboot userspace ব্যবহার করুন।

সফট রিস্টার্টের পরেও, ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ আনলকড থাকে।

যদি কোনো ডিভাইস সফট রিস্টার্ট সমর্থন করে, তাহলে PowerManager.isRebootingUserspace() API মেথডটি true রিটার্ন করে এবং init.userspace_reboot.is_supported সিস্টেম প্রপার্টির মান 1 এর সমান হয়।

যদি ডিভাইসটি সফট রিস্টার্ট সমর্থন না করে, তাহলে PowerManager.reboot(PowerManager.REBOOT_USERSPACE) , adb reboot userspace , এবং adb shell svc power reboot userspace ব্যর্থ হয়।

সফট রিস্টার্ট এক্সিকিউশন

সফট রিস্টার্টের অনুরোধ করার পর ( PowerManager বা শেল থেকে), init নিম্নলিখিত ধাপগুলো সম্পাদন করে:

  1. sys.powerctl=reboot,userspace গ্রহণ করা হয়েছে।

  2. সফট রিস্টার্ট নিরীক্ষণের জন্য একটি পৃথক UserspaceRebootWatchdogThread() প্রসেস ফর্ক করে।

  3. এটি একটি userspace-reboot-requested অ্যাকশন ট্রিগার করে, যা সফট রিস্টার্টকে প্রভাবিত করতে পারে এমন সমস্ত সিস্টেম প্রোপার্টি রিসেট করে। প্রভাবিত প্রোপার্টিগুলো হলো:

    • sys.usb.config
    • sys.usb.state
    • sys.boot_completed
    • dev.bootcomplete
    • sys.init.updatable_crashing
    • sys.init.updatable_crashing_process_name
    • apexd.status
    • sys.user.0.ce_available
    • sys.shutdown.requested
    • service.bootanim.exit

    বুট সিকোয়েন্সের সময় উপরের প্রোপার্টিগুলো পুনরায় সেট করতে হবে। প্রয়োজনে, আপনি অতিরিক্ত প্রোপার্টিগুলো রিসেট করতে পারেন। উদাহরণের জন্য, rootdir/init.rc তে থাকা on userspace-reboot-requested অ্যাকশনটি দেখুন।

  4. DoUserspaceReboot ফাংশনটি চালায়, যা নিম্নলিখিত কাজগুলো সম্পাদন করে:

    1. userdata মাউন্ট হওয়ার পরে চালু হওয়া প্রসেসগুলিতে SIGTERM পাঠায় এবং সেগুলি বন্ধ হওয়া পর্যন্ত অপেক্ষা করে।
    2. টাইমআউট শেষ হওয়ার পর, চলমান সমস্ত প্রসেস বন্ধ করার জন্য SIGKILL পাঠানো হয়।
    3. /system/bin/vdc volume reset কল করে।
    4. zRAM ব্যাকিং ডিভাইসটিকে আনমাউন্ট করে।
    5. সক্রিয় APEX প্যাকেজগুলো আনমাউন্ট করে।
    6. বুটস্ট্র্যাপ মাউন্ট নেমস্পেসে ফিরে যায়।
    7. userspace-reboot-resume অ্যাকশনটি সক্রিয় করে।

সফট রিস্টার্টের আগে যদি ফাইল সিস্টেম চেকপয়েন্টিংয়ের অনুরোধ করা হয়ে থাকে, userspace-reboot-fs-remount অ্যাকশনের সময় userdata চেকপয়েন্টিং মোডে রিমাউন্ট করা হয় (বিস্তারিত জানার জন্য পরবর্তী বিভাগটি দেখুন)। sys.boot_completed property মান 1 সেট করা হলে একটি সফট রিস্টার্ট সম্পন্ন হয়েছে বলে ধরা হয়। সফট রিস্টার্টের শেষে, ডিসপ্লে বন্ধ রাখা হয় এবং এটিকে চালু করার জন্য ব্যবহারকারীর সুস্পষ্ট হস্তক্ষেপের প্রয়োজন হয়।

ফাইল সিস্টেম চেকপয়েন্টিং

সফট রিস্টার্টের আগে যদি কোনো ফাইল সিস্টেম চেকপয়েন্টের জন্য অনুরোধ করা হয়ে থাকে, তাহলে সফট রিস্টার্টের সময় userdata চেকপয়েন্টিং মোডে রিমউন্ট করা হয়। রিমউন্টিং লজিকটি fs_mgr_remount_userdata_into_checkpointing ফাংশনে প্রয়োগ করা হয় এবং এটি চেকপয়েন্টিং পদ্ধতির উপর নির্ভর করে ভিন্ন হয়। বিশেষত, যখন userdata সমর্থন করে:

  • ফাইলসিস্টেম লেভেল চেকপয়েন্টিং (যেমন, f2fs ) এর ক্ষেত্রে, checkpoint=disable অপশনটি ব্যবহার করলে userdata পুনরায় মাউন্ট করা হয়।

  • ব্লক লেভেল চেকপয়েন্টিং (উদাহরণস্বরূপ, ext4 ) সম্পন্ন হলে, /data আনমাউন্ট করা হয় এবং এর উপরে মাউন্ট করা সমস্ত প্যারেন্ট ডিভাইস ম্যাপার ডিভাইস ধ্বংস করে দেওয়া হয়। এরপর, সাধারণ চেকপয়েন্টিং বুটে ব্যবহৃত একই কোড পাথ ব্যবহার করে userdata মাউন্ট করা হয়।

যদি ক্রেডেনশিয়াল-এনক্রিপ্টেড (CE) এবং ডিভাইস-এনক্রিপ্টেড (DE) কীগুলো পরিচালনা করার জন্য একটি ফাইল সিস্টেম লেভেল কী-রিং ব্যবহার করা হয়, তাহলে userdata আনমাউন্ট করার পর কীগুলো হারিয়ে যায়। কী পুনরুদ্ধারের সুযোগ দেওয়ার জন্য, ফাইল সিস্টেম কী-রিং-এ কোনো কী ইনস্টল করার সময় vold সেশন-লেভেল কী-রিং-এও fscrypt-provisioning টাইপের একই কী ইনস্টল করে। যখন init_user0 কল করা হয়, vold ফাইল সিস্টেম কী-রিং-এ কীগুলো পুনরায় ইনস্টল করে।

হার্ড রিবুটে ফিরে যান

সফট রিস্টার্টের কারণে ডিভাইসটি যাতে অব্যবহারযোগ্য অবস্থায় না পড়ে, তা নিশ্চিত করার জন্য অ্যান্ড্রয়েড ১১-এ হার্ড রিবুটের একটি ফলব্যাক ব্যবস্থা রয়েছে, যা নিম্নলিখিত শর্তগুলোর মধ্যে কোনো একটি পূরণ হলে সক্রিয় হয়:

  • একটি ডিভাইস নির্দিষ্ট টাইমআউটের মধ্যে সফট রিস্টার্ট শুরু করতে ব্যর্থ হয় (অর্থাৎ, sys.init.userspace_reboot.in_progress=1 )।
  • একটি প্রসেস নির্দিষ্ট টাইমআউটের মধ্যে বন্ধ হতে ব্যর্থ হয়।
  • /system/bin/vdc volume reset অপারেশনটি ব্যর্থ হয়েছে।
  • zRAM ডিভাইসটি আনমাউন্ট করা ব্যর্থ হয়।
  • একটি সক্রিয় APEX প্যাকেজ ভুলভাবে আনমাউন্ট হয়।
  • userdata চেকপয়েন্টিং মোডে পুনরায় মাউন্ট করার প্রচেষ্টা ব্যর্থ হয়।
  • একটি ডিভাইস নির্দিষ্ট টাইমআউটের মধ্যে সফলভাবে বুট হতে ব্যর্থ হয় (অর্থাৎ, sys.boot_completed=1 )।

প্রতি-ডিভাইস কনফিগারেশন

নিম্নলিখিত প্রপার্টিগুলোর মান পরিবর্তন করে সফট রিস্টার্টের কিছু দিক নিয়ন্ত্রণ করা যায়:

  • init.userspace_reboot.is_supported নিয়ন্ত্রণ করে কখন একটি ডিভাইস সফট রিস্টার্ট করতে পারবে। যদি এই প্রপার্টির মান false , 0 হয়, বা নির্দিষ্ট করা না থাকে, তাহলে রিস্টার্ট করার প্রচেষ্টা প্রত্যাখ্যান করা হয়।
  • init.userspace_reboot.sigkill.timeoutmillis সেইসব প্রসেসের জন্য মিলিসেকেন্ডে সময়সীমা নিয়ন্ত্রণ করে, যেগুলো বন্ধ হওয়ার জন্য একটি SIGKILL সিগন্যাল পেয়েছে। যদি প্রসেসগুলোর মধ্যে কোনো একটি নির্দিষ্ট সময়সীমার মধ্যে বন্ধ হতে ব্যর্থ হয়, তাহলে হার্ড রিবুটের একটি ফলব্যাক প্রক্রিয়া চালু হয়।
  • init.userspace_reboot.sigterm.timeoutmillis সেইসব প্রসেসের জন্য মিলিসেকেন্ডে সময়সীমা নিয়ন্ত্রণ করে, যারা টার্মিনেট করার জন্য একটি SIGTERM সিগন্যাল পেয়েছে। নির্দিষ্ট সময়সীমার মধ্যে যে সমস্ত প্রসেস টার্মিনেট হতে ব্যর্থ হয়, তারা একটি SIGKILL সিগন্যাল পায়।
  • init.userspace_reboot.started.timeoutmillis সফট রিস্টার্ট শুরু হওয়ার জন্য মিলিসেকেন্ডে সময়সীমা নিয়ন্ত্রণ করে (অর্থাৎ, sys.init.userspace_reboot.in_progress=1 )। যদি কোনো ডিভাইস নির্দিষ্ট সময়সীমার মধ্যে সফট রিস্টার্ট শুরু করতে ব্যর্থ হয়, তবে হার্ড রিবুট চালু হয়।
  • init.userspace_reboot.userdata_remount.timeoutmillis userdata আনমাউন্ট করার জন্য মিলিসেকেন্ডে সময়সীমা নিয়ন্ত্রণ করে। যদি কোনো ডিভাইস নির্দিষ্ট সময়সীমার মধ্যে userdata আনমাউন্ট করতে ব্যর্থ হয়, তবে হার্ড রিবুট চালু হয়।
  • init.userspace_reboot.watchdog.timeoutmillis একটি ডিভাইসের সফলভাবে বুট হওয়ার (অর্থাৎ, sys.boot_completed=1 ) জন্য নির্ধারিত সময়সীমা নিয়ন্ত্রণ করে। যদি কোনো ডিভাইস নির্দিষ্ট সময়সীমার মধ্যে বুট হতে ব্যর্থ হয়, তবে হার্ড রিবুটের একটি ফলব্যাক প্রক্রিয়া চালু হয়।

সফট রিস্টার্টের সময় অ্যানিমেশন কাস্টমাইজ করুন

সফট রিস্টার্টের রেফারেন্স ইমপ্লিমেন্টেশনে, সফট রিস্টার্ট চলাকালীন প্রদর্শিত অ্যানিমেশন কাস্টমাইজ করার সুবিধা অন্তর্ভুক্ত রয়েছে।

userspace-reboot-fs-remount অ্যাকশনটির শেষে, init bootanim সার্ভিসটি চালু করে। এই সার্ভিসটি তালিকাভুক্ত ক্রমানুসারে নিম্নলিখিত অ্যানিমেশন ফাইলগুলির অস্তিত্ব খুঁজে দেখে এবং প্রথমে যেটি খুঁজে পায় সেটি প্লে করে:

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip

সফট রিস্টার্টের জন্য নির্দিষ্ট কোনো অ্যানিমেশন ফাইল উল্লেখ না করা থাকলে, bootanim ডিফল্ট android অ্যানিমেশন দেখায়।

পরীক্ষা

অ্যান্ড্রয়েড ১১-এ সফট রিস্টার্টের একটি রেফারেন্স ইমপ্লিমেন্টেশন অন্তর্ভুক্ত রয়েছে। এছাড়াও, আপনি UserspaceRebootHostTest এ থাকা CTS টেস্ট ব্যবহার করে সফট রিস্টার্ট যাচাই করতে পারেন।