Kui programmeerite Androidi rakendusi või arendate selle ökosüsteemi jaoks teeke, olete ilmselt .jar ja .aar failidega rohkem kui korra kokku puutunud. Teil võib tekkida isegi küsimusi selle kohta, millal iga vormingut kasutada, millised on nende tegelikud erinevused ja millist mõju avaldab nende valik teie projektile. Kuigi mõlemad on tihendatud failid, mis on loodud korduvkasutatava koodi ja ressursside levitamiseks, on nende struktuur, otstarve ja võimalused Androidi kontekstis oluliselt erinevad. See artikkel püüab vastata kõigile teie küsimustele sellel teemal ja selleks süveneme teemasse, pakkudes selgeid ja põhjalikke selgitusi, aga ka loomulikku ja praktilist lähenemist, mis sobib ideaalselt nii alustajatele kui ka juba kogenud Androidi arendajatele.
Saate üksikasjalikult teada , mis on JAR-fail, mis iseloomustab AAR-faili ja kuidas mõlemat vormingut Androidi arenduse erinevates etappides kasutatakse. Vaatame üle nende eelised, piirangud, sisemise struktuuri ja selle, kuidas need mõjutavad teekide levitamist ja kasutamist nii teie enda kui ka kolmandate osapoolte projektides. Lisaks uurime nende rolli tänapäevastes ehitussüsteemides nagu Gradle ja Bazel ning õpite peamisi nippe, kuidas neist maksimumi võtta, vältides samal ajal levinud probleeme. Kõik on selgitatud hispaania keeles (Hispaania), väga selgete näidete ja põhipunktide esiletõstmisega, et saaksite sellele vajadusel hõlpsalt tagasi pöörduda.
Mis on JAR-failid?
JAR-fail (Java ARchive) on sisuliselt, tihendatud fail, mis sisaldab faile .klass (juba kompileeritud Java kood), ressursid, näiteks pildid, atribuutide failid ja konfiguratsioonifailid, samuti failis olev metateave META-INF. JAR loodi Java-rakenduste ja nende teekide levitamise lihtsustamiseks, võimaldades kõigi vajalike komponentide pakkimist ühte hõlpsasti transporditavasse ja hallatavasse faili. Klassikalises Javas.jar-failid on nii täielike rakenduste kui ka korduvkasutatavate moodulite levitamise põhiüksus.
Androidis on JAR-failid endiselt olemas ja neid kasutatakse sageli puhta Java loogika, näiteks utiliitide, algoritmide või platvormist sõltumatute teekide kapseldamiseks. Siiski tuleb arvestada: JAR ei tohi kunagi sisaldada Androidi ressursse (paigutusi, joonistusfaile jne) ega AndroidManifest.xml-faili. Samuti ei saa see sisaldada natiivkoodi (C/C++). Seega, kui teie kood peab suhtlema Androidi süsteemikomponentidega, määratlema visuaalseid ressursse või haldama õigusi, jäävad JAR-failid puudu ja mängu tulevad AAR-failid.
Mis on AAR-fail?
AAR-fail (Android Archive) on JAR-kontseptsiooni Androidile spetsiifiline edasiarendus. AAR on samuti tihendatud fail (põhimõtteliselt ZIP-fail), kuid selle struktuur ja sisu on loodud vastama kõigile tänapäevase Androidi teeki vajadustele. AAR võib sisaldada:
- Kompileeritud Java kood (.class, .jar-failis)
- andmed AndroidManifest.xml raamatupoele omane
- Androidi ressursid: paigutused, joonised, stringid, ikoonid jne.
- Natiivne kood C / C ++ (.so failid, valikuliselt)
- Proguardi failid, Linti ressursid ja palju muud
See teeb AAR-ist soovitatava vormingu teekide ja pluginate levitamiseks Androidis, kuna see sisaldab kõike, mis on vajalik teeki toimimiseks mis tahes projektis, hallates nii koodi kui ka sellega seotud ressursse ja konfiguratsioone.
JAR-i ja AAR-i struktuurilised erinevused
Asume asja kallale, võrreldes selgelt, mida iga vorming suudab ja mida mitte. Nii et näete seda lühidalt:
| Característica | JAR | õhk |
|---|---|---|
| Java kood | ✅ | ✅ |
| Androidi ressursid (paigutused, joonistusfailid…) | ❌ | ✅ |
| Oma AndroidManifest.xml | ❌ | ✅ |
| Natiivkood (.so) | ❌ | ✅ |
| Annotatsiooniprotsessorid | ✅ | ✅ |
| Proguardi/Linti failid | ❌ | ✅ |
Kuigi JAR piirdub puhta Java-koodi ja metaandmete failide pakkimisega mis tahes tüüpi Java-projektide jaoks, on AAR loodud hõlmama kogu Androidi ökosüsteemi : ressursse, manifesti, natiivkoodi ja spetsiifilisi reegleid, mida võib vaja minna teegi integreerimisel rakenduse või teiste teekidega.
Milleks JAR-faile tänapäeval Androidis kasutatakse?
JAR-failide kasutamine Androidis on teatud kontekstides endiselt väga mõistlik. Puhtad Java teegid (ilma ressursside, manifestide või Androidi-spetsiifilise koodita) levitatakse sageli JAR-failidena, kuna see vorming on universaalselt aktsepteeritud iga Java projekti poolt, olgu see siis töölaua-, taust- või Androidi-projekt. Kui teil on stringi manipuleerimise utiliidid, matemaatiline loogika, enne Androidi tulekut välja töötatud kolmandate osapoolte teegid, annotatsiooniprotsessorid või eraldiseisvad moodulid, on JAR-failid oma lihtsuse tõttu kehtiv ja optimaalne valik.
Lisaks on paljud Java ökosüsteemi annotatsiooniprotsessorid ja tööriistad (näiteks need, mida kasutatakse koos kapt o annotationProcessor) levitatakse JAR-idena, kuna nende funktsioon piirdub kompileerimisajaga ja nad ei vaja lisaressursse.
Millal on oluline kasutada AAR-i JAR-i asemel?
Kui teie teek vajab Androidi ressursse – olgu need siis paigutused, joonistused, menüüd, stringid, stiilid – või oma manifesti, peate selle pakkima AAR-failina . Näiteks kui arendate visuaalset komponenti (kohandatud nuppu, fragmenti, vidinat) või peate lisama õiguste, teenuste, vastuvõtjate või natiivkoodi ploki, ei piisa enam JAR-failist.
AAR lubab raamatupoel:
- Ressursside sisestamine tarbivasse rakendusse, võimaldades nende kasutamist teegis määratletud paigutused ja joonised.
- Hoidke a AndroidManifest.xml eraldi, mille kompileerimissüsteem seejärel lõpliku rakendusega ühendab.
- Jaotama .so failid natiivse koodiga, mis on vajalik teatud täiustatud funktsioonide jaoks.
- Määrake teegiga seotud Proguardi/Linti reeglid koodi kaitsmiseks või automaatsete kontrollide lisamiseks.
Lõppkokkuvõttes on AAR-vorming de facto standard iga korduvkasutatava koodi jaoks, mis tuleb täielikult integreerida Androidi projekti, hõlbustades modulaarsust ja nõuetekohast sõltuvuste haldamist.
AAR-i konkurentsieelised JAR-i ees
Praktilisel tasandil on AAR-i peamised eelised Androidi projektides JAR-iga võrreldes järgmised:
- Funktsioonide täielik jaotusVõimaldades teil lisada ressursse, manifeste ja natiivkoodi, võimaldab AAR pakendada mis tahes tüüpi funktsioone, alates kolmandate osapoolte SDK-dest kuni mooduliteni, mis laiendavad teie enda rakendust.
- Lihtsad ja tsentraliseeritud uuendusedKaughoidlate süsteemide (nt MavenCentral või Google'i hoidla) abil saab AAR-teegid kiiresti avaldada ja värskendada, mis mõjutab kõiki neid kasutavaid projekte.
- Integratsioon kaasaegsete ehitussüsteemidegaGradle ja Bazel, Androidi kõige laialdasemalt kasutatavad ehitussüsteemid, pakuvad otsest tuge AAR-idele ja haldavad automaatselt failist tuletatud ressursside, manifestide ja ehitusreeglite ühendamist.
- Modulaarsuse ja testimise tugiTänapäevased Androidi rakendused on sageli jagatud mitmeks mooduliks ja teekideks, millest paljud vajavad oma ressursse või manifeste. AAR hõlbustab neid skeeme ja võimaldab teil kirjutada teste (nii mooduli kui ka instrumentatsiooni) mooduliga ideaalselt seotud.
JAR on endiselt kasulik puhta Java loogika või annotatsiooniprotsessorite jaoks, kuid täielike ja funktsionaalsete Androidi moodulite jaoks, mis sisaldavad ressursse ja operatsioonisüsteemi integratsiooni, on AAR praktiliselt ületamatu.
Piirangud ja kaalutlused, mida tuleb arvesse võtta
Muidugi pole see kõik eelised. JAR-vorming on universaalne : seda saab kasutada iga Java keskkond, alates serveritest kuni töölauarakendusteni. Kuid AAR-il on mõtet ainult Androidi projektides ja see on loodud kasutamiseks Gradle'i või Bazeli poolt, mitte teistes keskkondades. Lisaks võib ressursside pakkimine AAR-is vajada täiendavaid kohandusi (näiteks nimeruumi õige haldamine, ressursside ja manifestide ühendamine ning sõltuvuste versioonikontroll). Seega, kui kavatsete levitada platvormideüleseid mooduleid või teie loogika on Androidist täiesti sõltumatu, kaaluge selle koodiosa pakkimist JAR-i.
Veel üks oluline punkt: JAR-failid ei saa sisaldada Androidi ressursse . Kui neid vajate, peate need igas tarbivas projektis käsitsi dubleerima, kaotades kõik modulaarsuse, tsentraliseeritud hoolduse ja automaatsete AAR-värskenduste eelised.
Kuidas JAR-id ja AAR-id integreeruvad ehitussüsteemidesse (Gradle ja Bazel)
Android Studio ehitussüsteemil (mis põhineb Gradle'il) ja täiustatud süsteemidel, näiteks Bazelil, on nii JAR-ide kui ka AAR-ide käsitlemiseks spetsiifilised reeglid.
Gradles
Kui lisate oma Androidi moodulile JAR-sõltuvuse, kasutate oma build.gradle'is järgmist märget:
sõltuvused { rakendusfailid('libs/mimil.jar') }
See hõlmab teie APK-s olevat Java-koodi , kuid see ei anna teile juurdepääsu Androidi ressurssidele. AAR-i puhul lisate lihtsalt viite AAR-i artefaktile (tavaliselt Maveni või Google'i repositooriumist) ja Gradle tegeleb ressursside, manifesti ja natiivkoodi ühendamisega.
sõltuvused { implementatsioon 'com.mycompany:milibreria-android:1.0.0' }
Kui artefakt on AAR, tuvastab, pakib lahti, ühendab ja lahendab Gradle selle automaatselt ning teie ressursid ja manifest integreeritakse sujuvalt lõplikku rakendusse.
Bazelis
Bazel, mis on oma kiiruse ja modulaarsuse tõttu üha populaarsem suurtes projektides, määratleb selged reeglid mõlema vorminguga töötamiseks:
- java_teek: kompileerib Java lähtekoodid ja loob väljundiks JAR-faili.
- androidi_teeksama mis java_library, aga tekitab samuti AAR-i (koos manifesti ja ressurssidega).
- aar_import: võimaldab teil otse AAR-faili tarbida, mida saab seejärel kasutada android_binary või android_library reeglites.
AAR-i integreerimise põhinäide Bazelis:
aar_import( name = "google-vr-sdk", aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar", ) android_binary( name = "app", manifest = "AndroidManifest.xml", srcs = glob(), deps = , )
Sellega muutub AAR ligipääsetavaks igale moodulile või rakendusele, mis seda vajab, sulandudes oma ressursside ja manifestidega.
Mis juhtub, kui lisan JAR-faili Androidi ressursid?
Kui proovite Androidi ressursifaile (XML-paigutusi, pilte, stringe...) JAR-faili panna ja seejärel oma projektis sellest JAR-failist sõltuda, need ressursid pole kunagi kättesaadavad oma rakenduses kompileerimise ajal. Gradle ja Bazel töötlevad ainult rakenduspuus ja AAR-moodulites sisalduvaid ressursse. Seega juurdepääs R.layout.tulayout ebaõnnestub kompileerimise ja/või käitusaja jooksul, tekitades vigu, mida on raske siluda.
AAR-faili sisemine struktuur
Vaatame, kuidas tüüpiline .aar-fail on sisemiselt korraldatud. Kui te selle lahti pakite (pidage meeles, et see on .zip-fail), leiate tavaliselt järgmised failid ja kaustad:
- klassid.jar: kompileeritud Java kood
- AndroidManifest.xmlraamatupoe spetsiifiline manifest
- res /Androidi ressursikaustad (paigutused, joonised, väärtused…)
- varad /: binaarressursid või lisaandmed
- jni/: natiivne kood erinevatele arhitektuuridele
- R.txteksporditud ressursside määratlus
- proguard.txt, lint.jar: Proguardi või Linti valikulised reeglid
Kogu see sisu ühendatakse sujuvalt ehitussüsteemiga, tagades, et teie rakendus saab otse kasutada AAR-is määratletud ressursse, manifeste ja natiivkoodi.