Fișierul manifest Android Suporta diferite rezoluții. Interzicerea schimbării orientării

AndroidManifest.xml- un dosar necesar pentru toată lumea aplicații Android. Se află în folderul aplicației și descrie valorile globale pentru pachetul dvs., inclusiv componentele aplicației (activități, servicii etc.), ceea ce pachetul expune „lumea exterioară”, ce date poate procesa fiecare dintre activitățile aplicației, și cum pot fi pornite.

Un lucru important de menționat despre acest fișier este așa-numitele IntentFilters. Aceste filtre descriu unde și când poate fi începută o activitate. Când Activitatea (sau sistem de operare) dorește să efectueze o acțiune, cum ar fi deschiderea unei pagini Web sau deschiderea unui ecran de selecție, aceasta creează un obiect Intent. Această intenție poate stoca informații care descriu ceea ce doriți să faceți, ce date sunt necesare pentru a o realiza și alte informații. Android compară informațiile din obiectul Intent cu IntentFilters expuse de fiecare aplicație și găsește Activități care se potrivesc pentru a procesa datele sau acțiunile definite program de apelare. Dacă există mai multe aplicații capabile să proceseze această intenție, utilizatorul este întrebat ce aplicație ar prefera să o gestioneze.

Pe lângă declararea activității, a furnizorului de conținut, a serviciilor și a receptorilor de intenție ai aplicației, puteți defini și permisiunile în AndroidManifest.xml.

Bazele

Un AndroidManifest.xml foarte simplu arată astfel:

android:label="@string/app_name">

Aproape fiecare AndroidManifest.xml (precum și multe alte fișiere XML Android) va include o declarație de spațiu de nume în primul său element. Acest lucru face disponibile în fișier o serie de atribute Android standard, care vor fi folosite pentru a furniza majoritatea datelor pentru elementele din acel fișier.

Aproape fiecare AndroidManifest.xml include un singur o etichetă care conține direct mai multe etichete care descriu aplicațiile, IntentReceiver-urile etc. care sunt disponibile în această aplicație.

Dacă doriți să faceți o Activitate lansată direct prin intermediul utilizatorului, atunci va trebui să îi atribuiți suport pentru acțiunea PRINCIPALA și categoria LAUNCHER. Rezultatul este așa cum se arată aici:

Activitate lansată direct.

Ceea ce urmează este o analiză detaliată a structurii fișierului AndroidManifest cu o descriere a tuturor celor disponibile , cu un exemplu pentru toată lumea. (Exemplele nu sunt peste tot, dar cu siguranță nu am pierdut nimic. Și expresia „pentru toți” în versiunea în limba engleză („pentru fiecare”) era și acolo. Nu știu unde au pierdut aceste exemple. - nota traducătorului ). Cine este al cărui descendent poate fi determinat prin indentare:

Acesta este nodul rădăcină al fiecărui AndroisManifest.xml. Conține un pachet de atribute care indică un anumit pachet din Activitate (Nu sa dovedit deloc în rusă, dar, în general, trucul este că există un pachet Activitate în cod, dar parametrii acestui pachet sunt descriși în această etichetă - cca. O altă cale către Activități se va baza în raport cu valoarea sa.

Descrie permisiunile de securitate care trebuie acordate pachetului dvs. Cantitatea nu este limitată.

Declara o permisiune de securitate care poate fi utilizată pentru a specifica ce aplicații pot accesa componente sau caracteristici din acest pachet. Cantitatea nu este limitată.

Declara codul unei componente de instrumentare care este disponibil pentru testare funcţionalitate acest pachet sau altul. Vezi Echipamente pentru Mai mult Detalii. Cantitatea nu este limitată.

< aplicarea>

Elementul rădăcină care conține declarațiile componente la nivel este conținut în pachet. Acest element poate include, de asemenea, global și/sau implicit atribute pentru aplicație, cum ar fi eticheta, pictograma, tema, cerința de permisiune etc. Cantitatea - de la zero la unu.

O activitate este principalul lucru pentru ca o aplicație să interacționeze cu utilizatorul. Ecranul pe care îl vede utilizatorul la lansarea aplicației este Activitatea, iar majoritatea celorlalte ecrane pe care le utilizează vor fi implementate ca acțiuni separate declarate cu etichete suplimentare de activitate.

Notă: Fiecare Activitate trebuie să aibă eticheta în manifest, indiferent dacă este expusă lumii sau este destinată utilizării numai în propriul pachet. Dacă Activitatea nu are nicio etichetă potrivită în manifestul său, atunci nu o veți putea folosi.

Declara ce intentii suporta componenta. Pe lângă diferitele tipuri de valori care pot fi definite sub acest element, aici pot fi date atribute pentru a furniza o etichetă unică, o pictogramă și alte informații pentru acțiunea descrisă.

Tipul de acțiune pe care o suportă componenta. Exemplu:

< categorie>

Tipul MIME, schema URI sau calea URI a suportului pentru componente.

De asemenea, puteți conecta 1+ bucăți de metadate la Activitatea dvs.:

Adaugă o nouă bucată de metadate la activitate, pe care clienții o pot prelua prin ComponentInfo.metaData.

IntentReceiver permite unei aplicații să raporteze înlocuirea datelor sau activitățile care au loc chiar dacă aplicația nu rulează în prezent. Ca și în cazul etichetei de activitate, puteți include opțional mai mult de una sau , la fel ca cu .

Serviciul este o componentă care rulează în fundal pentru o perioadă de timp arbitrară. În această etichetă, ca și în cazul etichetei de activitate, puteți include opțional una sau mai multe sau .

ContentProvider este o componentă care gestionează datele persistente și le pune la dispoziție pentru alte aplicații. De asemenea, puteți atașa opțional unul sau mai multe , ca în activitate. nu aici.

Desigur totul<теги>trebuie sa fie sau cam asa ceva, sau așa,<напрямую/>.



Uneori, unele aplicații de pe Android nu se potrivesc într-un fel utilizatorului. Un exemplu este publicitatea intruzivă. Și se întâmplă, de asemenea, că programul este bun pentru toată lumea, dar traducerea din el este fie strâmbă, fie complet absentă. Sau, de exemplu, programul este o versiune de încercare, dar nu există nicio modalitate de a obține versiunea completă. Cum să schimbi situația?

Introducere

În acest articol vom vorbi despre cum să dezasamblam un pachet APK cu o aplicație, să ne uităm la structura sa internă, să dezasamblam și să decompilăm bytecode și, de asemenea, vom încerca să facem mai multe modificări aplicațiilor care ne pot aduce un beneficiu sau altul.

Pentru a face toate acestea singur, veți avea nevoie de cel puțin cunoștințe de bază despre limbajul Java, în care sunt scrise aplicațiile Android, și limbajul XML, care este folosit peste tot în Android - de la descrierea aplicației în sine și drepturile sale de acces până la stocarea șirurilor care va fi afișat pe ecran. De asemenea, veți avea nevoie de capacitatea de a utiliza software specializat pentru consolă.

Deci, ce este un pachet APK în care este distribuit absolut tot software-ul Android?

Decompilarea aplicației

În acest articol, am lucrat doar cu codul de aplicație dezasamblat, dar dacă se fac modificări mai serioase aplicațiilor mari, înțelegerea codului smali va fi mult mai dificilă. Din fericire, putem decompila codul dex în cod Java, care, deși nu este original și nu este compilat înapoi, este mult mai ușor de citit și de înțeles logica aplicației. Pentru a face acest lucru, vom avea nevoie de două instrumente:

  • dex2jar este un traducător al bytecode Dalvik în bytecode JVM, pe baza căruia putem obține cod în limbajul Java;
  • jd-gui este un decompilator în sine care vă permite să obțineți cod Java lizibil din bytecode JVM. Ca alternativă, puteți utiliza Jad (www.varaneckas.com/jad); Deși este destul de vechi, în unele cazuri generează cod mai ușor de citit decât Jd-gui.

Așa ar trebui să fie folosite. Mai întâi, lansăm dex2jar, specificând calea către pachetul apk ca argument:

% dex2jar.sh mail.apk

Ca rezultat, pachetul Java mail.jar va apărea în directorul curent, care poate fi deja deschis în jd-gui pentru a vizualiza codul Java.

Aranjarea pachetelor APK și primirea acestora

Pachetul de aplicație Android este în esență un fișier ZIP obișnuit, nu este nevoie să vizualizați conținutul sau să îl dezarhivați. unelte speciale nu este necesar. Este suficient să aveți un arhivator - 7zip pentru Windows sau consola dezarhivare pe Linux. Dar asta e vorba de ambalaj. Ce e inauntru? În general, avem următoarea structură în interior:

  • META-INF/- conține un certificat digital al aplicației, care identifică creatorul acesteia și sume de control ale fișierelor pachetului;
  • res/ - diverse resurse, pe care aplicația le folosește în activitatea sa, de exemplu, imagini, descrierea declarativă a interfeței, precum și alte date;
  • AndroidManifest.xml- descrierea aplicatiei. Aceasta include, de exemplu, o listă a permisiunilor necesare, versiunea Android necesară și rezoluția necesară a ecranului;
  • clase.dex- codul octet al aplicației compilat pentru mașina virtuală Dalvik;
  • resurse.arsc- de asemenea resurse, dar de alt fel - în special, șiruri (da, acest fișier poate fi folosit pentru rusificare!).

Fișierele și directoarele enumerate sunt, dacă nu în toate, atunci, poate, în marea majoritate a APK-urilor. Cu toate acestea, mai există câteva fișiere/directoare care nu sunt atât de comune care merită menționate:

  • active- analog de resurse. Principala diferență este că pentru a accesa o resursă trebuie să cunoști identificatorul acesteia, dar lista de active poate fi obținută dinamic folosind metoda AssetManager.list() din codul aplicației;
  • lib- biblioteci native Linux scrise folosind NDK (Native Development Kit).

Acest director este folosit de producătorii de jocuri, plasând acolo motorul de joc scris în C/C++, precum și de creatorii de aplicații de înaltă performanță (de exemplu, Google Chrome). Ne-am dat seama de dispozitiv. Dar cum obții fișierul pachet al aplicației care te interesează? Deoarece nu este posibil să ridicați fișiere APK de pe dispozitiv fără root (acestea sunt situate în directorul /data/app), iar rootarea nu este întotdeauna recomandabilă, există cel puțin trei moduri de a aduce fișierul aplicației pe computer:

  • Extensie APK Downloader pentru Chrome;
  • Aplicația Leecher APK reală;
  • diverse găzduire de fișiere și Varezniks.

Care să folosești este o chestiune de gust; preferăm să folosim aplicații individuale, prin urmare, vom descrie utilizarea Real APK Leecher, mai ales că este scris în Java și, în consecință, va funcționa fie în Windows, fie în Nix.

După pornirea programului, trebuie să completați trei câmpuri: E-mail, Parolă și ID dispozitiv - și selectați o limbă. Primele două sunt adresa de e-mail și parola contului dvs. Google pe care le utilizați pe dispozitiv. Al treilea este identificatorul dispozitivului și poate fi obținut prin tastarea codului pe dialer # #8255## și apoi găsiți linia ID dispozitiv. Când completați, trebuie doar să introduceți ID-ul fără prefixul android.

După completare și salvare, apare adesea mesajul „Eroare la conectarea la server”. Nu are nimic de-a face cu Google Play, așa că nu ezitați să îl ignorați și să căutați pachete care vă interesează.

Vizualizați și modificați

Să presupunem că ați găsit un pachet care vă interesează, l-ați descărcat, l-ați despachetat... iar când ați încercat să vizualizați un fișier XML, ați fost surprins să descoperiți că fișierul nu era text. Cum să-l decompilați și cum să lucrați cu pachetele în general? Este cu adevărat necesar să instalați SDK-ul? Nu, nu este deloc necesar să instalați SDK-ul. De fapt, pentru toate etapele de despachetare, modificare și ambalare Pachete APK Sunt necesare următoarele instrumente:

  • Arhivator ZIP pentru despachetare și ambalare;
  • smali- mașină virtuală Dalvik bytecode assembler/disassembler (code.google.com/p/smali);
  • apt- un instrument pentru ambalarea resurselor (în mod implicit, resursele sunt stocate în formă binară pentru a optimiza performanța aplicației). Inclus în Android SDK, dar poate fi obținut separat;
  • semnatar- un instrument pentru semnarea digitală a unui pachet modificat (bit.ly/Rmrv4M).

Puteți utiliza toate aceste instrumente separat, dar acest lucru este incomod, deci este mai bine să utilizați software de nivel superior construit pe baza lor. Dacă lucrați pe Linux sau Mac OS X, există un instrument numit apktool. Vă permite să despachetați resurse în aspect original(inclusiv fișiere XML binare și arsc), reconstruiți pachetul cu resurse modificate, dar nu știe cum să semneze pachetele, așa că va trebui să rulați manual utilitarul de semnare. În ciuda faptului că utilitarul este scris în Java, instalarea sa este destul de nestandard. Mai întâi trebuie să obțineți fișierul jar în sine:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

Dacă lucrați pe Windows, atunci există un instrument excelent pentru acesta numit Virtuous Ten Studio, care acumulează și toate aceste instrumente (inclusiv apktool în sine), dar în loc de o interfață CLI oferă utilizatorului o interfață grafică intuitivă cu care puteți efectuați operațiuni de despachetare, dezasamblare și decompilare în câteva clicuri. Acest instrument este Donation-ware, adică uneori apar ferestre care vă cer să obțineți o licență, dar până la urmă acest lucru poate fi tolerat. Nu are rost să-l descrii, pentru că poți înțelege interfața în câteva minute. Dar apktool, datorită naturii sale de consolă, ar trebui discutat mai detaliat.


Să ne uităm la opțiunile apktool. Pe scurt, există trei comenzi de bază: d (decodificare), b (build) și if (install framework). Dacă totul este clar cu primele două comenzi, atunci ce face a treia declarație condiționată? Acesta despachetează cadrul specificat de UI, care este necesar în cazurile în care disecați orice pachet de sistem.

Să ne uităm la cele mai interesante opțiuni ale primei comenzi:

  • -s- nu dezasamblați fișierele dex;
  • -r- nu despachetați resurse;
  • -b- nu introduceți informații de depanare în rezultatele dezasamblarii fișierului dex;
  • --cadru-cadru- utilizați cadrul specificat de UI în loc de cel încorporat în apktool. Acum să ne uităm la câteva opțiuni pentru comanda b:
  • -f- asamblare fortata fara verificarea modificarilor;
  • -A- indicați calea către aapt (un instrument pentru construirea unei arhive APK), dacă dintr-un motiv oarecare doriți să o utilizați dintr-o altă sursă.

Utilizarea apktool este foarte simplă pentru a face acest lucru, trebuie doar să specificați una dintre comenzi și calea către APK, de exemplu:

$ apktool d mail.apk

După aceasta, toate fișierele extrase și dezasamblate ale pachetului vor apărea în directorul de e-mail.

Pregătirea. Dezactivarea publicității

Teoria este, desigur, bună, dar de ce este necesară dacă nu știm ce să facem cu pachetul despachetat? Să încercăm să aplicăm teoria în beneficiul nostru, și anume, să modificăm niște software pentru ca acesta să nu ne arate reclamă. De exemplu, să fie Virtual Torch - o torță virtuală. Acest software este ideal pentru noi, deoarece este plin de reclame enervante și, în plus, este suficient de simplu pentru a nu se pierde în jungla codului.


Deci, folosind una dintre metodele de mai sus, descărcați aplicația de pe piață. Dacă decideți să utilizați Virtuous Ten Studio, deschideți fișierul APK în aplicație și extrageți-l, pentru care creați un proiect (Fișier -> Proiect nou), apoi în meniul contextual proiect, selectați Import File. Dacă alegerea ta a căzut pe apktool, atunci rulează doar o comandă:

$ apktool d com.kauf.particle.virtualtorch.apk

După aceasta, un arbore de fișiere similar cu cel descris în secțiunea anterioară va apărea în directorul com.kauf.particle.virtualtorch, dar cu un director smali suplimentar în loc de fișiere dex și un fișier apktool.yml. Primul conține codul dezasamblat al fișierului executabil dex al aplicației, cel de-al doilea conține informațiile de service necesare pentru ca apktool să asambla pachetul înapoi.

Primul loc pe care ar trebui să ne uităm este, desigur, AndroidManifest.xml. Și aici întâlnim imediat următoarea linie:

Nu este greu de ghicit că este responsabil pentru acordarea permisiunilor aplicației de a utiliza conexiunea la Internet. De fapt, dacă vrem doar să scăpăm de publicitate, cel mai probabil va trebui doar să blocăm aplicația de pe Internet. Să încercăm să facem asta. Ștergem linia specificată și încercăm să construim software-ul folosind apktool:

$ apktool b com.kauf.particle.virtualtorch

Fișierul APK rezultat va apărea în directorul com.kauf.particle.virtualtorch/build/. Totuși, nu va fi posibil să-l instalezi, deoarece nu are semnătură digitală și sume de verificare a fișierelor (pur și simplu nu are un director META-INF/). Trebuie să semnăm pachetul folosind utilitarul apk-signer. Lansat. Interfața este formată din două file - pe prima (Key Generator) creăm chei, pe a doua (APK Signer) semnăm. Pentru a ne crea cheie privată, completați următoarele câmpuri:

  • Fișierul țintă- fișier de ieșire keystore; de obicei stochează o pereche de chei;
  • ParolaȘi A confirma- parola pentru stocare;
  • Alias- numele cheii din depozit;
  • Parola aliasȘi A confirma- parola cheie secretă;
  • Valabilitate- perioada de valabilitate (în ani). Valoarea implicită este optimă.

Câmpurile rămase sunt, în general, opționale - dar cel puțin unul trebuie completat.


AVERTIZARE

Pentru a semna o aplicație folosind apk-signer, trebuie să instalați Android SDK și să specificați drum completînainte de acesta în setările aplicației.

Toate informațiile sunt furnizate doar în scop informativ. Nici editorii, nici autorul nu sunt responsabili pentru niciuna posibil prejudiciu cauzate de materialele acestui articol.

Acum puteți semna APK-ul cu această cheie. În fila APK Signer, selectați fișierul nou generat, introduceți parola, aliasul cheii și parola pentru acesta, apoi găsiți fișier APKși cu îndrăzneală apasa butonul"Semn" Daca totul merge bine, pachetul va fi semnat.

INFO

Deoarece am semnat pachetul cu propria noastră cheie, acesta va intra în conflict cu aplicația originală, ceea ce înseamnă că atunci când vom încerca să actualizăm software-ul prin piață, vom primi o eroare.

Este necesară doar o semnătură digitală software terță parte, deci dacă faci modificări aplicații de sistem, care sunt instalate prin copierea în directorul /system/app/, nu trebuie să le semnați.

După aceea, descărcați pachetul pe smartphone, instalați-l și lansați-l. Voila, reclama a dispărut! În schimb, a apărut însă un mesaj că nu avem internet sau nu avem permisiunile corespunzătoare. În teorie, acest lucru ar putea fi suficient, dar mesajul pare enervant și, să fiu sincer, tocmai am avut noroc cu o aplicație stupidă. Cel mai probabil, software-ul scris în mod normal își va clarifica acreditările sau va verifica o conexiune la Internet și, în caz contrar, va refuza pur și simplu lansarea. Cum să fii în acest caz? Desigur, editați codul.

De obicei, autorii aplicației creează clase speciale pentru afișarea reclamelor și a metodelor de apel ale acestor clase atunci când aplicația sau una dintre „activitățile” acesteia (în termeni simpli, ecranele aplicației) este lansată. Să încercăm să găsim aceste clase. Mergem la directorul smali, apoi com (org conține doar biblioteca grafică deschisă cocos2d), apoi kauf (aici este, pentru că acesta este numele dezvoltatorului și tot codul său este acolo) - și aici este, directorul de marketing. În interior găsim o grămadă de fișiere cu extensia smali. Acestea sunt clase, iar cea mai notabilă dintre ele este clasa Ad.smali, după denumirea căreia este ușor de ghicit că este cea care afișează reclamă.

Am putea schimba logica funcționării acestuia, dar ar fi mult mai ușor să eliminați pur și simplu apelurile la oricare dintre metodele sale din aplicația în sine. Prin urmare, părăsim directorul de marketing și mergem la directorul de particule adiacent și apoi la virtualtorch. Atentie speciala Fișierul MainActivity.smali merită acest lucru. Acesta este standard pentru Clasa Android, care este creat de Android SDK și instalat ca punct de intrare în aplicație (analog cu funcția principală din C). Deschideți fișierul pentru editare.

Înăuntru există cod smali (asambler local). Este destul de confuz și dificil de citit din cauza naturii sale de nivel scăzut, așa că nu îl vom studia, ci pur și simplu vom găsi toate referințele la clasa Ad în cod și le vom comenta. Introducem linia „Ad” în căutare și ajungem la rândul 25:

Câmp anunț privat:Lcom/kauf/marketing/Ad;

Aici este creat un câmp de anunț pentru a stoca un obiect de clasă de anunțuri. Comentăm punând un semn ### în fața liniei. Continuăm căutarea. Linia 423:

Noua instanță v3, Lcom/kauf/marketing/Ad;

Aici are loc crearea obiectului. Hai sa comentam. Continuăm căutarea și găsim în rândurile 433, 435, 466, 468, 738, 740, 800 și 802 apeluri la metodele clasei Ad. Hai sa comentam. Arata ca asta e. Să salvăm. Acum pachetul trebuie pus la loc și verificat pentru funcționalitate și prezența reclamei. Pentru puritatea experimentului, returnăm linia eliminată din AndroidManifest.xml, asamblam pachetul, îl semnăm și îl instalăm.

Cobaiul nostru. Publicitate vizibilă

Hopa! Publicitatea a dispărut doar în timp ce aplicația rula, dar a rămas în meniul principal, pe care îl vedem când lansăm software-ul. Așadar, așteptați, dar punctul de intrare este clasa MainActivity, iar reclama a dispărut în timp ce aplicația rula, dar a rămas în meniul principal, deci punctul de intrare este diferit? Pentru a identifica adevăratul punct de intrare, redeschideți fișierul AndroidManifest.xml. Și da, conține următoarele rânduri:

Ei ne spun (și, mai important, Android) că o activitate numită Start ar trebui să fie lansată ca răspuns la generarea unui intent (eveniment) android.intent.action.MAIN din categoria android.intent.category.LAUNCHER. Acest eveniment este generat atunci când atingeți pictograma aplicației din launcher, deci determină punctul de intrare, și anume clasa Start. Cel mai probabil, programatorul a scris mai întâi o aplicație fără meniu principal, punctul de intrare în care era clasa standard MainActivity, apoi a adăugat o nouă fereastră (activitate) care conține meniul și descrisă în clasa Start și a făcut-o manual intrarea. punct.

Deschideți fișierul Start.smali și căutați din nou linia „Ad”, găsim în rândurile 153 și 155 o mențiune a clasei FirstAd. Se află și în codul sursă și, judecând după nume, este responsabil pentru afișarea reclamelor pe ecranul principal. Să privim mai departe, există crearea unei instanțe a clasei FirstAd și o intenție care, după context, este legată de această instanță, iar apoi eticheta cond_10, a cărei tranziție condiționată se realizează exact înainte de a crea o instanță. din clasa:

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

Cel mai probabil, programul calculează cumva aleatoriu dacă publicitatea ar trebui să fie afișată pe ecranul principal și, dacă nu, sare direct la cond_10. Ok, să-i simplificăm sarcina și să înlocuim tranziția condiționată cu una necondiționată:

#if-ne p1, v0, :cond_10 goto:cond_10

Nu mai există mențiuni despre FirstAd în cod, așa că închidem fișierul și reasamblam lanterna noastră virtuală folosind apktool. Copiați-l pe smartphone, instalați-l, lansați-l. Voila, toate reclamele au dispărut, pentru care ne felicităm pe toți.

Rezultate

Acest articol este doar o scurtă introducere în metodele de hacking și modificare a aplicațiilor Android. Multe probleme au rămas în spatele scenei, cum ar fi eliminarea protecției, analiza codului ofuscat, traducerea și înlocuirea resurselor aplicației, precum și modificarea aplicațiilor scrise folosind Android NDK. Cu toate acestea, având cunoștințe de bază, este doar o chestiune de timp să-ți dai seama de toate.

Ei bine, cartea lui Goloshchapov are și o descriere bună. Deoarece articolele pot dispărea online, aici voi face o compilație gratuită a tuturor surselor de mai sus. Și în același timp corectez inexactitățile. De la traducerea unor elemente (de exemplu ) Ei bine, în general, nu este nici măcar aproape de original. Practic, toate articolele sunt copy-paste și nu este clar cine a furat pe cine. Dar, într-un fel sau altul, practic descrierea acestui fișier și scopul său din aceste articole coincide cu originalul.
Fac asta ca un memento pentru mine și, dacă este util pentru altcineva, este bine.

Fișierul AndroidManifest.xml specifică configurația aplicației:

  • declară numele pachetului Java al aplicației, care servește ca un identificator unic
  • declară nivelurile API minime și maxime necesare pentru ca aplicația să funcționeze
  • descrie componentele aplicației (Activiy, Service, Broadcast Receiver și Content Provider)
  • listează orice biblioteci asociate cu aplicația (în afară de bibliotecile implicite Android)
  • declară permisiunile necesare pentru ca aplicația să funcționeze (de exemplu, acces la rețea, permisiunea de a trimite SMS etc.)
În figura de mai jos puteți vedea structura generală a fișierului manifest și elementele acestuia. Desenul este preluat din cartea lui Goloshchapov și nu conține unele elemente. Am tradus chiar eu descrierea elementelor lipsă. Dar, în principiu, nu sunt multe dintre ele.

Descrierea completă este în alma mater, dar o voi oferi și aici pentru o mai mare claritate.
. . . . . . . . .
Ordinea de aranjare a elementelor situate la același nivel este arbitrară. Toate valorile sunt stabilite prin atributele elementului. Elementul este elementul principal al manifestului și conține multe elemente copil care definesc structura și funcționarea aplicației. Elemente , Și sunt obligatorii. Alte elemente sunt opționale și sunt folosite în manifest dacă este necesar.

Element este elementul rădăcină al fișierului AndroidManifest.xml. În mod implicit, Expertul nou proiect Android din Eclipse creează acest element cu patru atribute:

Aceste atribute sunt necesare pentru orice aplicație Android și au următorul scop:

xmins:android— definește spațiul de nume Android. Această valoare este întotdeauna aceeași pentru toate aplicațiile.

pachet- Definește numele unic al pachetului de aplicație pe care l-ați specificat la crearea proiectului.

De ce trebuie să specificați pachetul? Dacă doriți să vă încărcați aplicația pe Google Play, aceasta verifică unicitatea atunci când acceptați aplicația, așa că este recomandat să vă folosiți numele pentru a evita conflictele cu alți dezvoltatori.

android:versionCode- în esență, aceasta este o versiune a aplicației dvs. Când lansați o nouă versiune, o indicați în acest câmp, trebuie să fie un număr întreg.

Mai sus am vorbit despre unicitatea pachetului, așa că dacă ați încărcat anterior aplicația pe Google Play, atunci când decideți să descărcați versiunea actualizată a aplicației, trebuie să respectați mai multe reguli. Numele pachetului trebuie să se potrivească cu ceea ce este deja descărcat de Google Play și să indice versiunea android:versionCode mult mai înalt. Dar aceasta este cu condiția să lansați o nouă versiune a aplicației dacă doriți să adăugați o versiune ușor corectată, apoi citiți mai jos;

Prin schimbare acest parametru iar prin încărcarea aplicației pe Google Play, tuturor utilizatorilor aplicației dumneavoastră li se va oferi să actualizeze noua versiune a aplicației.

android:versionName- indică numărul versiunii utilizatorului. Dacă ați găsit mai multe defecte în aplicația dvs. și le-ați corectat, atunci în acest caz puteți specifica o nouă versiune pentru acest câmp, care va spune Google Play că aceasta nu este o versiune nouă a aplicației, ci una îmbunătățită. Puteți folosi un șir sau o resursă șir pentru a denumi o versiune.

Prin modificarea acestui parametru și încărcarea aplicației pe Google Play, tuturor utilizatorilor aplicației dumneavoastră li se va oferi să actualizeze versiunea modificată a aplicației.

Element vă permite să solicitați permisiuni care trebuie acordate unei aplicații de către sistem pentru ca aceasta functionare normala.

Permisiunile sunt acordate în timpul instalării aplicației, nu în timp ce aplicația rulează. are un singur atribut numit permisiune android:nume. Aceasta ar putea fi o rezoluție definită pe element aceasta aplicație, o permisiune definită într-o altă aplicație sau una dintre permisiunile standard ale sistemului, de exemplu:

android:name=’android.permission.CAMERA’– acces la camera dispozitivului
android:name=’android.permission.READ_CONTACTS’– acces la baza de date de contacte

Element declară o permisiune care este utilizată pentru a restricționa accesul la anumite componente sau funcționalități ale unei anumite aplicații. Această secțiune descrie drepturile pe care alte aplicații trebuie să le solicite pentru a obține acces la aplicația dvs.

O aplicație își poate proteja propriile componente (Activitate, Serviciu, Receptor de difuzare și Furnizor de conținut) cu permisiuni. Poate folosi oricare dintre permisiunile de sistem definite de Android (listate în android.Manifest.permission) sau declarate de alte aplicații și își poate defini, de asemenea, propriile permisiuni. Noua permisiune trebuie declarată în atribut android:nume element in felul urmator:

permis android:name="com.samples.custom_permission”

În plus, sunt utilizate atribute suplimentare:

android:label— numele permisiunii afișat utilizatorului
android:descriere- descrierea permisiunii
android:pictogramă- pictograma permisiunii
android:permissionGroup— determină apartenența la un grup de permisiuni
android:protectionLevel— nivelul de protecție

Element declară numele de bază pentru arborele de permisiuni. Acest element nu declară permisiunea în sine, ci doar un spațiu de nume în care pot fi plasate alte permisiuni.

Element definește un nume pentru un set de permisiuni legate logic. Acestea pot fi ambele declarate în același manifest cu elementul Permisiuni așa cum sunt anunțate în altă parte. Acest element nu declară direct o permisiune, ci doar o categorie în care pot fi plasate permisiunile. O permisiune poate fi plasată într-un grup prin atribuirea numelui grupului în atribut permissionGroup element .

Element declară un obiect Instrumentation, care face posibilă controlul interacțiunii aplicației cu sistemul. Utilizat de obicei la depanarea și testarea unei aplicații și eliminat din versiunea de lansare a aplicației.

Element vă permite să declarați compatibilitatea unei aplicații cu o versiune specificată (sau versiuni API mai noi) Platforme Android. Nivelul API declarat de aplicație este comparat cu nivelul API al sistemului de dispozitiv mobil pe care este instalată aplicația.

Atributul principal utilizat într-un element este android:minSdkVersion, definește nivelul minim API necesar pentru ca aplicația să funcționeze. sistem Android va împiedica utilizatorul să instaleze aplicația dacă nivelul API al sistemului este mai mic decât valoarea definită în acest atribut. Este recomandabil să declarați întotdeauna acest atribut, de exemplu:

Atribut android:targetSdkVersion introdus începând cu API Level 4. Acesta este un număr întreg care indică nivelul API pentru care este destinată aplicația (țintă, ceea ce înseamnă scop). Dacă acest atribut nu este setat, valoarea sa implicită este minSdkVersion.

Acest atribut informează sistemul că ați testat aplicația cu acest nivel de API și că sistemul nu ar trebui să permită niciun comportament de compatibilitate, adică emularea apelurilor API care oferă suplimentar special. procesare software unele apeluri API) pentru a menține compatibilitatea directă a aplicației cu versiunea sistemului țintă. Aplicația poate rula în continuare pe versiuni mai vechi (până la versiuni nu mai puțin de minSdkVersion).

Pe măsură ce Android evoluează cu fiecare versiune nouă, un anumit comportament și chiar aspectul aplicației se pot schimba. Cu toate acestea, dacă nivelul API al platformei este mai mare decât versiunea specificată în targetSdkVersion a aplicației, sistemul poate activa comportamente de compatibilitate pentru a asigura că aplicația dumneavoastră funcționează conform așteptărilor. Puteți preveni o astfel de gestionare a compatibilității specificând targetSdkVersion egal cu nivelul API al platformei Android pe care rulează aplicația. De exemplu, setarea acestei valori la „11” sau mai mare va permite sistemului să seteze o nouă temă implicită (Holo) pentru aplicația dvs. atunci când rulați pe Android 3.0 sau o versiune ulterioară și, de asemenea, va dezactiva modul de compatibilitate cu ecranul atunci când programul rulează. ecrane mari(deoarece suportul API de nivel 11 implică implicit suport pentru ecrane mari).

Există multe comportamente de compatibilitate pe care sistemul le poate rezolva pe baza valorii acestui atribut. Unele dintre aceste comportamente sunt descrise în documentația relevantă a versiunii platformei, consultați Build.VERSION_CODES.

Pentru a vă asigura că aplicația dvs. respectă fiecare nouă lansare Android, trebuie să creșteți valoarea acestui atribut pentru a se potrivi cu cel mai recent nivel API, apoi trebuie să testați complet comportamentul aplicației pe acea nouă versiune a platformei.

Atribut android:maxSdkVersion introdus începând cu API Level 4. Acesta este un număr întreg care indică nivelul maxim API la care poate rula aplicația.

Pe versiunile Android 1.5, 1.6, 2.0 și 2.0.1, sistemul verifică valoarea acestui atribut atunci când aplicația este instalată și când aplicația este verificată pentru compatibilitate după o actualizare a sistemului. În orice caz, dacă atributul maxSdkVersion al aplicației este mai mic decât API-ul Nivel de sistem, atunci instalarea aplicației va fi interzisă. La verificarea compatibilității unei aplicații după o actualizare a sistemului, acest caz corespunde cu eliminarea completă a aplicației de pe dispozitiv. Pentru a ilustra modul în care acest atribut poate afecta o aplicație după o actualizare a sistemului, luați în considerare un exemplu.

Aplicația a declarat maxSdkVersion="5" în manifestul său și a fost publicată pe Google Play. Utilizator dispozitive Android 1.6 (API Level 4) a descărcat și instalat această aplicație. După câteva săptămâni, utilizatorul a primit un mesaj de la sistemul over-the-air cu o ofertă de actualizare a sistemului la Android 2.0 (API Level 5). După instalarea acestei actualizări, sistemul a verificat atributul maxSdkVersion al aplicației și a permis utilizarea în continuare a acestei aplicații. Aplicația a funcționat bine după aceea. Cu toate acestea, după ceva timp, dispozitivul a acceptat o altă actualizare de sistem Android 2.0.1 (API Level 6). După actualizare, sistemul nu permite rularea aplicației deoarece nivelul API al sistemului (6) este acum mai mare decât nivelul maxim pe care îl poate suporta aplicația (5). Sistemul face aplicația invizibilă pentru utilizator și o elimină de pe dispozitiv.

Avertisment: Utilizarea acestui atribut este depreciată. În primul rând, nu este nevoie să setați acest atribut ca mijloc de a bloca aplicația dvs. de a fi implementată pe versiuni noi ale platformei Android pe măsură ce acestea devin disponibile. Pentru Android, complet compatibilitate inversă aplicații vechi pentru versiuni noi de Android. Aplicația dvs. ar trebui să funcționeze corect pe toate versiunile noi, atâta timp cât utilizează numai API-ul standard și urmează cele mai bune reguli și practici de dezvoltare. În al doilea rând, trebuie să rețineți că utilizarea acestui atribut va duce la eliminarea automată a aplicației dvs. de pe dispozitivele utilizator care își actualizează sistemul la un nivel API mai mare decât cel specificat în atribut. Cele mai multe dintre dispozitivele pe care aplicația dvs. este probabil instalată primesc actualizări periodice de sistem din zbor, prin aer, așa că ar trebui să luați în considerare acest efect înainte de a seta acest atribut pentru aplicația dvs.

Viitor versiuni Android(dincolo de Android 2.0.1) nu va mai verifica maxSdkVersion și nu va mai aplica valoarea atunci când instalează sau verifică compatibilitatea aplicației. Cu toate acestea, Google Play va continua să folosească acest atribut ca filtru atunci când pune aplicații disponibile pentru descărcare de către utilizatori.

Element specifică hardware-ul necesar aplicației și configurarea software-ului dispozitiv mobil. De exemplu, o aplicație necesită o tastatură fizică sau un trackball pentru a funcționa. Specificația este folosită pentru a evita instalarea unei aplicații pe dispozitive care nu acceptă configurația necesară.

Dacă aplicația dvs. poate funcționa cu diferite configurații de dispozitiv, trebuie să includeți anumite elemente în manifest pentru fiecare configurație.

Puteți specifica orice combinație care conține. următoarele dispozitive

reqFiveWayNav- utilizați true dacă aplicația necesită un dispozitiv de intrare care acceptă navigarea în sus, în jos, stânga, dreapta și făcând clic pe elementul evidențiat. Aceste dispozitive includ trackball-uri și D-pad-uri. Practic depășit
reqHardKeyboard- utilizați true dacă aplicația necesită o tastatură hardware.
reqKeyboardType- vă permite să setați tipul tastaturii: nokeys, qwerty, twelvekey, undefined
reqNavigation- specificați una dintre valori: nonav, dpad, trackball, wheel sau undefined dacă este necesar un dispozitiv de navigare
reqTouchScreen- dacă este necesar un ecran tactil, atunci utilizați valoarea dorită din opțiunile posibile: notouch, stylus, finger, undefined. Acum aproape toate dispozitivele conțin un ecran tactil, deci este și depășit

Aplicația nu se va instala pe un dispozitiv care nu se potrivește cu configurația pe care ați setat-o. În mod ideal, ar trebui să dezvoltați o aplicație care să funcționeze cu orice combinație de dispozitive de intrare. În acest caz nu e necesar.

Element declară anumite funcționalități necesare pentru ca aplicația să funcționeze. În acest fel, aplicația nu va fi instalată pe dispozitive care nu au funcționalitatea necesară. De exemplu, o aplicație poate detecta că necesită o cameră cu focalizare automată. Dacă dispozitivul nu are o cameră încorporată cu autofocus, aplicația nu va fi instalată. De exemplu:

android.hardware.camera.față- este necesară camera hardware

Android.hardware.camera.autofocus- Necesită o cameră cu autofocus

Toți parametrii pot fi vizualizați la alma mater.

Element definește dimensiunile ecranului necesare pentru funcționarea normală a programului dvs. și permite compatibilitatea ecranului pentru dimensiunile ecranului mai mari decât cele specificate în acest parametru.

Pentru o mai mare claritate, voi da sintaxa

Determină dimensiunile și densitățile ecranului compatibile cu aplicația dvs. Un singur element poate fi prezent în fișierul manifest, dar poate conține multe elemente . De exemplu:
... ...
Sistemul Android nu citește acest element în fișierul manifest, nici în timpul instalării, nici în timpul lansării aplicației. Acest element este pur informativ și este folosit doar de servicii externe precum Google Play pentru a filtra afișarea aplicației dumneavoastră pe piață. Adică, dacă utilizatorul are parametri de ecran diferiți de cei specificați în acest element, atunci Google Play pur și simplu nu îi va arăta această aplicație.

În general, nu ar trebui să utilizați acest element.

Acest element declară formatul de compresie al unei singure texturi GL suportate de aplicația dvs. Dacă aplicația dvs. acceptă mai multe formate de comprimare a texturii, atunci trebuie să utilizați mai mult de unul dintre aceste elemente. De exemplu:

Toate valorile pot fi vizualizate la acest link. Puteți citi puțin despre acest parametru în rusă.

Element are o structură mult mai complexă decât toate elementele enumerate. Am luat structura acestui element din cartea lui Goloshchapov

Element unul dintre elementele principale ale manifestului, conținând o descriere a componentelor aplicației disponibile în pachet: stiluri, pictogramă etc. Conține elemente copil care declară fiecare dintre componentele incluse în aplicație. Nu poate exista decât un singur element într-un manifest .

Element copil declară o componentă Activitate. Dacă o aplicație conține mai multe activități, acestea trebuie declarate în manifest, creând un element separat pentru fiecare dintre ele . Dacă o Activitate nu este declarată în manifest, aceasta nu va fi vizibilă pentru sistem și nu va fi lansată când aplicația rulează sau va fi afișat un mesaj de eroare. Exemplu de declarație de activitate:

Aceste atribute ale elementelor sunt obligatorii și determină următoarele:

android:nume- numele clasei. Numele trebuie să includă denumirea completă a pachetului, dar dacă numele pachetului este deja definit în elementul rădăcină , numele clasei care implementează Activitatea poate fi scris sub formă prescurtată, omițând numele pachetului.

android:label— o etichetă text afișată utilizatorului în antetul Activitate.

Element conține multe alte atribute care definesc rezoluțiile, orientarea ecranului etc. Modificarea configurației în timp ce programul rulează

Când se schimbă limba, regiunea sau configurația hardware, Android oprește toate aplicațiile și apoi le repornește, reîncărcând valorile din resurse. Un astfel de comportament nu este întotdeauna adecvat sau de dorit. De exemplu, unele modificări de configurare (orientarea ecranului în spațiu, accesibilitatea tastaturii) pot apărea doar pentru că utilizatorul rotește dispozitivul sau scoate tastatura. Puteți personaliza modul în care aplicația dumneavoastră reacționează la astfel de modificări detectându-le și executându-le. propriile actiuni. Pentru a forța o activitate să urmărească modificările configurației pe măsură ce programul rulează, adăugați atributul la nodul său în manifest android:configChanges, indicând ce evenimente doriți să procesați.

Iată câteva valori care pot fi folosite pentru a descrie modificările de configurare:

orientare— poziția ecranului a fost schimbată de la portret la peisaj (sau invers);
tastatură Ascunsă— tastatura este extinsă sau ascunsă;
fontScale— utilizatorul a schimbat dimensiunea preferată a fontului;
local— utilizatorul a selectat noi setări de limbă;
tastatură— tipul tastaturii s-a schimbat; de exemplu, un telefon poate avea un panou cu 12 taste care, atunci când este rotit, dezvăluie o tastatură cu drepturi depline;
touch screen sau navigare— tipul de tastatură sau metoda de navigare s-a schimbat. De regulă, astfel de evenimente nu au loc.

În unele cazuri, mai multe evenimente se vor declanșa în același timp. De exemplu, atunci când utilizatorul scoate tastatura, majoritatea dispozitivelor generează evenimente tastatură AscunsăȘi orientare. Puteți selecta mai multe evenimente pe care doriți să le procesați singur, separându-le cu simbolul | .

Prezența atributului android:configChanges anulează repornirea aplicației când modificări specificate configuratii. În schimb, metoda din interiorul activității se declanșează onConfigurationChanged(). Ignorați-l pentru a putea gestiona modificările de configurare. Utilizați obiectul trecut Configurare pentru a obține noi valori. Nu uitați să apelați metoda cu același nume din clasa părinte și să reîncărcați valorile modificate din toate resursele care sunt utilizate în cadrul activității.

@Override public void onConfigurationChanged(Configuration _newConfig) ( super.onConfigurationChanged(_newConfig); [ ... Actualizați interfața de utilizare folosind date din resurse... ] if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) ( [ ... Reacție la o orientare modificată a ecranului... ] ) if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) ( [ ... Reacția la împingerea/retragerea tastaturii... ] ) )
Orice modificare a configurației care nu a fost marcată în mod explicit pentru procesare în cadrul aplicației dvs. va determina repornirea activității, ocolind apelul de metodă onConfigurationChanged .

Element acceptă noduri imbricate . Element definește tipurile de intenții la care poate răspunde o activitate, un serviciu sau un receptor de difuzare. Un filtru de intenție oferă componentelor client capacitatea de a prelua intențiile de tip declarat, eliminând cele care nu sunt semnificative pentru componentă și conține elemente copil. , , .


Element adaugă o acțiune la filtrul de intenție. Element trebuie să conțină unul sau mai multe elemente . Dacă în element Dacă aceste elemente nu sunt prezente, atunci obiectele de intenție nu vor trece prin filtru. Exemplu de declarație de acțiune:

Aceasta înseamnă că această activitate de aplicație este cea principală și când sistemul trimite o intenție de a lansa aplicația, această activitate se va deschide implicit.


Element specifică categoria componentei pe care intenția ar trebui să o proceseze. Acestea sunt constante de șir definite în clasa de intenție, de exemplu:

Acest atribut specifică faptul că această aplicație va fi adăugată în directorul de aplicații de pe dispozitivul Android. Și va fi afișat în fereastra Lansatorul de aplicații a dispozitivului mobil.


Element adaugă o specificație de date la filtrul de intenție. Specificația poate fi doar un tip de date (atribut mimeType), un URI sau un tip de date plus un URI. Semnificația unui URI este determinată de atribute separate pentru fiecare dintre părțile sale, adică URI-ul este împărțit în părți: android:schemă, android:gazdă, android:port, android:cale sau android:pathPrefix, android:pathPattern.


Element definește o pereche nume-valoare pentru un element de date arbitrare suplimentare care pot fi furnizate componentei părinte. Un element constitutiv poate conține orice număr de elemente .


Element este un alias pentru Activitatea definită în atributul targetActivity. Activitatea țintă trebuie să fie în aceeași aplicație cu aliasul și trebuie declarată înaintea aliasului activității în manifest. Un alias reprezintă activitatea țintă ca entitate independentă. Un alias poate avea propriul set de filtre de intenții care determină intențiile care pot declanșa Activitatea țintă și modul în care sistemul va gestiona acea Activitate. De exemplu, filtrele de intenție pentru un alias de activitate pot defini steagurile android:name="android.intent.action.MAIN" și android:name="android.intent.category.LAUNCHER", determinând încărcarea activității țintă atunci când aplicația începe chiar dacă aceste semnalizatoare nu sunt setate în filtrele de intenție pentru activitatea țintă.

Elemente , Și Ei declară componentele Serviciu, Receptor de difuzare și, respectiv, Furnizor de conținut. Nu uitați că componentele care nu au fost declarate nu vor fi detectate de sistem și nu vor fi lansate niciodată. Aceste elemente au multe atribute care definesc numele, disponibilitatea, permisiunile, procesul etc.


Element declară un serviciu ca una dintre componentele aplicației. Toate serviciile trebuie să fie reprezentate printr-un element în fișierul manifest. Serviciile care nu au fost declarate nu vor fi detectate de sistem și nu vor fi pornite niciodată. Acest element are multe atribute care definesc numele, accesibilitatea, permisiunile, procesul etc. Acceptă noduri imbricate


Element declară un receptor de intenție de difuzare ca una dintre componentele aplicației. Receptorii de intenție de difuzare permit aplicațiilor să primească intenții care sunt difuzate de sistem sau de alte aplicații, chiar și atunci când alte componente ale aplicației sunt oprite.


Element declară un furnizor de conținut (sursă de date) pentru a controla accesul la bazele de date. Toți furnizorii de conținut care fac parte din aplicație trebuie să fie reprezentați în elemente În fișierul manifest. Dacă nu sunt declarați, nu vor funcționa deoarece sistemul nu le va putea vedea. Element Conține propriul set de elemente copil pentru setarea permisiunilor de acces la date:
  • ;
  • ;
Acest element are multe atribute care definesc numele, disponibilitatea, permisiunile, procesul etc.


Element este un copil al . Acesta stabilește cui pot fi acordate permisiuni pentru subseturi de date ale furnizorului de conținut. Acordarea permisiunii este o modalitate de a permite unui client care nu are permisiunea de a accesa datele complete să acceseze un subset al datelor furnizate de furnizorul de conținut. Dacă atributul granturiPermissions al furnizorului de conținut este adevărat, atunci se acordă permisiunea pentru orice date furnizate de furnizorul de conținut. Cu toate acestea, dacă atributul este setat la fals, permisiunea poate fi acordată numai subseturilor de date care sunt definite de acel element. Furnizorul de conținut poate conține orice număr de elemente .


Element - element copil pt . Definește calea și permisiunile necesare pentru un anumit subset de date din cadrul furnizorului informații operaționale. Acest element poate fi definit de mai multe ori pentru a furniza mai multe căi.


Element specifică o bibliotecă publică cu care aplicația ar trebui să fie conectată. Acest element indică sistemului să includă cod de bibliotecă în încărcătorul de clasă pentru pachetul de aplicație. Fiecare proiect este inclus în mod implicit cu bibliotecile Android, care includ pachetele de bază pentru construirea de aplicații (cu clase de uz general precum Activitate, Serviciu, Intenție, Vizualizare, Buton, Aplicație, ContentProvider etc.). Cu toate acestea, unele pachete (cum ar fi hărți și awt) sunt în biblioteci separate care nu sunt conectate automat cu aplicația. Dacă aplicația folosește pachete din aceste biblioteci sau altele de la dezvoltatori terți, este necesar să se facă legături explicite cu aceste biblioteci, iar manifestul trebuie să conțină un element separat. .

Totul a fost descris aici foarte pe scurt. Citiți mai multe despre alma mater.

Nume Descriere Necesitate
gen Fișierele generate de Java însuși. Iată unul ca acesta dosar important ca R.java da
AndroidManifest.xml Fișierul manifest AndroidManifest.xml oferă sistemului informații de bază despre program. Fiecare aplicație trebuie să aibă propriul fișier manifest da
src Directorul care conține codul sursă al aplicației da
active Colecție arbitrară de directoare și fișiere Nu
res Directorul care conține resursele aplicației. Acest director poate conține subdosare desenabile, anim, aspect, meniu, valori, xml și brut (vezi mai jos) da

1.5.1. Fișierul manifest AndroidManifest.xml

Fișierul manifest AndroidManifest.xml oferă sistemului informații de bază despre program. Fiecare aplicație trebuie să aibă propriul fișier AndroidManifest.xml. Puteți edita manual fișierul manifest schimbând codul XML sau prin intermediul editor vizual Manifest Editor, care permite vizual și editarea textului fișierul manifest al aplicației.

Scopul fișierului:

  • descrie componentele aplicației - Activități, Servicii, Receptoare de difuzare și Furnizori de conținut;
  • conține o listă de permisiuni necesare pentru a accesa părțile protejate ale API-ului și a interacționa cu alte aplicații;
  • declară permisiunile pe care trebuie să le aibă aplicațiile terțe pentru a interacționa cu componentele acestei aplicații;
  • declară nivelul minim de API Android necesar pentru ca aplicația să funcționeze;
  • listează biblioteci conexe.

Elementul rădăcină al manifestului este . Pe lângă acest element, etichetele sunt elemente obligatorii Și . Element este elementul principal al manifestului și conține multe elemente copil care definesc structura și funcționarea aplicației. Ordinea de aranjare a elementelor situate la același nivel este arbitrară. Toate valorile sunt stabilite prin atributele elementului. Pe lângă elementele necesare menționate mai sus, manifestul folosește și alte elemente după cum este necesar. Să enumerăm câteva dintre ele:

  • este elementul rădăcină al manifestului.

    În mod implicit, Eclipse creează un element cu patru atribute:

    xmlns:android definește spațiul de nume Android.

    pachet specifică numele unic al pachetului aplicației.

    android:versionCode indică numărul intern al versiunii.

    android:versionName specifică numărul versiunii utilizatorului.

  • Declara o permisiune care este utilizată pentru a restricționa accesul la anumite componente sau funcționalități ale unei anumite aplicații. Această secțiune descrie drepturile pe care alte aplicații trebuie să le solicite pentru a obține acces la aplicație. O aplicație își poate proteja și propriile componente (Activități, Servicii, Receptoare de difuzare și Furnizori de conținut) cu permisiuni. Poate folosi oricare dintre permisiunile de sistem, anumit Android sau declarat de alte aplicații și își poate defini, de asemenea, propriile permisiuni.
  • solicită permisiunile pe care aplicația trebuie să le fie acordată de către sistem pentru ca aceasta să funcționeze corect. Permisiunile sunt acordate în timpul instalării aplicației, nu în timpul rulării acesteia.

    Cele mai comune permisiuni:

    INTERNET – acces la internet

    READ_CONTACTS – citește (dar nu scrie) date din agenda utilizatorului

    WRITE_CONTACTS – scrierea (dar nu citirea) datelor către carte de adrese utilizator

    RECEIVE_SMS – procesarea SMS-urilor primite

    ACCESS_FINE_LOCATION – determinarea precisă a locației folosind GPS

  • Vă permite să declarați compatibilitatea unei aplicații cu o versiune specificată (sau versiuni API mai noi) ale platformei Android. Nivelul API declarat de aplicație este comparat cu nivelul API al sistemului de dispozitiv mobil pe care este instalată aplicația.

    Atribute:

    android:minSdkVersion definește nivelul minim de API necesar pentru rularea aplicației. Sistemul Android va împiedica utilizatorul să instaleze aplicația dacă nivelul API al sistemului este mai mic decât valoarea definită în acest atribut.

    android:maxSDKVersion vă permite să determinați cea mai recentă versiune pe care programul este gata să o accepte.

    targetSDKVersion vă permite să specificați platforma pentru care a fost dezvoltată și testată aplicația.

  • indică configurația hardware și software a dispozitivului mobil necesară pentru aplicație. Specificația este folosită pentru a evita instalarea unei aplicații pe dispozitive care nu acceptă configurația necesară. Dacă aplicația dvs. poate funcționa cu diferite configurații de dispozitiv, trebuie să includeți anumite elemente în manifest pentru fiecare configurație.
  • declară anumite funcționalități necesare pentru ca aplicația să funcționeze. În acest fel, aplicația nu va fi instalată pe dispozitive care nu au funcționalitatea necesară. De exemplu, o aplicație poate detecta că necesită o cameră cu focalizare automată. Dacă dispozitivul dumneavoastră nu are o cameră încorporată cu autofocus, aplicația nu va fi instalată.

    Atribute posibile:

    android.hardware.camera – necesită o cameră hardware.

    Android.hardware.camera.autofocus– Necesită o cameră cu focalizare automată.

  • determină rezoluția ecranului necesară pentru ca aplicația să funcționeze. Mod implicit aplicație modernă cu nivelul API 4 sau mai mare acceptă toate dimensiunile ecranului și ar trebui să ignore acest element.
  • unul dintre elementele principale ale manifestului, care conține o descriere a componentelor aplicației. Conține elemente copil ( , , , Și altele), care declară fiecare dintre componentele care compun aplicația. Nu poate exista decât un singur element într-un manifest .

1.5.2. Resurse

În Android, este o practică obișnuită să stocați obiecte, cum ar fi imagini, constante de șir, culori, animații, stiluri și altele asemenea. cod sursa. Sistemul acceptă stocarea resurselor în fișiere externe. Resursele externe sunt mai ușor de întreținut, actualizat și editat.

Practic, resursele sunt stocate ca fișiere XML în directorul res cu valori ale subdirectoarelor, drawable-ldpi, drawable-mdpi, drawable-hdpi, layout. Dar există și alte două tipuri de resurse: brute și active.

Pentru comoditate, sistemul creează identificatori de resurse și îi folosește în fișierul R.java (clasa R care conține referințe la toate resursele proiectului), ceea ce vă permite să faceți referire la resurse în codul programului. O clasă R statică este generată pe baza resurselor date și este creată atunci când proiectul este compilat. Deoarece fișierul R este generat automat, nu are rost să îl editați manual, deoarece toate modificările se vor pierde atunci când este regenerat.

În general, resursele sunt un fișier (cum ar fi o imagine) sau o valoare (cum ar fi un titlu de program) asociat creat de aplicație. Comoditatea utilizării resurselor constă în faptul că acestea pot fi modificate fără recompilare sau redezvoltare a aplicației.

Cele mai comune resurse sunt probabil șirurile, culorile și desene grafice(bitmap).

Următorul tabel listează principalele resurse ale unei aplicații Android:

Tipul de resursă Cazare Descriere
Culori /res/culori/ Un identificator de culoare care indică un cod de culoare.
Siruri de caractere /res/strings/ Resurse de șir. Acestea includ și șiruri de caractere în format java și html.
Meniul /res/meniuri/ Meniurile dintr-o aplicație pot fi definite ca resurse XML.
Opțiuni /res/valori/ Reprezintă parametrii sau dimensiunile diferitelor elemente.
Imagini /res/drawable/ Resurse de imagine. Sprijină formate JPG, GIF, PNG (cel mai preferat) și altele. Fiecare imagine este dosar separat. Sistemul acceptă, de asemenea, imagini extensibile, în care puteți modifica scara elementelor individuale, lăsând celelalte elemente neschimbate.

Culori desenabile

/res/valori/

/res/drawable/

Reprezintă dreptunghiuri colorate care sunt folosite ca fundal pentru obiectele principale redate, cum ar fi hărțile de biți.
Animaţie /res/anim/ Android poate face animație simplă pe un grafic sau o serie de imagini grafice.
Fișiere XML personalizate /res/xml/ Pe Android, fișierele XML arbitrare pot fi folosite ca resurse.
Resurse brute aleatorii /res/raw/ Orice binar necompilat sau fișiere text, de exemplu, video.

Pe lângă imagini, directorul res/drawable poate stoca resurse de forme geometrice simple. Iată doar câteva dintre atributele posibile:

  • android:shape specifică tipul formei: dreptunghi (dreptunghi), oval (oval), linie (linie), inel (cerc);
  • creează colțuri rotunjite pentru un dreptunghi;
  • setează o umplere cu gradient pentru formă; în Android poți crea trei tipuri de gradienți: Linear, Radial și Sweep;
  • stabilește dimensiunile figurii;
  • setează culoarea solidă pentru formă.

Există două tipuri de animație în Android:

  • Animație cadru - animație cadru, animație tradițională folosind modificări rapide ale imaginilor secvențiale, ca pe film.
  • Tween Animation – animația de transformare poate fi realizată ca o serie transformări simple: modificați poziția (clasa TranslateAnimation), dimensiunea (ScaleAnimation), unghiul de rotație (RotateAnimation) și nivelul de transparență (AlphaAnimation). Comenzile de animație definesc transformările care trebuie efectuate asupra unui obiect. Transformările pot fi secvenţiale sau simultane. Secvența comenzilor de animație este definită într-un fișier XML (de preferință) sau în codul programului.

Android are un alt director în care pot fi stocate fișierele care urmează să fie incluse într-un pachet: /assets. Acestea nu sunt resurse, ci doar fișiere brute. Acest director este la același nivel cu /res. R.java nu generează identificatori de resurse pentru fișierele aflate în /assets. Pentru a le citi, trebuie să specificați calea către fișier. Calea fișierului este relativă și începe cu /assets. Acest director, spre deosebire de subdirectorul res/, vă permite să specificați o adâncime arbitrară de subdirectoare și nume de fișiere arbitrare.

1.5.3. Marcare

În aplicațiile Android, interfața cu utilizatorul este construită pe obiecte View și ViewGroup. Clasa ViewGroup este baza pentru subclasa Layout.

Aspectul (numit și aspect sau aspect) este stocat ca fișier XML în folderul /res/layout. Acest lucru se face pentru a separa codul de design, așa cum este obișnuit în multe tehnologii (HTML și CSS, Studio vizualși Expression Blend). Pe lângă aspectul principal pentru întregul ecran, există aspecte secundare pentru un grup de elemente. În esență, un aspect este un fel de șablon vizual pentru interfața cu utilizatorul aplicație care vă permite să gestionați elementele, proprietățile și locația acestora. În practica dumneavoastră va trebui să vă familiarizați cu toate metodele de plasare.

Pluginul Android pentru Eclipse include un editor special pentru crearea de markup în două moduri. Editorul are două file: una vă permite să vedeți cum vor fi afișate controalele, iar a doua vă permite să creați manual marcaj XML.

Prin crearea interfeței cu utilizatorul într-un fișier XML, puteți separa designul aplicației de cod. Puteți schimba interfața cu utilizatorul într-un fișier de marcare fără a fi nevoie să schimbați codul. De exemplu, puteți crea marcaj XML pentru diferite orientări ale ecranului dispozitivului mobil (portret, peisaj), dimensiuni ale ecranului și limbi ale interfeței. Cu toate acestea, elementele de interfață pot fi create și programatic atunci când este necesar.

Fiecare fișier de marcare trebuie să conțină un singur element rădăcină de aspect, care trebuie să fie un obiect View sau ViewGroup. În interiorul elementului rădăcină puteți adăuga obiecte suplimentare marcaje sau elemente de interfață copil pentru a forma treptat o ierarhie de elemente care este definită de marcajul creat.

Sunt câteva tipuri standard marcaje:

  • FrameLayout este cel mai tip simplu marcajele. De obicei, acesta este un spațiu gol pe ecran care poate fi umplut doar de un obiect View sau ViewGroup copil. Toți copiii din FrameLayout sunt fixați în colțul din stânga sus al ecranului. Marcajul FrameLayout nu poate defini o locație diferită pentru un obiect View copil. Obiectele secundare ulterioare View vor fi pur și simplu desenate deasupra vizualizărilor anterioare, ascunzându-le parțial sau complet dacă obiectul de deasupra este opac
  • LinearLayout aliniază toate obiectele copil în aceeași direcție - vertical sau orizontal. Direcția este specificată folosind atributul android:orientation. Toți copiii sunt împinși pe stivă unul după altul, astfel încât o listă verticală de vizualizări va avea doar un copil pe rând, indiferent cât de largă este. Un aspect de listă orizontal va plasa articolele pe aceeași linie cu o înălțime de înălțime egală cel mai înalt element copil al listei.
  • TableLayout își poziționează copiii în rânduri și coloane. TableLayout nu afișează linii de chenar pentru rânduri, coloane sau celule. TableLayout poate avea rânduri cu un număr diferit de celule. La crearea aspectului tabelului, unele celule pot fi lăsate goale dacă este necesar. TableLayout este convenabil de utilizat, de exemplu, atunci când creați jocuri de logică, cum ar fi Sudoku, Tic-Tac-Toe și altele asemenea.
  • RelativeLayout permite elementelor copil să-și determine poziția față de vizualizarea părinte sau față de elementele copil învecinate.

Toate markupurile descrise aici sunt subclase ale ViewGroup și proprietățile moștenite definite în clasa View.

Markupurile se comportă ca comenzi și pot fi grupate. Aspectul controalelor poate fi imbricat. De exemplu, puteți utiliza RelativeLayout în LinearLayout și așa mai departe. Cu toate acestea, prea multă imbricare a controalelor cauzează probleme de performanță.

Fișierul manifest Android este cel principal Fișier de configurare fiecare aplicație Android. Editorul distribuie informațiile din acest fișier în mai multe file.

Manifest - În această filă, prezentată în Fig. 1.3, sunt definiți parametrii generali ai aplicației, cum ar fi numele pachetului și informațiile despre versiunea aplicației (pentru instalare și actualizare).

Aplicație - Această filă definește detalii despre aplicație, cum ar fi numele și pictograma aplicației, precum și componentele interne ale aplicației, cum ar fi activitățile care pot rula (inclusiv activitatea implicită de pornire DroidActivity) și alte caracteristici și servicii furnizate de aplicație.

Permisiuni este fila în care sunt definite permisiunile aplicației. De exemplu, dacă o aplicație trebuie să poată citi o listă de contacte

telefon, apoi tipul Uses-Permission cu drept de citire a contactelor (android, permisiunea. READCONTACTS) trebuie adăugat la fișierul de configurare.

Instrumentație - Această filă este folosită pentru a testa componente folosind diferite clase de instrumente disponibile în Android SDK.

AndroidManifest.xml - Această filă este un editor XML simplu pentru editarea manuală a fișierului manifest.

Dacă accesați fila AndroidManifest.xml, veți vedea codul pentru fișierul manifest care arată cam așa:

xmlns:android="http://schemas.android.com/apk/res/android"

pachet="com.androidbook.droidl"

android:versionCode="1"

android:versionName="l. 0">

android:icon="@drawable/icon" android:label="@string/nume aplicație">

android: name=". DroidActivity" android:label="@string/nume aplicație">

android:name="android.intent.action.MAIN" />

android:name = "android. intentie . categorie. LAUNCHER" / >

ATENŢIE!

ȘTII CĂ… __________________________________________________

Toate fișierele de resurse Android, inclusiv fișierul manifest Android, sunt scrise în format XML. Aceasta înseamnă că le puteți edita fără un editor special. Pentru a crea un nou fișier XML Android, faceți clic pe butonul de creare

cu o imagine a unei foi de hârtie (litera „a” și semnul plus „I” din bara de instrumente Eclipse.

FĂ-O SINGUR

EDITAREA FIȘIERULUI DE CONFIGURARE ANDROID

Încercați să editați fișierul manifest Android. Nu veți putea să vă depanați aplicația până când nu setați atributul android:debuggable la true. Pentru a face acest lucru, urmați acești pași:

1. Deschideți fișierul AndroidManifest.xml în editorul de resurse.

2. Accesați fila Aplicație.

3. Extindeți lista atributului de depanare și selectați true.

4. Salvați fișierul manifest.

Acum, dacă treceți la fila AndroidManifest.xml, veți vedea că eticheta

A apărut atributul de depanare „aplicație”:

android:debuggable="true"

EDITARE A ALTE FIȘIERE DE RESURSE

Majoritatea resurselor aplicației Android sunt stocate în folderul /res. Conține subdosare:

/drawable-ldpi, /drawable-hdpi, /drawable-mdpi - aceste subfoldere stochează fisiere grafice resurse pentru diferite densități de puncte și rezoluții de ecran. Dacă vizualizați conținutul acestor foldere în panoul Project Explorer, veți găsi un fișier grafic icon.png în fiecare dintre ele. Aceasta este pictograma aplicației. Veți afla mai multe despre diferențele dintre aceste foldere în ora 20.

/layout - iar acest subfolder stochează fișierele de aspect al interfeței utilizator. Aici puteți găsi fișierul de aspect al ecranului main.xml, care conține descrierea interfeței cu utilizatorul pentru activitatea implicită.

/valori – În acest subdosar, diferite tipuri de resurse sunt grupate după tip, cum ar fi valorile șirurilor, valorile culorilor și altele tipuri primitive. Aici puteți vedea fișierul de resurse strings.xml, care conține toate resursele de șir utilizate în aplicație.

Faceți dublu clic pe oricare dintre fișierele de resurse pentru a-l deschide în editor.

Rețineți că puteți edita datele XML direct într-un editor de text.

FACEȚI PROPRIA EDITARE A RESURSELOR STRING

Dacă vă uitați la codul din fișierul de aspect main.xml, veți vedea că acesta afișează o interfață simplă cu un singur element UI - un TextView. Acest element afișează un șir de text. În cazul nostru, textul afișat pe ecran este determinat de resursa șir 0string/hello.

Pentru a edita resursa șir 0string/hello utilizând editorul de resurse șir, efectuați următorii pași: 1. Deschideți fișierul strings.xml în editorul de resurse.

2. Observați resursa șir numită hello și textul Hello

Lume, DroidActivity! în editorul de resurse. 3. În câmpul de intrare Valoare, modificați valoarea la Bună ziua, Dave.

4. Salvați fișierul.

Acum, dacă treci la fila strings.xml și te uiți la codul XML, vei vedea asta în eticheta containerului conține două elemente șir:

Bună, Dave