Публикуем приложения в Google Play и зарабатываем миллионы. Публикуем приложения в Google Play и зарабатываем миллионы Как извлечь подпись файла apk

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

Необходимое условие для этого - наличие подписанного APK файла. Как подписать apk файл, вы узнаете из этой статьи.

Небольшое отступление

Когда мой pet project вплотную приблизился к релизу, я начал искать информацию о том, как быстро и без боли опубликовать приложение. Множество найденных инструкций выглядели простыми. Я выбрал инструкцию авторов фреймворка Ioniс, на котором и разработано приложение. Не все получилось с первого раза, есть несколько особенностей. Процесс подписывания описан в этой статье, важные моменты особо выделены.

Исходные данные

Я предполагаю, что у вас настроено все необходимое для разработки гибридных мобильных приложений с помощью Apache Cordova. Должно быть установлено: В качестве имени проекта и приложения используется lcf. Замените на имя своего проекта там, где это необходимо.

Поехали

Для начала нужно создать релизный билд вашего приложения. Но перед этим, давайте убедимся, что все лишние плагины удалены. Например, нам не нужен плагин, который выводит отладочную информацию в консоль. Удалим его:

$ cordova plugin rm cordova-plugin-console
Для генерации релизной сборки под Андроид используем команду build с флагом --release :

$ cordova build --release android
Эта команда создаст неподписанный APK файл в каталоге:

Platforms/android/build/outputs/apk
Например, platforms/android/build/outputs/apk/android-release-unsigned.apk . Потом нам понадобится подписать этот файл и запустить утилиту zipalign для оптимизации и подготовки файла для Google Play.

Для подписывания файла нужен сертификат. Создадим его с помощью утилиты keytool , которая включена в JDK:

$ keytool -genkey -v -keystore lcf.keystore -alias lcf -keyalg RSA -keysize 2048 -validity 10000
Важно

Значение параметра -alias необходимо запомнить, а лучше записать. В примере выше он равен lcf (по первым буквам названия приложения Loyal Client Free). Детали здесь приводить не буду, если будет интересно, напишите в комментарии, я расскажу подробнее.

Алиас используется каждый раз при подписывании* приложения. Чтобы было проще запомнить, в качестве алиаса используйте имя keystore файла, например:


-keystore hello-world.keystore -alias hello-world -keystore weather-app.keystore -alias weather-app -keystore todo.keystore -alias todo
* Подписывать приложение нужно при каждом выпуске обновлений

Утилита keytool задает ряд вопросов. Всего их будет 8. Чтобы заранее иметь представление о вопросах и примерных ответах, все они приведены далее, под спойлером.

Вопросы keytool и примерные ответы на них

1. Enter keystore password:
Здесь необходимо ввести пароль для файла (не менее 6 символов). Введенный пароль нужно записать в надежном месте, он нужен всякий раз при подписывании приложения.

2. Re-enter new password:
Повторный ввод пароля.

3. What is your first and last name?
: Ivan Petrov
Ваше имя и фамилия. Значение в квадратных скобках - это значение по умолчанию.

4. What is the name of your organizational unit?
: IT
Название подразделения вашей компании. Можно оставить пустым, я указываю IT.

5. What is the name of your organization?
: 2developers
Название вашей организации. Укажите, если есть.

6. What is the name of your City or Locality?
: Moscow
Название города

7. What is the name of your State or Province?
: MO
Название области

8. What is the two-letter country code for this unit?
: RU
Код страны. Я указываю RU.

: y

Подтверждайте, если все верно или нажмите Enter, чтобы ввести еще раз.


В конце появится сообщение об успешной генерации ключа. Будет предложено задать пароль для приватного ключа (если хотите оставить такой же, как и для сертификата - нажмите Enter):

Generating 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10 000 days for: CN=Ivan Petrov, OU=IT, O=2developers, L=Moscow, ST=MO, C=RU Enter key password for (RETURN if same as keystore password):
В текущем каталоге будет создан файл lcf.keystore .

Важно

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

Осталось два шага, и вы получите готовый к распространению APK файл. Переходим непосредственно к подписыванию.

Чтобы подписать ваш apk файл, используйте утилиту jarsigner , которая тоже включена в JDK.

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore lcf.keystore android-release-unsigned.apk lcf
Имя сертификата указывается после параметра -keystore , алиас - после имени файла.

Наконец, для оптимизации apk файла, воспользуемся утилитой zipalign :

$ zipalign -v 4 android-release-unsigned.apk LoyalClientFree.apk
Последний параметр - это имя файла, который вы будете загружать в Google Play.

Важно.

Утилита zipalign это часть Android SDK Tools и может быть найдена здесь:

/path/to/Android/sdk/build-tools/VERSION/zipalign

Заключение

Теперь у вас есть готовый к распространению apk файл, который можно загрузить в Google Play. Заполняйте описание, определяйте рейтинг своего приложения и смело жмите “Опубликовать”.

В статье присутствуют скриншоты, когда магазин приложений назывался "Android Market". Уже выросло поколение котов, которые никогда не слышали об этом названии. Но общий принцип не изменился. Оставил для истории. Я не могу заново пройти регистрацию, чтобы сделать новые скриншоты.

Так как мы волнуемся, то потренируемся на кошках. Возьмем, например, пример из статьи и попытаемся выложить его в Google Play. Если все получится, то дальше будет проще.

Прежде чем приступать к дальнейшим операциям, убедитесь, что у вас готовы собственные значки для приложений и название программы. Будет очень странно увидеть в магазине приложений программу со стандартным значком и названием "HelloWorld". А также проверьте все записи в файле манифеста.

Шаг первый. Он трудный самый

Любое приложение, выкладываемое в магазин, должно иметь подписанный сертификат. Сертификат позволяет идентифицировать вас как автора программы. И если кто-то попытается выложить программу с таким же именем как у вас, то ему будет отказано из-за конфликта имён. Под именем приложения имеется в виду полное название пакета.

Когда вы запускали свои приложения на эмуляторе или своём телефоне, то среда разработки автоматически подписывала программу отладочным сертификатом. Для распространения через магазин отладочный сертификат не подходит, и вам нужно подписать приложение своим уникальным сертификатом. Это бесплатно, без регистрации и смс.

Создадим подписанный APK-файл, который является что-то типа исполняемым файлом как notepad.exe в Windows. Если у вас открыта среда разработки Android Studio, то выберите в меню Build | Generate Signed APK... .

Появится диалоговое окно мастера, которое необходимо заполнить данными.

В первом поле следует указать путь к хранилищу ключей. Если вам раньше приходилось создавать программы раньше, в том числе и в Eclipse, то можете указать уже существующее хранилище через кнопку Choose existing... . Если вы создаёте хранилище первый раз, то выбирайте кнопку Create new... . Появится новое диалоговое окно.

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

Теперь создаёте ключ для приложения. В поле Alias (Псевдоним) вводите понятное вам и котам название ключа. Не обязательно создавать псевдоним для каждого приложения, можете использовать один псевдоним для своих приложений и отдельные псевдонимы для приложений под заказ.

Для ключа также нужно создать пароль и подтвердить его.

Ключ расчитан на 25 лет. Поле Validity (years) оставляем без изменений (если у вас нет весомых причин в обратном).

Напоследок заполняете данные о себе.

Заполнив поля, вы вернёмся к самому первому окну мастера.

Нажимаем на кнопку Next и в следующем окне вводим ещё один пароль для доступа к базе паролей.

Возможно, этого шага у вас не будет. Он может появиться, если вы отметили флажком опцию "Запомнить пароль". Подробностей не помню, разберётесь сами.

Последний шаг - нажать кнопку Finish .

Раньше это был последний шаг. Сейчас появились новые флажки V1 (Jar Signature) и V2 (Full APK Signature) . Отметьте как минимум первый вариант V1 - это соответствует старому способу. Второй способ считается более надёжным в плане взлома и его можно использовать для поздних API, на ваше усмотрение (см. ниже).

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

Нажав кнопку Show in Explorer , вы запустите Проводник на вашем компьютере с папкой, в которой находится подписанный файл.

Будьте аккуратны с созданным ключом. Именно он является гарантией, что новая версия программы написана вами. Поэтому, если вы потеряете созданный ключ, вам придется выкладывать программу под другим именем с новым ключом.

В студии предусмотрен режим автоматического создания подписанного приложения. Щёлкните правой кнопкой мыши на папке app и в контекстом меню выберите пункт Open Module Settings . Выберите раздел app в секции Modules . Выберите вкладку Signing . Нажимаете на кнопку с плюсиком и заполняете поля.

Переходите на вкладку Build Types и выбираете сборку release . В выпадающем списке Signing Config выбираете только что созданную конфигурацию. По умолчанию она имеет имя config .

Нажимаем OK для сохранения результатов.

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

v2 Full APK

В 2017 году Google немного изменила процесс подписания. Теперь существуют две схемы получения подписи APK: v1 JAR и v2 Full APK.

Подпись v1 (который существовал с самого начала) не защищает некоторые части APK, такие как метаданные ZIP. Верификатор APK должен обрабатывать множество ненадёжных структур данных, а затем отбрасывать данные, которые не подписаны, что предоставляет большой простор для атаки. Кроме того, верификатор APK должен распаковать все сжатые записи, что тратит много времени и памяти. Для решения проблем была разработана новая версия v2 Full APK, которую вы встретите при подписании вашего приложения.

Схема v2 работает в Android 7.0 Nougat (API 25). Схема обеспечивает более быструю установку приложения и хорошую защиту от несанкционированных изменений в APK. Содержимое APK хешируется и подписывается, затем полученный блок подписи APK вставляется в APK.

Новый формат обратно совместим, поэтому APK, подписанные новой схемой, могут быть установлены на более ранних устройствах (которые будут просто игнорировать новую подпись), если эти APK также подписаны схемой v1.

В старых приложениях я оставляю флажок у первой версии. Возможно, позже заставят переходить на вторую версию принудительно. Важно учитывать, что подписывать схемой v1 нужно до подписания схемой v2, поскольку APK не пройдёт проверку по схеме v2, если он будет подписан дополнительными сертификатами после подписания схемой v2.

Строго говоря, вы можете apk-файл выложить у себя на сайте, и все ваши посетители могут его скачать и установить на телефон. Но это как-то несолидно в наш век нанотехнологий. Поэтому переходим к следующему шагу.

Шаг второй. Надо, Федя, надо

Следующий шаг очень неприятный. Вам нужно подарить 25 вечнозеленых чужому человеку. Чтобы вам было не так обидно, данную операцию назвали регистрационным взносом. Вам понадобится кредитная карточка с указанной суммой. Учтите, что Visa Electron, а уж тем более дисконтная карточка сети магазинов "Перекресток" вам не подойдут. Если у вас уже есть нужная карточка, то пропускаете этот абзац. Остальным могу посоветовать завести QIWI-кошелёк и там завести виртуальную карточку. Именно так я и поступил, так как идти в банк и писать всякие заявления было неохота.

Автоматическое обновление

Если вы создали новую версию программы, исправив различные баги и добавив новые фотографии кота, то вам нужно в манифесте увеличить на единицу номер версии (атрибут versionCode ) и заменить versionName для себя (будет показана на странице Google Play). В последних версиях студии данные свойства находятся теперь не в манифесте, а в файле build.gradle модуля вашего приложения. Закачайте новую версию на Google Play и пользователи получат обновление в автоматическом режиме.

Следим за отзывами

Установите на своём устройстве приложение Google Play Developer Console , чтобы не пропустить новый отзыв на вашу программу. Также вы можете просматривать статистику.

Меняем пароли хранилища и псевдонима ключа

Не пришлось пользоваться за несколько лет, поэтому не знаю, актуальна ли данная информация.

Допустим, вы продали свою программу с исходниками другой компании. Чтобы она могла выкладывать обновления программы, компания должна подписывать приложение тем же ключом, которым подписывали вы. Иначе программа будет считаться другой и придётся менять название пакета. Но тогда старые пользователи не смогут получить обновления.

Но если вы все свои программы подписываете одним и тем же ключом и паролем, например cat cat , то компания может подписать этим же ключом и другие ваши приложения, разместив свои программы с таким же именем пакета, и вы никому ничего не докажете.

Поэтому вам нужно позаботиться о смене ключа для передачи новому владельцу.

Предположим наше хранилище имеет структуру:

Имя хранилища (keystore): old.keystore Пароль от хранилища: cat1 Псевдоним: my_alias Пароль от псеводнима: cat2

Сделайте копию вашего хранилища и сохраните его в другом месте. Это надо было сделать ещё при первом создании, потому что при потере хранилища вы не сможете восстановить доступ к своим программам при обновлении.

Сделайте копию вашего хранилища ещё раз и переименуйте его, например, new.keystore . С ним и будем работать.

Запускаем утилиту keytool с командой:

Keytool -storepasswd -keystore new.keystore

Вам будет предложено ввести текущий пароль, а затем ввести новый пароль и повторить его. Приблизительно так:

Enter keystore password: New keystore password: Re-enter new keystore password:

Первая часть задачи выполнена, пароль от хранилища изменён.

Если вы хотите также изменить и пароль от псевдонима, то снова запускаем утилиту с командой:

Keytool -keypasswd -keystore new.keystore -alias my_name

Вас попросят ввести текущий пароль от хранилища (ваш новый пароль), затем пароль для псевдонима. Вы можете ввести новый пароль и он заменит старый пароль.

Enter keystore password: Enter key password for

Пароль от псевдонима изменён.

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

Запускаем команду:

Keytool -changealias -keystore new.keystore -alias my_alias -destalias my_new_alias

Вас попросят ввести пароль от хранилища, затем пароль для нового псевдонима (текущий пароль), затем новый пароль и повторить его. Имя псевдонима будет изменено.

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

Подписываем готовое приложение

Такой случай может подвернуться, когда у вас утеряны исходники и есть только APK. Скорее всего это актуально для пиратов, которые переподписывают другие приложения (не делайте так с чужими программами).

Сначала поменяйте расширение с apk на zip. В архиве удалите папку META-INF . Восстановите расширение. Вы удалили старую подпись.

Теперь нужно подписать приложение новым ключом. Введите команду.

Jarsigner -keystore keystore-file.jks -storepass keystore_password -keypass alias_password --signedjar signed-apk-file.apk apk-file.apk alias_name

В успешном случае получите сообщение, что приложение подписано. Далее выполняем ещё одну команду.

ANDROID_SDK_PATH/build-tools/LAST_BUILD_TOOLS_VERSION/zipalign -v 4 signed-apk-file.apk aligned-apk-file.apk

В результате должен получиться APK-файл, подписанный новым ключом. Сам ни разу не применял.

Хранение ключей у Гугла

В 2017 году Google добавил новую возможность хранить ключи в облачном хранилише. Основное отличие заключается в том, что вы подписываете приложение специальным ключом загрузки, который Google проверяет и удаляет, заменяя его оригинальным ключом подписи приложения, который вы предоставили.

С его помощью можно управлять ключами подписи приложений как для новых, так и для опубликованных приложений, которые будут храниться у Google в их собственном хранилище ключей. Чтобы присоединиться к этой программе, необходимо подписаться на неё в своей Google Play Console. Стоит отметить, что отписаться от неё уже будет невозможно.

Такой способ очень полезен - при потере хранилища ключей Google Play App Signing позволит сбросить ключ для установки нового. Вам не придётся публиковать приложение повторно с новым именем пакета и ключом.

Дополнительное чтение

Android-keystore-password-recover by MaxCamillo - если вы утеряли пароль, то попробуйте воспользоваться данным инструментом. Сам не пользовался, поэтому рассказывать не буду.

Иногда некоторые приложения на Android чем-то не устраивают пользователя. В качестве примера можно привести назойливую рекламу. А то бывает и так - всем хороша программа, да только перевод в ней или кривой, или вовсе отсутствует. Или, например, программа триальная, а получить полную версию возможности нет. Как же изменить ситуацию?

Введение

В этой статье мы поговорим о том, как разобрать пакет APK с приложением, рассмотрим его внутреннюю структуру, дизассемблируем и декомпилируем байт-код, а также попробуем внести в приложения несколько изменений, которые могут принести нам ту или иную выгоду.

Чтобы сделать все это самостоятельно, потребуются хотя бы начальные знания языка Java, на котором пишутся приложения для Android, и языка XML, который используется в Android повсеместно - от описания самого приложения и его прав доступа до хранения строк, которые будут выведены на экран. Также понадобится умение обращаться со специализированным консольным софтом.

Итак, что же представляет собой пакет APK, в котором распространяется абсолютно весь софт для Android?

Декомпиляция приложений

В статье мы работали только с дизассемблированным кодом приложения, однако если в большие приложения вносить более серьезные изменения, разобраться в коде smali будет гораздо сложнее. К счастью, мы можем декомпилировать код dex в Java-код, который будет хоть и не оригинальным и не компилируемым обратно, но гораздо более легким для чтения и понимания логики работы приложения. Чтобы сделать это, нам понадобятся два инструмента:

  • dex2jar - транслятор байт-кода Dalvik в байт-код JVM, на основе которого мы сможем получить код на языке Java ;
  • jd-gui - сам декомпилятор, позволяющий получить из байт-кода JVM читаемый код Java . В качестве альтернативы можно использовать Jad (www.varaneckas.com/jad); хоть он и довольно старый, но в некоторых случаях генерирует более читаемый код, нежели Jd-gui.

Использовать их следует так. Сначала запускаем dex2jar, указывая в качестве аргумента путь до apk-пакета:

% dex2jar.sh mail.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 и, соответственно, работать будет хоть в винде, хоть в никсах.

После запуска программы необходимо заполнить три поля: Email, Password и Device ID - и выбрать язык. Первые два - e-mail и пароль твоего гуглоаккаунта, который ты используешь на устройстве. Третий же является идентификатором устройства, и его можно получить, набрав на номеронабирателе код # #8255## и затем найдя строку Device ID. При заполнении надо ввести только ID без префикса android-.

После заполнения и сохранения нередко выскакивает сообщение «Error while connecting to server». Оно не имеет отношения к Google Play, поэтому смело его игнорируй и ищи интересующие тебя пакеты.

Просмотр и модификация

Допустим, ты нашел интересующий тебя пакет, скачал, распаковал… и при попытке просмотра какого-нибудь XML-файла с удивлением обнаружил, что файл не текстовый. Чем же его декомпилировать и как вообще работать с пакетами? Неужели необходимо ставить SDK? Нет, SDK ставить вовсе не обязательно. На самом деле для всех шагов по распаковке, модификации и упаковке пакетов APK нужны следующие инструменты:

  • архиватор ZIP для распаковки и запаковки;
  • smali - ассемблер/дизассемблер байт-кода виртуальной машины Dalvik (code.google.com/p/smali);
  • aapt - инструмент для запаковки ресурсов (по умолчанию ресурсы хранятся в бинарном виде для оптимизации производительности приложения). Входит в состав Android SDK, но может быть получен и отдельно;
  • signer - инструмент для цифровой подписи модифицированного пакета (bit.ly/Rmrv4M).

Использовать все эти инструменты можно и по отдельности, но это неудобно, поэтому лучше воспользоваться более высокоуровневым софтом, построенным на их основе. Если ты работаешь в Linux или Mac OS X, то тут есть инструмент под названием apktool . Он позволяет распаковывать ресурсы в оригинальный вид (в том числе бинарные XML- и arsc-файлы), пересобирать пакет с измененными ресурсами, но не умеет подписывать пакеты, так что запускать утилиту signer придется вручную. Несмотря на то что утилита написана на Java, ее установка достаточно нестандартна. Сначала следует получить сам jar-файл:

$ cd /tmp $ wget http://bit.ly/WC3OCz $ tar -xjf apktool1.5.1.tar.bz2

$ wget http://bit.ly/WRjEc7 $ tar -xjf apktool-install-linux-r05-ibot.tar.bz2

$ mv apktool.jar ~/bin $ mv apktool-install-linux-r05-ibot/* ~/bin $ export PATH=~/bin:$PATH

Если же ты работаешь в Windows, то для нее есть превосходный инструмент под названиемVirtuous Ten Studio , который также аккумулирует в себе все эти инструменты (включая сам apktool), но вместо CLI-интерфейса предоставляет пользователю интуитивно понятный графический интерфейс, с помощью которого можно выполнять операции по распаковке, дизассемблированию и декомпиляции в несколько кликов. Инструмент этот Donation-ware, то есть иногда появляются окошки с предложением получить лицензию, но это, в конце концов, можно и потерпеть. Описывать его не имеет никакого смысла, потому что разобраться в интерфейсе можно за несколько минут. А вот apktool, вследствие его консольной природы, следует обсудить подробнее.


Рассмотрим опции 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, например:

$ apktool d mail.apk

После этого в каталоге mail появятся все извлеченные и дизассемблированные файлы пакета.

Препарирование. Отключаем рекламу

Теория - это, конечно, хорошо, но зачем она нужна, если мы не знаем, что делать с распакованным пакетом? Попробуем применить теорию с пользой для себя, а именно модифицируем какую-нибудь софтину так, чтобы она не показывала нам рекламу. Для примера пусть это будет Virtual Torch - виртуальный факел. Для нас эта софтина подойдет идеально, потому что она под завязку набита раздражающей рекламой и к тому же достаточно проста, чтобы не потеряться в дебрях кода.


Итак, с помощью одного из приведенных способов скачай приложение из маркета . Если ты решил использовать Virtuous Ten Studio, просто открой APK-файл в приложении и распакуй его, для чего создай проект (File -> New project), затем в контекстном меню проекта выбери Import File. Если же твой выбор пал на apktool, то достаточно выполнить одну команду:

$ apktool d com.kauf.particle.virtualtorch.apk

После этого в каталоге com.kauf.particle.virtualtorch появится файловое дерево, похожее на описанное в предыдущем разделе, но с дополнительным каталогом smali вместо dex-файлов и файлом apktool.yml. Первый содержит дизассемблированный код исполняемого dex-файла приложения, второй - служебную информацию, необходимую apktool для сборки пакета обратно.

Первое место, куда мы должны заглянуть, - это, конечно же, AndroidManifest.xml. И здесь мы сразу встречаем следующую строку:

Нетрудно догадаться, что она отвечает за предоставление приложению полномочий на использование интернет-соединения. По сути, если мы хотим просто избавиться от рекламы, нам, скорее всего, достаточно будет запретить приложению интернет. Попытаемся это сделать. Удаляем указанную строку и пробуем собрать софтину с помощью apktool:

$ apktool b com.kauf.particle.virtualtorch

В каталоге com.kauf.particle.virtualtorch/build/ появится результирующий APK-файл. Однако установить его не получится, так как он не имеет цифровой подписи и контрольных сумм файлов (в нем просто нет каталога META-INF/). Мы должны подписать пакет с помощью утилиты apk-signer. Запустили. Интерфейс состоит из двух вкладок - на первой (Key Generator) создаем ключи, на второй (APK Signer) подписываем. Чтобы создать наш приватный ключ, заполняем следующие поля:

  • Target File - выходной файл хранилища ключей; в нем обычно хранится одна пара ключей;
  • Password и Confirm - пароль для хранилища;
  • Alias - имя ключа в хранилище;
  • Alias password и Confirm - пароль секретного ключа;
  • Validity - срок действия (в годах). Значение по умолчанию оптимально.

Остальные поля, в общем-то, необязательны - но необходимо заполнить хотя бы одно.


WARNING

Чтобы подписать приложение с помощью apk-signer, ты должен установить Android SDK и указать полный путь до него в настройках приложения.

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

Теперь этим ключом можно подписать APK. На вкладке APK Signer выбираем только что сгенерированный файл, вводим пароль, алиас ключа и пароль к нему, затем находим файл APK и смело жмем кнопку «Sign». Если все пройдет нормально, пакет будет подписан.

INFO

Так как мы подписали пакет нашим собственным ключом, он будет конфликтовать с оригинальным приложением, а это значит, что при попытке обновить софтину через маркет мы получим ошибку.

Цифровая подпись необходима только стороннему софту, поэтому если ты занимаешься модификацией системных приложений, которые устанавливаются копированием в каталог /system/app/, то подписывать их не нужно.

После этого скидываем пакет на смартфон, устанавливаем и запускаем. Вуаля, реклама пропала! Вместо нее, однако, появилось сообщение, что у нас нет интернета или отсутствуют соответствующие разрешения. По идее, этого могло бы и хватить, но сообщение выглядит раздражающе, да и, если честно, нам просто повезло с тупым приложением. Нормально написанная софтина, скорее всего, уточнит свои полномочия или проверит наличие интернет-соединения и в противном случае просто откажется запускаться. Как быть в этом случае? Конечно, править код.

Обычно авторы приложений создают специальные классы для вывода рекламы и вызывают методы этих классов во время запуска приложения или одной из его «активностей» (упрощенно говоря, экранов приложения). Попробуем найти эти классы. Идем в каталог smali, далее com (в org лежит только открытая графическая библиотека cocos2d), далее kauf (именно туда, потому что это имя разработчика и там лежит весь его код) - и вот он, каталог marketing. Внутри находим кучу файлов с расширением smali. Это классы, и наиболее примечателен из них класс Ad.smali, по названию которого нетрудно догадаться, что именно он выводит рекламу.

Мы могли бы изменить логику его работы, но гораздо проще будет тупо убрать вызовы любых его методов из самого приложения. Поэтому выходим из каталога marketing и идем в соседний каталог particle, а затем в virtualtorch. Особого внимания здесь заслуживает файл MainActivity.smali. Это стандартный для Android класс, который создается Android SDK и устанавливается в качестве точки входа в приложение (аналог функции main в Си). Открываем файл на редактирование.

Внутри находится код smali (местный ассемблер). Он довольно запутанный и трудный для чтения в силу своей низкоуровневой природы, поэтому мы не будем его изучать, а просто найдем все упоминания класса Ad в коде и закомментируем их. Вбиваем строку «Ad» в поиске и попадаем на строку 25:

Field private ad:Lcom/kauf/marketing/Ad;

Здесь создается поле ad для хранения объекта класса Ad. Комментируем с помощью установки знака ### перед строкой. Продолжаем поиск. Строка 423:

New-instance v3, Lcom/kauf/marketing/Ad;

Здесь происходит создание объекта. Комментируем. Продолжаем поиск и находим в строках 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, условный переход на которую осуществляется аккурат перед созданием экземпляра класса:

If-ne p1, v0, :cond_10 .line 74 new-instance v0, Landroid/content/Intent; ... :cond_10

Скорее всего, программа каким-то случайном образом вычисляет, нужно ли показывать рекламу на главном экране, и, если нет, перескакивает сразу на cond_10. Ок, упростим ей задачу и заменим условный переход на безусловный:

#if-ne p1, v0, :cond_10 goto:cond_10

Больше упоминаний FirstAd в коде нет, поэтому закрываем файл и вновь собираем наш виртуальный факел с помощью apktool. Копируем на смартфон, устанавливаем, запускаем. Вуаля, вся реклама исчезла, с чем нас всех и поздравляем.

Итоги

Эта статья лишь краткое введение в методы вскрытия и модификации Android-приложений. За кадром остались многие вопросы, такие как снятие защиты, разбор обфусцированного кода, перевод и замена ресурсов приложения, а также модификация приложений, написанных с использованием Android NDK. Однако, имея базовые знания, разобраться во всем этом - лишь вопрос времени.

Поскольку сам гуглил вопрос "как подписать APK файл ?", знаю что найти действительно рабочую и во всём понятную инструкцию не так уж и легко. Именно поэтому я решил сам написать материал о том как стоит правильно подписывать свою программу или игру на Андроид.

Как известно сейчас без цифровой подписи, ваше творение не удасться разместить в Market"е, а это уже серьёзно. Заметил очень многие молодые разработчики на Андроид, так сказать новички и вовсе забывают подписать своё приложение и пытаются с ним что-то потом делать и всё задаются вопросом почему у них не удаётся выполнить то или иное действие с их APK файлом.

Итак, не будем тянуть резину и начнём сразу с того как можно подписать ваш апк файл и чем собственно пользоваться для достижения желаемого результата.

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

Для работы нам понадобятся: OpenSSL и SignApk .

Для начала сделаем сертификат и ключ для подписи. Установите OpenSSL. Во время установки, инсталлятор в виде выбора предложит скопировать компоненты в папку Windows, выберите в папку Bin, которая будет на месте куда вы установите весь OpenSSL.

Теперь откройте от имени системного администратора (это очень важно!) командную строку. После чего перейдите в командной строке в папку bin, которая находится в папке, куда вы установили OpenSSL (Например, C:\OpenSSL\Bin\ или C:\Program Files\OpenSSL\Bin\ ). Если вы не знаете, переход к другой папке выполняется командой cd . То есть для того чтобы перейти в нужную папку вам стоит выполнить команду такого плана:

cd C:\OpenSSL\Bin\

После того как вы в папке Bin, можно приступать непосредственно к созданию сертификата и ключа.

Шаг 1 (Выполняем генерацию ключа длиною 1024 бита)

Выполните команду:

openssl genrsa -out key.pem 1024

Шаг 2 (На основе ключа создаём запрос к сертификату)

Выполните команду:

openssl req -new -key key.pem -out request.pem

На этом этапе вам будет необходимо ввести ваши данные, которые будут идентифицировать вас в сертификате.

Шаг 3 (Генерируем закрытый ключ по сертификату)

Выполните команду:

openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem

Шаг 4 (Выполняем генерацию открытого ключа)

Выполните команду:

openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt

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

А теперь собственно, давайте приступим к подписи приложения. Распакуйте скачанный по ссылке выше архив с SingApk. Переместите из папки Bin, где мы создавали сертификат и ключ 2 файла: certificate.pem и key.pk8 в папку, куда вы распаковали SingApk. Windows должен отобраить диалог замены файлов - заменяйте.

Теперь для того чтобы подписать apk файл уникальной цифровой подписью, которую вы сделали сами, просто мышкой перетяните ваш apk файл на sign_APK.bat . Для того чтобы не тянуть файл с одного окна в другое (это не удобно) переместите ваш apk файл в папку с SingApk. После выполнения, в папке с SingApk появится файл apk_signed.apk , который и будет вашим подписанным приложением или игрой.

Последнее обновление: 30.10.2015

После создания приложения, его тестирования и отладки мы можем приступить к его публикации. Суть публикации заключается в создании файла с расширением .apk , которое будет представлять приложение, и его последующее размещение в Google Play Market или на других внешних сайтах. По умолчанию в процессе отладки и создания приложения файл apk уже создается, и мы можем его найти в папке проекта по пути Название_проекта\app\build\outputs\apk . По умолчанию файл называется app-debug.apk и представляет debug-версию.

Но для полноценно публикации данного файла может оказаться недостаточно. И нам еще дополнительно надо произвести некоторую подготовку проекта к релизу. Для это следует указать в файле манифеста у элемента установлены атрибуты android:versionCode и android:versionName . Также в файле манифеста элемент не должен содержать атрибута android:debuggable

Кроме того, на этом этапе можно установить иконку для приложения, которая будет отображаться на рабочем экране гаджета, название приложения (атрибут android:label у элемента), а также можно задать лицензионное соглашение.

В файле манифеста также следует определить название пакета (атрибут package элемента ), которое будет использоваться для приложения в дальнейшем. По умолчанию при разработке в Android Studio пакеты приложений начинаются с com.example . Не стоит оставлять данное название, так как название пакета будет служить уникальным идентификатором вашего приложения. Например, ниже в моем случае названием пакета служит "com.maverics.eugene.telephonelist":

При этом если в файлах кода java название пакета в начале файла также должно соответствовать пакету приложения.

Установка требований

На этапе подготовки к релизу также можно установить требования к API. Например, наше приложение имеет определеную минимальную версию ОС Android, поэтому мы можем установить в файле манифеста соответствующие атрибуты у элемента

    android:minSdkVersion - минимальная версия Android

    android:targetSdkVersion - оптимальная версия API

    android:maxSdkVersion - максимальная версия системы

Например, пусть минимальная версия Jelly Beans 4.1.2, а оптимальная KitKat 4.4.4:

//.............................

Подпись приложения

Когда все уже готово, приложение для Android должно быть подписано сертификатом, благодаря которому можно идентифицировать автора приложения. Когда мы тестируем приложение, устанавливая его через Android Studio на устройство, то оно подписывается автоматически. Но для создания релиз-версии нам надо произвести дополнительно ряд действий.

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

Во-первых, в Android Studio выберем в меню пункт Build -> Generate Signed APK . После этого нам откроется окно мастера:

Нажмем на кнопку Create new... . После этого нам откроется окно создания ключа:

Введем в поле Key store path путь к файлу сетификата, который будет создан. Если указанной папки не существует, то ее надо создать или определить существующую папку.

В поле Password/Confirm указываем пароль.

В поле Alias указываем псевдоним. Можно поставить произвольное название.

В поле First and Last Name вписываем имя и фамилию. И далее пишим подразделение, организацию, город, страну и код страны.

В конце нажимаем OK.

После этого автоматически обновится первое окошко:

Финальное окно покажет нам путь к каталогу, где будет находиться подписанное приложение apk в release-версии. Нажмем на Finish.

Теперь по указанному пути можно будет найти подписанный apk, который будет иметь название app-release.apk :

Мы можем переименовать файл, сохранив его расширение и выложить в Play Market или на любой сайт или сразу загрузить на мобильное устройство. После загрузки на телефон/планшет достоточно нажать на него, и с помощью стандартного установщика пакетов приложение будет установлено. Правда, здесь также надо учитывать, что если мы устанавливаем приложение не из Play Market, то в настройках надо разрешить установку из других источниках - Безопасность->Неизвестные источники (Разрешить установку приложений из других источников)


Top