DexPatcherin avulla kehittäjät voivat korjata APK: ita Javalla. Tällä on useita etuja, ja DexPatcherin käyttö on paljon helpompaa kuin klassinen Smali-lähestymistapa.
Olet luultavasti nähnyt tai asentanut muokattuja sovelluksia, olipa kyseessä sitten tarkkuuttasi vastaava korjattu kellotaulu tai mukautettu WhatsApp-versio lisäominaisuuksilla. Mutta kuinka kehittäjät tekevät sen? Usein sovellusten lähdekoodi ei ole edes saatavilla, joten miten se kaikki toimii? Näemme sen ensin, sitten tarkastelemme uutta työkalua, jonka tarkoituksena on tehdä prosessista paljon helpompaa, ja lopuksi verrataan sitä suosittuun Xposed-kehykseen nähdäksesi, miten ne eroavat toisistaan.
Olet ehkä kuullut siitä, kuinka APK: ita yleensä muokataan – kehittäjät liittävät itsensä matriisi, ala nähdä kaikki Smalissa ja saada kyky muokata asioita käyttämällä voimaa Lähde. Puhelinsoitto riittää saamaan heidät ulos sen jälkeen, jolloin he ovat valmiita jakamaan kiiltävät uudet APK: t.
Vakavammin… Aloitetaan alusta. Jos et ole perehtynyt Android-sovellusten muokkaamiseen, saatat ihmetellä, mikä smali on. Kehittäjät käyttävät yleensä Java-ohjelmointikieltä Android-sovellusten koodaamiseen. Ohjelma (kääntäjä) "kääntää" sitten koodin toiseen laitteellesi sopivaan muotoon, jolloin sovelluspaketin (tai APK: n) sisällä olevat .dex-tiedostot ovat.
Siinä vaiheessa et voi enää käyttää alkuperäistä lähdekoodia (ellet ole kehittäjä tai sovellus on avoimen lähdekoodin). Sinulla on kuitenkin APK, koska se on asennettu laitteellesi. Sieltä voit saada dex-tiedostot (yleensä classes.dex) ja yrittää sitten kääntää ne takaisin muotoon, jota ymmärrät. Siinä smali tulee esiin luettavampana mutta uskollisempana käännöksenä. Voit mennä askeleen pidemmälle ja kääntää sen takaisin Java-kielelle, vaikka tämä prosessi ei ole tarpeeksi luotettava – saat Ymmärrettävä tulos, mutta on mahdollista, että et voi kääntää sitä uudelleen toisinpäin, koska jotkut yksityiskohdat katoavat matkan varrella. Toisin sanoen, tekemäsi muutokset ovat turhia, koska et voi muuttaa sitä takaisin APK: ksi asentaaksesi sen laitteellesi… ainakaan ilman paljon vaivaa.
smali/baksmali on itse asiassa dex-muodon kokoaja/dissembler – sitä se tarkoittaa kirjaimellisesti islanniksi. Yleensä viittaamme kuitenkin muotoon, jonka smali ymmärtää, kun sanomme "Smali" (ajattele sitä ohjeena joka määrittelee jokaisen pienen yksityiskohdan, vaikka me ihmiset emme sitä kaikkea tarvitsisi – se on siksi enemmän sanailtuja kuin Java). Huomaa myös, että yllä oleva selitys on hieman yksinkertaistettu, mutta sen pitäisi olla läheinen analogia, vaikka se on silti helppo ymmärtää.
Mitä kehittäjän olisi sitten tehtävä muokatakseen sovellusta (ilman pääsyä lähteeseen)? Prosessi on enemmän tai vähemmän seuraava:
- Hanki APK (verkosta tai laitteelta).
- Käytä jotain sellaista apktool purkaa APK Smaliksi. (apktool käyttää smali/baksmalia, mutta tekee APK: iden purkamisesta ja uudelleen rakentamisesta paljon helpompaa ja huolehtii myös resurssien, kuten XML-tiedostojen, purkamisesta.)
- Pura classes.dex APK: sta ja käytä sitten dex2jar ja lopuksi Java-dekääntäjä saadakseen (epätäydellisen, usein rikki, mutta enimmäkseen ymmärrettävän) Java-koodin. (Tämä on valinnainen, mutta voi olla hyödyllistä, koska Smalia on paljon vaikeampi ymmärtää.)
- Tunnista, mitä haluat muokata.
- Itse asiassa muokkaa sitä muokkaamalla Smali-koodia suoraan.
- Vaihtoehtoisesti voit kirjoittaa muunnos Java-kielellä, kääntää se, purkaa se uudelleen Smaliksi ja kopioida sitten tuloksena oleva Smali-koodi.
- Kun kaikki on ohi, käytä apktool uudelleen rakentaaksesi APK: n uudelleen.
- Allekirjoita APK (tarkistaaksesi tekijän henkilöllisyyden; kaikki paketit on allekirjoitettava) ja asenna se lopulta.
Smali-koodin kirjoittaminen on melko vaikeaa ja virhealtista. Pienempiä muutoksia voidaan tehdä Smalissa, mutta uusien ominaisuuksien lisääminen sen avulla on haastavampaa. Lisäksi sinulla ei ole käännösaikavirheitä, joten jopa kirjoitusvirheet voidaan havaita vain ajon aikana. Smali-korjausten laajentaminen ja jakaminen voi myös olla hankalaa, koska erot ovat yleensä hyvin erityisiä tietylle APK-versiolle. Vaikka on olemassa työkaluja, jotka helpottavat yllä selitetyn prosessin osia (Virtuous Ten Studio tulee mieleen), se voi silti olla väsyttävää.
XDA: n vanhempi jäsen DexPatcher Lanchon pyrkii korjaamaan nämä ongelmat yksinkertaistamalla prosessia ja antamalla kehittäjille mahdollisuuden välttää tekemisiä Smalin kanssa. Sen sijaan kehittäjät voivat kirjoittaa korjaustiedostoja yksin Java-kielellä ja DexPatcher hoitaa kaiken muun.
Tämän tärkein etu on helposti luettavissa ja hallittavissa olevat korjaustiedostot. APK: iden korjaamisesta tulee myös yleensä helpompaa. Näemme hetken kuluttua täydellisen esimerkin DexPatcherin käytöstä, mutta tässä on ensin nopea yleiskatsaus sen tarjontaan:
- Avoin lähdekoodi.
- Monialustaiset: sen pitäisi toimia Linuxissa, Macissa ja Windowsissa.
- Korjaustiedostot: tekemäsi muutokset sisältyvät Java-korjaustiedostoihin, jotka voit jakaa itsenäisesti.
- Java: se ei ole Smali.
Saat myös edun rakennusaikaisen virheentarkistuksen avulla, joten virheet näkyvät kehityssyklin varhaisessa vaiheessa. Käännetty Java tarjoaa tavanomaisen käännösajan tarkistuksen (jolla on pääsy alkuperäisiin APK-symboleihin), ja DexPatcher pakottaa lähteen ja korjaustiedoston yhteensopivuus korjauksen aikana, hyödyllisten tietojen tarjoaminen ja varoitusten antaminen, kun näytät tekevän jotain laillista mutta hämärää.
Tämän lisäksi DexPatcherin mukana tulee sarja apukäsikirjoituksia (saatavilla vain Linuxissa, vaikka ne voidaan siirtää myös muille alustoille). Nämä huolehtivat työtilan asettamisesta, kohde-APK: n luokat ja resurssien purkamisesta, luokkien purkamisesta Javaksi ( CFR Java-kääntäjä käytetään jälkimmäiseen), ja lopuksi korjatun APK: n rakentaminen ja allekirjoittaminen, kun olet valmis.
Katsotaanpa esimerkkiä (Linuxissa):
Asenna DexPatcher-skriptit
$# 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.
Määritä DexPatcher-komentosarjat
Avata dxp.config suosikkitekstieditorissasi ja muista muuttaa tarvittavat muuttujat järjestelmääsi sopiviksi. Sinun tarvitsee vain muuttaa seuraava rivi osoittaaksesi Android SDK: n asennussijaintiin:
dxp_android_sdk_dir=(~/android/sdk)
(DexPatcher valitsee automaattisesti korkeimman saatavilla olevan alustaversion. Lisäksi voit myös muokata muita konfigurointiasetuksia niin, että se käyttää joidenkin työkalujen omia versioita mukana olevien oletusasetusten sijaan.)
Käytön helpottamiseksi voimme lisätä dexpatcher hakemistoomme PATH, tai jopa symbolilinkki eri dxp-* komentosarjat sijaintiin, joka on jo sinun PATH, kuten ~/bin:
export PATH=$PWD:$PATH
Muokkaa sovellusta
Tässä esimerkissä käytämme yksinkertaista ja avoimen lähdekoodin sovellusta. Tietysti lähdekoodin korjaus suoraan olisi mahdollista tässä tapauksessa, mutta se ei ole ollenkaan hauskaa!
Otamme basil2stylen "Get ID" -sovelluksen, sovelluksen, joka näyttää joitain tietoja laitteestasi. Tavoitteemme on muokata "Laitetunnuksen" "Kopioi"-painiketta ja saada se jakamaan tämän tunnuksen:
- Lataa ensin APK, jota aiomme muokata: Hanki henkilöllisyystodistus.
- Pura sovellus.
- Luo allekirjoitusavain, jota käytämme myöhemmin APK: n allekirjoittamiseen.
Voimme tehdä kaiken myös kuoren kautta käyttämällä apuohjelmia:
$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".
Huomaat siellä muutamia erilaisia hakemistoja:
- purkaa: löydät resurssit ja Smalin täältä, sellaisena kuin se on purettu apktool.
- src: Tyhjä hakemisto. Tänne sijoitamme korjaustiedostomme.
- src-cfr: tämä on missä vrt purki sovelluksen (virheiden kanssa). Hyvä paikka, josta voit päättää, mitä muuttaa (saatat myös tarvita resursseja ja niiden tunnuksia yllä olevasta dekoodaushakemistosta, mutta et tässä esimerkissä).
- src-cfr-solmukoodi: sama kuin yllä, mutta sisältää vain tyhjiä tyntejä (ei koodia, vain luurankoja). Voit käyttää näitä tiedostoja korjaustiedoston perustana, kuten näemme hetken kuluttua.
Kuten olemme aiemmin maininneet, haluamme muuttaa Device ID "Kopioi" -painiketta jakaaksemme sen sijaan tunnustekstin. Jos katsomme ympärillemme lähdekoodissa, huomaamme, että Device ID Copy -painike (laite_kopio) klikkaamalla tapahtuman hoitaa anonyymi luokka src-cfr/makeinfo/com/getid/MainActivity.java. Vaikka voisimme muokata sitä täällä, on yleensä parempi löytää vaihtoehtoinen tapa tehdä se, koska anonyymeillä luokilla on numeeriset nimet (MainClassName$SomeNumber, esim. Päätoiminta $3), joka saattaa muuttua arvaamattomasti versioiden välillä.
Sen sijaan rekisteröimme tapahtumaan oman luokkamme muokkaamalla Pääaktiviteetti luokkaa. Kopioidaan ensin "luuranko" -versio src-cfr-nocode/makeinfo/com/getid/MainActivity.java to src/makeinfo/com/getid/MainActivity.java (muista se src on paikka, jossa laastarimme asuu). (Voit myös kopioida version koko koodilla, jos haluat, tämä on puhtaasti makuasia.)
Voimme nyt muokata sitä seuraavasti:
- Lisää tarvittava tuonti DexPatcher-merkintää varten:
importlanchon.dexpatcher.annotation.*;
- Lisää tunniste, joka osoittaa, että muokkaamme luokkaa. Asetamme myös korjaustiedoston jäsenten oletustoiminnoksi JÄTTÄÄ HUOMIOTTA, mikä tarkoittaa, että koodimme viittaa jäseniin Java-kääntämisen aikana, mutta DexPatcher jättää ne huomiotta.
@DexEdit(defaultAction=DexAction.IGNORE)publicclassMainActivity
// The reference to ActionBarActivity will be satisfied by symbols
// extracted from the app when we build the patch.
extendsActionBarActivity{
- Lisää lisäksi tyhjät kappaleet konstruktoriin ja onCreate menetelmä sekä kaikki muut menetelmät, joita aiomme käyttää (muista, että ne jätetään huomioimatta, kun korjaustiedostomme todella laitetaan - me vain lisäämme ne, jotta voimme viitata niihin täällä tarvittaessa). Voit myös vain lisätä syntyperäinen avainsanan sijaan.
- Voimme rakentaa korjaustiedoston jo tässä vaiheessa, jos olet utelias:
$ dxp-make # Output: `patched.apk`.
Aika yksinkertaista, eikö? Jatkamme kuitenkin -- emme ole vieläkään valmiita. - Muokataan onCreate nyt lähtemään omalle OnClickListener jotta voimme jakaa laitetunnuksen sen sijaan, että kopioimme sen leikepöydälle:
// 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();}}}
- Nyt näyttää siltä, että olemme valmiit! Täysi laastari näyttää tältä Tämä. Voimme nyt rakentaa korjatun APK: n ja asentaa sen:
$ dxp-make$ adb install patched.apk
- Katsotaanpa tulosta:
(Kiitos Lanchonille mallikoodin auttamisesta!)
Xposed on äärimmäisen suosittu, ja hyvästä syystä - se tekee modien rakentamisesta, jakamisesta ja asentamisesta paljon yksinkertaisempaa niin kehittäjille kuin käyttäjillekin. DexPatcherin ja Xposedin välillä on muutamia eroja, joiden vuoksi jotkut saattavat suosia toista:
- Xposed tekee taikuutensa kytkemällä menetelmiä suorituksen aikana ja sallimalla kehittäjien tehdä jotain ennen, jälkeen tai sen sijaan mitä tahansa menetelmää. DexPatcher puolestaan muokkaa kaikkea ennen suoritusaikaa ja tuottaa itsenäisen, muokatun APK: n -- koodin suorittaminen menetelmien edessä, jälkeen tai sijasta on edelleen mahdollista, ja sinulla on itse asiassa ylimääräistä vapautta.
- Erillisen APK: n tuottaminen tarkoittaa, että se ei ole riippuvainen mistään ulkoisesta kehyksestä. Tämä tarkoittaa myös sitä, että pääkäyttäjää ei tarvita käyttäjän sovellusten muokkaamiseen.
- Koska olet luonut uuden APK: n DexPatcherilla, se allekirjoitetaan eri tavalla. Tämä tarkoittaa, että käyttäjät eivät voi vastaanottaa virallisia päivityksiä alkuperäiseltä kirjoittajalta ja saattaa aiheuttaa ongelmia sovelluksissa, kuten Google Appsissa, jos allekirjoitukset tarkistetaan.
- Sekä moduulien että DexPatcher-korjausten lähdekoodia voidaan helposti jakaa ja muokata. Heillä on myös monia yhtäläisyyksiä, jos tutustut niihin hieman.
Olemme puhuneet tarpeeksi DexPatcherista. On sinun vuorosi kokeilla sitä nyt, joten siirry sivulle DexPatcherin keskustelupalsta aloittaaksesi heti!