Есть ли способ получить исходный код из файла APK? - PullRequest
1178 голосов
/ 29 августа 2010

Жесткий диск на моем ноутбуке просто сломался, и я потерял весь исходный код приложения, над которым я работал последние два месяца. Все, что у меня есть, это файл APK, который хранится в моем письме, когда я отправил его другу.

Есть ли способ извлечь мой исходный код из этого файла APK?

Ответы [ 21 ]

1486 голосов
/ 21 мая 2011

Простой способ: использовать онлайн-инструмент http://www.javadecompilers.com/apk, загрузить apk и получить исходный код.


Процедура декодирования файлов .apk, пошаговый метод:

Шаг 1:

  1. Создайте новую папку и скопируйте файл .apk, который вы хотите декодировать.

  2. Теперь переименуйте расширениеэтот файл .apk в .zip (например, переименуйте из filename.apk в filename.zip) и сохраните его.Теперь вы можете получить доступ к файлам classes.dex и т. Д. На этом этапе вы можете видеть графические объекты, но не файлы XML и Java, поэтому продолжайте.

Шаг 2:

  1. Теперь извлеките этот ZIP-файл в ту же папку (или NEW FOLDER).

  2. Загрузите dex2jar и извлеките его в тот же файл.папка (или НОВАЯ ПАПКА).

  3. Переместите файл classes.dex в папку dex2jar.

  4. Теперь откройте командную строку и измените каталог наэта папка (или НОВАЯ ПАПКА).Затем напишите d2j-dex2jar classes.dex (для терминала Mac или Ubuntu напишите ./d2j-dex2jar.sh classes.dex) и нажмите ввод.Теперь у вас есть файл classes.dex.dex2jar в той же папке.

  5. Загрузите Java-декомпилятор , дважды щелкните jd-gui, нажмите на открытый файл иоткройте файл classes.dex.dex2jar из этой папки: теперь вы получаете файлы классов.

  6. Сохраните все эти файлы классов (в jd-gui выберите Файл -> Сохранить все источники) с помощьюимяНа этом этапе вы получаете исходный код Java, но XML-файлы по-прежнему не читаются, поэтому продолжайте.

Шаг 3:

Теперь откройте еще одну новую папку

  1. Поместите в файл .apk, который вы хотите декодировать

  2. Загрузите последнюю версию apktool AND apktool install window (оба можно скачать по одной и той же ссылке) и поместить их в одну папку

  3. Открыть командное окно

  4. Теперь запуститекоманда типа apktool if framework-res.apk (если у вас ее нет , получите ее здесь ) и затем

  5. apktool d myApp.apk (где myApp.apk обозначает имя файла, которое выхотите декодировать)

теперь вы получаете папку с файлами в этой папке и можете легко читать XML-файлы АПК.

Шаг 4:

Это не какой-либо шаг, просто скопируйте содержимое обеих папок (в данном случае обе новые папки) в одну

и наслаждайтесь исходным кодом...

117 голосов
/ 14 марта 2013

Это альтернативное описание - на случай, если кто-то застрянет с описанием выше. Следуйте инструкциям:

  1. загрузить apktool.bat (или apktool для Linux) и apktool_<version>.jar из http://ibotpeaches.github.io/Apktool/install/
  2. переименуйте файл jar сверху на apktool.jar и поместите оба файла в одну папку

  3. откройте окно DOS (cmd.exe) и перейдите в эту папку; убедитесь, что установлена ​​среда Java (для Linux также проверьте примечания относительно необходимых библиотек)
  4. Начало: apktool decode [apk file]

    Промежуточный результат : файлы ресурсов, AndroidManifest.xml

  5. unzip APK файл с распаковщиком на ваш выбор

    Промежуточный результат : classes.dex

  6. скачать и извлечь dex2jar-0.0.9.15.zip из http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=
  7. перетащите classes.dex на dex2jar.bat (или введите <path_to>\dex2jar.bat classes.dex в поле DOS; для Linux используйте dex2jar.sh)

    Промежуточный результат : classes_dex2jar.jar

  8. распаковать classes_dex2jar.jar (может быть необязательным в зависимости от используемого декомпилятора)
  9. декомпилируйте ваши файлы классов (например, с помощью JD-GUI или DJ Decompiler )

    Результат : исходный код

Примечание: нельзя декомпилировать сторонние пакеты; это руководство предназначено для восстановления личного исходного кода только из файла APK; наконец, результирующий код, скорее всего, будет запутан

107 голосов
/ 29 августа 2010

Хотя вы можете декомпилировать файл APK, вы, вероятно, столкнетесь с одной большой проблемой:

он не вернет код, который вы написали.Вместо этого он будет возвращать все, что встроено компилятором, с переменными с произвольными именами, а с функциями с произвольными именами.Может потребоваться значительно больше времени, чтобы попытаться декомпилировать и восстановить его в коде, который вы имели, чем начать заново.

К сожалению, подобные вещи убили многие проекты.
В будущем,Я настоятельно рекомендую изучить систему контроля версий, такую ​​как CVS , SVN и git и т. Д.

и способы ее резервного копирования.

49 голосов
/ 11 января 2014

В Play Store также есть новое приложение, с помощью которого можно декомпилировать apk (системные приложения тоже) и просматривать исходный код прямо на вашем смартфоне. Он сохраняет файлы на вашу SD-карту, чтобы вы могли просматривать их и на своем компьютере. Не требует рута или чего-то еще.

Просто установите и получайте удовольствие. Я думаю, что это самый простой способ декомпилировать приложение.

27 голосов
/ 29 августа 2010

apktool - это лучшее, что вы можете попробовать. Я сохранил немного XML с ним, но, честно говоря, я не знаю, как это будет работать с кодом .java.

Я бы порекомендовал вам иметь хранилище кода, даже если вы единственный кодер. Я использовал Project Locker для своих собственных проектов. Он дает вам бесплатные репозитории SVN и GIT.

21 голосов
/ 06 декабря 2012

В этих двух статьях описано, как объединить использование apktool и dex2jar для получения файла APK и создания проекта Eclipse, который может его собрать и запустить.

http://blog.inyourbits.com/2012/11/extending-existing-android-applications.html

http://blog.inyourbits.com/2012/12/extending-existing-android-applications.html

В основном вы:

  1. Используйте apktool, чтобы получить файлы ресурсов из apk
  2. Используйте dex2jar, чтобы получить файл jar, содержащий классы в формате, который понравится Eclipse.
  3. Создайте проект Eclipse, укажите его в файлах ресурсов и новом файле jar
  4. Откройте файл jar утилитой zip и удалите существующие ресурсы
  5. Откройте файл jar с помощью JDGui, чтобы просмотреть исходный код
  6. Возьмите любой необходимый исходный код из JDGui, вставьте его в класс внутри Eclipse и измените его
  7. Удалить этот класс из файла jar (чтобы один и тот же класс не определялся несколько раз)
  8. Запустите его.
19 голосов
/ 29 августа 2010

apktool будет работать. Вам даже не нужно знать хранилище ключей для извлечения исходного кода (что немного страшно). Основным недостатком является то, что источник представлен в формате Smali вместо Java. Другие файлы, такие как icon и main.xml, проходят отлично, хотя, возможно, стоит хотя бы восстановить их. В конечном итоге вам, скорее всего, придется переписывать код Java с нуля.

Вы можете найти apktool здесь . Просто скачайте apktool и соответствующий помощник (для Windows, Linux или Mac OS). Я рекомендую использовать такой инструмент, как 7-zip, чтобы распаковать их.

12 голосов
/ 11 августа 2017

Есть несколько способов сделать это:

  1. Использовать функцию «Профиль или Отладка APK» в Android Studio 3.0.

    Позволяет открывать иизучить APK в Android Studio.Классы декомпилированы в smali.Ресурсы не извлекаются, и такие вещи, как «Перейти к определению», «Найти все ссылки» и отладка, не работают без исходного кода (android studio 3.0 canary 9).Некоторые дополнительные функции smali могут работать с smallidea .

    android-studio

    select-file

    code

  2. Использование jadx .

    Jadx декомпилирует код в данном APK в исходные файлы Java.

    jdax-img

  3. Используйте apktool .

    Apktool - это инструмент командной строки, который извлекает ресурсы и декомпилирует код в smali для данного apk.Вы также можете перекомпилировать, используя apktool.Вот пример этого в действии:

    $ apktool d test.apk
    I: Using Apktool 2.2.4 on test.apk
    I: Loading resource table...
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: 1.apk
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Baksmaling classes.dex...
    I: Copying assets and libs...
    I: Copying unknown files...
    I: Copying original files...
    $ apktool b test
    I: Using Apktool 2.2.4 on test
    I: Checking whether sources has changed...
    I: Smaling smali folder into classes.dex...
    I: Checking whether resources has changed...
    I: Building resources...
    I: Building apk file...
    I: Copying unknown files/dir...
    
8 голосов
/ 25 мая 2017

Может быть проще увидеть источник:

В Android Studio 2.3, Build -> Analyze APK -> Select the apk that you want to decompile.
Вы увидите его исходный код.

Ссылка для справки:
https://medium.com/google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2

6 голосов
/ 25 февраля 2013

Я покажу вам другой способ декомпиляции файлов .apk .

Первые два шага вы можете выполнить из " prankul garg ".Таким образом, у вас есть другие возможности:

Шаг 3 ':

Загрузить "JD-GUI" , который легко найти.Откройте файл .jar в "jd-gui.exe".(Файл> Открыть файл> 'нашел ваш .jar файл').После этой процедуры вы можете сохранить все ресурсы в файле .zip .

Итак,

1-й - вам нужно переименовать .apk файл в .zip

2nd - Вы должны декодировать файл .dex (если хотите, декодируйте файл .apk в dex2jar , это возможно)

3-ий - Вы должны декодировать .jar файл с помощью JD-GUI

...