بسته های OTA بسازید

شما می‌توانید از ابزار ota_from_target_files که در build/make/tools/releasetools ارائه شده است، برای ساخت بسته‌های OTA کامل و افزایشی برای دستگاه‌هایی که از به‌روزرسانی‌های سیستم A/B یا به‌روزرسانی‌های سیستم غیر A/B استفاده می‌کنند، استفاده کنید. این ابزار فایل target-files.zip تولید شده توسط سیستم ساخت اندروید را به عنوان ورودی دریافت می‌کند.

برای دستگاه‌هایی که اندروید ۱۱ یا بالاتر را اجرا می‌کنند، می‌توانید یک بسته OTA برای چندین دستگاه با SKU های مختلف بسازید. انجام این کار مستلزم پیکربندی دستگاه‌های هدف برای استفاده از اثر انگشت‌های پویا و به‌روزرسانی فراداده‌های OTA برای درج نام دستگاه و اثر انگشت در ورودی‌های پیش و پس از شرط است.

اندروید ۸.۰ بسته‌های OTA مبتنی بر فایل را برای دستگاه‌های غیر A/B منسوخ کرد، که در عوض باید از بسته‌های OTA مبتنی بر بلوک استفاده کنند. برای تولید بسته‌های OTA مبتنی بر بلوک یا دستگاه‌هایی که اندروید ۷.x یا پایین‌تر را اجرا می‌کنند، گزینه --block را به پارامتر ota_from_target_files ارسال کنید.

ساخت به‌روزرسانی‌های کامل

یک به‌روزرسانی کامل ، یک بسته OTA است که شامل کل وضعیت نهایی دستگاه (پارتیشن‌های سیستم، بوت و ریکاوری) می‌شود. تا زمانی که دستگاه قادر به دریافت و اعمال بسته باشد، بسته می‌تواند بدون توجه به وضعیت فعلی دستگاه، نسخه ساخته شده را نصب کند. به عنوان مثال، دستورات زیر از ابزارهای انتشار برای ساخت آرشیو target-files.zip برای دستگاه tardis استفاده می‌کنند.

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist یک بسته کامل OTA (در $OUT ) می‌سازد. فایل .zip حاصل شامل همه چیزهایی است که برای ساخت بسته‌های OTA برای دستگاه tardis لازم است. همچنین می‌توانید ota_from_target_files را به عنوان یک فایل باینری پایتون بسازید و آن را برای ساخت بسته‌های کامل یا افزایشی فراخوانی کنید.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

مسیر ota_from_target_files در $PATH تنظیم شده است و فایل باینری پایتون حاصل در دایرکتوری out/ قرار دارد.

ota_update.zip اکنون آماده ارسال به دستگاه‌های آزمایشی است (همه چیز با کلید آزمایشی امضا شده است). برای دستگاه‌های کاربر، کلیدهای خصوصی خود را همانطور که در بخش امضای نسخه‌های آزمایشی توضیح داده شده است، تولید و استفاده کنید.

ساخت به‌روزرسانی‌های تدریجی

به‌روزرسانی افزایشی ، یک بسته OTA است که شامل وصله‌های باینری برای داده‌های موجود در دستگاه است. بسته‌هایی که به‌روزرسانی‌های افزایشی دارند، معمولاً کوچک‌تر هستند زیرا نیازی به شامل کردن فایل‌های بدون تغییر ندارند. علاوه بر این، از آنجایی که فایل‌های تغییر یافته اغلب بسیار شبیه به نسخه‌های قبلی خود هستند، این بسته فقط باید شامل کدگذاری تفاوت‌های بین دو فایل باشد.

شما می‌توانید یک بسته به‌روزرسانی افزایشی را فقط روی دستگاه‌هایی نصب کنید که از نسخه منبع (source build) در ساخت بسته استفاده شده باشد. برای ساخت یک به‌روزرسانی افزایشی، به فایل target_files.zip از نسخه قبلی (نسخه‌ای که می‌خواهید از آن به‌روزرسانی کنید) و همچنین فایل target_files.zip از نسخه جدید نیاز دارید. به عنوان مثال، دستورات زیر از ابزارهای انتشار (release tools) برای ساخت یک به‌روزرسانی افزایشی برای دستگاه tardis استفاده می‌کنند.

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

این نسخه بسیار شبیه به نسخه قبلی است و بسته به‌روزرسانی افزایشی ( incremental_ota_update.zip ) بسیار کوچک‌تر از به‌روزرسانی کامل مربوطه است (حدود ۱ مگابایت به جای ۶۰ مگابایت).

یک بسته افزایشی را فقط در دستگاه‌هایی توزیع کنید که دقیقاً همان نسخه قبلی را که به عنوان نقطه شروع بسته افزایشی استفاده شده است، اجرا می‌کنند. شما باید فایل‌های image را در PREVIOUS-tardis-target_files.zip یا PREVIOUS-tardis-img.zip (هر دو با make dist ساخته شده‌اند تا با fastboot update فلش شوند) فلش کنید، نه فایل‌های image موجود در دایرکتوری PRODUCT_OUT (ساخته شده با make که با fastboot flashall فلش خواهد شد). تلاش برای نصب بسته افزایشی روی دستگاهی با نسخه دیگری از سیستم عامل منجر به خطای نصب می‌شود. هنگامی که نصب با شکست مواجه می‌شود، دستگاه در همان حالت کار (اجرای سیستم قدیمی) باقی می‌ماند. بسته قبل از لمس فایل‌هایی که به‌روزرسانی می‌کند، وضعیت قبلی آنها را تأیید می‌کند، بنابراین دستگاه در حالت نیمه‌ارتقاء قرار نمی‌گیرد.

برای بهترین تجربه کاربری، به ازای هر ۳ تا ۴ به‌روزرسانی تدریجی، یک به‌روزرسانی کامل ارائه دهید. این کار به کاربران کمک می‌کند تا از آخرین نسخه مطلع شوند و از نصب طولانی به‌روزرسانی‌های تدریجی جلوگیری شود.

ساخت بسته‌های OTA برای چندین SKU

اندروید ۱۱ یا بالاتر از استفاده از یک بسته OTA واحد برای چندین دستگاه با SKU های مختلف پشتیبانی می‌کند. انجام این کار مستلزم پیکربندی دستگاه‌های هدف برای استفاده از اثر انگشت پویا و به‌روزرسانی ابرداده OTA (با استفاده از ابزارهای OTA) برای درج نام دستگاه و اثر انگشت در ورودی‌های شرط قبل و بعد است.

درباره SKU ها

قالب یک SKU، گونه‌ای از مقادیر پارامتر ساخت ترکیبی است و معمولاً زیرمجموعه‌ای اعلام‌نشده از پارامترهای build_fingerprint فعلی است. تولیدکنندگان تجهیزات اصلی (OEM) می‌توانند از هر ترکیبی از پارامترهای ساخت تأیید شده توسط CDD برای یک SKU استفاده کنند و در عین حال از یک تصویر واحد برای آن SKUها نیز استفاده کنند. به عنوان مثال، SKU زیر دارای چندین گونه است:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA سطح دستگاه است (مانند Pro، Premium یا Plus)
  • modifierB نوع سخت‌افزاری (مانند رادیو) است.
  • modifierC منطقه است که می‌تواند عمومی (مانند NA، EMEA یا CHN) یا مختص کشور یا زبان (مانند JPN، ENG یا CHN) باشد.

بسیاری از تولیدکنندگان اصلی تجهیزات (OEM) از یک تصویر واحد برای چندین SKU استفاده می‌کنند، سپس نام نهایی محصول و اثر انگشت دستگاه را در زمان اجرا پس از بوت شدن دستگاه استخراج می‌کنند. این فرآیند، فرآیند توسعه پلتفرم را ساده می‌کند و به دستگاه‌هایی با سفارشی‌سازی‌های جزئی اما نام‌های محصول متفاوت، امکان می‌دهد تصاویر مشترک (مانند tardis و tardispro ) را به اشتراک بگذارند.

استفاده از اثر انگشت پویا

یک اثر انگشت، مجموعه‌ای تعریف‌شده از پارامترهای ساخت مانند ro.product.brand ، ro.product.name و ro.product.device است. اثر انگشت یک دستگاه از اثر انگشت پارتیشن سیستم گرفته شده و به عنوان شناسه منحصر به فرد تصاویر (و بایت‌ها) در حال اجرا روی دستگاه استفاده می‌شود. برای ایجاد یک اثر انگشت پویا ، از منطق پویا در فایل build.prop دستگاه استفاده کنید تا مقدار متغیرهای بوت لودر را در زمان بوت دستگاه دریافت کنید، سپس از آن داده‌ها برای ایجاد یک اثر انگشت پویا برای آن دستگاه استفاده کنید.

برای مثال، برای استفاده از اثر انگشت پویا برای دستگاه‌های tardis و tardispro ، فایل‌های زیر را مطابق شکل زیر به‌روزرسانی کنید.

  • فایل odm/etc/build_std.prop را به‌روزرسانی کنید تا خط زیر را در بر بگیرد.

    ro.odm.product.device=tardis
    
  • فایل odm/etc/build_pro.prop را به‌روزرسانی کنید تا خط زیر را در بر بگیرد.

    ro.odm.product.device=tardispro
    
  • فایل odm/etc/build.prop را به‌روزرسانی کنید تا شامل خطوط زیر باشد.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

این خطوط به صورت پویا مقادیر نام دستگاه، اثر انگشت و ro.build.fingerprint را بر اساس مقدار ویژگی بوت لودر ro.boot.product.hardware.sku (که فقط خواندنی است) تنظیم می‌کنند.

به‌روزرسانی فراداده بسته OTA

یک بسته OTA حاوی یک فایل فراداده ( META-INF/com/android/metadata ) است که بسته را توصیف می‌کند، از جمله پیش‌شرط‌ها و پس‌شرط‌های بسته OTA. برای مثال، کد زیر فایل فراداده برای یک بسته OTA است که دستگاه tardis را هدف قرار می‌دهد.

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

مقادیر pre-device ، pre-build-incremental و pre-build وضعیتی را که یک دستگاه باید قبل از نصب بسته OTA داشته باشد، تعریف می‌کنند. مقادیر post-build-incremental و post-build وضعیتی را که انتظار می‌رود دستگاه پس از نصب بسته OTA داشته باشد، تعریف می‌کنند. مقادیر فیلدهای pre- و post- از ویژگی‌های ساخت مربوطه زیر گرفته می‌شوند.

  • مقدار pre-device از ویژگی ساخت ro.product.device گرفته شده است.
  • مقادیر pre-build-incremental و post-build-incremental از ویژگی build مربوط به ro.build.version.incremental مشتق شده‌اند.
  • مقادیر pre-build و post-build از ویژگی ساخت ro.build.fingerprint مشتق شده‌اند.

در دستگاه‌هایی که اندروید ۱۱ یا بالاتر را اجرا می‌کنند، می‌توانید از پرچم --boot_variable_file در ابزارهای OTA برای مشخص کردن مسیری به فایلی که حاوی مقادیر متغیرهای زمان اجرا مورد استفاده در ایجاد اثر انگشت پویای دستگاه است، استفاده کنید. سپس از این داده‌ها برای به‌روزرسانی فراداده OTA استفاده می‌شود تا نام دستگاه و اثر انگشت در شرایط pre- و post- (با استفاده از کاراکتر پایپ | به عنوان جداکننده) گنجانده شود. پرچم --boot_variable_file دارای نحو و توضیحات زیر است.

  • نحو: --boot_variable_file <path>
  • توضیحات: مسیری را به فایلی مشخص می‌کند که حاوی مقادیر ممکن برای ویژگی‌های ro.boot.* است. برای محاسبه‌ی اثر انگشت‌های احتمالی زمان اجرا، زمانی که برخی از ویژگی‌های ro.product.* توسط دستور import لغو می‌شوند، استفاده می‌شود. این فایل در هر خط یک ویژگی را انتظار دارد که هر خط دارای قالب زیر است: prop_name=value1,value2 .

برای مثال، وقتی ویژگی ro.boot.product.hardware.sku=std,pro باشد، فراداده‌های OTA برای دستگاه‌های tardis و tardispro به صورت زیر خواهد بود.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

برای پشتیبانی از این قابلیت در دستگاه‌هایی که اندروید ۱۰ را اجرا می‌کنند، به پیاده‌سازی مرجع مراجعه کنید. این فهرست تغییرات، دستورات import را در فایل build.prop به صورت مشروط تجزیه می‌کند، که باعث می‌شود overrideهای ویژگی شناسایی شده و در فراداده نهایی OTA منعکس شوند.