
Android giriş alt sistemi, nominal olarak, sistemin birden çok katmanını geçen bir olay işlem hattından oluşur.
Giriş Boru Hattı
En alt katmanda, fiziksel giriş cihazı, tuşlara basma ve temas noktaları gibi durum değişikliklerini tanımlayan sinyaller üretir. Cihaz ürün yazılımı, bu sinyalleri, sisteme USB HID raporları göndererek veya bir I2C veriyolunda kesintiler üreterek olduğu gibi bir şekilde kodlar ve iletir.
Sinyaller daha sonra Linux çekirdeğindeki bir aygıt sürücüsü tarafından çözülür. Linux çekirdeği, özellikle HID protokolüne uyanlar olmak üzere birçok standart çevre birimi için sürücüler sağlar. Bununla birlikte, bir OEM, genellikle dokunmatik ekranlar gibi düşük düzeyde sisteme sıkı bir şekilde entegre edilen yerleşik cihazlar için özel sürücüler sağlamalıdır.
Giriş aygıtı sürücüleri, aygıta özgü sinyalleri Linux giriş protokolü aracılığıyla standart bir giriş olay biçimine çevirmekten sorumludur. Linux girdi protokolü, linux/input.h
çekirdek başlık dosyasında standart bir olay türleri ve kodları kümesini tanımlar. Bu şekilde çekirdek dışındaki bileşenlerin fiziksel tarama kodları, HID kullanımları, I2C mesajları, GPIO pinleri ve benzerleri gibi detaylara dikkat etmesine gerek kalmaz.
Daha sonra, Android EventHub
bileşeni, her bir giriş cihazıyla ilişkili evdev
sürücüsünü açarak giriş olaylarını çekirdekten okur. Android InputReader bileşeni daha sonra giriş olaylarının kodunu cihaz sınıfına göre çözer ve bir Android giriş olayları akışı oluşturur. Bu sürecin bir parçası olarak, Linux giriş protokolü olay kodları, giriş cihazı yapılandırmasına, klavye düzen dosyalarına ve çeşitli eşleme tablolarına göre Android olay kodlarına çevrilir.
Son olarak, InputReader
, input olaylarını uygun pencereye ileten InputReader
gönderir.
Kontrol noktaları
Giriş hattında, giriş cihazının davranışı üzerinde kontrolü etkileyen birkaç aşama vardır.
Sürücü ve Firmware Yapılandırması
Giriş aygıtı sürücüleri, kayıtlarda parametreleri ayarlayarak ve hatta aygıt yazılımının kendisini yükleyerek giriş aygıtının davranışını sıklıkla yapılandırır. Bu, özellikle kalibrasyon işleminin büyük bir kısmının istenen doğruluğu ve tepkiyi sağlamak ve gürültüyü bastırmak için bu parametreleri ayarlamayı veya aygıt yazılımını sabitlemeyi içerdiği dokunmatik ekranlar gibi gömülü cihazlar için geçerlidir.
Sürücü yapılandırma seçenekleri genellikle çekirdek kartı destek paketinde (BSP) modül parametreleri olarak belirtilir, böylece aynı sürücü birden fazla farklı donanım uygulamasını destekleyebilir.
Bu dokümantasyon, sürücü veya ürün yazılımı yapılandırmasını açıklamaya çalışır, ancak genel olarak cihaz kalibrasyonu konusunda rehberlik sağlar.
Kart Yapılandırma Özellikleri
Çekirdek kartı destek paketi (BSP), sanal tuşların dokunmatik ekrana yerleştirilmesi gibi Android InputReader bileşeni tarafından kullanılan kart yapılandırma özelliklerini SysFS aracılığıyla dışa aktarabilir.
Farklı cihazların kart konfigürasyon özelliklerini nasıl kullandığına ilişkin ayrıntılar için cihaz sınıfı bölümlerine bakın.
Kaynak Katmanları
Birkaç giriş davranışı, config.xml
kapak anahtarının çalışması gibi kaynak katmanları aracılığıyla yapılandırılır.
İşte birkaç örnek:
config_lidKeyboardAccessibility
: Donanım klavyesinin erişilebilir veya gizli olup olmadığı konusunda kapak anahtarının etkisini belirtir.config_lidNavigationAccessibility
:config_lidNavigationAccessibility
erişilebilir veya gizli olup olmadığı konusunda kapak anahtarının etkisini belirtir.config_longPressOnPowerBehavior
: Kullanıcı güç düğmesini basılı tuttuğunda ne olacağını belirtir.config_lidOpenRotation
: Kapak anahtarının ekran yönü üzerindeki etkisini belirtir.
Her yapılandırma seçeneği hakkında ayrıntılar için frameworks/base/core/res/res/values/config.xml
içindeki belgelere bakın.
Anahtar Haritalar
Anahtar haritalar, Android EventHub
ve InputReader
bileşenleri tarafından, Linux olay kodlarından tuşlar, joystick düğmeleri ve joystick eksenleri için Android olay kodlarına eşlemeyi yapılandırmak için kullanılır. Eşleştirme cihaza veya dile bağlı olabilir.
Farklı cihazların temel haritaları nasıl kullandığı hakkında ayrıntılar için cihaz sınıfı bölümlerine bakın.
Giriş Cihazı Yapılandırma Dosyaları
Giriş cihazı yapılandırma dosyaları, Android EventHub
ve InputReader
bileşenleri tarafından, dokunma boyutu bilgilerinin nasıl rapor edildiği gibi özel cihaz özelliklerini yapılandırmak için kullanılır.
Farklı cihazların giriş cihazı yapılandırma haritalarını nasıl kullandığına ilişkin ayrıntılar için cihaz sınıfı bölümlerine bakın.
HID Kullanımlarını ve Olay Kodlarını Anlama
Bir klavyedeki herhangi bir tuşa, oyun denetleyicisindeki düğmeye, oyun çubuğu eksenine veya başka bir denetime atıfta bulunmak için genellikle kullanılan birkaç farklı tanımlayıcı vardır. Bu tanımlayıcılar arasındaki ilişkiler her zaman aynı değildir: bazıları sabit, bazıları da aygıtın özelliklerine, aygıt sürücüsüne, mevcut yerel ayara, sistem yapılandırmasına bağlı olarak değişen bir dizi eşleme tablosuna bağlıdırlar. kullanıcı tercihleri ve diğer faktörler.
- Fiziksel Tarama Kodu
Fiziksel tarama kodu, her bir tuş, düğme veya diğer kontrollerle ilişkilendirilen cihaza özgü bir tanımlayıcıdır. Fiziksel tarama kodları genellikle bir cihazdan diğerine değişiklik gösterdiğinden, bunların HID Kullanımları veya Linux anahtar kodları gibi standart tanımlayıcılarla eşleştirilmesinden ürün yazılımı veya cihaz sürücüsü sorumludur.
Tarama kodları esas olarak klavyeler için ilgi çekicidir. Diğer cihazlar tipik olarak GPIO pinleri, I2C mesajları veya diğer araçları kullanarak düşük seviyede iletişim kurar. Sonuç olarak, yazılım yığınının üst katmanları, neler olup bittiğini anlamak için aygıt sürücülerine güvenir.
- HID Kullanımı
HID kullanımı, klavye tuşu, kumanda kolu ekseni, fare düğmesi veya dokunma temas noktası gibi bir kontrolün durumunu bildirmek için kullanılan standart bir tanımlayıcıdır. Çoğu USB ve Bluetooth giriş cihazı, sistemin onlarla tek tip bir şekilde arayüz oluşturmasını sağlayan HID spesifikasyonuna uygundur.
Android Çerçevesi, HID kullanım kodlarını Linux anahtar kodlarına ve diğer tanımlayıcılara çevirmek için Linux çekirdeği HID sürücülerine dayanır. Bu nedenle, HID kullanımları esas olarak çevre birimi üreticilerinin ilgisini çekmektedir.
- Linux Anahtar Kodu
Linux anahtar kodu, bir anahtar veya düğme için standart bir tanımlayıcıdır. Linux anahtar kodları,
linux/input.h
başlık dosyasındaKEY_
veyaBTN_
önekiyle başlayan sabitler kullanılarakBTN_
. Linux çekirdek giriş sürücüleri, fiziksel tarama kodlarını, HID kullanımlarını ve diğer cihaza özgü sinyalleri Linux anahtar kodlarına çevirmekten veEV_KEY
olaylarının bir parçası olarakEV_KEY
hakkında bilgi vermektenEV_KEY
.Android API bazen bir anahtarla ilişkili Linux anahtar kodunu "tarama kodu" olarak ifade eder. Bu teknik olarak yanlıştır, ancak Linux anahtar kodlarını API'deki Android anahtar kodlarından ayırt etmeye yardımcı olur.
- Linux Göreli veya Mutlak Eksen Kodu
Bir Linux göreli veya mutlak eksen kodu, bir farenin X ekseni boyunca göreli hareketleri veya X ekseni boyunca bir oyun çubuğunun mutlak konumu gibi bir eksen boyunca göreli hareketleri veya mutlak konumları bildirmek için standart bir tanımlayıcıdır. Linux eksen kodu,
linux/input.h
başlık dosyasındaREL_
veyaABS_
önekiyle başlayan sabitler kullanılarakABS_
. Linux çekirdek giriş sürücüleri, HID kullanımlarını ve diğer cihaza özgü sinyalleri Linux eksen kodlarınaEV_REL
veEV_ABS
EV_REL
veEV_ABS
olaylarının bir parçası olarak bilgi sağlamaktanEV_ABS
.- Linux Anahtar Kodu
Bir Linux anahtar kodu, kapak anahtarı gibi bir cihaz üzerindeki bir anahtarın durumunu bildirmek için standart bir tanımlayıcıdır. Linux anahtar kodları tanımlanmıştır
linux/input.h
önek ile başlayan sabitleri kullanılarak başlık dosyasınaSW_
. Linux çekirdeği giriş sürücüleri, anahtar durumu değişiklikleriniEV_SW
olayları olarakEV_SW
.Android uygulamaları genellikle anahtarlardan olay almaz, ancak sistem bunları cihaza özgü çeşitli işlevleri kontrol etmek için dahili olarak kullanabilir.
- Android Anahtar Kodu
Bir Android anahtar kodu, 'HOME' gibi belirli bir anahtarı belirtmek için Android API'de tanımlanan standart bir tanımlayıcıdır. Android anahtar kodları,
android.view.KeyEvent
sınıfı tarafındanKEYCODE_
önekiyle başlayan sabitler olarak tanımlanır.Anahtar düzeni, Linux anahtar kodlarının Android anahtar kodlarıyla nasıl eşlendiğini belirtir. Klavye modeline, dile, ülkeye, düzene veya özel işlevlere bağlı olarak farklı tuş düzenleri kullanılabilir.
Android anahtar kodlarının kombinasyonları, bir cihaz ve yerel ayara özel anahtar karakter haritası kullanılarak karakter kodlarına dönüştürülür. Örneğin,
KEYCODE_SHIFT
veKEYCODE_A
olarak tanımlanan tuşların her ikisine birlikte basıldığında, sistem, anahtar karakter haritasında kombinasyona bakar ve daha sonra o anda odaklanılan metin widget'ına eklenen büyük harf 'A'yı bulur.- Android Eksen Kodu
Bir Android eksen kodu, belirli bir cihaz eksenini belirtmek için Android API'de tanımlanan standart bir tanımlayıcıdır. Android eksen kodları,
android.view.MotionEvent
sınıfı tarafındanAXIS_
önekiyle başlayan sabitler olarak tanımlanır.Anahtar düzeni, Linux Eksen Kodlarının Android eksen kodlarına nasıl eşleneceğini belirtir. Cihaz modeli, dili, ülkesi, düzeni veya özel işlevlere bağlı olarak farklı tuş düzenleri kullanılabilir.
- Android Meta Durumu
Bir Android meta durumu, hangi değiştirici tuşlara basıldığını belirtmek için Android API'de tanımlanan standart bir tanımlayıcıdır. Android meta durumları,
android.view.KeyEvent
sınıfı tarafındanMETA_
önekiyle başlayan sabitler olarak tanımlanır.Mevcut meta durumu, KEYCODE_SHIFT_LEFT gibi değiştirici tuşlara ne zaman basıldığını / bırakıldığını
KEYCODE_SHIFT_LEFT
ve uygun meta durum bayrağını ayarlayan / sıfırlayan Android InputReader bileşeni tarafından belirlenir.Değiştirici anahtarlar ve meta durumlar arasındaki ilişki sabit kodlanmıştır, ancak anahtar düzeni, değiştirici tuşların kendilerinin nasıl eşleneceğini değiştirebilir ve bu da meta durumlarını etkiler.
- Android Düğme Durumu
Bir Android düğme durumu, hangi düğmelere (fare veya ekran kaleminde) basıldığını belirtmek için Android API'de tanımlanan standart bir tanımlayıcıdır. Android düğme durumları,
android.view.MotionEvent
sınıfı tarafındanBUTTON_
önekiyle başlayan sabitler olarak tanımlanır.Geçerli düğme durumu, düğmelere (fare veya kalemde) ne zaman basıldığını / bırakıldığını izleyen ve uygun düğme durumu bayrağını ayarlayan / sıfırlayan Android InputReader bileşeni tarafından belirlenir.
Düğmeler ile düğme durumları arasındaki ilişki kodlanmıştır.