Как изменить код программы на Андроид

Вероятно, на пути создания своих форков приложений для Android придётся идти по пути не написания их «с нуля», а модификации уже готовых, зачастую системных приложений.

Постараюсь вкратце описать процесс такой модификации.

Состоит она из четырех этапов:

  1. Декомпилляция apk
  2. Внесение правок в код
  3. Компилляция в apk
  4. Подписывание apk

Что из себя представляет apk-файл

По своей сути apk-файл — это zip-архив, внутри которого хранятся исполняемые и служебные файлы.

Если Вы поменяете расширение на zip, то сможете увидеть его содержимое.

Но работать с этими файлами нельзя, так как они представлены в бинарном виде, даже XML.

Декомпиляция apk

Декомпиляция apk может быть выполнена с помощью утилиты apktool. bat файл для её запуска Вы можете скачать внизу статьи. Самую последнюю версию утилиты можно взять на сайте авторов.

В Ubuntu apktool устанавливается командами:

Утилита apktool написана на языке Java и требует установки на компьютер Java 8 (JRE 1.8).

Как обойти блокировку в онлайн играх

После установки JRE необходимо переименовать файл утилиты в apktool.jar (убрать из имени версию, только в случае, если Вы скачивали файл с официального сайта) и перенести jar и bat файлы в папку, которая описана в системной переменной path.

По сути, после этого мы можем уже начать декомпилировать apk.

Способов получения файла APK много.

Кто-то использует для этого Android Device Bridge (ADB).

Кто-то скачивает файл на компьютер непосредственно из Google Play.

Но лично я использую другой способ. Многие файловые менеджеры позволяют создавать резервные копии приложений. Я, например, использую «Cx Проводник», создаю резервную копию, а потом с его же помощью перебрасываю файл на компьютер через сеть, либо Яндекс диск.

Итак, у нас есть apk-файл, который мы планируем исследовать и поменять. Также у нас есть инструмент, необходимый для его декомпиляции.

После этого у нас в том же каталоге, где находится apk, появится папка с тем же именем, внутри которого находится декомпилированная структура файла apk.

Данная структура совпадает с тем, что видели с помощью архиватора, если открывали apk как архив.

Но в ней появилась директория smali, где лежит дезассемблированный код dex-файла, плюс в корне появился файл apktool.yml. Этот файл является служебным файлом apktool и понадобится утилите при обратной сборке проекта.

С этим всем нам и предстоит работать.

В данном способе есть один минус: исходный код получается в small (аналог ассемблера).

Чтобы получить более читаемый код, используют связку dex2jar и jd-gui (В качестве его альтернативы можно использовать Jad, а можно даже использовать облачную декомпиляцию).

Первый позволяет получить из apk файл jar, а второй — собственно дезассемблировать jar.

Также могут пригодиться:

  • smali — ассемблер/дизассемблер smali / dex.
  • apksigner — программа для подписывания apk (входит в состав Android SDK и требует его установки)
  • Android Studio — не помешает, если мы планируем разрабатывать код для Android. Можно сказать, что это целый «комбайн».
  • uber-apk-signer — еще вариант для подписывания apk
  • Virtuous Ten Studio — программа, с функционалом, аналогичным apktool, но имеющая графический интерфейс и работающая под Windows.
Читайте также:
Что такое программа color

Скачивание файла с помощью ADB

В Windows потребуется предварительно установить USB драйвера для вашего Андроид устройства (если Вы не устанавливали его ранее). В Linux этого скорее всего не потребуется.

Как изменить код элемента на андроид!

Установите Android Device Bridge (ADB). Скачать установочный пакет для Windows можно здесь.

Для установки в Ubuntu используется команда:

Подключите Android устройство к компьютеру через USB кабелю.

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

Естественно, если Вы используете Ubuntu, то можете использовать grep для фильтрации вывода и поиска искомого пакета (в Windows команда не сработает).

Теперь мы можем узнать полный путь к пакету при помощи команды

Теперь мы можем скачать файл с устройства на компьютер:

Второй параметр является не обязательным.

Скачивание файла из Google Play

На сайте Google Play необходимо найти требуемое приложение и скопировать его адрес (в строке адреса браузера).

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

Модификация кода

После декомпиляции мы получили папку со следующей структурой:

информация о программе:

  • версия
  • автор программы
  • цифровая подпись
  • другая информацию

Также могут присутствовать папки

  • assets — аналог папки ресурсов. Основным отличием ресурсов в этом папке является то, что для получения списка asset’ов можно использовать метод AssetManager.list() в коде приложения, получая их динамически;
  • lib — оригинальные статические библиотеки Linux, написанные с помощью NDK (Native Development Kit) на C/C++.

Основными объектами модификации являются:

  • Ресурсы — их можно напрямую заменять, не изменяя имён. Можно добавлять, удалять, переименовывать, но это потребует изменить файл описания ресурсов.
  • Исходный код программы — в зависимости от метода декомпиляции это может быть код на smali, или java.
  • Файл AndroidManifest.XML — если нужно изменить набор прав для приложения, ему название и т.д.

Компиляция apk

Сборка модифицированного нами кода выполняется командой

После этого внутри директории проекта появятся еще две директории:

  • build — в ней лежат скомпилированные файлы
  • dist — тут располагается сам готовый файл apk. Но установить его на устройство пока не получится, так как требуется этот файл подписать. Если Вы посмотрите, в этом apk просто отсутствует каталог META-INF, в котором хранится цифровая подпись.

Подписание apk-файла

Мне известно два способа подписания apk-файла:

  • С помощью uber-apk-signer
  • С помощью apksigner из состава Android SDK

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

Поэтому «поверх» пересобранное приложение установить нельзя. Нужно предварительно удалить оригинальное и установить своё.

Либо изменить название и установить свой форк рядом с оригиналом.

Подписывание apk с помощью uber-apk-signer

Подписывание выполняется командой:

В результате в директории с исходным apk появится файл с именем -aligned-debugSigned.apk

Это и есть наш подписанный файл.

Подписывание apk с помощью apksigner

В отличии от uber-apk-signer в этом приложении можно указать свои параметры для генерации электронной подписи.

На первой вкладке программы (Key Generator) мы создаем ключи, на второй вкладке (APK Signer) производим подписывание apk.

Для создания цифровой подписи необходимо заполнить на первой вкладке следующие поля:

  • Target File — файл хранилища ключей;
  • Password и Confirm — пароль хранилища;
  • Alias — имя ключа в хранилище;
  • Alias password и Confirm — пароль секретного ключа;
  • Validity — срок жизни ключа (в годах).
Читайте также:
Отладка программы это цикл направленный на самые частые ошибки это

Также подпись можно проводить и из командной строки.

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

Attachments: URLFile sizeLast modified
apktool.bat 1 kB 2022-04-15 20:06

Источник: www.rodina-ru.com

Модификация исходного кода android-приложения с использованием apk-файла

Так уж получилось, что приложение для чтения комиксов и манги, которое я использую на своем android-смартфоне, после обновления стало показывать рекламу в конце каждой главы комикса. Данное приложение пару лет назад было доступно на Google Play (платная версия которого и была мной куплена), но было удалено в силу «нарушения авторских прав», после чего ушло в подполье и стало распространятся через сайт разработчика.

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

Для начала был загружен сам apk-файл приложения. Затем недолгий поиск по интернету привел меня на сайт http://www.decompileandroid.com/. С его помощью можно было загрузить apk-файл с приложением и на выходе получить набор исходников. Увы, декомпиляция в java-классы происходит не совсем идеально и поэтому восстановить полностью сам проект приложения в IDE(Idea) у меня не получилось, но это позволило проанализировать саму структуру проекта и разобраться как он примерно работает. После проведения анализа, было найдено два перспективных метода в классе BaseReaderFragment.java – placeAdViewIfNeeded и removeAdViewIfNeeded.

Код метода placeAdViewIfNeeded:

if (adViewPlaced || adView == null) < return; >else

Самое простое, что пришло на ум после чтения кода, это убрать все лишнее, и оставить лишь вызов return;

Но, как уже было сказано, даже если бы я изменил в java-классе что-либо, я бы не смог в итоге скомпилировать приложение в IDE. Поэтому пришлось искать альтернативу. Оказалось, что smali-файлы, которые создаются в процессе декомпиляции, позволяют также после внесения нужных изменений, вновь собрать модифицированное приложение. Увы, сайт, что был приведен выше, позволял лишь получать исходники, но не собирать новые. Поэтому пришлось искать способы сделать это самостоятельно.
Была найдена утилита ApkTools, которая позволяла декомпилировать и компилировать apk-файлы. Кроме того, потребовалась утилита aapt.exe, которая была взята мной из стандартного SDK под андроид в папке android-sdkbuild-tools20.0.0.

Для удобства вызова утилиты из под windows был создан скрипт apktool.bat:

Для декомпиляции приложения были выполнены команды:

apktool if .apk apktool d .apk

После чего, в полученных исходниках был найден файл BaseReaderFragment.smali и нужные нам методы были изменены следующим образом:

.method protected placeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 3 .param p1, «layoutAds» # Landroid/view/ViewGroup; .prologue const/4 v2, -0x2 return-void .end method .method protected removeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 1 .param p1, «layoutAds» # Landroid/view/ViewGroup; .prologue .line 149 const/16 v0, 0x8 return-void .end method

Далее пришла очередь сборки apk-файла из исходников.

Сделать это можно cледующей командой:

apktool b

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

Читайте также:
Почему программа называется 8 16

Распаковываем архив, выполняем команду:

java -jar signapk.jar certificate.pem key.pk8 .apk .apk

Полученный apk-файл можно загружать на телефон, чтобы проверить наше модифицированное приложение. Однако в процессе тестирования изменений оказалось, что объявления больше не показываются, однако сама страница для их показа создается, что не очень приятно. Снова был проанализирован код приложения, найден класс BaseSeamlessReaderFragment, а в нем метод appendPages.

В нем было видно, что строчка:

addPage(new MangaPage(i — 1, null, chapteritem, true), false);

создает дополнительную страницу, помимо тех, что есть в главе манги, с параметром, отвечающим за показ объявлений. Было решено удалить эту строчку и посмотреть результат. Снова заглядываем в аналогичный smali-файл(BaseSeamlessReaderFragment$4) и удаляем строчку:

invoke-virtual , Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment;->addPage(Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment$MangaPage;Z)V

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

Как отредактировать чужой апк в Android Studio?

Читал, что для работы с приложениями, точнее, над приложениями, используют прогу под названием Android Studio. Но не знаю, как. И плюс было бы круто если бы был способ обойтись без компа, т.е. сделать все с мобилы Моей целью является «подправить» название пакейджа файла, а заодно и номер версии.

Дело в том, что у меня на самсунге камера ну капец лагучая, а вот сторонний софт — очень даже ниче так. И вот я вытащил 2 апк файла, у одного имя com.sec.android.camera, у другого net.sourceforge.opencamera. Я хочу в OpenCamera’вском манифесте поменять имя пакета и изменить версию, чтобы накатом «обновить» системную камеру до сторонней.

Отслеживать
задан 22 мар 2022 в 13:06
3 1 1 серебряный знак 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Тогда можно просто скачать исходники с SourceForge и в gradle.build изменить package на нужный Вам. Плюс в манифесте и коде надо автозаменой найти всё связанное с net.sourceforge.opencamera .

Но поверх стандартного приложения оно не встанет, см. в конце ответа.

А ниже общая информация по модификации APK:

Android Studio обычно используется для создания и сборки приложений при наличии исходного кода.

В Вашем случае есть только APK-файл.
Его нужно декомпилировать с помощью ApkTool, а затем вносить изменения.
В каталоге с разобранным приложением будут:

  • Ресурсы ( res/* ),
  • Код приложения ( smali/ , smali_classes2/ . ),
  • Двоичные файлы ( assets/ ),
  • Библиотеки, если есть ( lib// ),
  • Файлы другого типа, манифест и инфа для apktool ( other , AndroidManifest.xml и apktool.json соответственно).

При этом привычного Java-кода Вы там не встретите, classes.dex «конвертируется» в Smali — это по сути, ассемблер для Android. Чтобы с таким кодом работать, нужно знать его устройство.
А ресурсы и манифест можно спокойно редактировать.

Пакет можно менять и вручную, заменяя все вхождения в manifest.xml и smali, но лучше пользоваться патчерами по типу Batch ApkTool + плагин AllInOne:

  • Декомпилировать,
  • Запустить AllInOne,
  • Поставить ✓флажок на «Клонировать APK»,
  • Ввести имя пакета,
  • Рекомпилировать,
  • Подписать.

Но без root-прав камеру поверх стандартной поставить не получится, т.к. не будут совпадать подписи!
Нужно будет применять патч на проверку подписи в packagemanager, например, через LuckyPatcher: Инструменты -> Настройки Xposed -> Включить 2 и 3.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru