Indiferent cât de inovatoare și utilă este aplicația dvs. Android, dacă este lagtă, predispusă la înghețarea sau memoria porcilor, nimeni nu va dori să o folosească.
Performanța este foarte importantă, dar este și ceva ușor de uitat atunci când sunteți ocupat să puneți atingeri finale la interfața dvs. de utilizator frumoasă sau să veniți cu caracteristici noi și interesante pentru aplicația dvs..
Asta este, până când încep să se rostogolească recenziile negative din Google Play.
În acest articol, veți obține un curs de prăbușire în problemele comune de performanță pe care fiecare dezvoltator Android trebuie să le cunoască. Veți învăța cum să testați dacă aceste probleme apar în propriile proiecte, utilizând instrumentele furnizate de instrumentul Android SDK plus un singur instrument deja instalat pe dispozitivul dvs. Android.
Dacă descoperiți o problemă de performanță în aplicația dvs., evident că veți dori să o remediați. Așa că, de-a lungul felului, vom analiza și modul de utilizare a instrumentelor SDK Android pentru a obține mai multe informații despre problemele de performanță pe care le descoperiți. Odată ce ați obținut aceste informații, veți avea o mai bună înțelegere a modului de a perfecționa performanța aplicației și, în cele din urmă, a crea o aplicație pe care o vor face oamenii dragoste utilizând.
Interfața de utilizator a aplicației dvs. este conexiunea dvs. cu utilizatorul, dar crearea a ceva care arată frumos este doar jumătate din bătălie. De asemenea, trebuie să vă asigurați că interfața dvs. de utilizator se redă rapid și că rulează fără probleme.
Una dintre cele mai frecvente cauze ale unei interfețe de utilizator lagogice, care nu răspunde este supraexcita. Overdraw este locul în care pierzi timpul de procesare a GPU-ului prin colorarea în pixeli care devin din nou colorate din nou prin altceva.
De exemplu, imaginați-vă un fundal albastru cu un text peste el. Android nu doar vopsește zonele de albastru care sunt vizibile pentru utilizator, pictează întregul fundal albastru și apoi desenează textul deasupra. Acest lucru înseamnă că unii pixeli sunt colorați de două ori, ceea ce înseamnă depășirea.
Unele descoperiri, ca în exemplul de mai sus, sunt inevitabile. Cu toate acestea, prea multă depășire poate avea un impact vizibil asupra performanței aplicației dvs., astfel încât veți dori să minimalizați depășirea situației când este posibil.
Este relativ ușor să verificați aplicația pentru derulare. Cantitățile excesive pot indica o problemă care stă la baza interfeței de utilizare a aplicației, cum ar fi vederile redundante - mai multe despre acestea mai târziu. Din aceste motive, atunci când testați aplicația pentru probleme de performanță, depășirea este un loc sensibil pentru a începe.
Vestea bună este că dispozitivul dvs. Android are deja o funcție încorporată care vă permite să verificați cantitatea de depășire orice aplicație instalată pe dispozitiv.
Deoarece această caracteristică trăiește pe dispozitiv, primul pas este să instalați aplicația pe care doriți să o testați pe dispozitivul Android. Apoi, pentru a verifica cantitatea de overdraw, trebuie doar să deschideți dispozitivul Setări, Selectați Opțiuni pentru dezvoltatori, și atingeți Debug GPU Overdraw urmat de Afișați zonele de descărcare în exces.
Acest instrument utilizează blocuri de culori pentru a evidenția diferitele valori ale depășirii. Singurul lucru pe care trebuie să-l faceți este să lansați aplicația pe care doriți să o testați și să vedeți ce este situația de depășire.
Odată ce ați identificat o zonă de supraexploatare semnificativă, cel mai simplu mod de a reduce această depășire este să deschideți fișierele XML ale aplicației dvs. și să căutați orice zone de suprapunere, în special orice dispozitive de desenare care nu sunt vizibile pentru utilizator și orice fundaluri care sunt fiind desenate unul peste celălalt.
De asemenea, ar trebui să căutați zone în care atributul de fundal este setat la alb, chiar dacă un părinte a pictat deja un fundal alb. Toate aceste lucruri pot provoca excesul de valori semnificative.
Sistemul Android poate reduce în mod automat cazurile simple de overdraw, dar merită menționat că acest lucru nu se extinde la afișări personalizate complexe în care Android nu are o perspectivă asupra modului în care desenați conținutul.
Dacă utilizați vizualizări personalizate complexe în aplicația dvs., puteți defini limitele trasabile pentru vizualizările dvs. utilizând clipRect
metodă. Pentru mai multe informații, vă recomandăm să vizitați documentația oficială Android.
O altă cauză obișnuită a problemelor de performanță este ierarhia de vizualizare a aplicației. Pentru a reda fiecare vizualizare, Android trece prin trei etape:
Timpul necesar pentru ca Android să finalizeze aceste etape este proporțional cu numărul de vizualizări din ierarhia dvs. Aceasta înseamnă că una dintre cele mai ușoare modalități de a reduce viteza de redare a aplicației este identificarea și eliminarea oricăror vizualizări care nu contribuie la imaginea finală pe care utilizatorul o vede pe dispozitiv.
Chiar dacă toate opiniile din ierarhia dvs. sunt necesare, modul în care aceste aranjamente sunt aranjate poate avea un impact semnificativ asupra fazei de măsură a procesului de redare. În general, cu cât ierarhia dvs. de vizualizare este mai adâncă, cu atât mai mult este necesară finalizarea fazei de măsurare.
În timpul procesului de redare, fiecare vizualizare oferă dimensiunile sale în vizualizarea părinte. Dacă vizualizarea părinte descoperă o problemă cu oricare dintre aceste dimensiuni, poate forța fiecare copil să se reamestească.
Reamintirile pot apărea chiar și atunci când există nu este o eroare. De exemplu, machetele relative trebuie adesea să își măsoare copiii de două ori pentru a obține totul pentru a se potrivi. Modele liniare cu copii care folosesc layout_weight
parametrul măsoară rutin fiecare copil de două ori.
În funcție de modul în care sunt aranjate punctele dvs. de vedere, măsurătorile și măsurătorile pot fi un proces costisitor, consumator de timp, care are un impact notabil asupra vitezei de redare a aplicației dvs..
Cheia pentru asigurarea rapidă și fără probleme a interfeței cu utilizatorul este eliminarea oricăror vizionări inutile și căutarea oportunităților de a vă aplatiza aspectul.
SDK-ul Android include un instrument, Vizualizator de ierarhie, care vă permite vizualizarea întregii ierarhii de vizualizare. Acest instrument vă ajută să vedeți atât vederile redundante și obiecte imbricate.
Înainte de a examina mai atent Vizualizator de ierarhie instrument, există câteva ciudățenii pe care trebuie să le cunoașteți. În primul rând, Hierarchy Viewer poate comunica numai cu o aplicație care rulează, nu codul sursă al aplicației. Aceasta înseamnă că va trebui să instalați aplicația pe care doriți să o testați fie pe dispozitivul dvs. Android, fie să utilizați un emulator.
Există o altă captură mai mare. În mod implicit, Hierarchy Viewer poate comunica numai cu un dispozitiv care rulează o versiune de dezvoltare a sistemului de operare Android. Dacă nu aveți un dispozitiv de dezvoltator, puteți obține această restricție prin adăugarea acesteia ViewServer
clasă la cererea dumneavoastră.
Odată ce sunteți gata să faceți Hierarchy Viewer pentru o rotire, lansați Android Studio și selectați Unelte din bara de instrumente, urmată de Android și Android Device Monitor.
Apasă pe Vizualizare în ierarhie butonul din dreapta, după cum se arată în imaginea de mai jos.
În partea stângă a ecranului se află a ferestre care afișează toate dispozitivele și emulatorii detectați Android. Selectați dispozitivul și veți vedea o listă a proceselor care rulează pe acel dispozitiv. Selectați procesul pe care doriți să îl examinați mai îndeaproape și trei zone ale lui Hierarchy Viewer se vor actualiza automat.
Aceste trei ferestre oferă trei reprezentări vizuale diferite ale ierarhiei de vizualizare:
Aceste trei ferestre sunt legate. Dacă selectați o vizualizare într-o singură fereastră, va apărea evidențiată în celelalte două. Puteți utiliza simultan toate cele trei ferestre pentru a vâna orice vizualizare redundantă ascunsă în ierarhia vizuală.
Dacă nu sunteți sigur dacă o imagine contribuie cu adevărat la ceva la imaginea finală, pur și simplu mergeți la Vizualizare copac și faceți clic pe nodul în cauză. Veți vedea o previzualizare a modului în care această vizualizare va apărea pe ecran pentru a vedea exact ce contribuie această vizualizare la aplicația dvs..
Dar doar pentru că o vedere contribuie ceva la imaginea redată finală nu înseamnă că nu contribuie, de asemenea, la o problemă de performanță mare. Ați văzut deja cum puteți folosi Ierarhia Viewer pentru a arăta machetele evidente, dar dacă ce nu este așa de evidentă? Sau dacă altceva face ca vederea să se facă încet?
Vestea bună este că puteți utiliza, de asemenea, ierarhia Viewer pentru a detalia cât timp este nevoie ca fiecare vizualizare să treacă prin diferitele faze ale procesului de redare. Acest lucru vă oferă o cale de a renunța la rezolvarea problemelor care nu pot fi evidente la prima vedere.
Următoarea secțiune vă arată cum să utilizați Vizualizatorul de tip ierarhic pentru a vizualiza diferitele vizualizări din aspectul dvs. pentru a detecta orice probleme de redare care pot fi ascunse sub suprafață.
Cea mai ușoară modalitate de a identifica blocajele din interfața dvs. de utilizator este prin colectarea datelor despre durata analizei fiecărui punct de vedere pentru a finaliza etapele măsurării, aspectului și fracțiunii procesului de randare.
Nu numai că puteți utiliza Ierarhia Viewer pentru a aduna aceste informații, iar Hierarchy Viewer afișează aceste date într-un mod ușor de înțeles, astfel încât să puteți vedea dintr-o privire care dintre opiniile nu funcționează bine.
Ierarhia Viewer nu afișează timpii de redare implicit. Puteți adăuga aceste informații accesând Vizualizare copac și selectând nodul rădăcină al părții arborelui pe care doriți să îl testați. Apoi, invocați caracteristica de profilare a ierarhiei Viewer făcând clic pe pictograma de diagramă Venn a diafragmei verde, roșie și purpurie, așa cum se arată în imaginea de mai jos.
Trei puncte colorate vor apărea pe fiecare nod din această parte a ierarhiei. De la stânga la dreapta, aceste puncte reprezintă:
Fiecare punct are, de asemenea, o culoare atribuită:
După colectarea acestor date, nu numai că veți cunoaște viziunile de care aveți nevoie pentru a optimiza, dar veți ști exact care parte a procesului de redare determină afișarea mai lentă a acestei vizualizări.
Trebuie doar să știți că, deși vederile cu puncte galbene și roșii pot fi locul logic pentru a începe eforturile de optimizare, acești indicatori de performanță sunt relativila celelalte noduri profilate din ierarhia de vizualizare. Cu alte cuvinte, veți avea mereu niște opinii care vor deveni mai lent decât altele.
Înainte de a începe să vă curățați codul pentru modalități de optimizare a unei anumite vizualizări, întrebați-vă dacă această vizualizare are un motiv bun pentru a face mai lent decât celelalte noduri profilate sau dacă aceasta este cu adevărat o oportunitate de a reduce timpul de redare al aplicației.
Deși Android este un mediu gestionat de memorie, nu lăsați-l să vă acoperiți într-un sentiment fals de pierderi de memorie de securitate, care se pot întâmpla în continuare. Acest lucru se datorează faptului că colectarea gunoiului (GC) poate numai elimina obiectele pe care le recunoaște ca fiind inaccesibile. Dacă nu observă un obiect inaccesibil, atunci acel obiect nu va primi colectarea gunoiului.
Aceste obiecte inaccesibile atârnă în jur, vă poluează mormanul și ocupă spațiu valoros. Pe măsură ce aplicația dvs. continuă să scurgă obiecte, cantitatea de spațiu utilizabil devine mai mică și mai mică, ceea ce la rândul său declanșează evenimente GC mai frecvente și mai lungi.
Aceasta este o veste proastă din două motive. În primul rând, în timp ce evenimentele GC nu au în mod normal un impact semnificativ asupra performanței aplicației dvs., o mulțime de evenimente GC care apar într-un interval mic de timp pot duce la o interfață de utilizator lagică și lipsită de răspuns. A doua problemă este că dispozitivele mobile tind să fie scurte pe memorie pentru a începe, astfel încât o scurgere de memorie se poate escalada rapid într-o OutOfMemoryError, prăbușindu-vă aplicația.
Pierderile de memorie pot fi dificil de detectat. Puteți înțelege numai că memoria este o problemă pentru aplicația dvs. atunci când utilizatorii dvs. încep să se plângă. Din fericire, SDK-ul Android are câteva instrumente utile pe care le puteți utiliza pentru a vă curăța aplicația pentru acele semne uneori subtile de scurgere de memorie.
Monitor de memorie este o modalitate ușoară de a obține o imagine de ansamblu asupra utilizării memoriei aplicației în timp. Rețineți că acest instrument se poate conecta la o aplicație în desfășurare, deci asigurați-vă că aplicația pe care doriți să o testați este instalată pe dispozitivul dvs. Android și că dispozitivul dvs. este atașat la computer.
Acest instrument este integrat în aplicația Android Studio, deci accesați-l făcând clic pe Memorie în partea de jos a IDE-ului. Imediat ce monitorul de memorie detectează aplicația în desfășurare, începe înregistrarea utilizării memoriei aplicației.
Dacă monitorul de memorie nu începe înregistrarea, verificați din nou dacă dispozitivul este selectat în meniul derulant al dispozitivelor.
Dacă monitorul de memorie se întoarce a Nu există aplicații debuggabile mesaj, deschideți aplicația Android Studio Unelte meniu, selectați Android, și asigurați-vă Activați integrarea adb este selectat. Această caracteristică poate fi temperamentală, deci este posibil să trebuiască să comutați Activați integrarea adb de câteva ori. De asemenea, vă poate ajuta să eliminați dispozitivul Android și apoi să îl reconectați.
După ce monitorul de monitorie a detectat aplicația în desfășurare, va afișa numărul de memorie pe care aplicația dvs. îl folosește în albastru închis, iar memoria nealocată în albastru deschis.
Petreceți ceva timp interacționând cu dispozitivul, păstrând în același timp atenția asupra modificării modului de utilizare a memoriei aplicației în Monitorul de memorie. În cele din urmă, memoria alocată va crește până când nu va mai rămâne o memorie liberă. În acest moment, sistemul va elibera memoria prin declanșarea unui eveniment GC. Ori de câte ori vedeți o scădere semnificativă în memoria alocată, acesta este un semn că sa produs un eveniment GC.
Evenimentele GC sunt perfect normale, însă vă faceți griji dacă vedeți că aplicația dvs. alocă o mulțime de memorie într-o perioadă scurtă de timp sau evenimentele GC devin mai frecvente. Acestea sunt ambele semne care indică faptul că apare o scurgere de memorie în aplicația dvs..
Dacă utilizați Monitorul de memorie pentru a urmări o scurgere de memorie suspectată într-o perioadă semnificativă de timp, este posibil ca sistemul Android să compenseze cererea de memorie a aplicației dvs., acordând aplicației dvs. un plafon de memorie mai mare, moment în care ciclul începe din nou.
În cele din urmă, ați putea chiar să vedeți că aplicația dvs. consumă atât de multă memorie încât sistemul nu mai poate pune la dispoziția aplicației dvs. nicio memorie suplimentară. Dacă vedeți că se întâmplă acest lucru, atunci este ceva grav în neregulă cu modul în care aplicația utilizează memoria.
Un alt instrument care vă poate ajuta să adunați mai multe informații despre scurgerile de memorie și alte probleme legate de memorie este Android Device Monitor's Morman fila.
Morman fila vă poate ajuta să diagnosticați scurgeri de memorie, afișând numărul de memorie pe care sistemul le-a alocat aplicației. După cum am menționat deja, dacă memoria alocată continuă să crească, atunci acesta este un indiciu puternic că aplicația dvs. are o scurgere de memorie.
Dar acest instrument furnizează, de asemenea, o mulțime de date despre modul de utilizare a aplicației, inclusiv tipul de obiecte pe care aplicația dvs. le alocă, numărul de obiecte alocate și cantitatea de spațiu pe care aceste obiecte o au. Aceste informații suplimentare pot fi de neprețuit atunci când urmăriți sursa scurgerilor de memorie și alte probleme legate de memorie din aplicația dvs..
Pentru a accesa acest instrument, lansați Android Device Monitor și selectați DDMS tab. În Dispozitive , selectați dispozitivul și procesul pe care doriți să îl examinați. Apoi, selectați Morman , așa cum se arată în imaginea de mai jos, și puteți petrece ceva timp interacționând cu aplicația.
Semnalul de ieșire heap este afișat numai după un eveniment GC, astfel încât să umpleți această filă cu date fie că trebuie să așteptați ca un eveniment GC să apară în mod natural, fie că puteți forța un GC făcând clic pe Cauza GC buton.
Odată ce a avut loc un eveniment GC, Morman fila va actualiza cu o mulțime de informații despre utilizarea heap-ului aplicației. Aceste date se vor actualiza după fiecare eveniment GC.
În acest tutorial, am abordat unele dintre cele mai frecvente probleme de performanță pe care trebuie să le cunoașteți atunci când dezvoltați aplicații Android, overdraw, scurgeri de memorie și redarea lentă a interfeței cu utilizatorul.
De asemenea, v-ați confruntat cu unele dintre instrumentele pe care le puteți utiliza pentru a verifica dacă aceste probleme apar în propriile dvs. proiecte Android și ați văzut cum puteți obține mai multe informații despre problemele de performanță care apar în propriile dvs. aplicații. Cu cât aveți mai multe informații, cu atât aveți mai multe șanse să urmăriți cauza problemei și să o remediați.
SDK-ul Android are mult mai multe instrumente care vă pot ajuta să diagnosticați și să abordați problemele de performanță. Dacă doriți să aflați mai multe, atunci paginile oficiale de documentare Android din Traceview și dmtracedump și Allocation Tracker conțin mai multe informații.