Asigurați-vă codul de înaltă calitate Android cu instrumente de analiză statică

În tutorialul de astăzi, vom afla despre cum să asigurăm codul Android de înaltă calitate în proiectele noastre, utilizând câteva instrumente de analiză a codului static pentru Java. Ne vom uita la Checkstyle, FindBugs, PMD și Android Studio Lint - toate acestea sunt gratuite și open source!

Ce sunt instrumentele de analiză a codului static?

Acestea sunt instrumente care vă analizează și analizează codul sursă fără să îl executați. Scopul este de a găsi vulnerabilități potențiale, cum ar fi erori și erori de securitate. Un popular analizor de cod static gratuit, cum ar fi FindBugs, verifică codul împotriva unui set de reguli pe care codul dvs. ar trebui să le respecte - în cazul în care codul nu respectă aceste reguli, este un semn că ceva poate fi în neregulă. Gândiți-vă la instrumentele statice de analiză a codului ca un compilator suplimentar care este rulat înainte de compilația finală în limba sistemului.  

Multe companii de software solicită proiecte pentru a trece teste de analiză statică a codurilor, în plus față de efectuarea de recenzii de cod și testarea unităților în procesul de construire. Chiar și întreținătorii proiectelor cu surse deschise includ adesea unul sau mai mulți pași de analiză statică a codului în procesul de construire. Deci, învățarea despre analiza statică este un pas important în scrierea codului de calitate. Fiți conștienți de faptul că analiza statică a codului, cunoscută și sub denumirea de test "white-box", nu ar trebui văzută ca un înlocuitor pentru testarea unitară a codului dvs. sursă.

În acest tutorial, vom învăța despre unele instrumente populare de analiză statică disponibile pentru Android și Java. Dar mai întâi, să vedem câteva dintre avantajele utilizării analizei statice.

Beneficii

  • Ajută la detectarea erorilor potențiale pe care chiar le-ar fi ratat unitatea sau testarea manuală.
  • Definește regulile specifice proiectului. De exemplu, analiza statică, ca parte a lanțului de construcție, ajută noii veniți să se ridice la viteză cu standardele de cod ale noii lor echipe.
  • Vă ajută să vă îmbunătățiți cunoștințele despre o nouă limbă.
  • Scanează întregul proiect, inclusiv fișiere pe care nu le-ați citit vreodată.

Înființat

Toate instrumentele de analiză a codului pe care le vom învăța în acest tutorial sunt disponibile ca pluginuri Gradle, astfel încât să putem crea sarcini individuale Gradle pentru fiecare dintre ele. Să folosim un singur fișier Gradle care să le includă pe toate. Dar înainte de asta, să creăm un dosar care să conțină toate fișierele noastre pentru analiza codului static. 

Deschideți Android Studio și în interiorul modulului app (în Proiect vizualizați), creați un nou dosar și denumiți-l code_quality_tools. Acest dosar va conține fișierele XML pentru instrumentele de analiză a codului și va avea și un fișier Gradle, quality.gradle, care va executa sarcinile noastre de analiză statică. 

În cele din urmă, vizitați-vă build.gradle în dosarul modulului app și includeți această linie la sfârșitul fișierului:

se aplică de la: '/code_quality_tools/quality.gradle'

Aici, ale noastre calitate.gradle Scriptul de grad este aplicat cu o trimitere la locația sa locală a fișierului. 

Checkstyle

Având în vedere normele pe care le specificați într-un fișier XML pentru a aplica un standard de codare pentru proiectul dvs., Checkstyle aplică aceste reguli analizând codul sursă și le compară cu standardele sau convențiile de codare cunoscute. 

Checkstyle este un instrument open source care este întreținut activ de comunitate. Aceasta înseamnă că vă puteți crea propriile cecuri personalizate sau puteți modifica cele existente pentru a vă potrivi nevoilor. De exemplu, Checkstyle poate efectua o verificare a numelor constante (finale, statice sau ambele) în clasele dvs. Dacă numele dvs. constante nu se supun unei reguli de a fi marcat cu cuvinte separate printr-un subliniere, problema va fi marcată în raportul final. 

// incorect privat final static String myConstant = "myConstant"; // corecta statică finală privată String MY_CONSTANT = "myConstant";

Integrarea stilului de verificare

Vă vom arăta cum să integrăți Checkstyle în proiectul nostru Android Studio și să demonstrați un exemplu practic.

În primul rând, trebuie să ne creăm regulile de codificare. Interior checkstyle.xml, noi creăm reguli de configurare Checkstyle care vor fi difuzate împotriva codului nostru.

                  

În codul de mai sus, includem regulile sau verificările pe care doriți să le verificăm în codul sursă. O regulă este AvoidStarImport care, după cum spune și numele, verifică dacă codul dvs. sursă include o declarație de import ca java.util. *. (În schimb, trebuie să specificați explicit pachetul de import, de ex. java.util.Observable.) 

Unele reguli au proprietăți pe care le putem seta exact așa cum am făcut pentru ParameterNumber - aceasta limitează numărul parametrilor unei metode sau unui constructor. Implicit, proprietatea max este 7, dar am schimbat-o la 6 în schimb. Uitați-vă la unele dintre celelalte verificări de pe site-ul Checkstyle.

Pentru a rula această verificare, trebuie să creați o sarcină Gradle. Deci, vizitați quality.gradle fișier și creați o sarcină numită checkstyle:

aplicați pluginul: 'checkstyle' sarcină checkstyle (tip: Checkstyle) descriere 'verifică grupul de verificare standard' file configFile ('./ code_quality_tools / checkstyle.xml') sursa 'src' excludeți ** ** / gen / ** 'classpath = fișiere () ignoreFailures = false

Observați că în codul de mai sus am aplicat pluginul Checkstyle Gradle. Am oferit o descriere și l-am adăugat la un grup predefinit Gradle numit verificare. 

Proprietățile cheie ale sarcinii Checkstyle Gradle cu care ne ocupăm sunt: 

  • configFile: fișierul de configurare Checkstyle de folosit.
  • IgnoreFailures: dacă doriți sau nu să permiteți construcția să continue dacă există avertismente.
  • include: setul de modele includ.
  • exclude: setul de modele de excludere. În acest caz, nu scanăm clase generate. 

În sfârșit, puteți rula scriptul Gradle vizitând fereastra instrumentului Gradle din Android Studio, deschizând verificare grup, apoi faceți clic pe checkstyle pentru a executa sarcina. 

O altă modalitate este să utilizați linia de comandă: 

gradient de verificare

După terminarea sarcinii, va fi generat un raport care este disponibil la modulul app> construi> rapoarte> checkstyle. Poți să deschizi checkstyle.html pentru a vedea raportul. 

Un plugin Checkstyle este disponibil gratuit pentru aplicațiile Android Studio sau IntelliJ IDEA. Oferă scanarea în timp real a fișierelor dvs. Java. 

PMD

PMD este un alt instrument de analiză a codului open source care vă analizează codul sursă. Acesta găsește defecte comune precum variabilele neutilizate, blocurile de captură goale, crearea de obiecte inutile și așa mai departe. PMD are multe seturi de reguli pe care le puteți alege. Un exemplu de regulă care face parte din Regulile de proiectare este:

  • SimplifyBooleanExpressions: evitați comparațiile inutile în expresiile booleene care complică codul simplu. Un exemplu: 
clasa publică Bar poate fi simplificată la // bar = isFoo (); boolean privat bar = (isFoo () == true); public esteFoo () return false;

PMD este configurat cu PMD.xml fişier. În interiorul acestuia, vom include câteva reguli de configurare, cum ar fi cele pentru Android, denumire și design. 

  Set de reguli personalizat pentru aplicația Android .* / R.java .* / Gen /.*                 

Așa cum am făcut pentru Checkstyle, trebuie să creăm și o sarcină PMD Gradle pentru ca verificarea să fie executată în interiorul quality.gradle fişier. 

aplicați plugin-ul: pmd 'task pmd (type: Pmd) description' Run 'PMD' rule 'verification' ruleSetFiles = files ("./ code_quality_tools / pmd.xml" exclude rapoartele ** ** / gen / ** 'xml.enabled = false html.enabled = true ignoreFailures = false

PMD este disponibil și ca plugin Gradle. 

Proprietățile cheie ale sarcinii pe care am creat-o sunt: 

  • ruleSetFiles: Fișierul setat pentru regulile personalizate va fi utilizat.
  • sursă: Sursa pentru această sarcină.
  • rapoarte: Rapoartele generate de această sarcină.

În cele din urmă, puteți rula scriptul Gradle accesând fereastra instrumentului Gradle, deschizând dosarul grupului de verificare, apoi făcând clic pe PMD pentru a executa sarcina. Sau puteți rula prin linia de comandă:

grad pmd

Un raport va fi generat, de asemenea, după executarea sarcinii care este disponibilă la modulul app> construi> rapoarte> pmd. Există, de asemenea, un plugin PMD disponibil pentru IntelliJ sau Android Studio, pe care îl puteți descărca și integra, dacă doriți. 

FindBugs

FindBugs este un alt instrument gratuit de analiză statică, care analizează clasa dvs. în căutarea unor probleme potențiale, verificându-vă bytecodes împotriva unei liste cunoscute de modele de erori. Unii dintre ei sunt:

  • Clasa definește hashCode () dar nu este egal (): O clasă implementează metoda hashCode () dar nu este egală () - prin urmare, două instanțe ar putea fi egale, dar nu au aceleași coduri hash. Aceasta intră sub incidența categoriei de practici incorecte. 
  • Compararea greșită a valorii int cu o constantă lungă: Codul compară o valoare int cu o constantă lungă care este în afara intervalului de valori care pot fi reprezentate ca o valoare int. Această comparație este vidă și, eventual, va da un rezultat neașteptat. Aceasta se încadrează în categoria de corectitudine. 
  • TestCase nu are teste: clasa este un JUnit testcase dar nu a implementat metode de testare. Acest model este, de asemenea, sub categoria de corectitudine. 

FindBugs este un proiect open-source, astfel încât să puteți vedea, contribui sau monitoriza progresul codului sursă pe GitHub. 

În findbugs-exclude.xml fișier, vrem să împiedicăm FindBugs să scaneze anumite clase (folosind expresii regulate) în proiectele noastre, cum ar fi clasele de resurse generate automat și clasele manifeste generate automat. De asemenea, dacă folosiți Dagger, vrem ca FindBugs să nu verifice clasele Dagger generate. De asemenea, îi putem spune lui FindBugs să ignore anumite reguli dacă vrem. 

                 

Și, în sfârșit, vom include findbugs sarcină în quality.gradle:

aplicați pluginul: findbugs task findbugs (type: FindBugs) description 'Run' findbugs 'group' verificare 'classes = files (' $ project.buildDir / intermediates / classes ') source' src 'classpath = "reportLevel =" high "exclude fișierul Filtru ('./ code_quality_tools / findbugs-exclude.xml') raportează xml.enabled = false html.enabled = true ignoreFailures = false

În primul rând de mai sus, am aplicat FindBugs ca un plugin Gradle și apoi am creat o sarcină numită findbugs. Proprietățile cheie ale findbugs cu care suntem cu adevărat preocupați sunt: 

  • clase: clasele care trebuie analizate.
  • efort: nivelul efortului de analiză. Valoarea specificată ar trebui să fie una dintre minMod implicit, sau max.  Fiți conștienți de faptul că nivelurile mai ridicate măresc precizia și găsesc mai multe bug-uri cu costul timpului de funcționare și al consumului de memorie.
  • reportLevel: pragul de prioritate pentru raportarea erorilor. Dacă sunt setate la nivel scăzut, toate bug-urile sunt raportate. Dacă este setat la mediu (implicit), sunt raportate bug-uri de prioritate medie și mare. Dacă este setat la nivel ridicat, sunt raportate numai erori de prioritate ridicată.
  • excludeFilter: numele fișierului unui filtru care specifică erorile care trebuie eliminate pentru a fi raportate, pe care le-am creat deja. 

Apoi, puteți rula scriptul Gradle vizitând fereastra instrumentului Gradle, deschizând dosarul grupului de verificare și apoi făcând clic pe findbugs pentru a executa sarcina. Sau lansați-l din linia de comandă:

gauri de găurit

Un raport va fi generat, de asemenea, atunci când sarcina sa terminat. Acest lucru va fi disponibil la modulul app> construi> rapoarte> bug-uri. Pluginul FindBugs este un alt plugin disponibil gratuit pentru descărcare și integrare cu IntelliJ IDEA sau Android Studio.

Android Lint

Lint este un alt instrument de analiză a codului, dar acesta este disponibil în mod implicit cu Android Studio. Acesta verifică fișierele sursă ale proiectului Android pentru posibile bug-uri și optimizări pentru corectitudine, securitate, performanță, utilizare, accesibilitate și internaționalizare. 

Pentru a configura Lint, trebuie să includeți opțiuni de oprire blocați la nivelul modulului build.gradle fişier:

lintOptions abortOnError fișier lintConfig false adevărat silențios ('./ code_quality_tools / lint.xml')

Opțiunile cheie Lint cu care ne ocupăm sunt: 

  • abortOnError: dacă scamele ar trebui să stabilească codul de ieșire al procesului dacă sunt descoperite erori.
  • Liniște: dacă să opriți raportarea progresului analizei.
  • lintConfig: fișierul de configurare implicit utilizat.

Ta lint.xml fișierul poate include problemele pe care doriți să le ignorați sau să le modificați, cum ar fi exemplul de mai jos:

      

Puteți rula manual Lint din Android Studio făcând clic pe A analiza meniu, alegerea Inspectați codul ...  (scopul inspecției este întregul proiect), apoi faceți clic pe O.K pentru a continua.

De asemenea, puteți rula Lint vizitând fereastra instrumentului Gradle, deschizând verificare grup, apoi faceți clic pe puf. În cele din urmă, îl puteți executa prin linia de comandă.

Pe Windows:

Grayling

Pe Linux sau Mac:

./ scame

Un raport va fi, de asemenea, generat atunci când sarcina a terminat executarea, care este disponibil la modulul app> construi> ieșiri> lint-results.html.

Bonus: StrictMode

StrictMode este un instrument de dezvoltare care vă ajută să împiedicați dezvoltatorii proiectului dvs. să facă orice intrare / ieșire accidentală I / O sau rețea I / O pe firul principal, deoarece acest lucru poate duce la apariția unei aplicații lente sau nereușite. De asemenea, ajută la prevenirea apariției unor dialoguri ANR (App Not Responding). Cu problemele StrictMode corectate, aplicația dvs. va deveni mai receptivă și utilizatorul se va bucura de o experiență mai bună. StrictMode utilizează două seturi de politici pentru aplicarea regulilor sale:

  • Politicile VM: vă protejează de practicile de codare nepotrivite, cum ar fi închiderea SQLiteCursor obiecte sau altele care se pot închide obiect care a fost creat. 
  • Politicile privind firurile: caută operații precum I / O flash și I / O de rețea care se efectuează pe firul principal al aplicației în loc de un thread de fundal. 
dacă (BuildConfig.DEBUG) StrictMode.setThreadPolicy (new StrictMode.ThreadPolicy.Builder () .detectDiskReads () .detectDiskWrites () .detectNetwork () // sau .detectAll () pentru toate problemele detectabile. încălcări ale sistemului de log ... build ()); StrictMode.setVmPolicy (new StrictMode.VmPolicy.Builder () .detectLeakedSqlLiteObjects () .detectLeakedClosableObjects () .penaltyLog () .penaltyDeath () // Crashes întregul proces de încălcare ... build ()); 

Codul de mai sus poate fi fie în aplicația dvs., în activitatea dvs., fie în altă componentă a aplicației onCreate () metodă. 

Puteți afla mai multe despre StrictMode aici pe Envato Tuts+. 

Un exemplu de proiect Android care implementează toate cele de mai sus, inclusiv seturile de reguli ale instrumentelor pentru un proiect tipic Android, poate fi găsit în GitHub repo.

Concluzie

În acest tutorial, ați învățat cum să vă asigurați codul Android de înaltă calitate utilizând instrumente de analiză statică a codului: ce sunt, beneficiile utilizării acestora și cum să utilizați aplicația Checkstyle, FindBugs, Lint, PMD și StrictMode. Continuați și încercați aceste instrumente - s-ar putea să descoperiți unele probleme în codul pe care nu le-ați așteptat niciodată.

Între timp, verificați câteva din celelalte cursuri și tutoriale ale dezvoltării aplicațiilor Android!

Cod