Cum funcționează instalarea aplicației Android sub capotă

A smartphone on engineering blueprints with gears, illustrating how app installation works

Când atingeți „Instalare” pe un fișier APK sau descărcați o aplicație din Magazinul Play, în culise începe o secvență complexă de operațiuni. Ceea ce pare a fi o simplă bară de progres reprezintă de fapt zeci de pași care implică analizarea pachetelor, verificarea criptografică, gestionarea permisiunilor, extragerea fișierelor și optimizarea codului. Înțelegerea acestui proces ajută la explicarea motivelor pentru care instalările eșuează uneori și ce puteți face în această privință.

În acest articol, vom parcurge fiecare pas major al conductei de instalare Android, din momentul în care sistemul primește un APK până la punctul în care aplicația este gata de lansare.

Pasul 1: Inițierea instalării

Procesul de instalare începe diferit în funcție de sursă:

  • Magazin Play: Aplicația Magazin Play descarcă APK-ul (sau APK-urile împărțite) și apelează instalatorul de pachete al sistemului cu privilegii speciale care ocolesc unele confirmări ale utilizatorului.
  • Încărcare laterală: Când deschideți un fișier APK, Android lansează activitatea de instalare a pachetelor. Pe Android 8.0 și versiuni ulterioare, aplicația de instalare trebuie să aibă permisiunea „Instalare aplicații necunoscute” pentru sursa sa specifică.
  • ADB: Comanda adb install comunică direct cu serviciul de gestionare a pachetelor prin USB, ocolind complet instalatorul grafic.

Indiferent de sursă, toate instalațiile ajung în cele din urmă la același serviciu de sistem: PackageManagerService (PMS). Aceasta este autoritatea centrală pentru toate operațiunile de pachete pe Android.

Pasul 2: Analiza pachetului

Înainte de orice altceva, sistemul trebuie să înțeleagă ce urmează să fie instalat. PackageManagerService invocă PackageParser pentru a citi fișierul APK și a extrage metadatele acestuia.

Analizorul citește fișierul AndroidManifest.xml din interiorul APK-ului. Acest fișier XML binar conține informații critice:

  • Nume pachet: Identificatorul unic pentru aplicație (de ex., com.example.myapp)
  • Codul și numele versiunii: Folosit pentru a determina dacă aceasta este o actualizare sau o instalare nouă
  • Versiunile SDK minime și vizate: Determină compatibilitatea cu dispozitivul
  • Permisiuni declarate: Atât permisiunile solicitate de aplicație, cât și permisiunile personalizate pe care le definește
  • Componente: Activități, servicii, receptoare de transmisie și furnizori de conținut pe care le înregistrează aplicația
  • Caracteristici hardware și software: Cerințe precum cameră, GPS sau versiuni specifice OpenGL

Dacă manifestul este malformat sau structura APK-ului este invalidă, instalarea eșuează în această etapă cu un mesaj „Eroare de analiză”. Acesta este unul dintre cele mai frecvente motive pentru care APK-urile cu încărcare laterală nu se instalează.

Pasul 3: Verificări de compatibilitate

Odată ce manifestul este analizat, sistemul efectuează o serie de verificări de compatibilitate:

  • Versiunea SDK: Dacă minSdkVersion al aplicației este mai mare decât nivelul API al dispozitivului, instalarea este respinsă.
  • Compatibilitate ABI: Dacă APK-ul conține biblioteci native, sistemul verifică dacă acestea se potrivesc cu arhitectura CPU a dispozitivului. Un APK cu numai biblioteci armeabi-v7a nu se va instala pe un dispozitiv exclusiv x86.
  • Caracteristici necesare: Dacă aplicația declară caracteristicile hardware necesare (cum ar fi android.hardware.telephony), sistemul verifică dacă dispozitivul le acceptă.
  • Spațiul de stocare disponibil: Sistemul verifică dacă există suficient spațiu liber pentru a instala aplicația, inclusiv spațiu pentru bibliotecile native extrase și fișierele DEX optimizate.

Pasul 4: Verificarea semnăturii

Acesta este unul dintre cei mai critici pași în procesul de instalare. Android verifică semnătura criptografică a APK-ului pentru a asigura integritatea și autenticitatea acestuia.

Procesul de verificare depinde de schemele de semnare prezente:

Semnătură V1 (semnare JAR)

Sistemul verifică directorul META-INF/ pentru fișiere de semnătură (.SF, .RSA sau .DSA). Fiecare fișier din APK este verificat în raport cu rezumatele enumerate în manifest. Acest lucru este lent, deoarece fiecare fișier trebuie să aibă hashing individual.

Semnătură V2 (Schema de semnătură APK v2)

Introdusă în Android 7.0, această schemă semnează întregul APK ca un blob binar. Blocul de semnătură este inserat între directorul central ZIP și înregistrarea de la sfârșitul directorului central. Verificarea este mult mai rapidă deoarece operează pe octeții bruti fără a fi nevoie să decomprimați intrările individuale.

Semnătura V3 (rotirea tastelor)

Disponibilă începând cu Android 9.0, versiunea V3 extinde V2 cu suport pentru rotația cheilor. Include o structură de dovadă a rotației care leagă cheile de semnare vechi și noi, permițând dezvoltatorilor să-și schimbe cheia de semnare, menținând în același timp compatibilitatea actualizărilor.

Semnătura V4 (incremental)

Android 11 a introdus V4 pentru instalări incrementale. Oferă o semnătură bazată pe arbore Merkle care permite verificarea blocurilor individuale pe măsură ce sunt transmise în flux către dispozitiv.

Dacă verificarea semnăturii eșuează din orice motiv, instalarea este imediat întreruptă. Puteți verifica semnătura unui APK înainte de instalare folosind Instrument de verificare APK.

Actualizați potrivirea semnăturii

Dacă o aplicație cu același nume de pachet este deja instalată, sistemul efectuează o verificare suplimentară: certificatul de semnare a noului APK trebuie să se potrivească cu certificatul de instalare existent. Acest lucru împiedică o parte rău intenționată să înlocuiască o aplicație legitimă cu o versiune modificată. Dacă semnăturile nu se potrivesc, veți vedea eroarea „Aplicația nu este instalată: pachetul intră în conflict cu un pachet existent cu același nume”.

Pasul 5: Confirmarea utilizatorului

Pentru instalările cu încărcare laterală, sistemul afișează un dialog de confirmare a instalării care arată:

  • Numele și pictograma aplicației (extrase din resursele APK-ului)
  • Permisiunile solicitate de aplicație (pe versiunile mai vechi de Android)
  • Indiferent dacă aceasta este o nouă instalare sau o actualizare
  • Orice avertismente despre sursa aplicației sau despre riscurile potențiale

Pe Android 12 și versiuni ulterioare, ecranul de confirmare este mai simplu, deoarece permisiunile de rulare sunt acordate individual atunci când aplicația are nevoie de ele pentru prima dată, mai degrabă decât în ​​momentul instalării.

Pasul 6: Extragerea și plasarea fișierelor

Odată ce utilizatorul confirmă (sau pentru instalările Play Store, automat), sistemul începe să extragă și să plaseze fișiere:

Stocare APK

Fișierul APK în sine este copiat în /data/app/[package-name]-[random]/base.apk. Pentru instalările APK divizate, fișierele suplimentare precum split_config.arm64_v8a.apk sunt plasate alături de APK-ul de bază. APK-ul original din dosarul Descărcări nu este modificat sau șters.

Extragerea bibliotecii native

Dacă APK-ul conține biblioteci native (în directorul lib/, acestea sunt extrase în /data/app/[package-name]-[random]/lib/[abi]/). Pe versiunile mai noi de Android, aplicațiile pot opta pentru a menține bibliotecile native comprimate în APK și a le încărca direct folosind android:extractNativeLibs="false", ceea ce economisește spațiu de stocare.

Crearea directorului de date

Sistemul creează directorul de date private al aplicației la /data/data/[package-name]/ (sau /data/user/0/[package-name]/ pe dispozitive cu mai mulți utilizatori). Acest director este deținut de un UID Linux unic alocat aplicației, asigurându-se că nicio altă aplicație nu îl poate accesa fără privilegii de root.

Pasul 7: Optimizarea DEX

Acest pas este în cazul în care Android transformă bytecode al aplicației într-un format optimizat pentru hardware-ul specific al dispozitivului. Procesul a evoluat semnificativ de-a lungul istoriei Android:

Era Dalvik (Android 4.4 și versiuni anterioare)

Mașina virtuală originală Dalvik a folosit compilarea Just-In-Time (JIT). În timpul instalării, fișierul classes.dex a fost optimizat într-un fișier ODEX care conținea bytecode verificat și optimizat. Acest lucru a fost relativ rapid, dar a însemnat că aplicația a rulat mai lent în timpul rulării, deoarece majoritatea codului a fost încă interpretat.

ART cu AOT (Android 5.0 până la 6.0)

Android Runtime (ART) l-a înlocuit pe Dalvik și a introdus compilarea Ahead-Of-Time (AOT). În timpul instalării, întregul bytecode DEX a fost compilat la codul mașină nativ. Acest lucru a făcut ca aplicațiile să ruleze mai rapid, dar a crescut semnificativ timpul de instalare și utilizarea stocării. Instalarea unor aplicații a durat câteva minute.

Compilare ghidată de profil (Android 7.0+)

Android modern folosește o abordare hibridă. În timpul instalării, sunt compilate numai căile critice de pornire. Pe măsură ce utilizatorul rulează aplicația, sistemul colectează profiluri de execuție care identifică căile de cod utilizate frecvent. În timpul întreținerii inactiv (de obicei, în timpul încărcării peste noapte), sistemul compilează aceste căi fierbinți către codul nativ. Aceasta echilibrează viteza de instalare, utilizarea stocării și performanța de rulare.

Codul compilat este stocat în /data/dalvik-cache/ sau alături de APK ca fișiere .odex, .vdex și .art. Fișierul .vdex conține cod DEX verificat, fișierul .odex conține cod nativ compilat, iar fișierul .art conține imagini heap pre-inițializate pentru o pornire mai rapidă.

Pasul 8: Înregistrarea permisiunii

PackageManagerService înregistrează permisiunile și componentele declarate ale aplicației în sistem:

  • Permisiuni la momentul instalării (cum ar fi INTERNET sau VIBRATE sunt acordate automat fără interacțiunea utilizatorului).
  • Permisiuni de rulare (cum ar fi CAMERA sau LOCATION sunt înregistrate, dar nu sunt acordate). Aplicația trebuie să le solicite în timpul execuției.
  • Filtre de intenție sunt înregistrate, astfel încât sistemul să știe ce aplicații pot gestiona ce acțiuni (cum ar fi deschiderea unei adrese URL sau partajarea conținutului).
  • Furnizorii de conținut sunt înregistrate la autoritățile lor, astfel încât alte aplicații să le poată interoga.

Pasul 9: Integrarea sistemului

Ultimii pași integrează aplicația în sistemul Android:

  • Actualizarea bazei de date pachet: Baza de date a pachetelor sistemului (/data/system/packages.xml este actualizată cu informațiile noii aplicații, inclusiv UID-ul atribuit, permisiunile și declarațiile componentelor).
  • Notificare de lansare: Lansatorul ecranului de pornire este notificat cu privire la noua aplicație, astfel încât să poată afișa pictograma aplicației.
  • Difuzare: Sistemul trimite o difuzare PACKAGE_ADDED, permițând altor aplicații să reacționeze la noua instalare (de exemplu, aplicațiile de rezervă ar putea programa o copie de rezervă).
  • Context SELinux: Fișierele aplicației sunt etichetate cu contextul de securitate SELinux corespunzător, pe baza versiunii SDK-ului țintă și a permisiunilor declarate.

De ce eșuează instalațiile

Înțelegerea conductei de instalare ajută la diagnosticarea defecțiunilor comune:

  • „Eroare de analiză”: APK-ul este corupt, incomplet sau are un manifest incorect. Acest lucru se întâmplă adesea cu descărcări incomplete sau fișiere convertite incorect.
  • „Aplicația nu este instalată” (nepotrivire de semnătură): Încercați să actualizați o aplicație cu un APK semnat de o cheie diferită. Mai întâi trebuie să dezinstalați versiunea existentă.
  • „Depozitare insuficientă”: Spațiu insuficient pentru APK, biblioteci extrase și rezultate de optimizare DEX. Spațiul real necesar este de obicei de 2-3 ori dimensiunea APK-ului.
  • „Pachetul intră în conflict cu pachetul existent”: Același nume de pachet, dar semnătură diferită. Frecvent atunci când comutați între Magazin Play și versiunile cu încărcare laterală.
  • Versiune downgrade blocată: În mod implicit, Android împiedică instalarea unei versiuni mai vechi în locul uneia mai noi. ADB poate suprascrie acest lucru cu adb install -d.

Instalare Split APK

La instalarea fișierelor APK divizate (din App Bundles), procesul este ușor diferit. Sistemul folosește un API instalare bazată pe sesiune:

  1. Este creată o nouă sesiune de instalare
  2. Fiecare APK divizat este scris în sesiune
  3. Sesiunea este comisă, declanșând canalul complet de verificare
  4. Toate diviziunile trebuie să aibă nume de pachete, coduri de versiune și certificate de semnare care se potrivesc

Acesta este mecanismul folosit de instalatorii XAPK și instrumentele precum Fuziunea APKS cu APK pentru a gestiona instalările cu mai multe fișiere.

Instalare prin ADB

Când utilizați adb install, procesul ocolește programul de instalare grafic, dar urmează aceeași conductă internă. ADB comunică cu serviciul de gestionare a pachetelor printr-o conexiune socket. Acceptă steaguri suplimentare care nu sunt disponibile prin GUI:

  • -r: Înlocuiți aplicația existentă (permiteți reinstalarea)
  • -d: Permiteți downgrade versiunii
  • -g: Acordați imediat toate permisiunile de rulare
  • -t: permiteți instalarea de APK-uri numai pentru testare
  • --install-multiple: Instalați APK-uri împărțite într-o singură sesiune

Ce se întâmplă în timpul dezinstalării

Pentru a fi complet, iată ce se întâmplă atunci când o aplicație este eliminată:

  1. Procesele aplicației sunt oprite
  2. APK-ul și bibliotecile extrase sunt șterse din /data/app/
  3. Directorul de date private al aplicației este eliminat (cu excepția cazului în care utilizatorul a ales să păstreze datele)
  4. Fișierele cache DEX compilate sunt șterse
  5. Baza de date a pachetelor este actualizată
  6. Este trimisă o difuzare PACKAGE_REMOVED
  7. Lansatorul elimină pictograma aplicației

Rețineți că fișierele specifice aplicației de pe stocarea externă (/Android/data/[package]/ și /Android/obb/[package]/ sunt, de asemenea, șterse pe Android 10 și versiuni ulterioare, datorită aplicării spațiului de stocare).

De ce înțelegerea PackageManager economisește timp de depanare

Procesul de instalare Android este o secvență atent orchestrată de verificări de securitate, operațiuni cu fișiere și integrări de sistem. Fiecare pas are un scop, de la protejarea utilizatorilor împotriva aplicațiilor falsificate până la optimizarea performanței pentru hardware-ul specific. Când instalările eșuează, eroarea indică, de obicei, un anumit pas din această conductă, iar înțelegerea procesului vă ajută să diagnosticați și să rezolvați rapid problemele.

Instalarea din Magazinul Play, încărcarea manuală a unui APK și împingerea unei versiuni cu ADB, toate canalizează prin aceeași conductă subiacentă, cea care se asigură că fiecare aplicație de pe dispozitivul dvs. a fost verificată, plasată corect și optimizată pentru hardware-ul dvs.

Proiectat și documentat de doamna Shaefale Dezvoltator principal și arhitect pachet Android • Verificat pe Android 12–15

Mst Shaefale menține fuziunea XAPK/APKS la nivelul clientului, analizatorul de manifeste binar și instrumentele de semnare APK v1+v2 la xapktoapk.com. Ați găsit o comandă învechită sau o modificare a sistemului de operare? Trimiteți o notă editorială.