USB HAL را پیاده سازی کنید

نسخه اندروید ۸.۰، مدیریت دستورات USB را از اسکریپت‌های init خارج کرده و به یک سرویس USB بومی منتقل می‌کند تا پیکربندی و قابلیت اطمینان کد بهبود یابد. برای پیکربندی تابع Gadget، از اسکریپت‌های init (تریگرهای ویژگی) برای انجام عملیات مربوط به دستگاه خاص گجت استفاده می‌شود.

در نسخه‌های قبلی، این پیکربندی‌های مختص دستگاه از طریق اسکریپت‌های init مختص دستگاه (با استفاده از triggerهای ویژگی) حاصل می‌شدند. انتقال به طراحی لایه انتزاعی سخت‌افزار (HAL) منجر به پیاده‌سازی بسیار تمیزتری می‌شود که این مشکلات را حل می‌کند:

  1. عملیاتی مانند نوشتن در گره‌های هسته sysfs ممکن است با شکست مواجه شوند، اما به کد فریم‌ورک که تریگر ویژگی را تنظیم می‌کند، باز نمی‌گردند. در نتیجه، فریم‌ورک‌ها به اشتباه فرض می‌کنند که عملیات با موفقیت انجام شده‌اند، حتی اگر به طور خاموش شکست خورده باشند.
  2. اسکریپت‌های init تعداد محدودی عملیات می‌توانند اجرا کنند.

نسخه اندروید ۱۲ پشتیبانی از USB Gadget HAL را برای مدل‌های کنترل شبکه (NCM) و فراخوانی‌های API که هم شماره نسخه HAL و هم سرعت USB را برمی‌گردانند، اضافه می‌کند. برای اطلاعات بیشتر در مورد فراخوانی‌های API موجود از طریق USB HAL، به خلاصه بسته android.hardware.usb مراجعه کنید.

هال و تریبل

اسکریپت‌های init مختص دستگاه به عنوان جایگزینی برای لایه‌های HAL برای انجام عملیات USB مختص دستگاه استفاده شدند. USB (از طریق ADB) یک رابط اصلی برای اشکال‌زدایی مشکلات سیستم است. داشتن یک سرویس بومی برای انجام پیکربندی USB، وابستگی به کد فریم‌ورک را از بین می‌برد، بنابراین حتی اگر فریم‌ورک از کار بیفتد، USB باید در حال اجرا باشد.

در مدل Treble که در اندروید ۸.۰ نیز معرفی شد، تمام HALها از سرویس‌های سیستمی جدا شده‌اند و لازم است در دیمن‌های بومی خود اجرا شوند. این امر نیاز به داشتن یک دیمن USB اختصاصی را از بین می‌برد، زیرا لایه HAL به خوبی به عنوان یک دیمن USB عمل می‌کند.

پیاده‌سازی پیش‌فرض HAL از تمام دستگاه‌های قبل از اندروید ۸.۰ مراقبت می‌کند. بنابراین، هیچ کار خاصی برای دستگاه‌های قبل از اندروید ۸.۰ وجود نخواهد داشت. اندروید ۸.۰ از رابط HAL برای پرس‌وجو از وضعیت پورت‌های USB و انجام جابجایی نقش‌های داده و برق استفاده می‌کند.

پیاده‌سازی

رابط USB HAL جدید باید روی هر دستگاهی که با اندروید ۸.۰ راه‌اندازی می‌شود، پیاده‌سازی شود. پیاده‌سازی پیش‌فرض باید دستگاه‌های قبل از اندروید ۸.۰ را نیز پشتیبانی کند. پیاده‌سازی پیش‌فرض در صورتی کافی است که دستگاه از کلاس dual_role_usb برای گزارش وضعیت پورت type-c استفاده کند. ممکن است تغییرات جزئی در اسکریپت‌های USB مخصوص دستگاه برای انتقال مالکیت گره‌های typc-c به سیستم مورد نیاز باشد.