زیرسیستم ورودی اندروید به طور اسمی از یک خط لوله رویداد تشکیل شده است که چندین لایه از سیستم را طی می کند.
خط لوله ورودی
در پایینترین لایه، دستگاه ورودی فیزیکی سیگنالهایی تولید میکند که تغییرات حالت را توصیف میکنند، مانند فشار دادن کلیدها و نقاط تماس لمسی. سفتافزار دستگاه این سیگنالها را به روشی مانند ارسال گزارشهای USB HID به سیستم یا با ایجاد وقفه در یک گذرگاه I2C، رمزگذاری و انتقال میدهد.
سپس سیگنال ها توسط یک درایور دستگاه در هسته لینوکس رمزگشایی می شوند. هسته لینوکس درایورهای بسیاری از تجهیزات جانبی استاندارد را فراهم می کند، به ویژه آنهایی که به پروتکل HID پایبند هستند. با این حال، یک OEM اغلب باید درایورهای سفارشی را برای دستگاههای تعبیهشده که به شدت در سطح پایینی با سیستم ادغام شدهاند، مانند صفحهنمایشهای لمسی، ارائه دهد.
درایورهای دستگاه ورودی، از طریق پروتکل ورودی لینوکس، مسئول ترجمه سیگنالهای خاص دستگاه به قالب رویداد ورودی استاندارد هستند. پروتکل ورودی لینوکس مجموعه استانداردی از انواع رویدادها و کدها را در فایل هدر کرنل linux/input.h
تعریف می کند. به این ترتیب، اجزای خارج از هسته نیازی به توجه به جزئیاتی مانند کدهای اسکن فیزیکی، استفاده از HID، پیامهای I2C، پینهای GPIO و موارد مشابه ندارند.
سپس، مؤلفه Android EventHub
با باز کردن درایور evdev
مرتبط با هر دستگاه ورودی، رویدادهای ورودی را از هسته میخواند. سپس مؤلفه Android InputReader رویدادهای ورودی را با توجه به کلاس دستگاه رمزگشایی میکند و جریانی از رویدادهای ورودی Android را تولید میکند. به عنوان بخشی از این فرآیند، کدهای رویداد پروتکل ورودی لینوکس با توجه به پیکربندی دستگاه ورودی، فایلهای طرحبندی صفحهکلید و جداول نقشهبرداری مختلف به کدهای رویداد Android ترجمه میشوند.
در نهایت، InputReader
رویدادهای ورودی را به InputDispatcher ارسال میکند که آنها را به پنجره مربوطه ارسال میکند.
نقاط کنترل
مراحل مختلفی در خط لوله ورودی وجود دارد که بر روی رفتار دستگاه ورودی کنترل می شود.
پیکربندی درایور و سیستم عامل
درایورهای دستگاه ورودی اغلب رفتار دستگاه ورودی را با تنظیم پارامترها در رجیسترها یا حتی آپلود خود سفتافزار پیکربندی میکنند. این مورد مخصوصاً برای دستگاههای تعبیهشده مانند صفحهنمایشهای لمسی که بخش بزرگی از فرآیند کالیبراسیون شامل تنظیم این پارامترها یا تعمیر سفتافزار برای ارائه دقت و پاسخگویی مطلوب و کاهش نویز است، صادق است.
گزینه های پیکربندی درایور اغلب به عنوان پارامترهای ماژول در بسته پشتیبانی از برد هسته (BSP) مشخص می شوند تا یک درایور بتواند چندین پیاده سازی سخت افزاری مختلف را پشتیبانی کند.
این مستندات سعی میکند پیکربندی درایور یا سیستمافزار را توصیف کند، اما راهنماییهایی را در مورد کالیبراسیون دستگاه به طور کلی ارائه میکند.
ویژگی های پیکربندی برد
بسته پشتیبانی از برد هسته (BSP) ممکن است ویژگیهای پیکربندی برد را از طریق SysFS صادر کند که توسط مؤلفه InputReader Android استفاده میشود، مانند قرار دادن کلیدهای مجازی روی صفحه لمسی.
برای جزئیات در مورد نحوه استفاده دستگاه های مختلف از ویژگی های پیکربندی برد، به بخش های کلاس دستگاه مراجعه کنید.
همپوشانی منابع
چند رفتار ورودی از طریق همپوشانی منابع در config.xml
پیکربندی میشوند، مانند عملکرد سوئیچ درب.
در اینجا چند نمونه هستند:
config_lidKeyboardAccessibility
: تأثیر سوئیچ درب را بر قابل دسترسی یا پنهان بودن صفحه کلید سخت افزاری مشخص می کند.config_lidNavigationAccessibility
: تأثیر سوئیچ درب را بر قابل دسترسی یا پنهان بودن صفحه لمسی مشخص می کند.config_longPressOnPowerBehavior
: مشخص می کند که وقتی کاربر دکمه پاور را نگه می دارد چه اتفاقی می افتد.config_lidOpenRotation
: تأثیر سوئیچ درب را بر جهت صفحه نمایش مشخص می کند.
برای جزئیات در مورد هر گزینه پیکربندی، به مستندات درون frameworks/base/core/res/res/values/config.xml
مراجعه کنید.
نقشه های کلیدی
نقشههای کلید توسط اجزای Android EventHub
و InputReader
برای پیکربندی نگاشت از کدهای رویداد لینوکس به کدهای رویداد Android برای کلیدها، دکمههای جوی استیک و محورهای جوی استیک استفاده میشوند. نقشه برداری ممکن است وابسته به دستگاه یا زبان باشد.
برای جزئیات در مورد نحوه استفاده دستگاه های مختلف از نقشه های کلیدی، به بخش های کلاس دستگاه مراجعه کنید.
فایل های پیکربندی دستگاه را وارد کنید
فایلهای پیکربندی دستگاه ورودی توسط اجزای Android EventHub
و InputReader
برای پیکربندی ویژگیهای خاص دستگاه مانند نحوه گزارش اطلاعات اندازه لمس استفاده میشوند.
برای جزئیات در مورد نحوه استفاده دستگاه های مختلف از نقشه های پیکربندی دستگاه ورودی، به بخش های کلاس دستگاه مراجعه کنید.
کاربردهای HID و کدهای رویداد را درک کنید
اغلب چندین شناسه مختلف برای اشاره به هر کلید داده شده روی صفحه کلید، دکمه روی کنترلر بازی، محور جوی استیک یا سایر کنترل ها استفاده می شود. روابط بین این شناسهها همیشه یکسان نیست: آنها به مجموعهای از جداول نقشهبرداری وابسته هستند که برخی از آنها ثابت هستند و برخی بر اساس ویژگیهای دستگاه، درایور دستگاه، محل فعلی، پیکربندی سیستم، متفاوت است. ترجیحات کاربر و سایر عوامل
- کد اسکن فیزیکی
کد اسکن فیزیکی یک شناسه مخصوص دستگاه است که با هر کلید، دکمه یا کنترل دیگر مرتبط است. از آنجایی که کدهای اسکن فیزیکی اغلب از دستگاهی به دستگاه دیگر متفاوت است، سفتافزار یا درایور دستگاه مسئول نگاشت آنها به شناسههای استاندارد مانند HID Usages یا کدهای کلید لینوکس است.
کدهای اسکن عمدتاً برای صفحه کلیدها مورد توجه هستند. سایر دستگاهها معمولاً در سطح پایین با استفاده از پینهای GPIO، پیامهای I2C یا وسایل دیگر ارتباط برقرار میکنند. در نتیجه، لایههای بالایی پشته نرمافزار به درایورهای دستگاه تکیه میکنند تا بفهمند چه اتفاقی میافتد.
- استفاده از HID
استفاده از HID یک شناسه استاندارد است که برای گزارش وضعیت یک کنترل مانند کلید صفحه کلید، محور جوی استیک، دکمه ماوس یا نقطه تماس لمسی استفاده می شود. اکثر دستگاههای ورودی USB و بلوتوث با مشخصات HID مطابقت دارند، که سیستم را قادر میسازد با آنها به شیوهای یکنواخت ارتباط برقرار کند.
چارچوب Android به درایورهای HID هسته لینوکس برای ترجمه کدهای استفاده از HID به کدهای کلید لینوکس و سایر شناسه ها متکی است. بنابراین استفاده از HID عمدتاً مورد توجه سازندگان لوازم جانبی است.
- کد کلید لینوکس
کد کلید لینوکس یک شناسه استاندارد برای یک کلید یا دکمه است. کدهای کلید لینوکس در فایل هدر
linux/input.h
با استفاده از ثابت هایی که با پیشوندKEY_
یاBTN_
شروع می شوند، تعریف می شوند. درایورهای ورودی هسته لینوکس مسئول ترجمه کدهای اسکن فیزیکی، استفاده های HID و سایر سیگنال های خاص دستگاه به کدهای کلید لینوکس و ارائه اطلاعات مربوط به آنها به عنوان بخشی از رویدادهایEV_KEY
هستند.API Android گاهی اوقات به کد کلید لینوکس مرتبط با یک کلید به عنوان "کد اسکن" آن اشاره می کند. این از نظر فنی نادرست است، اما به تشخیص کدهای کلید لینوکس از کدهای کلید Android در API کمک می کند.
- کد نسبی یا مطلق محور لینوکس
یک کد محور نسبی یا مطلق لینوکس یک شناسه استاندارد برای گزارش حرکات نسبی یا موقعیت های مطلق در امتداد یک محور است، مانند حرکات نسبی یک ماوس در امتداد محور X یا موقعیت مطلق یک جوی استیک در امتداد محور X آن. کدهای محور لینوکس در فایل هدر
linux/input.h
با استفاده از ثابت هایی که با پیشوندREL_
یاABS_
شروع می شوند، تعریف می شوند. درایورهای ورودی هسته لینوکس مسئول ترجمه استفاده های HID و سایر سیگنال های خاص دستگاه به کدهای محور لینوکس و ارائه اطلاعات مربوط به آنها به عنوان بخشی از رویدادهایEV_REL
وEV_ABS
هستند.- کد سوئیچ لینوکس
کد سوئیچ لینوکس یک شناسه استاندارد برای گزارش وضعیت سوئیچ در یک دستگاه، مانند سوئیچ درب است. کدهای سوئیچ لینوکس در فایل هدر
linux/input.h
با استفاده از ثابت هایی که با پیشوندSW_
شروع می شوند، تعریف می شوند. درایورهای ورودی هسته لینوکس تغییرات وضعیت سوئیچ را به عنوان رویدادهایEV_SW
گزارش می کنند.برنامههای Android معمولاً رویدادها را از سوییچها دریافت نمیکنند، اما سیستم ممکن است از آنها برای کنترل عملکردهای مختلف دستگاه استفاده کند.
- کد کلید اندروید
کد کلید Android یک شناسه استاندارد است که در API Android برای نشان دادن یک کلید خاص مانند "HOME" تعریف شده است. کدهای کلید اندروید توسط کلاس
android.view.KeyEvent
به عنوان ثابت هایی تعریف می شوند که با پیشوندKEYCODE_
شروع می شوند.طرح کلید مشخص می کند که چگونه کدهای کلید لینوکس با کدهای کلید اندروید نگاشت می شوند. بسته به مدل صفحه کلید، زبان، کشور، طرحبندی یا عملکردهای خاص، ممکن است از طرحبندی کلیدهای متفاوتی استفاده شود.
ترکیبی از کدهای کلید اندروید با استفاده از یک نقشه کاراکتر کلیدی خاص دستگاه و محلی به کدهای کاراکتر تبدیل می شود. به عنوان مثال، هنگامی که کلیدهای شناسایی شده به عنوان
KEYCODE_SHIFT
وKEYCODE_A
هر دو با هم فشرده می شوند، سیستم ترکیب را در نقشه کاراکتر کلید جستجو می کند و حرف بزرگ "A" را پیدا می کند، که سپس در ویجت متن متمرکز فعلی درج می شود.- کد محور اندروید
کد محور Android یک شناسه استاندارد است که در Android API برای نشان دادن یک محور دستگاه خاص تعریف شده است. کدهای محور اندروید توسط کلاس
android.view.MotionEvent
به عنوان ثابت هایی تعریف می شوند که با پیشوندAXIS_
شروع می شوند.طرح کلید مشخص می کند که چگونه کدهای محور لینوکس با کدهای محور اندروید نگاشت می شوند. بسته به مدل دستگاه، زبان، کشور، طرحبندی یا عملکردهای خاص، ممکن است از طرحبندی کلیدهای مختلفی استفاده شود.
- Android Meta State
حالت متا اندروید یک شناسه استاندارد است که در API Android برای نشان دادن اینکه کدام کلیدهای اصلاح کننده فشار داده شده است تعریف شده است. حالت های متا اندروید توسط کلاس
android.view.KeyEvent
به عنوان ثابت هایی تعریف می شوند که با پیشوندMETA_
شروع می شوند.حالت متا فعلی توسط مؤلفه Android InputReader تعیین میشود که وقتی کلیدهای اصلاحکننده مانند
KEYCODE_SHIFT_LEFT
فشار داده میشوند/رها میشوند و پرچم حالت متا مناسب را تنظیم/بازنشانی میکند.رابطه بین کلیدهای اصلاح کننده و حالت های متا کدگذاری شده است اما طرح بندی کلید می تواند نحوه نگاشت خود کلیدهای اصلاح کننده را تغییر دهد که به نوبه خود بر حالت های متا تأثیر می گذارد.
- وضعیت دکمه اندروید
وضعیت دکمه Android یک شناسه استاندارد است که در Android API برای نشان دادن اینکه کدام دکمه ها (روی ماوس یا قلم) فشرده شده اند تعریف شده است. حالت های دکمه اندروید توسط کلاس
android.view.MotionEvent
به عنوان ثابت هایی تعریف می شوند که با پیشوندBUTTON_
شروع می شوند.وضعیت فعلی دکمه توسط مؤلفه Android InputReader تعیین میشود که فشار/رها شدن دکمهها (روی ماوس یا قلم) را نظارت میکند و پرچم وضعیت دکمه مناسب را تنظیم/بازنشانی میکند.
رابطه بین دکمه ها و حالت های دکمه هاردکد است.