ДекПатцхер омогућава програмерима да закрпе АПК-ове користећи Јава. Ово има неколико предности, а коришћење ДекПатцхер-а је много лакше од класичног Смали приступа.
Вероватно сте видели или инсталирали модификоване апликације, било да се ради о закрпљеном бирачу за вашу резолуцију или прилагођеној верзији ВхатсАпп-а са додатним функцијама. Међутим, како програмери то раде? Често изворни код апликација није ни доступан, па како све то функционише? Прво ћемо то видети, а затим погледати нови алат који има за циљ да олакша процес и на крају га упореди са популарним Кспосед оквиром да видимо по чему се разликују.
Можда сте чули о томе како се АПК-ови обично мењају – програмери се сами укључују у матрице, почните да видите све у Смалију и стекните способност да мењате ствари користећи моћ Извор. Телефонски позив је довољан да их извучете када то буде готово, а у том тренутку су спремни да поделе сјајне нове АПК-ове.
Озбиљније… Почнимо од почетка. Ако нисте упознати са модификовањем Андроид апликација, можда се питате шта је смали. Програмери обично користе програмски језик Јава за кодирање Андроид апликација. Програм (компајлер) затим „преводи“ тај код у други формат погодан за ваш уређај, што резултира .дек датотекама које се налазе унутар пакета апликације (или АПК).
У том тренутку више не можете приступити оригиналном изворном коду (осим ако нисте програмер или апликација није отвореног кода). Међутим, оно што имате је АПК, јер је то оно што је инсталирано на вашем уређају. Из њега можете добити дек датотеке (обично цлассес.дек), а затим покушати да их преведете назад у формат који разумете. Ту долази смали, као читљивији али вернији превод. Можете отићи корак даље и превести га назад на Јаву, иако тај процес није довољно веран – добићете разумљив резултат, али шансе су да нећете моћи поново да га преведете обрнуто јер ће се неки детаљи изгубити успут. Другим речима, све модификације које бисте могли да направите неће бити узалудне јер нећете моћи да га поново претворите у АПК да бисте га инсталирали на свој уређај… бар не без много труда.
смали/баксмали је заправо асемблер/диссемблер за дек формат -- то је оно што буквално значи на исландском. Међутим, обично се позивамо на формат који смали разуме када кажемо „Смали“ (мислите на то као на упутства дефинисање сваког малог детаља, чак и ако није све потребно нама људима - стога је више опширно него Јава). Такође имајте на уму да је горње објашњење мало поједностављено, али би требало да буде блиска аналогија док је још увек лако за разумевање.
Шта би програмер онда морао да уради да би изменио апликацију (без приступа извору)? Процес је мање-више следећи:
- Преузмите АПК (са веба или са уређаја).
- Користите нешто попут апктоол да декомпилирате АПК у Смали. (апктоол користи смали/баксмали, али знатно олакшава декомпајлирање и поновну изградњу АПК-ова, а такође води рачуна о ресурсима за декодирање као што су КСМЛ датотеке.)
- Извуците цлассес.дек из АПК-а, а затим користите дек2јар и коначно Јава декомпајлер за добијање (непотпуног, често поквареног, али углавном разумљивог) Јава кода. (Ово није обавезно, али може бити од помоћи јер је Смали много теже разумети.)
- Идентификујте шта да измените.
- Заправо га измените тако што ћете директно изменити Смали код.
- Алтернативно, напишите модификацију у Јави, компајлирајте је, поново је декомпилирајте у Смали, а затим копирајте резултујући Смали код.
- Када се све заврши, користите апктоол поново да бисте обновили АПК.
- Потпишите АПК (да бисте потврдили идентификацију аутора; сви пакети морају бити потписани) и на крају га инсталирати.
Писање Смали кода је прилично тешко и подложно грешкама. Мање промене се могу направити у Смали, али додавање нових функција са њим је изазовније. Поред тога, нећете имати никаквих грешака у времену компајлирања, тако да чак и грешке у куцању могу бити откривене само током извршавања. Проширивање и дељење Смали закрпа такође може бити проблематично, пошто су разлике обично веома специфичне за одређену верзију АПК-а. Иако постоје неки алати који олакшавају делове процеса објашњеног изнад (Виртуоус Тен Студио пада на памет), и даље може бити заморно.
ДекПатцхер од КСДА Сениор Мембер Ланцхон има за циљ да реши ове проблеме тако што ће поједноставити процес и омогућити програмерима да у потпуности избегну рад са Смалијем. Уместо тога, програмери могу да пишу закрпе само у Јави и да ДекПатцхер управља свим осталим.
Ово има главну предност у томе што имате лако читљиве и управљиве датотеке закрпа. Закрпање АПК-ова такође постаје практичније уопштено. Видећемо комплетан пример како да користите ДекПатцхер за мало, али ево кратког прегледа онога што нуди прво:
- Отвореног кода.
- Више платформи: требало би да ради на Линук-у, Мац-у и Виндовс-у.
- Датотеке закрпе: измене које направите садржане су у Јава датотекама закрпа које можете независно да делите.
- Јава: није Смали.
Такође добијате предност провере грешака током изградње, тако да се грешке појављују рано у развојном циклусу. Јава компајлирана пружа уобичајену проверу времена компајлирања (са приступом оригиналним АПК симболима), а ДекПатцхер спроводи компатибилност извора и закрпе приликом закрпе, пружање корисних информација и давање упозорења када се чини да нешто радите легално али сумњиво.
Поред тога, ДекПатцхер долази са сетом помоћне скрипте (доступно само на Линук-у, мада се могу пренети и на друге платформе). Они се брину о постављању радног простора, издвајању класа и ресурса циљног АПК-а, декомпајлирању класа у Јаву ( ЦФР Јава декомпајлер се користи за ово друго) и коначно прављење и потписивање закрпљеног АПК-а када завршите.
Хајде да погледамо пример (на Линуку):
Инсталирајте ДекПатцхер скрипте
$# 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.
Конфигуришите ДекПатцхер скрипте
Отвори дкп.цонфиг у свом омиљеном уређивачу текста и уверите се да промените потребне променљиве да одговарају вашем систему. Потребно је само да промените следећи ред да би уместо тога указао на локацију за инсталирање вашег Андроид СДК-а:
dxp_android_sdk_dir=(~/android/sdk)
(ДекПатцхер ће аутоматски изабрати највишу доступну верзију платформе. Поред тога, можете модификовати и друге опције конфигурације како бисте користили сопствене верзије неких алата уместо подразумеваних вредности у пакету.)
Ради лакшег приступа, можемо додати декпатцхер именик нашем ПАТХ, или чак симболички повезују различите дкп-* скрипте на локацију која је већ у вашој ПАТХ, као такав ~/бин:
export PATH=$PWD:$PATH
Измените апликацију
За овај пример користићемо једноставну апликацију отвореног кода. Наравно, директно закрпање изворног кода би било могуће у овом конкретном случају, али то уопште није забавно!
Узећемо апликацију „Гет ИД“ од стране басил2стиле, апликације која вам показује неке детаље о вашем уређају. Наш циљ је да изменимо дугме „Копирај“ за „ИД уређаја“ и да уместо тога делимо овај ИД:
- Прво, преузмимо АПК који ћемо модификовати: Узмите ИД.
- Декомпилирајте апликацију.
- Направите кључ за потписивање који ћемо касније користити за потписивање АПК-а.
Све то можемо да урадимо и преко љуске, користећи помоћне скрипте:
$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".
Тамо ћете приметити неколико различитих директоријума:
- декодирати: овде ћете пронаћи ресурсе и Смалија, како их декодира апктоол.
- срц: Празан именик. Овде ћемо поставити наше датотеке закрпе.
- срц-цфр: ово је место где цфр декомпилирао апликацију (заједно са грешкама). Добро место да погледате како бисте одлучили шта да промените (можда ће вам такође требати ресурси и њихови ИД-ови из горе наведеног директоријума за декодирање, али не за овај конкретан пример).
- срц-цфр-нодецоде: исто као горе, али садржи само празне стубове (без кода, само скелете). Можете користити ове датотеке као основу за своју закрпу, као што ћемо видети мало касније.
Као што смо раније споменули, желимо да променимо дугме „Копирај“ ИД уређаја да бисмо уместо тога делили текст ИД-а. Ако погледамо около изворног кода, приметићемо да дугме Копирај ИД уређаја (девице_цопи) онЦлицк догађај обрађује анонимна класа у срц-цфр/макеинфо/цом/гетид/МаинАцтивити.јава. Иако бисмо то могли да модификујемо овде, обично је боље пронаћи алтернативни начин да то урадите пошто анонимне класе имају нумеричка имена (МаинЦлассНаме$СомеНумбер, на пример. МаинАцтивити$3) који се може непредвидиво мењати између верзија.
Уместо тога, регистроваћемо сопствену класу за догађај тако што ћемо изменити Основна делатност класа. Прво, копирајмо верзију "скелета". срц-цфр-ноцоде/макеинфо/цом/гетид/МаинАцтивити.јава до срц/макеинфо/цом/гетид/МаинАцтивити.јава (запамтите да срц где ће наша закрпа живети). (Такође можете копирати верзију са пуним кодом ако желите, ово је чисто питање укуса.)
Сада га можемо уредити на следећи начин:
- Додајте неопходан увоз за ДекПатцхер напомену:
importlanchon.dexpatcher.annotation.*;
- Додајте ознаку која означава да уређујемо разред. Такође смо поставили подразумевану акцију за чланове класе закрпе на ИГНОРЕ, што значи да су чланови ту да буду референцирани у нашем коду током Јава компилације, али ће их ДекПатцхер игнорисати.
@DexEdit(defaultAction=DexAction.IGNORE)publicclassMainActivity
// The reference to ActionBarActivity will be satisfied by symbols
// extracted from the app when we build the patch.
extendsActionBarActivity{
- Додатно, додајте празна тела у конструктор и онЦреате метод, као и све друге методе које планирамо да користимо (запамтите да ће они бити занемарени када се наша закрпа стварно примени -- ми их само додајемо да бисмо могли да их упутимо овде ако треба). Такође можете само додати нативе уместо кључне речи.
- У овом тренутку већ можемо да направимо закрпу, ако сте радознали:
$ dxp-make # Output: `patched.apk`.
Прилично једноставно, зар не? Ипак, хајде да наставимо даље -- још увек нисмо готови. - Хајде да уредимо онЦреате сада да се постави сопствени ОнЦлицкЛистенер тако да можемо да делимо ИД уређаја уместо да га копирамо у међуспремник:
// 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();}}}
- Изгледа да смо сада завршили! Цела закрпа би требало да изгледа тако ово. Сада можемо да направимо закрпљени АПК и да га инсталирамо:
$ dxp-make$ adb install patched.apk
- Хајде да погледамо резултат:
(Хвала Ланцхону на помоћи око узорка кода!)
Кспосед је изузетно популаран, и то са добрим разлогом - чини прављење, дељење и инсталирање модова много једноставнијим за програмере и кориснике. Постоји неколико разлика између ДекПатцхер-а и Кспосед-а због којих неки преферирају једно над другим:
- Кспосед чини своју магију тако што спаја методе у време извођења и дозвољава програмерима да ураде нешто пре, после или уместо било које методе. ДекПатцхер, с друге стране, модификује све пре времена извођења и производи самостални, модификовани АПК -- покретање кода пре, после или уместо метода је и даље могуће, а ви заправо имате нешто више слобода.
- Производња самосталног АПК-а значи да не зависи од било каквог спољног оквира. Ово такође значи да роот није потребан за модификацију корисничких апликација.
- Пошто сте направили нови АПК са ДекПатцхер-ом, он ће бити другачије потписан. То значи да корисници не могу да примају званична ажурирања од оригиналног аутора и може изазвати неке проблеме са апликацијама као што је Гоогле Аппс ако се провере потписи.
- Изворни код и модула и ДекПатцхер закрпа се може лако дистрибуирати и модификовати. Они такође деле много сличности ако се мало упознате са сваком од њих.
Доста смо причали о ДекПатцхеру. Ваш је ред да сада покушате, па идите на ДекПатцхер Форум Тхреад да почнемо одмах!