এই পৃষ্ঠাটি AOSP-তে যোগ করা পরিবর্তনগুলি বর্ণনা করে যাতে বিল্ডগুলির মধ্যে অপ্রয়োজনীয় ফাইল পরিবর্তনগুলি হ্রাস করা যায়। ডিভাইস বাস্তবায়নকারীরা যারা তাদের নিজস্ব বিল্ড সিস্টেম বজায় রাখেন তারা তাদের ওভার-দ্য-এয়ার (OTA) আপডেটের আকার হ্রাস করার জন্য এই তথ্যটি একটি নির্দেশিকা হিসাবে ব্যবহার করতে পারেন।
অ্যান্ড্রয়েড ওটিএ আপডেটে মাঝেমধ্যে এমন পরিবর্তিত ফাইল থাকে যা কোড পরিবর্তনের সাথে সঙ্গতিপূর্ণ নয়। এগুলি আসলে বিল্ড সিস্টেম আর্টিফ্যাক্ট। এটি তখন ঘটতে পারে যখন একই কোড, বিভিন্ন সময়ে তৈরি, বিভিন্ন ডিরেক্টরি থেকে, বা বিভিন্ন মেশিনে প্রচুর পরিমাণে পরিবর্তিত ফাইল তৈরি করে। এই ধরনের অতিরিক্ত ফাইলগুলি একটি ওটিএ প্যাচের আকার বাড়ায় এবং কোন কোডটি পরিবর্তন করা হয়েছে তা নির্ধারণ করা কঠিন করে তোলে।
OTA-এর বিষয়বস্তু আরও স্বচ্ছ করার জন্য, AOSP-তে OTA প্যাচের আকার কমানোর জন্য ডিজাইন করা বিল্ড সিস্টেম পরিবর্তনগুলি অন্তর্ভুক্ত করা হয়েছে। বিল্ডগুলির মধ্যে অপ্রয়োজনীয় ফাইল পরিবর্তনগুলি বাদ দেওয়া হয়েছে, এবং OTA আপডেটগুলিতে কেবল প্যাচ-সম্পর্কিত ফাইলগুলি অন্তর্ভুক্ত রয়েছে। AOSP-তে একটি বিল্ড ডিফ টুলও রয়েছে, যা একটি পরিষ্কার বিল্ড ফাইল ডিফ প্রদানের জন্য সাধারণ বিল্ড-সম্পর্কিত ফাইল পরিবর্তনগুলি ফিল্টার করে এবং একটি ব্লক ম্যাপিং টুল রয়েছে, যা আপনাকে ব্লক বরাদ্দ সামঞ্জস্যপূর্ণ রাখতে সহায়তা করে।
একটি বিল্ড সিস্টেম বিভিন্ন উপায়ে অপ্রয়োজনীয়ভাবে বড় প্যাচ তৈরি করতে পারে। এটি কমাতে, অ্যান্ড্রয়েড 8.0 এবং উচ্চতর সংস্করণে, প্রতিটি ফাইল ডিফের জন্য প্যাচের আকার হ্রাস করার জন্য নতুন বৈশিষ্ট্যগুলি প্রয়োগ করা হয়েছিল। OTA-আপডেট প্যাকেজের আকার হ্রাসকারী উন্নতিগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
- A/B ডিভাইসের বাইরের আপডেটে পূর্ণাঙ্গ চিত্রের জন্য একটি জেনেরিক-উদ্দেশ্য, লসলেস-কম্প্রেশন অ্যালগরিদম, ZSTD এর ব্যবহার। কম্প্রেশন লেভেল বাড়িয়ে উচ্চ কম্প্রেশন অনুপাতের জন্য ZSTD কাস্টমাইজ করা যেতে পারে। OTA জেনারেশন টাইমে কম্প্রেশন লেভেল সেট করা হয় এবং
--vabc_compression_param=zstd,$COMPRESSION_LEVELফ্ল্যাগ পাস করে সেট করা যেতে পারে। - OTA চলাকালীন ব্যবহৃত কম্প্রেশন উইন্ডোর আকার বৃদ্ধি করা। ডিভাইসের
.mkফাইলে বিল্ড প্যারামিটার কাস্টমাইজ করে সর্বাধিক কম্প্রেশন উইন্ডোর আকার সেট করা যেতে পারে। এই ভেরিয়েবলটিPRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 262144হিসাবে সেট করা হয়েছে। - ডিফ্লেট স্ট্রিমগুলির জন্য একটি নির্ধারক প্যাচিং টুল, পাফিন রিকম্প্রেশনের ব্যবহার, যা A/B OTA আপডেট জেনারেশনের জন্য কম্প্রেশন এবং ডিফ ফাংশন পরিচালনা করে।
- ডেল্টা-জেনারেশন টুল ব্যবহারের পরিবর্তন, যেমন প্যাচ কম্প্রেস করার জন্য
bsdiffলাইব্রেরি কীভাবে ব্যবহার করা হয়। অ্যান্ড্রয়েড 9 এবং উচ্চতর সংস্করণে,bsdiffটুল কম্প্রেস অ্যালগরিদম নির্বাচন করে যা একটি প্যাচের জন্য সেরা কম্প্রেসেশন ফলাফল দেবে। -
update_engineএর উন্নতির ফলে A/B ডিভাইস আপডেটের জন্য প্যাচ প্রয়োগ করার সময় মেমরি কম খরচ হয়েছে।
নিম্নলিখিত বিভাগগুলিতে OTA-আপডেটের আকার, তাদের সমাধান এবং AOSP-তে বাস্তবায়নের উদাহরণগুলিকে প্রভাবিত করে এমন বিভিন্ন সমস্যা নিয়ে আলোচনা করা হয়েছে।
ফাইল অর্ডার
সমস্যা : ডিরেক্টরিতে ফাইলের তালিকা চাওয়ার সময় ফাইল সিস্টেম ফাইল অর্ডারের গ্যারান্টি দেয় না, যদিও একই চেকআউটের ক্ষেত্রে এটি সাধারণত একই রকম হয়। ls এর মতো টুলগুলি ডিফল্টভাবে ফলাফল সাজায়, কিন্তু find এবং make don't sort এর মতো কমান্ডের মাধ্যমে ব্যবহৃত ওয়াইল্ডকার্ড ফাংশন। এই টুলগুলি ব্যবহার করার আগে, আপনাকে অবশ্যই আউটপুট সাজাতে হবে।
সমাধান : যখন আপনি ওয়াইল্ডকার্ড ফাংশন ব্যবহার করে find এবং make এর মতো টুল ব্যবহার করেন, তখন এই কমান্ডগুলি ব্যবহার করার আগে তাদের আউটপুট সাজান। Android.mk ফাইলগুলিতে $(wildcard) বা $(shell find) ব্যবহার করার সময়, সেগুলিও সাজান। কিছু টুল, যেমন Java, সাজান ইনপুট করে, তাই ফাইলগুলি সাজান আগে, যাচাই করুন যে আপনি যে টুলটি ব্যবহার করছেন তা ইতিমধ্যেই তা করেনি।
উদাহরণ: কোর বিল্ড সিস্টেমে বিল্টইন all-*-files-under ম্যাক্রো ব্যবহার করে অনেকগুলি ইনস্ট্যান্স ঠিক করা হয়েছিল, যার মধ্যে all-cpp-files-under অন্তর্ভুক্ত ছিল (যেহেতু অন্যান্য মেকফাইলে বেশ কয়েকটি সংজ্ঞা ছড়িয়ে দেওয়া হয়েছিল)। বিস্তারিত জানার জন্য, নিম্নলিখিতগুলি দেখুন:
- https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f
- https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410
- https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653
- https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c
ডিরেক্টরি তৈরি করুন
সমস্যা: যে ডিরেক্টরিতে জিনিসপত্র তৈরি করা হয়েছে তা পরিবর্তন করলে বাইনারিগুলি ভিন্ন হতে পারে। অ্যান্ড্রয়েড বিল্ডের বেশিরভাগ পাথ আপেক্ষিক পাথ, তাই C/C++ এ __FILE__ কোনও সমস্যা নয়। তবে, ডিবাগ প্রতীকগুলি ডিফল্টরূপে সম্পূর্ণ পাথনাম এনকোড করে এবং .note.gnu.build-id প্রি-স্ট্রিপড বাইনারি হ্যাশ করার মাধ্যমে তৈরি হয়, তাই ডিবাগ প্রতীকগুলি পরিবর্তন হলে এটি পরিবর্তন হবে।
সমাধান: AOSP এখন ডিবাগ পাথগুলিকে আপেক্ষিক করে তোলে। বিস্তারিত জানার জন্য, CL দেখুন: https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02 ।
টাইমস্ট্যাম্প
সমস্যা: বিল্ড আউটপুটে টাইমস্ট্যাম্পের ফলে অপ্রয়োজনীয় ফাইল পরিবর্তন হয়। এটি নিম্নলিখিত স্থানে ঘটতে পারে:
- C অথবা C++ কোডে
__DATE__/__TIME__/__TIMESTAMP__ম্যাক্রো। - জিপ-ভিত্তিক সংরক্ষণাগারে এমবেড করা টাইমস্ট্যাম্প।
সমাধান/উদাহরণ: বিল্ড আউটপুট থেকে টাইমস্ট্যাম্প অপসারণ করতে, C/C++ এ __DATE__/__TIME__/__TIMESTAMP__ এ নীচের নির্দেশাবলী এবং আর্কাইভে এমবেডেড টাইমস্ট্যাম্প ব্যবহার করুন।
C/C++ তে __DATE__/__TIME__/__TIMESTAMP__
এই ম্যাক্রোগুলি সবসময় বিভিন্ন বিল্ডের জন্য বিভিন্ন আউটপুট তৈরি করে, তাই এগুলি ব্যবহার করবেন না। এই ম্যাক্রোগুলি বাদ দেওয়ার জন্য এখানে কয়েকটি বিকল্প রয়েছে:
- এগুলো সরিয়ে ফেলুন। উদাহরণস্বরূপ, https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f দেখুন।
- চলমান বাইনারিটিকে অনন্যভাবে সনাক্ত করতে, ELF হেডার থেকে বিল্ড-আইডিটি পড়ুন।
- অপারেটিং সিস্টেমটি কখন তৈরি হয়েছিল তা জানতে,
ro.build.dateপড়ুন (এটি ইনক্রিমেন্টাল বিল্ড ছাড়া অন্য সব কিছুর জন্য কাজ করে, যা এই তারিখটি আপডেট নাও করতে পারে)। উদাহরণস্বরূপ, https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84 দেখুন।
আর্কাইভে এমবেড করা টাইমস্ট্যাম্প (জিপ, জার)
অ্যান্ড্রয়েড ৭.০ জিপ আর্কাইভে এমবেডেড টাইমস্ট্যাম্পের সমস্যা সমাধানের জন্য zip কমান্ডের সকল ব্যবহারে -X যোগ করেছে। এর ফলে বিল্ডারের UID/GID এবং জিপ ফাইল থেকে বর্ধিত ইউনিক্স টাইমস্ট্যাম্প মুছে ফেলা হয়েছে।
একটি নতুন টুল, ziptime ( /platform/build/+/android16-qpr1-release/tools/ziptime/ এ অবস্থিত) জিপ হেডারের স্বাভাবিক টাইমস্ট্যাম্পগুলি রিসেট করে। বিস্তারিত জানার জন্য, README ফাইলটি দেখুন।
signapk টুলটি APK ফাইলগুলির জন্য টাইমস্ট্যাম্প সেট করে যা সার্ভার টাইমজোনের উপর নির্ভর করে পরিবর্তিত হতে পারে। বিস্তারিত জানার জন্য, CL https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028 দেখুন।
signapk টুলটি APK ফাইলগুলির জন্য টাইমস্ট্যাম্প সেট করে যা সার্ভার টাইমজোনের উপর নির্ভর করে পরিবর্তিত হতে পারে। বিস্তারিত জানার জন্য, CL https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028 দেখুন।
সংস্করণ স্ট্রিং
সমস্যা: APK ভার্সনের স্ট্রিংগুলিতে প্রায়শই BUILD_NUMBER তাদের হার্ডকোডেড ভার্সনে যুক্ত করা হত। এমনকি যদি APK-তে অন্য কিছু পরিবর্তন নাও হয়, তবুও APK ভিন্ন থাকবে।
সমাধান: APK সংস্করণ স্ট্রিং থেকে বিল্ড নম্বরটি সরান।
উদাহরণ:
- https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27
- https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c
ডিভাইসে ভেরিটি গণনা সক্ষম করুন
যদি আপনার ডিভাইসে dm-verity সক্ষম করা থাকে, তাহলে OTA টুলগুলি স্বয়ংক্রিয়ভাবে আপনার verity কনফিগারেশনটি গ্রহণ করে এবং অন-ডিভাইস verity গণনা সক্ষম করে। এটি আপনার OTA প্যাকেজে raw বাইট হিসাবে সংরক্ষণ করার পরিবর্তে, অ্যান্ড্রয়েড ডিভাইসগুলিতে verity ব্লকগুলি গণনা করার অনুমতি দেয়। 2GB পার্টিশনের জন্য Verity ব্লকগুলি প্রায় 16MB ব্যবহার করতে পারে।
তবে, ডিভাইসে ভেরিটি কম্পিউটিং করতে অনেক সময় লাগতে পারে। বিশেষ করে, ফরোয়ার্ড ত্রুটি-সংশোধন কোডটি অনেক সময় নিতে পারে। পিক্সেল ডিভাইসে, এটি সাধারণত ১০ মিনিট পর্যন্ত সময় নেয়। লো-এন্ড ডিভাইসে এটি বেশি সময় নিতে পারে। আপনি যদি অন-ডিভাইস ভেরিটি কম্পিউটেশন অক্ষম করতে চান, কিন্তু তবুও dm-verity সক্ষম করতে চান, তাহলে OTA আপডেট তৈরি করার সময় আপনি --disable_fec_computation কে ota_from_target_files টুলে পাস করে তা করতে পারেন। এই ফ্ল্যাগটি OTA আপডেটের সময় অন-ডিভাইস ভেরিটি কম্পিউটেশন অক্ষম করে। এটি OTA ইনস্টলেশনের সময় হ্রাস করে, কিন্তু OTA প্যাকেজের আকার বৃদ্ধি করে। যদি আপনার ডিভাইসে dm-verity সক্রিয় না থাকে, তাহলে এই ফ্ল্যাগটি পাস করার কোনও প্রভাব নেই।
ধারাবাহিক নির্মাণ সরঞ্জাম
সমস্যা: ইনস্টল করা ফাইল তৈরি করে এমন টুলগুলি অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে (একটি প্রদত্ত ইনপুট সর্বদা একই আউটপুট তৈরি করবে)।
সমাধান/উদাহরণ: নিম্নলিখিত বিল্ড টুলগুলিতে পরিবর্তন প্রয়োজন ছিল:
- NOTICE ফাইল ক্রিয়েটার । NOTICE ফাইল ক্রিয়েটারটি পুনরুৎপাদনযোগ্য NOTICE সংগ্রহ তৈরি করার জন্য পরিবর্তন করা হয়েছে। CL দেখুন: https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64 ।
- জাভা অ্যান্ড্রয়েড কম্পাইলার কিট (জ্যাক) । জেনারেটেড কনস্ট্রাক্টর অর্ডারিংয়ে মাঝে মাঝে পরিবর্তনগুলি পরিচালনা করার জন্য জ্যাক টুলচেইনের একটি আপডেটের প্রয়োজন ছিল। কনস্ট্রাক্টরের জন্য ডিটারমিনিস্টিক অ্যাক্সেসরগুলি টুলচেইনে যোগ করা হয়েছে: https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b ।
- ART AOT কম্পাইলার (dex2oat) । ART কম্পাইলার বাইনারিটি একটি আপডেট পেয়েছে যা একটি নির্ধারক চিত্র তৈরি করার জন্য একটি বিকল্প যুক্ত করেছে: https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9 ।
- libpac.so ফাইল (V8) । প্রতিটি বিল্ডের জন্য V8 স্ন্যাপশট পরিবর্তিত হওয়ার কারণে প্রতিটি বিল্ড একটি ভিন্ন
/system/lib/libpac.soফাইল তৈরি করে। সমাধান ছিল স্ন্যাপশটটি সরিয়ে ফেলা: https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29 । - অ্যাপ্লিকেশন প্রি-ডেক্সোপ্ট (.odex) ফাইল । প্রি-ডেক্সোপ্ট (.odex) ফাইলগুলিতে ৬৪-বিট সিস্টেমে অপ্রচলিত প্যাডিং ছিল। এটি সংশোধন করা হয়েছে: https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029 ।
বিল্ড ডিফ টুলটি ব্যবহার করুন
যেসব ক্ষেত্রে বিল্ড-সম্পর্কিত ফাইল পরিবর্তনগুলি বাদ দেওয়া সম্ভব নয়, সেক্ষেত্রে AOSP দুটি ফাইল প্যাকেজের তুলনা করার জন্য একটি বিল্ড ডিফ টুল, target_files_diff.py অন্তর্ভুক্ত করে। এই টুলটি দুটি বিল্ডের মধ্যে একটি পুনরাবৃত্ত পার্থক্য সম্পাদন করে, সাধারণ বিল্ড-সম্পর্কিত ফাইল পরিবর্তনগুলি বাদ দিয়ে, যেমন
- বিল্ড আউটপুটে প্রত্যাশিত পরিবর্তন (উদাহরণস্বরূপ, বিল্ড নম্বর পরিবর্তনের কারণে)।
- বর্তমান বিল্ড সিস্টেমে জ্ঞাত সমস্যার কারণে পরিবর্তনগুলি।
বিল্ড ডিফ টুল ব্যবহার করতে, নিম্নলিখিত কমান্ডটি চালান:
target_files_diff.py dir1 dir2
dir1 এবং dir2 হল বেস ডিরেক্টরি যেখানে প্রতিটি বিল্ডের জন্য এক্সট্র্যাক্ট করা টার্গেট ফাইল থাকে।
ব্লক বরাদ্দ সামঞ্জস্যপূর্ণ রাখুন
একটি প্রদত্ত ফাইলের ক্ষেত্রে, যদিও দুটি বিল্ডের মধ্যে এর বিষয়বস্তু একই থাকে, তবে ডেটা ধারণকারী প্রকৃত ব্লকগুলি পরিবর্তিত হতে পারে। ফলস্বরূপ, OTA আপডেটের জন্য ব্লকগুলিকে সরানোর জন্য আপডেটারকে অপ্রয়োজনীয় I/O সম্পাদন করতে হবে।
ভার্চুয়াল A/B OTA আপডেটে, অপ্রয়োজনীয় I/O কপি-অন-রাইট স্ন্যাপশট সংরক্ষণের জন্য প্রয়োজনীয় স্টোরেজ স্পেসকে অনেকাংশে বাড়িয়ে দিতে পারে। A/B নয় এমন OTA আপডেটে, OTA আপডেটের জন্য ব্লকগুলি এদিক-ওদিক সরানো আপডেটের সময় বাড়ায় কারণ ব্লক সরানোর কারণে I/O বেশি থাকে।
এই সমস্যা সমাধানের জন্য, Android 7.0-এ Google make_ext4fs টুলটি সম্প্রসারিত করেছে যাতে বিল্ডগুলিতে ব্লক বরাদ্দ সামঞ্জস্যপূর্ণ থাকে। make_ext4fs টুলটি একটি ঐচ্ছিক -d base_fs ফ্ল্যাগ গ্রহণ করে যা ext4 ইমেজ তৈরি করার সময় একই ব্লকে ফাইল বরাদ্দ করার চেষ্টা করে। আপনি পূর্ববর্তী বিল্ডের টার্গেট ফাইলের জিপ ফাইল থেকে ব্লক ম্যাপিং ফাইলগুলি (যেমন base_fs ম্যাপ ফাইল) বের করতে পারেন। প্রতিটি ext4 পার্টিশনের জন্য, IMAGES ডিরেক্টরিতে একটি .map ফাইল থাকে (উদাহরণস্বরূপ, IMAGES/system.map system পার্টিশনের সাথে সম্পর্কিত)। এই base_fs ফাইলগুলি তারপর PRODUCT_<partition>_BASE_FS_PATH মাধ্যমে চেক-ইন করা যেতে পারে এবং নির্দিষ্ট করা যেতে পারে, যেমন এই উদাহরণে:
PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map PRODUCT_SYSTEM_EXT_BASE_FS_PATH := path/to/base_fs_files/base_system_ext.map PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map PRODUCT_PRODUCT_BASE_FS_PATH := path/to/base_fs_files/base_product.map PRODUCT_ODM_BASE_FS_PATH := path/to/base_fs_files/base_odm.map
যদিও এটি সামগ্রিক OTA প্যাকেজের আকার কমাতে সাহায্য করে না, তবে I/O এর পরিমাণ কমিয়ে OTA আপডেটের কর্মক্ষমতা উন্নত করে। ভার্চুয়াল A/B আপডেটের জন্য, এটি OTA প্রয়োগের জন্য প্রয়োজনীয় স্টোরেজ স্পেসের পরিমাণ উল্লেখযোগ্যভাবে হ্রাস করে।
অ্যাপ আপডেট করা থেকে বিরত থাকুন
বিল্ড ডিফেন্স কমানোর পাশাপাশি, অ্যাপ স্টোরের মাধ্যমে আপডেট পাওয়া অ্যাপগুলির আপডেট বাদ দিয়ে আপনি OTA আপডেটের আকার কমাতে পারেন। APK গুলি প্রায়শই একটি ডিভাইসের বিভিন্ন পার্টিশনের একটি উল্লেখযোগ্য অংশ ধারণ করে। OTA আপডেটে অ্যাপ স্টোর দ্বারা আপডেট করা অ্যাপগুলির সর্বশেষ সংস্করণগুলি অন্তর্ভুক্ত করলে OTA প্যাকেজগুলির উপর বড় আকারের প্রভাব পড়তে পারে এবং ব্যবহারকারীদের খুব কম সুবিধা প্রদান করতে পারে। ব্যবহারকারীরা যখন OTA প্যাকেজ পান, তখন তারা ইতিমধ্যেই অ্যাপ স্টোর থেকে সরাসরি আপডেট করা অ্যাপ, অথবা আরও নতুন সংস্করণ পেয়ে যেতে পারেন।