DexPatcher: parandage Androidi APK-sid Java abil

DexPatcher võimaldab arendajatel APK-sid Java abil parandada. Sellel on mitmeid eeliseid ja DexPatcheri kasutamine on palju lihtsam kui klassikaline Smali lähenemine.

Tõenäoliselt olete näinud või installinud muudetud rakendusi, olgu selleks teie eraldusvõime jaoks paigatud helistaja või lisafunktsioonidega kohandatud WhatsAppi versioon. Kuidas aga arendajad seda teevad? Paljudel juhtudel pole rakenduste lähtekood isegi saadaval, nii et kuidas see kõik töötab? Esmalt näeme seda, seejärel vaatame uut tööriista, mille eesmärk on protsessi palju lihtsamaks muuta, ja lõpuks võrdleme seda populaarse Xposedi raamistikuga, et näha, kuidas need erinevad.

Võib-olla olete kuulnud, kuidas APK-sid tavaliselt muudetakse – arendajad ühendavad end ise maatriksit, hakkate nägema kõike Smali keeles ja omandage võime asju muuta, kasutades võimsust Allikas. Kui see on tehtud, piisab telefonikõnest, et nad välja saada ja siis on nad valmis uusi säravaid APK-sid jagama.

Tõsisemalt… Alustame algusest. Kui te pole Androidi rakenduste modifitseerimisega tuttav, võite mõelda, mis on smali. Arendajad kasutavad Androidi rakenduste kodeerimiseks tavaliselt Java programmeerimiskeelt. Seejärel "tõlgib" programm (kompilaator) selle koodi muusse teie seadme jaoks sobivasse vormingusse, mille tulemuseks on dex-failid, mis sisalduvad rakenduspaketis (või APK-s).

Sel hetkel ei pääse te enam algsele lähtekoodile juurde (välja arvatud juhul, kui olete arendaja või kui rakendus on avatud lähtekoodiga). Kuid teil on APK, kuna see on teie seadmesse installitud. Sellest saate hankida dex-failid (tavaliselt classes.dex) ja seejärel proovida tõlkida need uuesti teile arusaadavasse vormingusse. Siin tulebki sõna smali loetavama, kuid tõetruu tõlkena. Võite minna sammu edasi ja tõlkida selle Java keelde tagasi, kuigi see protsess pole piisavalt usaldusväärne – saate arusaadav tulemus, kuid tõenäoliselt ei saa te seda teistpidi tõlkida, kuna mõned üksikasjad lähevad kaotsi tee peal. Teisisõnu, kõik muudatused, mida võite teha, on asjatud, kuna te ei saa seda uuesti APK-ks muuta, et seda oma seadmesse installida… vähemalt mitte ilma suurema vaevata.

smali/baksmali on tegelikult dex-vormingus monteerija/lahutaja – just seda see islandi keeles tähendabki. Siiski viitame tavaliselt vormingule, millest smali aru saab, kui ütleme "Smali" (mõelge sellele kui juhistele määratledes iga pisidetailide, isegi kui seda kõike meie, inimesed, vaja ei ole – seepärast on see paljusõnalisem kui Java). Pange tähele ka seda, et ülaltoodud selgitus on veidi lihtsustatud, kuid see peaks olema lähedane analoogia, samas kui seda on lihtne mõista.

Mida peaks arendaja tegema rakenduse muutmiseks (ilma allikale juurdepääsuta)? Protsess on enam-vähem järgmine:

  1. Hankige APK (veebist või seadmest).
  2. Kasutage midagi sellist apktool APK dekompileerimiseks Smalisse. (apktool kasutab smali/baksmali, kuid muudab APK-de dekompileerimise ja ümberehitamise palju lihtsamaks ning hoolitseb ka ressursside, näiteks XML-failide, dekodeerimise eest.)
  3. Ekstraktige APK-st classes.dex ja seejärel kasutage dex2jar ja lõpuks Java dekompilaator (puudulik, sageli katkine, kuid enamasti arusaadav) Java koodi saamiseks. (See on valikuline, kuid võib olla kasulik, kuna Smali keelest on palju raskem aru saada.)
  4. Tehke kindlaks, mida muuta.
  5. Tegelikult muutke seda, muutes otse Smali koodi.
  6. Teise võimalusena kirjutage modifikatsioon Javas, kompileerige see, dekompileerige uuesti Smalisse ja kopeerige saadud Smali kood üle.
  7. Kui kõik on möödas, kasutage apktool uuesti, et APK uuesti üles ehitada.
  8. Allkirjastage APK (autori isiku tuvastamiseks; kõik paketid peavad olema allkirjastatud) ja lõpuks installima.

Smali koodi kirjutamine on üsna keeruline ja tõrgeteta. Väiksemaid muudatusi saab teha Smalis, kuid uute funktsioonide lisamine sellega on keerulisem. Lisaks ei teki teil kompileerimisaja vigu, seega võidakse isegi kirjavigu tuvastada ainult käitusajal. Smali plaastrite laiendamine ja jagamine võib samuti olla tülikas, kuna erinevused on tavaliselt konkreetse APK versiooni jaoks väga spetsiifilised. Kuigi on olemas mõned tööriistad, mis muudavad ülaltoodud protsessi osad lihtsamaks (Virtuous Ten Studio tuleb meelde), võib see ikka tüütuks muutuda.

XDA vanemliikme DexPatcher Lanchon eesmärk on need probleemid lahendada, muutes protsessi lihtsamaks ja võimaldades arendajatel täielikult vältida Smaliga suhtlemist. Selle asemel saavad arendajad kirjutada plaastreid ainult Javas ja lasta DexPatcheril kõige muuga hakkama saada.

Selle peamine eelis on hõlpsasti loetavate ja hallatavate paigafailide olemasolu. APK-de lappimine muutub ka üldiselt mugavamaks. Näeme täielikku näidet selle kohta, kuidas DexPatcherit kasutada, kuid siin on esmalt kiire ülevaade sellest, mida see pakub:

  • Avatud lähtekoodiga.
  • Platvormideülene: see peaks töötama Linuxis, Macis ja Windowsis.
  • Plaastrifailid: teie tehtud muudatused sisalduvad Java paigafailides, mida saate iseseisvalt jagada.
  • Java: see pole Smali.

Samuti saate eelise ehitusaja vigade kontrollimisest, nii et vead ilmnevad arendustsükli alguses. Kompileeritud Java pakub oma tavalist kompileerimisaja kontrolli (juurdepääsuga algsetele APK sümbolitele) ja DexPatcher jõustab allika ja paiga ühilduvus parandamisel, kasuliku teabe pakkumine ja hoiatuste andmine, kui tundub, et teete midagi seaduslik, kuid kahtlane.

Lisaks on DexPatcheriga kaasas komplekt abiskriptid (saadaval ainult Linuxis, kuigi neid saab teisaldada ka teistele platvormidele). Need hoolitsevad tööruumi seadistamise, siht-APK klasside ja ressursside ekstraktimise, klasside Java-vormingusse dekompileerimise ( CFR Java dekompilaator kasutatakse viimase jaoks) ning lõpuks koostage ja allkirjastage parandatud APK, kui olete lõpetanud.

Vaatame näidet (Linuxis):

Installige DexPatcheri skriptid

$# Make a directory where we can test stuff out and enter it. 

$ mkdir xda-test

$cd xda-test

$ git clone https://github.com/Lanchon/DexPatcher-scripts.git dexpatcher # Clone the DexPatcher helper scripts repo.

$cd dexpatcher

$ chmod +x dxp-* # Not necessary, but for clarity: we need to make sure the files we'll call later are executable.

Konfigureerige DexPatcheri skriptid

Avatud dxp.config oma lemmiktekstiredaktoris ja muutke kindlasti vajalikud muutujad oma süsteemile sobivaks. Peate muutma ainult järgmist rida, et osutada selle asemel oma Android SDK installikohale.

dxp_android_sdk_dir=(~/android/sdk)

(DexPatcher valib automaatselt kõrgeima saadaoleva platvormi versiooni. Lisaks saate muuta ka muid konfiguratsioonisuvandeid, et see kasutaks komplekti kuuluvate vaikeseadete asemel mõne tööriista enda versioone.)

Juurdepääsu hõlbustamiseks võime lisada dexpatcher kataloog meie juurde PATHvõi isegi erinevat sümbolit dxp-* skriptid asukohta, mis on juba teie asukohas PATH, nagu näiteks ~/bin:

export PATH=$PWD:$PATH

Rakenduse muutmine

Selle näite puhul kasutame lihtsat ja avatud lähtekoodiga rakendust. Muidugi oleks sel konkreetsel juhul võimalik lähtekoodi otse lappida, kuid see pole üldse lõbus!

Kasutame basil2style'i rakenduse „Hangi ID” – rakendus, mis näitab teile seadme kohta mõningaid üksikasju. Meie eesmärk on muuta "Seadme ID" nuppu "Kopeeri" ja lasta sellel hoopis seda ID-d jagada:

  • Esmalt laadime alla APK, mida me muudame: Hankige ID.
  • Dekompileerige rakendus.
  • Looge allkirjastamisvõti, mida kasutame hiljem APK allkirjastamiseks.

Saame seda kõike teha ka kesta kaudu, kasutades abiskripte:

$cd dexpatcher # Go to our working directory. 

$ curl -O https://f-droid.org/repo/makeinfo.com.getid_1.apk # Download the APK.

$ dxp-setup-for-apk makeinfo.com.getid_1.apk # Unpack and decompile the APK.

$cd makeinfo.com.getid_1 # Go to the newly created directory where everything is unpacked/decompiled to.

$ dxp-create-keystore # Create the APK signing key. Press 6 times (or fill out the info), then "yes".

Märkate seal mõnda erinevat kataloogi:

  • dekodeerida: leiate siit ressursid ja Smali, nagu dekodeeris apktool.
  • src: tühi kataloog. Siia paigutame oma plaastrifailid.
  • src-cfr: see on koht vrd dekompileeris rakenduse (koos vigadega). Hea koht, kust otsida, et otsustada, mida muuta (võite vajada ka ülaltoodud dekodeerimiskataloogi ressursse ja nende ID-sid, kuid mitte selle konkreetse näite puhul).
  • src-cfr-nodecode: sama, mis ülal, kuid sisaldab ainult tühje tühje (ilma koodita, ainult skeletid). Saate neid faile kasutada oma plaastri alusena, nagu näeme mõne aja pärast.

Nagu oleme varem maininud, tahame muuta seadme ID nuppu "Kopeeri", et jagada selle asemel ID teksti. Kui vaatame lähtekoodis ringi, märkame, et nupp Device ID Copy (seadme_koopia) onClick sündmust haldab anonüümne klass src-cfr/makeinfo/com/getid/MainActivity.java. Kuigi me saame seda siin muuta, on tavaliselt parem leida selleks mõni muu viis, kuna anonüümsetel klassidel on numbrilised nimed (MainClassName$SomeNumber, näit. Põhitegevus $3), mis võivad versioonide vahel ettearvamatult muutuda.

Selle asemel registreerime üritusele oma klassi, muutes Põhitegevus klass. Kõigepealt kopeerime "skeleti" versiooni src-cfr-nocode/makeinfo/com/getid/MainActivity.java juurde src/makeinfo/com/getid/MainActivity.java (mäleta seda src on koht, kus meie plaaster hakkab elama). (Kui soovite, võite ka täiskoodiga versiooni kopeerida, see on puhtalt maitse küsimus.)

Nüüd saame seda redigeerida järgmiselt:

  • Lisage DexPatcheri annotatsiooni jaoks vajalik import:
importlanchon.dexpatcher.annotation.*;
  • Lisage märgend, mis näitab, et muudame kursust. Samuti määrasime paigaklassi liikmete vaiketoiminguks Ignoreeri, mis tähendab, et liikmed peavad olema Java kompileerimise ajal meie koodiga viidatud, kuid DexPatcher ignoreerib neid.
@DexEdit(defaultAction=DexAction.IGNORE)

publicclassMainActivity

// The reference to ActionBarActivity will be satisfied by symbols

// extracted from the app when we build the patch.

extendsActionBarActivity{

  • Lisaks lisage konstruktorile tühjad kehad ja onCreate meetod, aga ka kõik muud meetodid, mida kavatseme kasutada (pidage meeles, et neid ignoreeritakse, kui meie plaaster tegelikult rakendatakse – me lihtsalt lisame need, et saaksime vajadusel neile siin viidata). Võite ka lihtsalt lisada emakeelena selle asemel märksõna.
  • Kui olete uudishimulik, saame plaastri juba praegu luua.
    $ dxp-make # Output: `patched.apk`.
    Päris lihtne, eks? Jätkame siiski – me pole ikka veel lõpetanud.
  • Redigeerime onCreate nüüd asuda ise teele OnClickListener et saaksime lõikepuhvrisse kopeerimise asemel seadme ID-d jagada:
    // Rename the target method so that we can still call it (the original)// if needed.@DexEdit(target="onCreate")protectedvoidsource_onCreate(Bundlevar1){}// Add our new custom method.@Override@DexAddprotectedvoidonCreate(Bundlevar1){// Call the original method:source_onCreate(var1);// Replace the text and handler:device_copy.setText("Share");device_copy.setOnClickListener(newDeviceCopyOnClick());}// Note that we don't use an anonymous class to avoid nameclashing with// MainActivity$1, which already exists.// We also could've defined a nested MainActivity.Patch class and used// an anonymous class in MainActivity.Patch.onCreate(), and then called// MainActivity.Patch.onCreate() from MainActivity.onCreate().@DexAddclassDeviceCopyOnClickimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewobject){if(MainActivity.this.val){Intentintent=newIntent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT,"Device ID");intent.putExtra(Intent.EXTRA_TEXT,device.getText().toString());startActivity(Intent.createChooser(intent,"Share Device ID"));}else{Toast.makeText(MainActivity.this.getApplicationContext(),"Nothing to Share",0).show();}}}
  • Näib, et oleme nüüd valmis! Täisplaaster peaks välja nägema see. Nüüd saame paigatud APK luua ja installida:
    $ dxp-make$ adb install patched.apk
  • Vaatame tulemust:

(Täname Lanchoni näidiskoodiga abistamise eest!)

Xposed on tohutult populaarne ja mõjuval põhjusel – see muudab modifikatsioonide loomise, jagamise ja installimise nii arendajatele kui ka kasutajatele palju lihtsamaks. DexPatcheri ja Xposedi vahel on mõned erinevused, mis võivad panna mõne eelistama ühte teisele:

  1. Xposed teeb oma võlu, haakides meetodeid käitusajal ja lubades arendajatel teha midagi enne, pärast või selle asemel mis tahes meetodit. DexPatcher seevastu muudab kõike enne käitusaega ja toodab eraldiseisva muudetud APK -- koodi käivitamine meetodite ees, järel või asemel on endiselt võimalik ja teil on tegelikult lisa vabadust.
  2. Eraldiseisva APK loomine tähendab, et see ei sõltu ühestki välisest raamistikust. See tähendab ka seda, et kasutajarakenduste muutmiseks pole root kasutajat vaja.
  3. Kuna olete DexPatcheriga loonud uue APK, allkirjastatakse see teisiti. See tähendab, et kasutajad ei saa algselt autorilt ametlikke värskendusi ja allkirjade kontrollimisel võivad tekkida probleemid selliste rakendustega nagu Google Apps.
  4. Nii moodulite kui ka DexPatcheri paikade lähtekoodi saab hõlpsasti levitada ja muuta. Neil on ka palju sarnasusi, kui olete nendega pisut tuttav.

Oleme DexPatcherist piisavalt rääkinud. Nüüd on teie kord seda proovida, nii et minge aadressile DexPatcheri foorumi teema et kohe alustada!