Binder
Fiecare proces în Android este izolat, operând într-un mediu controlat și izolat. Sistemul oferă fiecărei aplicații propria memorie, timp CPU și resurse, împiedicând procesele să acceseze orice din afara propriei izolări.
Comunicarea inter-proces (IPC) permite proceselor să schimbe date și semnale. Linux oferă mai multe mecanisme IPC:
- Semnale (Signals): Notifică procesele când apar evenimente (întreruperi de tastatură, probleme de acces la memorie)
- Semafoare (Semaphores): Gestionează accesul concurent la resursele partajate folosind contoare
- Cozi de Mesaje (Message Queues): Permit comunicare asincronă FIFO între procese
- Memorie Partajată (Shared Memory): Cea mai rapidă metodă IPC care permite accesul direct la o regiune de memorie
- Pipe-uri (Pipes): Oferă canale de comunicare unidirecționale între procese înrudite
IPC-ul Android este construit pe framework-ul Binder, evoluat din OpenBinder (Be Inc. și Palm, Inc.).
Binder este un driver de kernel Linux care facilitează comunicarea sigură și eficientă între procese, permițând apeluri de metode peste granițele proceselor. Aplicațiile folosesc cod generat de Android Interface Definition Language (AIDL), care gestionează marshaling-ul și unmarshaling-ul parametrilor metodelor în Parcel-uri.

Fiecare proces care utilizează Binder menține un pool de thread-uri gestionat de framework, permițând gestionarea concurentă a mai multor cereri de la clienți, optimizând astfel performanța pe dispozitivele multi-core. Metodele AIDL sunt sincrone în mod implicit, dar cuvântul cheie oneway permite apeluri asincrone, suportând comunicare complet asincronă și non-blocantă.
Framework-ul Binder folosește modele clasice de design software precum Broker, Proxy și Activator pentru a separa logica IPC de mecanismele de nivel scăzut. Acesta stă la baza serviciilor esențiale Android și a componentelor principale precum Intent-urile și Content Provider-ii, asigurând IPC robust, scalabil și eficient pe întreaga platformă Android.
De ce a ales Android Binder?
Metodele tradiționale IPC precum System V IPCs (semaforuri, memorie partajată, cozi de mesaje) nu sunt suportate de Bionic libc al Android și sunt în general evitate din cauza:
- Riscurilor de scurgere de resurse când procesele se termină în mod neașteptat (de exemplu, în condiții de memorie insuficientă)
- Complexității și overhead-ului ridicate
- Vulnerabilității la atacuri de tip denial-of-service (DoS)
Pentru a aborda aceste provocări, Android folosește Binder — un mecanism IPC ușor și robust, proiectat special pentru sistemele mobile cu constrângeri agresive de memorie și performanță.
Motive principale pentru utilizarea Binder:
- Gestionare sigură a resurselor: Numărarea automată a referințelor și notificarea la terminare previn scurgerile de resurse.
- Model de migrare a thread-urilor: Permite invocarea metodelor remote ca și cum ar fi locale; contextul thread-ului „sare" între procese.
- Securitate: Urmărește UID/PID-ul expeditorilor de mesaje.
- Eficiență: Dacă clientul și serviciul se află în același proces, apelurile sunt executate direct — fără overhead IPC.
- Suport pentru date complexe: Prin AIDL, Binder generează automat stub-uri/proxy-uri și gestionează marshalling-ul obișnuit al datelor.
- Transmitere de descriptori de fișiere: Permite partajarea resurselor la nivel scăzut între procese.
- Referințe unice către obiecte: Obiectele remote pot fi transmise și reutilizate în diferite procese.
Limitări:
- Nu este un sistem RPC cu scop general.
- Nu este compatibil POSIX.
- Nu este ideal pentru streaming de date.
Cu toate acestea, majoritatea serviciilor Android și callback-urilor din ciclul de viață al aplicațiilor (cum ar fi onResume() și onDestroy()) depind de Binder. Dezactivarea Binder ar opri sistemul — fără interfață grafică, fără audio, fără senzori.