Как скомпилировать андроид приложение
Для того чтобы редактировать APK приложения. Прежде всего их нужно декомпилировать, а после скомпилировать! Как это сделать и чем можно узнать в этом уроке.
В прошлом уроке вы узнали из чего состоят основные внутренности приложения, а также что данные что APK приложения (в дальнейшем просто APK) можно открыть архиватором, но что либо изменить у вас не получиться! Нужна Декомпиляция APK приложения Android!
Содержание:
- Необходимые инструменты
- Настройка
- Декомпиляция приложения с помощью Apktool через командную строку
- Компиляция приложения с помощью Apktool через командную строку
- Что необходимо чтобы работать с системными APK
- Графические надстройки утилиты ApkTool
Декомпиляция и Компиляция APK приложения Android
Необходимые компоненты
Настройка Java
После установки Java JDK , необходимо, добавить ее в переменную Windows. Если кто не понял официальное куроводство то,
Скопируйте путь Java JDK:
Перейдите в меню Дополнительные настройки:
(Мой) Компьютер ->Свойства системы->Дополнительные параметры системы->Дополнительно->Системные переменные->Правка
Java JDK настроена!
Настройка ApkTool
- Создать папку на диске C:\ и в нее переместить файлы apktool_x_x.jar и apktool.bat
- Файл apktool_x_x.jar переименовать в apktool.jar
Если появилось наподобие такой вывод информации, то все сделано правильно.
Декомпиляция APK
Чтобы декомпилировать приложение, скопируйте файл APK приложения в папку где находится apktool, далее необходимо выполнить вот что, в командной строке ввести команду:
apktool d название.apk
apktool d browser.apk
После того как вы отредактируете или русифицируете APK, его надо компилировать обратно.
Компиляция APK
Вводим в командной строке:
После чего перейдите в папку проекта ( в данном случае папка browser) и вы увидете две новые папки:
После компиляции приложения apk его необходимо подписать.
Подпись APK
- Для этого Вам надо разархивировать архив Sign Android;
- Скопировать готовое приложение в папку с распакованным Sign Android;
- Потянуть приложение на файл Sign_APK.bat после чего приложение будет подписано!
Готовое подписанное приложение будет носить название apk_signed.apk
Работа с системными APK
Для того чтобы модифицировать системные приложения необходимо прежде всего необходимо скормить программе APKTOOL системный файл framework -res.apk который находиться в системном разделе Android:
/system/framework/framework -res.apk
Для того чтобы скормить Apktool данный файл необходимо, ввести команду:
apktool if framework -res.apk
Учитывайте что, команду нужно вводить относительно пути расположения, то есть если файл framework -res.apk находиться в папке C:\primer, то команда будет выглядеть следующим обзором:
apktool if С:\primer\framework -res.apk
Также для того чтобы можно было модифицировать системные файлы прошивка должна быть вначале Deodex-ирована.
Теперь как это можно все упросить! (не использовать командную строку)
Скачайте приложение SmartApkTool, данное программа имеет графический интерфейс и очень легкая в использование. Автор данной программы мой хороший друг Никита Коровкин (на данный момент работает в Surfingbird)! за что ему огромное Спасибо!
Как пользоваться SmartApkTool
Прежде всего вам надо установить и настроить Java JDK и Apktool как указано выше.
Откройте программу SmartApkTool
Если Вам необходимо Декомпилировать приложение в SmartApkTool, то выберите данный пункт и необходимое приложение
Если компилировать, то
и выбрать файл в проекте apktool.yml
Для подписи приложения APK, нажать обзор, выбрать приложение и подписать
Все так легко и просто!
Альтернативный вариант
Для тех кому не понравился SmartApkTool, есть альтернатива Android MultiTool
Иногда некоторые приложения на Android чем-то не устраивают пользователя. В качестве примера можно привести назойливую рекламу. А то бывает и так — всем хороша программа, да только перевод в ней или кривой, или вовсе отсутствует. Или, например, программа триальная, а получить полную версию возможности нет. Как же изменить ситуацию?
Введение
В этой статье мы поговорим о том, как разобрать пакет APK с приложением, рассмотрим его внутреннюю структуру, дизассемблируем и декомпилируем байт-код, а также попробуем внести в приложения несколько изменений, которые могут принести нам ту или иную выгоду.
Чтобы сделать все это самостоятельно, потребуются хотя бы начальные знания языка Java, на котором пишутся приложения для Android, и языка XML, который используется в Android повсеместно — от описания самого приложения и его прав доступа до хранения строк, которые будут выведены на экран. Также понадобится умение обращаться со специализированным консольным софтом.
Итак, что же представляет собой пакет APK, в котором распространяется абсолютно весь софт для Android?
Декомпиляция приложений
В статье мы работали только с дизассемблированным кодом приложения, однако если в большие приложения вносить более серьезные изменения, разобраться в коде smali будет гораздо сложнее. К счастью, мы можем декомпилировать код dex в Java-код, который будет хоть и не оригинальным и не компилируемым обратно, но гораздо более легким для чтения и понимания логики работы приложения. Чтобы сделать это, нам понадобятся два инструмента:
Использовать их следует так. Сначала запускаем dex2jar, указывая в качестве аргумента путь до apk-пакета:
В результате в текущем каталоге появится Java-пакет mail.jar, который уже можно открыть в jd-gui для просмотра Java-кода.
Устройство APK-пакетов и их получение
Пакет приложения Android, по сути, является обычным ZIP-файлом, для просмотра содержимого и распаковки которого никаких специальных инструментов не требуется. Достаточно иметь архиватор — 7zip для Windows или консольный unzip в Linux. Но это что касается обертки. А что внутри? Внутри же у нас в общем случае такая структура:
- META-INF/ — содержит цифровой сертификат приложения, удостоверяющий его создателя, и контрольные суммы файлов пакета;
- res/ — различные ресурсы, которые приложение использует в своей работе, например изображения, декларативное описание интерфейса, а также другие данные;
- AndroidManifest.xml — описание приложения. Сюда входит, например, список требуемых разрешений, требуемая версия Android и необходимое разрешение экрана;
- classes.dex — компилированный байт-код приложения для виртуальной машины Dalvik;
- resources.arsc — тоже ресурсы, но другого рода — в частности, строки (да-да, этот файл можно использовать для русификации!).
Перечисленные файлы и каталоги есть если не во всех, то, пожалуй, в абсолютном большинстве APK. Однако стоит упомянуть еще несколько не столь распространенных файлов/каталогов:
- assets — аналог ресурсов. Основное отличие — для доступа к ресурсу необходимо знать его идентификатор, список asset’ов же можно получать динамически, используя метод AssetManager.list() в коде приложения;
- lib — нативные Linux-библиотеки, написанные с помощью NDK (Native Development Kit).
Этот каталог используют производители игр, помещая туда движок игры, написанный на C/C++, а также создатели высокопроизводительных приложений (например, Google Chrome). С устройством разобрались. Но как же получить сам файл пакета интересующего приложения? Поскольку без рута с устройства забрать файлы APK не представляется возможным (они лежат в каталоге /data/app), а рутить не всегда целесообразно, имеется как минимум три способа получить файл приложения на компьютер:
- расширение APK Downloader для Chrome;
- приложение Real APK Leecher;
- различные файлообменники и варезники.
Какой из них использовать — дело вкуса; мы предпочитаем использовать отдельные приложения, поэтому опишем использование Real APK Leecher, тем более что написан он на Java и, соответственно, работать будет хоть в винде, хоть в никсах.
Настройка Real APK Leecher
Просмотр и модификация
Допустим, ты нашел интересующий тебя пакет, скачал, распаковал… и при попытке просмотра какого-нибудь XML-файла с удивлением обнаружил, что файл не текстовый. Чем же его декомпилировать и как вообще работать с пакетами? Неужели необходимо ставить SDK? Нет, SDK ставить вовсе не обязательно. На самом деле для всех шагов по распаковке, модификации и упаковке пакетов APK нужны следующие инструменты:
Использовать все эти инструменты можно и по отдельности, но это неудобно, поэтому лучше воспользоваться более высокоуровневым софтом, построенным на их основе. Если ты работаешь в Linux или Mac OS X, то тут есть инструмент под названием apktool. Он позволяет распаковывать ресурсы в оригинальный вид (в том числе бинарные XML- и arsc-файлы), пересобирать пакет с измененными ресурсами, но не умеет подписывать пакеты, так что запускать утилиту signer придется вручную. Несмотря на то что утилита написана на Java, ее установка достаточно нестандартна. Сначала следует получить сам jar-файл:
Далее нам понадобится скрипт-обвязка для запуска apktool (он, кстати, доступен и для Windows), включающий в себя еще и утилиту aapt, которая понадобится для запаковки пакета:
Далее просто сваливаем содержимое обоих архивов в каталог
/bin и добавляем его в $PATH:
Если же ты работаешь в Windows, то для нее есть превосходный инструмент под названиемVirtuous Ten Studio, который также аккумулирует в себе все эти инструменты (включая сам apktool), но вместо CLI-интерфейса предоставляет пользователю интуитивно понятный графический интерфейс, с помощью которого можно выполнять операции по распаковке, дизассемблированию и декомпиляции в несколько кликов. Инструмент этот Donation-ware, то есть иногда появляются окошки с предложением получить лицензию, но это, в конце концов, можно и потерпеть. Описывать его не имеет никакого смысла, потому что разобраться в интерфейсе можно за несколько минут. А вот apktool, вследствие его консольной природы, следует обсудить подробнее.
Импорт APK в Virtuous Ten Studio
Рассмотрим опции apktool. Если вкратце, то имеются три основные команды: d (decode), b (build) и if (install framework). Если с первыми двумя командами все понятно, то что делает третья, условный оператор? Она распаковывает указанный UI-фреймворк, который необходим в тех случаях, когда ты препарируешь какой-либо системный пакет.
Рассмотрим наиболее интересные опции первой команды:
- -s — не дизассемблировать файлы dex;
- -r — не распаковывать ресурсы;
- -b — не вставлять отладочную информацию в результаты дизассемблирования файла dex;
- --frame-path — использовать указанный UI-фреймворк вместо встроенного в apktool. Теперь рассмотрим пару опций для команды b:
- -f — форсированная сборка без проверки изменений;
- -a — указываем путь к aapt (средство для сборки APK-архива), если ты по какой-то причине хочешь использовать его из другого источника.
Пользоваться apktool очень просто, для этого достаточно указать одну из команд и путь до APK, например:
После этого в каталоге mail появятся все извлеченные и дизассемблированные файлы пакета.
Препарирование. Отключаем рекламу
Теория — это, конечно, хорошо, но зачем она нужна, если мы не знаем, что делать с распакованным пакетом? Попробуем применить теорию с пользой для себя, а именно модифицируем какую-нибудь софтину так, чтобы она не показывала нам рекламу. Для примера пусть это будет Virtual Torch — виртуальный факел. Для нас эта софтина подойдет идеально, потому что она под завязку набита раздражающей рекламой и к тому же достаточно проста, чтобы не потеряться в дебрях кода.
Поиск кода рекламы в jd-gui
Итак, с помощью одного из приведенных способов скачай приложение из маркета. Если ты решил использовать Virtuous Ten Studio, просто открой APK-файл в приложении и распакуй его, для чего создай проект (File -> New project), затем в контекстном меню проекта выбери Import File. Если же твой выбор пал на apktool, то достаточно выполнить одну команду:
После этого в каталоге com.kauf.particle.virtualtorch появится файловое дерево, похожее на описанное в предыдущем разделе, но с дополнительным каталогом smali вместо dex-файлов и файлом apktool.yml. Первый содержит дизассемблированный код исполняемого dex-файла приложения, второй — служебную информацию, необходимую apktool для сборки пакета обратно.
Первое место, куда мы должны заглянуть, — это, конечно же, AndroidManifest.xml. И здесь мы сразу встречаем следующую строку:
Нетрудно догадаться, что она отвечает за предоставление приложению полномочий на использование интернет-соединения. По сути, если мы хотим просто избавиться от рекламы, нам, скорее всего, достаточно будет запретить приложению интернет. Попытаемся это сделать. Удаляем указанную строку и пробуем собрать софтину с помощью apktool:
В каталоге com.kauf.particle.virtualtorch/build/ появится результирующий APK-файл. Однако установить его не получится, так как он не имеет цифровой подписи и контрольных сумм файлов (в нем просто нет каталога META-INF/). Мы должны подписать пакет с помощью утилиты apk-signer. Запустили. Интерфейс состоит из двух вкладок — на первой (Key Generator) создаем ключи, на второй (APK Signer) подписываем. Чтобы создать наш приватный ключ, заполняем следующие поля:
- Target File — выходной файл хранилища ключей; в нем обычно хранится одна пара ключей;
- Password и Confirm — пароль для хранилища;
- Alias — имя ключа в хранилище;
- Alias password и Confirm — пароль секретного ключа;
- Validity — срок действия (в годах). Значение по умолчанию оптимально.
Остальные поля, в общем-то, необязательны — но необходимо заполнить хотя бы одно.
Создание ключа в apk-signer
WARNING
Чтобы подписать приложение с помощью apk-signer, ты должен установить Android SDK и указать полный путь до него в настройках приложения.
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Теперь этим ключом можно подписать APK. На вкладке APK Signer выбираем только что сгенерированный файл, вводим пароль, алиас ключа и пароль к нему, затем находим файл APK и смело жмем кнопку «Sign». Если все пройдет нормально, пакет будет подписан.
Так как мы подписали пакет нашим собственным ключом, он будет конфликтовать с оригинальным приложением, а это значит, что при попытке обновить софтину через маркет мы получим ошибку.
Цифровая подпись необходима только стороннему софту, поэтому если ты занимаешься модификацией системных приложений, которые устанавливаются копированием в каталог /system/app/, то подписывать их не нужно.
Обычно авторы приложений создают специальные классы для вывода рекламы и вызывают методы этих классов во время запуска приложения или одной из его «активностей» (упрощенно говоря, экранов приложения). Попробуем найти эти классы. Идем в каталог smali, далее com (в org лежит только открытая графическая библиотека cocos2d), далее kauf (именно туда, потому что это имя разработчика и там лежит весь его код) — и вот он, каталог marketing. Внутри находим кучу файлов с расширением smali. Это классы, и наиболее примечателен из них класс Ad.smali, по названию которого нетрудно догадаться, что именно он выводит рекламу.
Мы могли бы изменить логику его работы, но гораздо проще будет тупо убрать вызовы любых его методов из самого приложения. Поэтому выходим из каталога marketing и идем в соседний каталог particle, а затем в virtualtorch. Особого внимания здесь заслуживает файл MainActivity.smali. Это стандартный для Android класс, который создается Android SDK и устанавливается в качестве точки входа в приложение (аналог функции main в Си). Открываем файл на редактирование.
Внутри находится код smali (местный ассемблер). Он довольно запутанный и трудный для чтения в силу своей низкоуровневой природы, поэтому мы не будем его изучать, а просто найдем все упоминания класса Ad в коде и закомментируем их. Вбиваем строку «Ad» в поиске и попадаем на строку 25:
Здесь происходит создание объекта. Комментируем. Продолжаем поиск и находим в строках 433, 435, 466, 468, 738, 740, 800 и 802 обращения к методам класса Ad. Комментируем. Вроде все. Сохраняем. Теперь пакет необходимо собрать обратно и проверить его работоспособность и наличие рекламы. Для чистоты эксперимента возвращаем удаленную из AndroidManifest.xml строку, собираем пакет, подписываем и устанавливаем.
Наш подопытный кролик. Видна реклама Он же, но уже без рекламы
Оп-па! Реклама пропала только во время работы приложения, но осталась в главном меню, которое мы видим, когда запускаем софтину. Так, подождите, но ведь точка входа — это класс MainActivity, а реклама пропала во время работы приложения, но осталась в главном меню, значит, точка входа другая? Чтобы выявить истинную точку входа, вновь открываем файл AndroidManifest.xml. И да, в нем есть следующие строки:
Они говорят нам (и, что важнее, андроиду) о том, что активность с именем Start должна быть запущена в ответ на генерацию интента (события) android.intent.action.MAIN из категории android.intent.category.LAUNCHER. Это событие генерируется при тапе на иконку приложения в ланчере, поэтому оно и определяет точку входа, а именно класс Start. Скорее всего, программист сначала написал приложение без главного меню, точкой входа в которое был стандартный класс MainActivity, а затем добавил новое окно (активность), содержащее меню и описанное в классе Start, и вручную сделал его точкой входа.
Открываем файл Start.smali и вновь ищем строку «Ad», находим в строках 153 и 155 упоминание класса FirstAd. Он тоже есть в исходниках и, судя по названию, как раз и отвечает за показ объявлений на главном экране. Смотрим дальше, идет создание экземпляра класса FirstAd и интента, по контексту имеющего отношение к этому экземпляру, а дальше метка cond_10, условный переход на которую осуществляется аккурат перед созданием экземпляра класса:
Скорее всего, программа каким-то случайном образом вычисляет, нужно ли показывать рекламу на главном экране, и, если нет, перескакивает сразу на cond_10. Ок, упростим ей задачу и заменим условный переход на безусловный:
Больше упоминаний FirstAd в коде нет, поэтому закрываем файл и вновь собираем наш виртуальный факел с помощью apktool. Копируем на смартфон, устанавливаем, запускаем. Вуаля, вся реклама исчезла, с чем нас всех и поздравляем.
- Перевод приложений Android;
- пример снятия триала с приложения.
Итоги
Эта статья лишь краткое введение в методы вскрытия и модификации Android-приложений. За кадром остались многие вопросы, такие как снятие защиты, разбор обфусцированного кода, перевод и замена ресурсов приложения, а также модификация приложений, написанных с использованием Android NDK. Однако, имея базовые знания, разобраться во всем этом — лишь вопрос времени.
Может кто-нибудь рассказать поэтапно как скомпилировать какой-нибудь код (например на C++) на Андроиде? Я в этом без понятия, но знаю что это достаточно сложно.
Ваш код написан к примеру на Java (Это более частый случай). Каждое Android -приложение состоит из компонентов. Компоненты реализованы в виде Java-классов.
Например, Activity в Android представляет экран или часть экрана устройства пользователя. Это экземпляр класса Java с именем Android.app.Activity .
Другим примером является элемент пользовательского интерфейса Button . Кнопка в приложении Android - это экземпляр класса Java с именем Android.widget.Button .
1. Компиляторы Android (DALVIK vs ART)
Ваш исходный код компилируется стандартным компилятором Java, который использует модель компиляции JIT-Just-In-Time. Как только код скомпилирован, он становится байт-кодом (с расширением «.class»). Этот код идет на второй раунд компиляции (опять-таки к байт-коду - но на этот раз он свернут). Байт-код исполняется с помощью JVM для конкретных целей (виртуальная машина Java), которая является средой выполнения для Java. Но для Android у нас есть две разные виртуальные машины:
DALVIK
До ART (который был представлен с выпуском Android 4.4, то есть Kitkat), средой выполнения для приложений Android была DALVIK. У DALVIK был один существенный недостаток - это было МЕДЛЕННО!
Пользователям было неприятно использовать свои приложения на своих устройствах, поскольку приложения зависали во время работы.
Dalvik использует модель компиляции JIT. JIT-компилятор компилирует приложение, когда они открываются пользователями (процедура запуска приложения). Таким образом, это замедляло открытие приложений и, в свою очередь, затрудняло работу пользователя.
ART использует опережающую модель компиляции, которая компилирует приложения в машинный код после установки
Приложения работают немного быстрее! в рамках ART время запуска приложений сокращается.
Он также улучшил сборку мусора, так что пользователь видит меньше пауз и заиканий в среде с низким объемом памяти. АРТ имеет свои ограничения:
- Проблема со временем установки: Процесс установки медленный с ART, поскольку преобразование приложений в машинный код занимает много времени.
- Проблема размера: компиляция кода после установки означает, что приложение должно «жить» на вашем устройстве. Таким образом, для относительно меньшего Java-кода машина или байт-код будут сравнительно большими.
Вот тут обсуждают что лучше Dalvik или ART.
2. Процесс компиляции Android
2.1. Из исходного кода в байт-код
Вам понадобится JDK (Java Developer Kit) для компиляции кода Java вашего приложения.
Ваш код и предварительно скомпилированные классы из среды выполнения и пользовательских библиотек сначала компилируются Javac (JIT Compiler / Standard Java Compiler) .
Javac выводит набор файлов байт-кода Java. Пока это выглядит как любой процесс компиляции Java , но следующий шаг компиляции делает процесс компиляции уникальным для Android .
2.2. Обфускатор (ProGuard инструмент)
Этот шаг не является обязательным, вы можете пропустить этот шаг, если хотите.
Инструмент ProGuard берет файлы байт-кода Java (выводится как шаг № 1) и отправляет их через инструмент с именем ProGuard. Это сведет к минимуму и запутает (то есть - сделает неясным, неясным или неразборчивым) ваш код.
По умолчанию он отключен в новых проектах Android , но когда ProGuard включен, он анализирует ваш код и удаляет реализации методов, например, которые не вызываются.
Это может значительно сократить ваш пакет распространяемого приложений. Он также запутывает ваш код, изменяя имена методов и так усложняя декомпиляцию упакованного Java-кода третьим лицом или организацией.
Независимо от использования ProGuard вы снова получите файлы .class (минимизированный байт-код).
2.3. От минимизированного байт-кода до кода dex
Следующим шагом является получение выходных файлов из шага № 2 и преобразование этих файлов в байт-код dex - Dalvik EXecutable (.DEX) .
Байт-код DEX - это формат, оптимизированный для Android , который может быть выполнен в более старой среде выполнения DALVIK или более новой среде выполнения ART .
2.4. Исполнение машинного кода
Во время выполнения устройства считывают эти файлы dex (вывод шага № 3) и перекомпилируют некоторые файлы в машинный код для максимально быстрого выполнения.
В DALVIK этот шаг происходит, когда приложение работает с использованием архитектуры Just-In-Time или JIT .
В более новой версии ART перекомпиляция (или перевод в машинный код) происходит при первой установке приложения, что означает, что приложение может работать быстрее, когда пользователь запускает его на своем устройстве.
И вот как ваш код Java превращается во что-то, что работает на Android . Он начинается с Java и через пару шагов превращается в то, что может прочитать и выполнить среда выполнения Android .
Вот еще есть иллюстрация:
Вот ссылки после исследования вопроса. Некоторые были использованы для построения этого вопроса: ссылка_1 и ссылка_2. А вот и первоисточник этого ответа. Данная информация находится в полностью свободном доступе :) Надеюсь вам стало немного понятнее как именно компилируются приложения.
Привет, в прошлом уроке мы закончили с каркасом и основными настройками нашего проекта. Сегодня давайте научимся компилировать приложение. Вы можете заказать компилирование приложения, воспользоваться сервисом по компилированию приложения или же сделать это самостоятельно через консоль.
Kwork услуги
Сервисы создания приложений
Когда я только начинал делать приложения, я использовал сервисы по конвертированию приложения из сайта. Способ рабочий, но есть нюансы. Кто-то вставляет свою рекламу в ваши приложения, мотивируя вас подключить платный тариф. Где-то нужно собирать вручную вебвью и минимальный интерфейс.
Сервис делает мобильное приложение для iOS и Android из вашего WordPress, конвертируя и адаптируя его для огромного количества устройств в автоматическом режиме.
Сервис, который конвертирует сайт в мобильное приложение для Android, iOS и WinPhone за 5 минут. Без рекламы и с PUSH рассылкой.
Бесплатный веб-сервис, который позволяет сконвертировать контент вашего сайта в Android приложение и распространить его через Google Play.
Бесплатный сервис для создания приложений, но вставляет свою рекламу в созданные приложения, можно отключить всего за 5 у.е в месяц.
Сервис с готовыми шаблонами и возможностью отправлять пуш уведомления. Делает приложения для iTunes, Android Market, Blackberry Marketplace, Windows Marketplace и Facebook.
Дешевый сервис с бесплатными тарифами, бывший appmakr. Делает приложения как для Android, так и IOS.
Создание в Android Studio
Начните установку, в процессе вам потребуются дополнительные ресурсы, вроде эмулятора и SDK, инсталятор скачает всё в автоматическом режиме.
Дальше вам нужно установить эмулятор и Android OS, чтобы запускать и тестировать свое приложение. Найдите в правом верхнем углу иконку как на скриншоте и создайте виртуальное устройство.
При конфигурации виртуальной среды выберите версию операционной системы, она скачается и установится автоматически.
Читайте также: