کتابخانه Jetpack WindowManager به توسعهدهندگان برنامه امکان میدهد از ضرایب شکل دستگاه جدید و محیطهای چندپنجرهای پشتیبانی کنند.
WindowManager Extensions (Extensions) یک ماژول پلاتفرم Android اختیاری است که
انواع مختلفی از ویژگیهای Jetpack WindowManager را فعال میکند. این ماژول در AOSP در
frameworks/base/libs/WindowManager/Jetpack
پیادهسازی شده است
و در دستگاههایی که از ویژگیهای WindowManager پشتیبانی میکنند عرضه میشود.
توزیع واحد افزونهها
اگر «افزونهها» در فایل ساخت دستگاه فعال باشد، «افزونهها» در کتابخانه JAR کامپایل میشوند و در بخش system_ext دستگاه قرار میگیرند.
برای فعال کردن «افزونهها» در دستگاه، موارد زیر را به فایل makefile محصول اضافه کنید:
$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk)
این کار بستههای androidx.window.extensions و androidx.window.sidecar را در دستگاه فعال میکند و ویژگی persist.wm.extensions.enabled را تنظیم میکند.
گنجاندن این بستهها در فایل ساخت همچنین بیانیهها را در
etc/permissions/ قرار میدهد و آنها را برای فرایندهای برنامه دردسترس قرار میدهد. معمولاً وقتی از کتابخانه Jetpack WindowManager استفاده میشود،
واحدها در زمان اجرا در فرایند برنامه بارگیری و بهعنوان بخشی از آن اجرا میشوند،
که عملکرد آن را شبیه به کد چارچوب سمت مشتری میکند، همانطور که در شکل زیر نشان داده شده است:
شکل ۱. افزونهها در فرایند برنامه بار شد.
پیمانه androidx.window.extensions پیمانه «افزونههای» کنونی درحال توسعه فعال است. ماژول androidx.window.sidecar یک ماژول قدیمی است
که برای سازگاری با نسخههای اولیه Jetpack WindowManager گنجانده شده است،
اما سایدکار دیگر بهطور فعال نگهداری نمیشود.
شکل زیر منطق تعیین استفاده از
androidx.window.extensions یا androidx.window.sidecar را نشان میدهد.
شکل ۲. درخت تصمیم برای دسترسی به androidx.window.extensions یا androidx.window.sidecar.
واحدهای افزونهها
افزونهها ویژگیهای پنجرهبندی را برای دستگاههای تاشو با صفحهنمایش بزرگ و دستگاههایی که از پنجرهبندی در نمایشگرهای خارجی پشتیبانی میکنند ارائه میدهند. حوزههای ویژگی شامل موارد زیر میشود:
پیادهسازیهای «تولیدکننده اصلی محصول» از «افزونهها» میتوانند مؤلفههای تهی یا مؤلفههایی با پیادهسازیهای پیشفرض یا ساختگی از روشهای موجود در رابط WindowExtensions
ارائه دهند، اگر سختافزار دستگاه از ویژگیهای مربوطه پشتیبانی نکند،
مگر اینکه ویژگی بهطور خاص در سند تعریف سازگاری (CDD) 7.1.1.1 درخواست شده باشد.
افزونهها و میاناهای برنامهسازی کاربردی Jetpack
واحد «افزونههای WindowManager» علاوه بر میاناهای برنامهسازی کاربردی پلاتفرم عمومی، سطح میانای برنامهسازی کاربردی خود را نیز ارائه میدهد. واحد «افزونهها» بهصورت عمومی در
کتابخانه Jetpack androidx.window.extensions
غیرتوسعهدهنده توسعه داده میشود، تا Jetpack WindowManager (androidx.window)
بتواند در زمان کامپایل به آن پیوند دهد. سطح Extensions API معمولاً
میاناهای برنامهسازی کاربردی سطح پایینتری ارائه میدهد.
APIهایی که «افزونهها» ارائه میدهد فقط برای استفاده توسط کتابخانه Jetpack WindowManager درنظر گرفته شده است. «میاناهای برنامهسازی کاربردی افزونهها» برای این طراحی نشدهاند که توسط توسعهدهندگان برنامه مستقیماً فراخوانی شوند. برای اطمینان از عملکرد صحیح، کتابخانه «افزونهها» نباید بهعنوان وابستگی برای برنامه در فایل ساخت Gradle اضافه شود. از پیشکامپایل کردن مستقیم کتابخانه «افزونهها» در برنامه خودداری کنید؛ درعوض، برای جلوگیری از بار کردن ترکیبی از کلاسهای «افزونهها» که ازپیش کامپایلشده و در زمان اجرا ارائه شدهاند، به بار کردن در زمان اجرا تکیه کنید.
Jetpack WindowManager (androidx.window) باید بهعنوان وابستگی برنامه اضافه شود و میاناهای برنامهسازی کاربردی عمومی توسعهدهنده را ارائه میدهد، ازجمله میاناهای برنامهسازی کاربردی برای ویژگیهای «افزونههای WindowManager». کتابخانه WindowManager بهطور خودکار
«افزونهها» را در فرایند برنامه بار میکند و
«واسطههای برنامهسازی کاربردی افزونهها» در سطح پایینتر را در انتزاعهای سطح بالاتر و
میاناهای متمرکزتر میپیچد. میاناهای برنامهسازی کاربردی WindowManager Jetpack از استانداردهای توسعه مدرن برنامه Android پیروی میکنند و هدف آنها ارائه قابلیت همکاری مناسب با ادغام خوب با پایههای کد است که از کتابخانههای دیگر AndroidX استفاده میکنند.
نسخهها و بهروزرسانیهای افزونهها
واحد «افزونهها» میتواند همراه با بهروزرسانیهای سالانه یا فصلی پلاتفرم Android بهروز شود. بهروزرسانیهای فصلی امکان میدهد سطح «میانای برنامهسازی کاربردی افزونهها» بین بهروزرسانیهای میانای برنامهسازی کاربردی پلاتفرم Android افزایش یابد، که این امر امکان تکرار سریعتر را فراهم میکند و به تولیدکنندگان تجهیزات اصلی فرصت میدهد تا دسترسی رسمی به میانای برنامهسازی کاربردی را به ویژگیهای جدید نزدیک به زمان عرضه سختافزار اضافه کنند.
جدول زیر فهرست نسخههای androidx.window.extensions API را برای
انتشارهای مختلف Android ارائه میدهد.
| نسخه پلاتفرم Android | سطح میانای برنامهسازی کاربردی افزونههای WindowManager | نسخه API androidx.window.extensions |
|---|---|---|
| Android 15 | 6 | ۱.۵.۰ (بهزودی ارائه میشود) |
| Android 14 QPR3 | 5 | ۱.۴.۰ (بهزودی) |
| Android 14 QPR1 | 4 | 1.3.0 |
| Android 14 | 3 | 1.2.0 |
| Android 13 QPR3 | 2 | 1.1.0 |
| Android 13 | 1 | 1.0.0 |
| Android 12L | 1 | 1.0.0 |
سطح «میانای برنامهسازی کاربردی افزونهها» (ستون وسط) هر بار که سطح میانای برنامهسازی کاربردی پایدار موجود (ستون سمت راست) افزایش مییابد، افزایش مییابد.
سازگاری با نسخه قدیمی و جدید
Jetpack WindowManager پیچیدگی کار با بهروزرسانیهای مکرر سطح API، تکامل سریع API، و سازگاری با نسخههای قدیمی را مدیریت میکند. وقتی کد کتابخانه در فرایند برنامه اجرا میشود، کتابخانه سطح «میانای برنامهسازی کاربردی افزونهها» اعلامشده را بررسی میکند و براساس سطح اعلامشده دسترسی به ویژگیها را فراهم میکند.
برای محافظت از برنامه دربرابر ازکارافتادن در زمان اجرا، WindowManager همچنین بررسی بازتاب جاوا در زمان اجرا را برای میاناهای برنامهسازی کاربردی «افزونههای» دردسترس براساس سطح میانای برنامهسازی کاربردی «افزونههای» اعلامشده انجام میدهد. اگر عدم تطابقی وجود داشته باشد، WindowManager میتواند استفاده از «افزونهها» را (بهطور جزئی یا کامل) غیرفعال کند و ویژگیهای مربوطه را بهعنوان دردسترس نبودن برای برنامه گزارش کند.
«افزونههای WindowManager» بهعنوان system_ext واحدی که از
میاناهای برنامهسازی کاربردی پلاتفرم خصوصی برای فراخوانی هسته WindowManager،
DeviceStateManager،
و سایر سرویسهای سیستم در پیادهسازی ویژگیهای «افزونهها» استفاده میکند پیادهسازی میشود.
ممکن است سازگاری با نسخههای پیشانتشار «افزونهها» قبلاز انتشار فصلی یا سالانه پلاتفرم Android مربوطه که نسخهها با آن نهایی میشوند حفظ نشود. سابقه کامل Extensions APIs را میتوانید در فایلهای متنی API window:extensions:extensions شاخه انتشار پیدا کنید.
نسخههای جدیدتر «افزونهها» باید همچنان با نسخههای پایینتر WindowManager که در برنامهها کامپایل شدهاند کار کنند تا سازگاری با نسخههای بعدی حفظ شود. برای اطمینان از این موضوع، هر نسخه جدید از Extensions API فقط APIهای جدید را اضافه میکند و APIهای قدیمیتر را حذف نمیکند. درنتیجه، برنامههایی که نسخههای پایینتر WindowManager دارند میتوانند به استفاده از Extensions APIs قدیمیتری که برنامهها دربرابر آنها همگردانی شدهاند ادامه دهند.
درستیسنجی CTS تضمین میکند که برای هر نسخه اعلامشده از «میاناهای برنامهسازی کاربردی افزونهها» در دستگاه، همه میاناهای برنامهسازی کاربردی برای آن نسخه و نسخههای قبلی وجود داشته باشد و کار کند.
عملکرد
مدول «افزونهها» بهطور پیشفرض از Android 14 (سطح API 34) در بارکنندههای کلاس سیستم غیر bootclasspath ذخیره میشود، بنابراین بهدلیل بار کردن مدول در حافظه هنگام راهاندازی برنامه، عملکرد تحت تأثیر قرار نمیگیرد. استفاده از ویژگیهای واحد ممکن است تأثیر اندکی بر مشخصههای عملکرد برنامهها داشته باشد، زیرا تماسهای IPC اضافی بین کارخواه و سرور انجام میشود.
مدولها
جاسازی فعالیت
عنصر فعالیت جاسازی به برنامهها امکان میدهد «میانای کاربر» خود را برای دستگاههای دارای صفحهنمایش بزرگ و نمایشگرهای خارجی بهینهسازی کنند. جاسازی فعالیت امکان ارائه دو فعالیت را در کنار هم در چیدمان چندپانلی فراهم میکند و توسعه برنامه تطبیقی را برای برنامههای قدیمی تسهیل میکند.
عنصر جاسازی فعالیت باید در همه دستگاههایی که صفحهنمایش داخلی آنها برابر یا بزرگتر از sw600dp است دردسترس باشد. «جاسازی فعالیت» باید در دستگاههایی که از اتصال نمایشگر خارجی پشتیبانی میکنند نیز فعال باشد، زیرا ممکن است برنامه هنگام اتصال نمایشگرهای خارجی در زمان اجرا در اندازه بزرگتری نشان داده شود.
پیکربندی دستگاه
هیچ پیکربندی خاصی برای دستگاه لازم نیست، بهجز فعال کردن ماژول «افزونهها» که در بخش توزیع ماژول «افزونهها» توضیح داده شده است. منطقی است که «افزونهها» را در همه دستگاههایی که از حالت چندپنجرهای پشتیبانی میکنند فعال کنید. نسخههای آتی Android احتمالاً «افزونهها» را در پیکربندیهای رایج دستگاههای دستی و صفحهنمایش بزرگ الزامی خواهند کرد.
اطلاعات چیدمان پنجره
وقتی لولا از پنجره برنامه عبور میکند، عنصر اطلاعات چیدمان پنجره موقعیت و وضعیت لولا را در دستگاه تاشو شناسایی میکند. اطلاعات چیدمان پنجره به برنامهها امکان میدهد در حالت رومیزی در دستگاههای تاشو به چیدمانهای بهینهشده پاسخ دهند و آنها را نشان دهند. برای جزئیات استفاده، برنامهتان را با تاشوندگی سازگار کنید را ببینید.
دستگاههای Android تاشو که دارای لولایی هستند که نواحی پانل نمایشگر جداگانه یا
پیوسته را به هم متصل میکند باید اطلاعات مربوط به لولا را
ازطریق WindowLayoutComponent دردسترس برنامهها قرار دهند.
موقعیت و حدود لولا باید نسبتبه پنجره برنامه که با Context منتقلشده به «میانای برنامهسازی کاربردی» شناسایی میشود گزارش شود. اگر مرزهای پنجره برنامه با مرزهای لولا تداخل نداشته باشد، لولا DisplayFeature نباید گزارش شود. همچنین قابلقبول است که ویژگیهای نمایشگر گزارش نشود
وقتی ممکن است موقعیت آنها بهطور قابلاطمینان گزارش نشود، مثلاً وقتی
پنجره برنامه میتواند آزادانه توسط کاربر در حالت چندپنجرهای یا
حالت جعبهنامهای سازگاری جابهجا شود.
برای ویژگیهای تاشو،
وقتی موقعیت لولا بین وضعیتهای
پایدار تغییر میکند، باید وضعیت بهروزرسانیها گزارش شود. بهطور پیشفرض در حالت نمایشگر تخت، میانای برنامهسازی کاربردی باید
FoldingFeature.State.FLAT را گزارش کند.
اگر سختافزار دستگاه بتواند در حالت نیمهتاشده در وضعیت پایداری قرار بگیرد،
میانای برنامهسازی کاربردی باید FoldingFeature.State.HALF_OPENED را گزارش کند.
هیچ حالت بستهای در API وجود ندارد، زیرا در چنین حالتی پنجره برنامه
یا قابلمشاهده نخواهد بود یا از مرزهای لولا عبور نخواهد کرد.
پیکربندی دستگاه
برای پشتیبانی از پیادهسازی ویژگی تاشو، «تولیدکنندگان تجهیزات اصلی» باید موارد زیر را انجام دهند:
وضعیتهای دستگاه را در
device_state_configuration.xmlپیکربندی کنید تا توسطDeviceStateManagerServiceاستفاده شود. برای مرجع، بهDeviceStateProviderImpl.javaمراجعه کنید.اگر پیادهسازیهای پیشفرض
DeviceStateProviderیاDeviceStatePolicyبرای دستگاه مناسب نیست، میتوان از پیادهسازی سفارشی استفاده کرد.واحد «افزونهها» را همانطور که در بخش توزیع واحد «افزونهها» توضیح داده شده است فعال کنید.
مکان ویژگیهای نمایش را در منبع رشته
com.android.internal.R.string.config_display_features(معمولاً درframeworks/base/core/res/res/values/config.xmlدر رونهاد دستگاه) مشخص کنید.قالب موردانتظار برای رشته:
<type>-[<left>,<top>,<right>,<bottom>]
typeمیتواندfoldیاhingeباشد. مقادیرleft،top،right، وbottomمختصات پیکسل عدد صحیح در فضای مختصات نمایشگر در جهت طبیعی نمایشگر است. رشته پیکربندی میتواند شامل چندین ویژگی نمایش باشد که با نقطهویرگول از هم جدا شدهاند.برای مثال:
<!-- Jetpack WindowManager display features --> <string name="config_display_features" translatable="false">fold-[1000,0,1000,2000]</string>نگاشت بین شناسههای وضعیت داخلی دستگاه که در
DeviceStateManagerاستفاده میشود و ثابتهای وضعیت عمومی که درcom.android.internal.R.array.config_device_state_posturesبه توسعهدهندگان ارسال میشود را تعریف کنید.قالب موردانتظار برای هر ورودی این است:
<device_specific_state_identifier>:<Jetpack WindowManager state identifier>شناسههای وضعیت پشتیبانیشده عبارتاند از:
-
COMMON_STATE_NO_FOLDING_FEATURES = 1: این حالت ویژگیهای تاشو برای گزارش ندارد. برای مثال، میتواند حالت بسته دستگاه تاشو معمولی با صفحهنمایش اصلی در سمت داخلی باشد. -
COMMON_STATE_HALF_OPENED = 2: ویژگی تاشو تا نیمه باز است. COMMON_STATE_FLAT = 3: ویژگی تاشو صاف است. برای مثال، میتواند حالت بازشده دستگاه تاشو معمولی با صفحهنمایش اصلی در سمت داخلی باشد.COMMON_STATE_USE_BASE_STATE = 1000: در Android نسخه ۱۴، مقداری که میتواند برای حالتهای شبیهسازیشده استفاده شود که در آن حالت لولا بااستفاده از حالت پایه مشتق میشود، همانطور که درCommonFoldingFeature.javaتعریف شده است.
برای اطلاعات بیشتر، به
DeviceStateManager.DeviceStateCallback#onBaseStateChanged(int)بروید.برای مثال:
<!-- Map of System DeviceState supplied by DeviceStateManager to WindowManager posture.--> <string-array name="config_device_state_postures" translatable="false"> <item>0:1</item> <!-- CLOSED : COMMON_STATE_NO_FOLDING_FEATURES --> <item>1:2</item> <!-- HALF_OPENED : COMMON_STATE_HALF_OPENED --> <item>2:3</item> <!-- OPENED : COMMON_STATE_FLAT --> <item>3:1</item> <!-- REAR_DISPLAY : COMMON_STATE_NO_FOLDING_FEATURES --> <item>4:1000</item> <!-- CONCURRENT : COMMON_STATE_USE_BASE_STATE --> </string-array>-
محدوده پنجره
عنصر ناحیه پنجره مجموعهای از ویژگیها را ارائه میدهد که به برنامهها امکان میدهد به نمایشگرهای اضافی و نواحی نمایشگر در برخیاز دستگاههای تاشو و چندنمایشگر دسترسی داشته باشند.
حالت نمایشگر پشتی به برنامه اجازه میدهد رابط کاربری پیشنمایش دوربین را در نمایشگر جلد دستگاه تاشو نشان دهد تا بتوان از دوربین اصلی دستگاه برای سلفی و ویدیو استفاده کرد. دستگاههایی که نمایشگر پوششی سازگار با Android (طبق تعریف Android CDD ازنظر مشخصههایی مثل اندازه، تراکم، و امکانات ناوبری دردسترس) دارند و با دوربینهای پشت دستگاه همتراز است باید امکان دسترسی به حالت نمایشگر پشت را فراهم کنند.
در Android 14، حالت نمایش دوگانه به برنامههایی که در نمایشگر داخلی دستگاه تاشو اجرا میشوند امکان میدهد محتوای اضافی را در نمایشگر پوششی که رو به کاربران دیگر است نشان دهند؛ برای مثال، نمایشگر پوششی میتواند پیشنمایش دوربین را به فردی که از او عکس یا فیلم گرفته میشود نشان دهد.
پیکربندی دستگاه
برای پشتیبانی از پیادهسازی ویژگی تاشو، «تولیدکنندگان تجهیزات اصلی» باید موارد زیر را انجام دهند:
وضعیتهای دستگاه را در
device_state_configuration.xmlپیکربندی کنید تا توسطDeviceStateManagerServiceاستفاده شود. برای اطلاعات بیشتر،DeviceStateProviderImpl.javaرا ببینید.اگر پیادهسازی پیشفرض
DeviceStateProviderیاDeviceStatePolicyبرای دستگاه مناسب نباشد، میتوان از پیادهسازی سفارشی استفاده کرد.برای دستگاههای تاشویی که از حالت باز یا تخت پشتیبانی میکنند، شناسههای حالت مربوطه را در
com.android.internal.R.array.config_openDeviceStatesمشخص کنید.برای دستگاههای تاشو که از حالتهای تاشده پشتیبانی میکنند، شناسههای حالت مربوطه را در
com.android.internal.R.array.config_foldedDeviceStatesفهرست کنید.برای دستگاههای تاشو داخلی که از حالت نیمهتاشده پشتیبانی میکنند (لولا نیمهباز است، مثل لپتاپ)، حالتهای مربوطه را در
com.android.internal.R.array.config_halfFoldedDeviceStatesفهرست کنید.برای دستگاههایی که از حالت نمایشگر پشتیبانی میکنند:
- ایالتهای مربوطه را در
com.android.internal.R.array.config_rearDisplayDeviceStatesبرایDeviceStateManagerفهرست کن. - نشانی نمایشگر فیزیکی نمایشگر پشت را در
com.android.internal.R.string.config_rearDisplayPhysicalAddressمشخص کنید. - شناسه ایالت را در
com.android.internal.R.integer.config_deviceStateRearDisplayمشخص کنید تا توسط «افزونهها» استفاده شود. - شناسه ایالت را در
com.android.internal.R.array.config_deviceStatesAvailableForAppRequestsاضافه کنید تا برای برنامهها دردسترس قرار گیرد.
- ایالتهای مربوطه را در
در Android 14، برای دستگاههایی که از حالت نمایش دوگانه (همزمان) پشتیبانی میکنند:
-
com.android.internal.R.bool.config_supportsConcurrentInternalDisplaysرا رویtrueتنظیم کنید. - نشانی نمایشگر فیزیکی نمایشگر پشت را در
com.android.internal.R.config_deviceStateConcurrentRearDisplayمشخص کنید. - شناسه وضعیت را در
com.android.internal.R.integer.config_deviceStateConcurrentRearDisplayمشخص کنید تا اگر قرار است شناسه برای برنامهها دردسترس قرار گیرد، «افزونهها» از آن استفاده کنند. - شناسه ایالتی را در
com.android.internal.R.array.config_deviceStatesAvailableForAppRequestsاضافه کنید تا برای برنامهها دردسترس قرار گیرد.
-
درستیسنجی
«تولیدکنندگان تجهیزات اصلی» باید پیادهسازیهای خود را درستیسنجی کنند تا از عملکرد موردانتظار در سناریوهای رایج مطمئن شوند. آزمایشهای CTS و آزمایشهای استفاده از Jetpack WindowManager برای آزمایش پیادهسازیها دراختیار سازندگان تجهیزات اصلی قرار دارد.
آزمایشهای CTS
برای اجرای آزمایشهای CTS، به اجرای آزمایشهای CTS مراجعه کنید. آزمایشهای CTS مربوط به Jetpack WindowManager در
cts/tests/framework/base/windowmanager/jetpack/ قرار دارند.
نام ماژول آزمایشی CtsWindowManagerJetpackTestCases است.
آزمایشهای WindowManager
برای بارگیری آزمایشهای Jetpack WindowManager، دستورالعملهای Android Jetpack را دنبال کنید
آزمایشها در کتابخانه پنجره در زیر واحد window:window قرار دارند:
window/window/src/androidTest/.
برای اجرای آزمایشهای دستگاه برای واحد window:window از خط فرمان،
کارهای زیر را انجام دهید:
- دستگاهی را که گزینههای توسعهدهندگان و اشکالزدایی USB در آن فعال است وصل کنید.
- به رایانه اجازه دهید دستگاه را اشکالزدایی کند.
- پوسته را در دایرکتوری ریشه مخزن androidx باز کنید.
- تغییر دایرکتوری به
framework/support. - فرمان
./gradlew window:window:connectedAndroidTestرا اجرا کنید. - نتایج را تحلیل کنید.
برای اجرای آزمایشها از «استودیو Android»، مراحل زیر را انجام دهید:
- «استودیو Android» را باز کنید.
- دستگاهی را که گزینههای توسعهدهندگان و اشکالزدایی USB در آن فعال است وصل کنید.
- به رایانه اجازه دهید دستگاه را اشکالزدایی کند.
- به آزمایشی در کتابخانه پنجرهای واحد پنجره پیمایش کنید.
- کلاس آزمایشی را باز کنید و بااستفاده از کلیدهای سبز در سمت راست ویرایشگر اجرا کنید.
همچنین میتوانید پیکربندیای در «استودیو Android» ایجاد کنید تا روش آزمون، کلاس آزمون، یا همه آزمونهای یک واحد را اجرا کنید.
با نگاه کردن به برونداد پوسته میتوان نتایج را بهصورت دستی تجزیهوتحلیل کرد. اگر دستگاه پیشفرضهای خاصی را برآورده نکند، برخیاز آزمایشها رد میشوند. نتایج در مکان استانداردی ذخیره میشود و تحلیلگران میتوانند دستورگانی برای خودکارسازی تحلیل نتایج بنویسند.