воскресенье, 12 февраля 2012 г.

Android: Как изменить apk


В этой статье я расскажу как модифицировать установочные файлы для платформы Android (файлы с расширением apk).

Фактически apk представляет из себя zip-архив, который легко распаковывается обычным архиватором. Но если стоит задача распаковать его по полной, то лучше воспользоваться инструментом apktool, которому в свою очередь нужен JDK.




Итак, качаем и устанавливаем:
  1. JDK (Java SE Development Kit)
  2. apktool - достаточно просто распаковать этот архив, например в корень диска C: 
Распаковка apk
Для распаковки apk-файла (в моем примере это D:\test\my_app.apk) в командной строке выполняем:
C:\ApkTools\apktool-d.cmd D:\test\my_app.apk

В результате в каталоге, где лежал наш apk появится папка my_app в которой будет находиться содержимое нашего apk.

После внесения необходимых изменений необходимо собрать новый apk.


Если же вы хотите получить доступ к исходному коду, вам необходим самый важный файл – classes.dex. Но он тоже зашифрован. Для того, что бы получить доступ к его содержимому, необходимо воспользоваться программой Dex2Jar и JD-GUI.

После того как вы скачали эти две программы, распакуйте их. Скопируйте файл classes.dex в папку с Dex2Jar и выберите в свойствах classes.dex «открыть с помощью… – Dex2Jar», файл будет перепакован в .jar, который можно уже открыть для редактирования в JD-GUI.

Упаковка apk
  1. Выполняем сборку нового apk-файла.
    В командной строке запускаем:
    C:\ApkTools\apktool-b.cmd D:\test\my_app
  2. После сборки в  D:\test\my_app  должна появиться папка build\apk. В ней есть всё, что упаковывается в apk, кроме папки  D:\test\my_app\assets.
    Итак, копируем  в build\apk папку  assets
  3. Далее выделяем все файлы/папки, жмем на любом правой кнопкой, в появившемся меню выбираем WinRAR - Добавить в архив...
    На вкладке Общие - формат архива: ZIP
    На вкладке файлы - поле "Файлы, добавляемые в архив без сжатия" вставить:
    *.arsc *.png *.ogg
    У полученного ZIP - архива меняем расширение на apk.
  4. Подписываем полученный  apk:
    C:\ApkTools\Sign.cmd  my_app.apk
    Sign.cmd внутри архива apk создаст  папку  META-INF, в которой будут храниться сертификат, контрольные суммы и подписи всех файлов
Удачных модов. И направляйте свою энергию в правильное русло, ну вы поняли о чем я :)

P.S.: Если положить apk непосредственно в C:\ApkTools\, то  отпадет нужда прописывать полные пути в командной строке.

14 комментариев:

  1. Ринат Курмашев16 марта 2012 г., 15:48

    Спасибо, друг, помог =)

    ОтветитьУдалить
  2. Херня! Скачал всё, установил яву, закинул в сраный apktool переименованную в d.apk прогу и нихрена:

    Processing...
    Exception in thread "main" brut.androlib.AndrolibException: brut.directory.Direc
    toryException: java.io.FileNotFoundException: D:\test\d.apk (═х єфрхЄё  эрщЄш єъ
    рчрээ√щ Їрщы)
    at brut.androlib.ApkDecoder.hasSources(Unknown Source)
    at brut.androlib.ApkDecoder.decode(Unknown Source)
    at brut.apktool.Main.cmdDecode(Unknown Source)
    at brut.apktool.Main.main(Unknown Source)
    Caused by: brut.directory.DirectoryException: java.io.FileNotFoundException: D:\
    test\d.apk (═х єфрхЄё  эрщЄш єърчрээ√щ Їрщы)
    at brut.directory.ZipRODirectory.(Unknown Source)
    at brut.directory.ZipRODirectory.(Unknown Source)
    at brut.androlib.res.util.ExtFile.getDirectory(Unknown Source)
    ... 4 more
    Caused by: java.io.FileNotFoundException: D:\test\d.apk (═х єфрхЄё  эрщЄш єърчрэ
    э√щ Їрщы)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.(Unknown Source)
    at java.util.zip.ZipFile.(Unknown Source)
    ... 7 more

    !!!Aborted!!!

    Хуйня ваша прога! Я тупо заменил расширение файла с .apk на .zip и зипером разархивировал всё без проблем! Затем перекодировал classes.dex прогой dex2jar.bat в classes_dex2jar.jar и снова хуйня! Ваша гонимая прога кроме как читать этот файл нихера больше не может - хуем его править?

    ОтветитьУдалить
    Ответы
    1. Если руки кривые и голова не шарит то нечего гнать!!! я сам пользуюсь этими прогоми и все нормуль!! Хотя честно говоря первый раз у м4ня тоже ни чего не получилось.

      Удалить
  3. К чему этот грубый коммент? В ответ на него я должен кинуться разбираться почему у тебя не получилось?
    Я написал как делал сам и у меня все сработало. Если можешь объяснить как делают нормальные пацаны - welcome.

    ОтветитьУдалить
  4. Денис Бушаев6 июня 2012 г., 14:11

    Ты просто слепой или дурак???
    FileNotFoundException: D:\test\d.apk-ЭТО ОЗНАЧАЕТ что нет такого файла!!!

    ОтветитьУдалить
  5. аха - я просто слепой дурак, который этот файл переименовал, закинул в указанную папку и теперь прога, которую я носом ткнул в этот файл доказывает мне, что такого файла в дире нет )))) жжош денис - тебе в камеди выступать

    ОтветитьУдалить
  6. извини за грубость - видать настроение было не пушистое, а прога реально не пашет - у меня с ней так и не вышло... обычно бывает так - начинаешь с одной фиговиной работать, но в процессе она оказываецца шлак и ты находишь кучу другого софта, с помощью которого всё получаецца, но в какой последовательности и что именно ты применял и к чему забываецца, ты довольный собой и своим творением, выкладываешь то, что у тебя было изначально забыв упомянуть все приключения в "пути" и у остальных тоже естественно ничего не получаецца и они, мягко говоря, "выходят из себя"

    ОтветитьУдалить
  7. Проверьте совпадает ли регистр имени файла
    D:\TEST\D.APK и D:\test\d.apk - разные файлы
    Это прикол многих java-утилит

    Мужики, будьте терпимей! Хреновая статья - да и хрен с ней. Есть где написано лучше - не стесняемся кидаем пруфлинки в комменты )))

    ОтветитьУдалить
  8. так что надо делать
    ?

    ОтветитьУдалить
  9. Єто просто жесть - сделал всё как тут написано - создало оно мне папку з названием аплика, НО - она пуста. Что ж за прикол такой ?

    ОтветитьУдалить
  10. спасибо автору прога реально работает я вот сижу и переделываю игру прикольно спасибо большое

    ОтветитьУдалить
  11. "файл будет перепакован в .jar, который можно уже открыть для редактирования в JD-GUI"
    ничего не выйдет. Это не редактор а декомпилятор. Максимум что можно сделать, сохранить все классы в яве и то кривой яве. Открой эти классы для редактирования к примеру в JBuilder и там будет столько ошибок, просто ужжжжжоооссс! :) И все на этом. Компильнуть обратно никак :)

    ОтветитьУдалить
  12. Процесс запустился и не остановился:

    http://hkar.ru/exzB

    ОтветитьУдалить
  13. Dex2Jar с этим проблемка не хочет создовать jar подскажите почему так

    ОтветитьУдалить