سیستم فایل افزایشی

واحد هسته «سیستم فایل افزایشی» (IncFS) که در Android 11 معرفی شده است سیستم‌عامل Android را قادر می‌سازد تا فایل‌های APK جاری‌سازی‌شده را ازطریق «پل اشکال‌زدایی Android» (ADB) دریافت کند.

این واحد هسته خوداتکا سیستم فایل مجازی جدیدی ایجاد می‌کند که در بالای سیستم فایل Android موجود قرار می‌گیرد. این امر مکمل تغییرات در چارچوب و کیت توسعه نرم‌افزار است تا توسعه‌دهندگان برنامه و بازی بتوانند فایل‌های APK بزرگ را ازطریق ADB در دستگاهی که Android 11 یا بالاتر را اجرا می‌کند مستقر کنند.

تغییر هسته امکان استفاده از قالب جدید «طرح امضای APK نسخه ۴» را فراهم می‌کند و از تغییرات چارچوب Android در «مدیر بسته Android»، خدمات سیستم جدید، و تغییرات ADB پشتیبانی می‌کند.

پیاده‌سازی

برای پیاده‌سازی IncFS، تولیدکنندگان تجهیزات اصلی و سازندگان SoC باید یک درایور هسته جدید به ساخت‌های دستگاه Android خود اضافه کنند.

فقط برای Android 11، اگر درایور هسته به‌عنوان ماژول ساخته شده باشد، درصورت درخواست بار می‌شود. اگر هیچ برنامه‌ای ازطریق نصب افزایشی ADB نصب نشده باشد، دستگاه درایور هسته را بار نمی‌کند.

درغیراین‌صورت، وقتی به‌عنوان بخشی از تصویر هسته ساخته می‌شود، درایور همیشه بار می‌شود. این پیاده‌سازی برای Android 12 و بالاتر معتبر است و می‌تواند با Android 11 استفاده شود. برای اطلاعات درباره ارتقا دادن درایور هسته به Android 12، ارتقا دادن درایور هسته را ببینید.

درایور هسته بخشی از سیستم بزرگ‌تری برای فعال کردن نصب‌های APK جاری‌سازی‌شده است. تولیدکنندگان تجهیزات اصلی و فروشندگان نیازی به استفاده از کد دقیق IncFS ارائه‌شده در پیاده‌سازی‌های نمونه ندارند. بااین‌حال، برای اطمینان از تجربه یکسان در همه دستگاه‌ها، باید مطمئن شوید که پیاده‌سازی میانای برنامه‌سازی کاربردی دارای سیستم فایلی است که عملکرد خواندن فایل و عملکرد خواندن-نوشتن دایرکتوری را طبق تعریف در سند میانای Userspace برای Incremental FS دارد.

علاوه‌براین، پیاده‌سازی‌ها باید گزینه‌های نصب و فایل‌های ویژه داشته باشند که ازنظر عملکردی با پیاده‌سازی نمونه IncFS مطابقت داشته باشند.

در فهرست زیر تغییرات لازم برای پیاده‌سازی آمده است:

  1. دستگاه توسعه را برای ساختن هسته راه‌اندازی کنید.
  2. هسته مشترک را از شاخه common-android-mainline هدف‌یابی کنید.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. بررسی کنید که تغییرات زیر که برای IncFS لازم است در شاخه بررسی وجود داشته باشد:
  4. یا CONFIG_INCREMENTAL_FS=y یا برای فقط Android 11، CONFIG_INCREMENTAL_FS=m را در پایین فایل defconfig اضافه کنید. برای دیدن مثال، روی یکی از پیوندهای زیر کلیک کنید:
  5. ساختن هسته
  6. هسته را در ساخت تصویر دستگاه Android جاسازی کنید.
  7. برای دستگاه Android هدف، یکی از خطوط دارایی سیستم مختص فروشنده زیر را به فایل device.mk خود اضافه کنید (در دستگاه‌هایی که با Android 12 و نسخه‌های بالاتر عرضه می‌شوند اختیاری است):
  8. وقتی از CONFIG_INCREMENTAL_FS=y استفاده می‌کنید، فایل را با یکی از این موارد پیوست کنید:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    وقتی از CONFIG_INCREMENTAL_FS=m (فقط برای Android 11) استفاده می‌کنید، یکی از این موارد را به فایل اضافه کنید:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. فایل‌های نمونه device.mk را برای شبیه‌ساز Android و Pixel 4 ببینید.
  10. فقط برای Android 11: اگر از CONFIG_INCREMENTAL_FS=m استفاده می‌کنید، قوانین SE Linux را اضافه کنید.
  11. فایل vold.te را با محتوای زیر در پوشه /system/sepolicy/vendor دستگاهتان ایجاد و اضافه کنید:

    • vold.te

    به آن اجازه دهید درایور سیستم فایل افزایشی را بار کند:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    قوانین SE Linux زیر را به فایل file.te موجود که در پوشه /system/sepolicy/vendor شما قرار دارد اضافه کنید:

    • ‫file.te فایل - برای مثال، این file.te فایل را ببینید.)
    • گرداننده سیستم فایل افزایشی
    • type vendor_incremental_module, vendor_file_type, file_type;

    قوانین زیر SE Linux را به فایل file_contents موجود در پوشه /system/sepolicy/vendor اضافه کنید:

    • فایل file_contents - برای نمونه، این فایل file_contents را ببینید.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

ارتقای درایور هسته

دستگاه‌هایی که به Android 12 ارتقا می‌یابند ممکن است نسخه قدیمی‌تری از درایور IncFS داشته باشند. برای این دستگاه‌ها، AOSP توصیه می‌کند که درایور IncFS را به نسخه فعلی (در این مورد v2) به‌روزرسانی کنید، زیرا:

  • نسخه منتشرشده با Android 11 پیاده‌سازی اولیه IncFS است که فقط برای پشتیبانی از نصب ADB هدف‌یابی شده است.
  • ‫Android 12 از درایور IncFS برای جاری‌سازی نصب بازی‌های Play استفاده می‌کند، که برای تجربه کاربری بهتر به ویژگی‌های جدید و بهینه‌سازی‌های IncFS v2 نیاز دارد.
  • V1 از جاری‌سازی بازی پشتیبانی می‌کند، اما این کار را با افت عملکرد و مصرف بیشتر باتری، CPU، و RAM نسبت به v2 انجام می‌دهد.
  • نسخه ۲ تجربه کاربری بهتری برای جاری‌سازی ارائه می‌دهد، با پویانمایی‌های پیشرفت روان، گزارش دقیق استفاده از فضای دیسک، و جلوگیری از تداخل جاری‌سازی برنامه‌های طرف سوم.

برای ارتقا دادن درایور IncFS در هسته، وصله‌های زیر را برای هسته ۴.۱۴ یا هسته ۴.۱۹ اعمال کنید:

برای همه نسخه‌های سفارشی دیگر هسته، لطفاً یکی از مجموعه‌های وصله را انتقال دهید. این تغییرات فقط بر دایرکتوری fs/incfs تأثیر می‌گذارند و به‌طور کامل بر کد v1 موجود اعمال می‌شوند.

به‌همان روشی که برای نسخه اصلی استفاده می‌کردید، به استفاده از درایور IncFS ادامه دهید، اما اکنون در Android 11 ارتقا یافته است، یا به‌عنوان بخشی داخلی از تصویر هسته، یا به‌عنوان یک واحد جداگانه. پیکربندی صفحه سیستم یا ویژگی سیستم را تغییر ندهید.

دستگاه‌های جدیدی که از تصویر هسته GKI استفاده می‌کنند به‌طور خودکار جدیدترین درایور IncFS (نسخه ۲) را دریافت می‌کنند که به‌عنوان بخشی از تصویر هسته پیکربندی شده است. این کار نیاز به مراحل اضافی ندارد.

پیکربندی واحد بارشدنی در Android 12 منسوخ شد و برای دستگاه‌های جدید پشتیبانی نمی‌شود. این ویژگی فقط برای ارتقاها یا برای ثابت کردن تصویر فروشنده مجاز است وقتی هسته اصلی ازقبل آن را به‌عنوان واحد داخلی داشته باشد.

پیاده‌سازی‌های مرجع

این پیاده‌سازی را می‌توان به‌عنوان بخشی از تصویر هسته یا (فقط برای Android 11) به‌عنوان یک ماژول قابل‌بارگیری درنظر گرفت.

واحد بارکردنی (دستگاه Pixel 4) شبیه‌ساز Android (به‌عنوان بخشی از تصویر هسته)

اعتبارسنجی و آزمایش

پیاده‌سازی را بااستفاده از «آزمون‌های واحد ویژگی»، CTS، و GTS اعتبارسنجی کنید.

CTS

از CtsIncrementalInstallHostTestCases استفاده کنید.

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

آزمایش IncFS

  1. محیط توسعه نرم‌افزار را راه‌اندازی کنید.
  2. تکالیف پیاده‌سازی را که در بخش پیاده‌سازی شرح داده شده است تکمیل کنید.
  3. آزمایش‌های دستی زیر را اجرا کنید:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

آزمایش IncFS با «کیت توسعه نرم‌افزار Android» (ADB و apksigner)

  • محیط توسعه نرم‌افزار را راه‌اندازی کنید.
  • تکالیف پیاده‌سازی را که در بخش پیاده‌سازی ذکر شده است تکمیل کنید.
  • ساخت را روی دستگاه فیزیکی هدف یا شبیه‌ساز فلش کنید.
  • یک APK موجود را تولید یا دریافت کنید.
  • کلید امضای اشکال‌زدایی ایجاد کنید.
  • فایل APK را با قالب امضای v4 از پوشه build-tools امضا کنید.
    ./apksigner sign --ks debug.keystore game.apk
  • فایل APK را در دستگاه از پوشه platform-tools نصب کنید.
    ./adb install game.apk
نمونه نصب
شکل ۱: مثال نصب

یافتن این آزمون‌ها