Framework res apk редактирование
Иногда некоторые приложения на Android чем-то не устраивают пользователя. В качестве примера можно привести назойливую рекламу. А то бывает и так — всем хороша программа, да только перевод в ней или кривой, или вовсе отсутствует. Или, например, программа триальная, а получить полную версию возможности нет. Как же изменить ситуацию?
Декомпиляция APK
Чтобы декомпилировать приложение, скопируйте файл APK приложения в папку где находится apktool, далее необходимо выполнить вот что, в командной строке ввести команду:
apktool d название.apk
apktool d browser.apk
После того как вы отредактируете или русифицируете APK, его надо компилировать обратно.
Декомпиляция приложений
В статье мы работали только с дизассемблированным кодом приложения, однако если в большие приложения вносить более серьезные изменения, разобраться в коде smali будет гораздо сложнее. К счастью, мы можем декомпилировать код dex в Java-код, который будет хоть и не оригинальным и не компилируемым обратно, но гораздо более легким для чтения и понимания логики работы приложения. Чтобы сделать это, нам понадобятся два инструмента:
Использовать их следует так. Сначала запускаем dex2jar, указывая в качестве аргумента путь до apk-пакета:
В результате в текущем каталоге появится Java-пакет mail.jar, который уже можно открыть в jd-gui для просмотра Java-кода.
Подпись APK
- Для этого Вам надо разархивировать архив Sign Android;
- Скопировать готовое приложение в папку с распакованным Sign Android;
- Потянуть приложение на файл Sign_APK.bat после чего приложение будет подписано!
Готовое подписанное приложение будет носить название apk_signed.apk
Просмотр и модификация
Допустим, ты нашел интересующий тебя пакет, скачал, распаковал… и при попытке просмотра какого-нибудь 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 появятся все извлеченные и дизассемблированные файлы пакета.
Декомпиляция и Компиляция APK приложения Android
Необходимые компоненты
-
— среда разработки; — программа декомпилятор; — bat файл; — подпись приложения APK.
Настройка ApkTool
- Создать папку на диске C:\ и в нее переместить файлы apktool_x_x.jar и apktool.bat
- Файл apktool_x_x.jar переименовать в apktool.jar
Если появилось наподобие такой вывод информации, то все сделано правильно.
Компиляция APK
Вводим в командной строке:
После чего перейдите в папку проекта ( в данном случае папка browser) и вы увидете две новые папки:
Если папки dist не обнаружили, значит apktool не смог собрать редактируемый проект, причиной тому может быть то, что имения которые вы вносили(«поломали») не позволяют собрать приложение apk.
После компиляции приложения apk его необходимо подписать.
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;
- пример снятия триала с приложения.
Работа с системными 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-ирована.
Препарирование. Отключаем рекламу
Теория — это, конечно, хорошо, но зачем она нужна, если мы не знаем, что делать с распакованным пакетом? Попробуем применить теорию с пользой для себя, а именно модифицируем какую-нибудь софтину так, чтобы она не показывала нам рекламу. Для примера пусть это будет 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
Введение
В этой статье мы поговорим о том, как разобрать пакет APK с приложением, рассмотрим его внутреннюю структуру, дизассемблируем и декомпилируем байт-код, а также попробуем внести в приложения несколько изменений, которые могут принести нам ту или иную выгоду.
Чтобы сделать все это самостоятельно, потребуются хотя бы начальные знания языка Java, на котором пишутся приложения для Android, и языка XML, который используется в Android повсеместно — от описания самого приложения и его прав доступа до хранения строк, которые будут выведены на экран. Также понадобится умение обращаться со специализированным консольным софтом.
Итак, что же представляет собой пакет APK, в котором распространяется абсолютно весь софт для Android?
Устройство 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
Другие статьи в выпуске:
Настройка Java
После установки Java JDK , необходимо, добавить ее в переменную Windows. Если кто не понял официальное куроводство то,
Скопируйте путь Java JDK:
Перейдите в меню Дополнительные настройки:
(Мой) Компьютер ->Свойства системы->Дополнительные параметры системы->Дополнительно->Системные переменные->Правка
Java JDK настроена!
Теперь как это можно все упросить! (не использовать командную строку)
Скачайте приложение SmartApkTool, данное программа имеет графический интерфейс и очень легкая в использование. Автор данной программы мой хороший друг Никита Коровкин (на данный момент работает в Surfingbird)! за что ему огромное Спасибо!
Как пользоваться SmartApkTool
Прежде всего вам надо установить и настроить Java JDK и Apktool как указано выше.
Откройте программу SmartApkTool
Если Вам необходимо Декомпилировать приложение в SmartApkTool, то выберите данный пункт и необходимое приложение
Если компилировать, то
и выбрать файл в проекте apktool.yml
Для подписи приложения APK, нажать обзор, выбрать приложение и подписать
Все так легко и просто!
Альтернативный вариант
Для тех кому не понравился SmartApkTool, есть альтернатива Android MultiTool
Добрый день!
Хочу поделиться с вами историей как я модифицировал одно из системных приложений Adroid'а, точнее его модификации LeWa OS. С Андроидом я познакомился недавно, всего месяц назад, и постараюсь тут описать весь ход своих мыслей, что несомненно будет полезно всем тем кто хочет улучшить Андроид, но не знает с чего начать. Пост постараюсь сделать подробным, а потому длинным.
Для начало немного истории.
Как только я получил свой первый китайфон, решил попробовать разные прошивки и в результате остановился на Lewa. Но глаза постоянно мозолил один ее недочет — список контактов, а точнее быстрая навигация на английском.
Информации о данной проблеме немного, поэтому начал копать сам.
Набор инструментов
- APKTOOLS для распаковки *.apk
- Прочитать данный пост
- Получить объект исследования. Если вы пользуетесь Lewa то надо из архива с прошивкой или прямо с телефона нужно вытянуть /system/app/PIM.apk и все apk из папки /system/framework/ обычно это framework-res.apk, lewa-res.apk и
mediatek-res.apk. Если вы хотите просто потренироваться то могу дать свои
Приступим
Итак, первое что нам надо это разобрать наше приложение, для этого все apk надо скопировать в папку с apktools. Все apk которые лежали в /system/framework/ надо выделить, подцепить мышью и перенести на apktool-if.cmd тем самым открыв их с помощью этого bat'ника. PIM.apk таким же образом надо открыть с помощью apktool-d.cmd. В результате получаем папку с распакованным приложением.
Изучаем код
Там меня заинтересовала строчка
. Что это за индексер такой?? Смотрим
Тут ключевые стороки
Что это за элемент который прижимается к правой части экрана (android:layout_gravity=«right»), не то ли что мы ищем?
com.lewa.PIM.widget.AlphabetFastIndexer это ссылка на код PIM\smali\com\lewa\PIM\widget\AlphabetFastIndexer.smali, но изучать его неудобно, и тут на сцену выходит связка dex2jar-0.0.9.7 jd-gui-0.3.3.windows которые мы скачали из поста на форуме и так же научились ими пользоваться. Превращаем classes.dex в classes_dex2jar.jar и открываем через jd-gui.exe
Тут и так все понятно, меняем буквы на русские, и так как русских букв больше придется добавить несколько строк типа
const/16 v1, 0x1b это порядковый номер буквы он тоже будет с каждой новой буквой расти. Так же в начале вы могли заметить стоку
Это размер всего массива, так как мы добавили несколько букв ее нам тоже надо поменять. Я добавил 3 буквы по этому в моем случае ее надо поменять на
В итоге у меня получился следующий код:
"\u042f" — это «юникоды» наших букв, так надежней)
После этого можно попробовать собрать риложение перетянув папку PIM на apktool-b.cmd, через некоторое время появится PIM\dist\PIM.apk
Теперь можно заменить им PIM.apk своего телефона, как это сделать выходит за рамки данной статьи. Могу лишь скзать что можно прошится моим патчем, предварительно заменив в нем PIM.apk на свой.
PROFIT?
Не совсем… Да, буквы русские но поиск то не работает!
Изучаем дальше декомпилированный AlphabetFastIndexer.smali
тут больше ничего интересного кроме
Хотя по идее он к нашей проблеме не относится я все же решил посмотреть что это такое. public static abstract говорит о том, что этот интерфейс реализован где то в другом файле. Ищем поиском и находим пару файлов где встречается OnTouchingLetterChangedListener:
PIM\smali\com\lewa\PIM\contacts\list\ContactEntryListFragment.smali
PIM\smali\com\lewa\PIM\mms\choiceContacts\MmsChoicePhoneNumbersContacts.smali
Они достаточно длинные поэтому приведу только то что нас интересует
Там нужно найти участок
0x41 и 0x5a это буквы 'A' и 'Z' их надо поменять на русские:
После чего найти
0x61 — 'a'
0x7a — 'z'
Меняем
В файле MmsChoicePhoneNumbersContacts.smali примерно такая же история
Собираем это дело обратно и запихиваем а телефон. Вот теперь работает!
Спасибо всем за внимание!
P.S. Надеюсь мой ход мыслей кому то поможет. В идеале бы найти как строятся группы в списке контактов и привинтить это дело сюда. Тогда бы в этом списке были толко те буквы, которые дейсвительно присутствуют в контактах, при том что на нескольких языках одновременно, но это мне пока не по зубам.
Итоги
Эта статья лишь краткое введение в методы вскрытия и модификации Android-приложений. За кадром остались многие вопросы, такие как снятие защиты, разбор обфусцированного кода, перевод и замена ресурсов приложения, а также модификация приложений, написанных с использованием Android NDK. Однако, имея базовые знания, разобраться во всем этом — лишь вопрос времени.
Файл logcat.txt будет лежать в корне sdcard.
Также можно использовать эту программу:
CatLog - Logcat Reader
[b]Андроид:[/b] Здесь пишем версию андроид
[b]Версия ApkTool:[/b] Здесь пишем версию ApkTool
[b]Описание:[/b]
Здесь пишем описание вашей проблемы
[spoiler=Скриншоты]При необходимости добавляем скриншоты[/spoiler]
[spoiler=Лог]Здесь при необходимости оставляем лог (либо файлы, либо код)[/spoiler]
Помните: все, что Вы делаете - Вы делаете на свой страх и риск!
Авторы модификаций и Администрация форума не несут ответственности за работоспособность Ваших девайсов!
А что именно становится хуже? Градиенты (плавные переходы от темного к светлому) выглядят как бы "ступенькой"? Тоесть нет самого ПЛАВНОГО перехода - всё какое-то рваненькое. Так?
Если да, то проблема решается в фотошопе. Открываете понравившуюся обоину - filter - noise - add noise (значения от 0.5 до 1 вполне будет достаточно)
Ну же,мне нужна ваша помощь.Я опустил руки и смирился с тем что наши телефоны плохо дружат с градиентами.Ещё service.jar нужно разбирать,и редактировать там classes.dex,чего я не умею.
Насчет services.jar и classes.dex посмотри как я делал
а насчет градиента сам ничего толкового не добился.
sk0t,
спасибо,нашел уже,и мне кажется что там не все.хочу заменить цвет текста на кнопке,и он видимо хранится в фреймворке,в файле btn_default.xml.но он не хочет открываться,или я не правильно его вытащил.просто как из архива.
фреймворк не хочет распаковываться.
Насчет xml-файлов:
в apk они в бинарном формате.
Самый простой способ редактировать эти xml - разложить apk в программе apk-tool(переведет xml-ки в нормальный вид),
ну и после редактирования, ей же и собрать(переведет xml-ки в бинарный вид)
или можно перевести в нормальный формат с помощью AXMLPrinter.jar но обратно в бинарный он не переводит.
sk0t,
Ну для перевода приложений этот способ актуален,а разобрать фреймворк таким способом не получается.
я разбирал
насколько помню вроде с ключем -d надо разбирать
(debug mode)
Поправка с ключем -s
Вот содержимое моего framework-res.apk\res\drawable\btn_default.xml обработанного программой apk-tool
Извини что не по теме не много, я редактирую LauncherProPlus, всё бы ничего вот только пересобранный файл launcher.xml в папке /res/layout-port/ не даёт лаунчеру запустится вылетая в ФК, может у тебя есть решение проблемы? Был бы очень благодарен!
Простые вопросы:
apk подписан?
что менялось в файле?
пересобран означает - разобран с помощью apk-tool, отредактирован, и собран с помощью apk-tool?
ещё по умолчанию собранный файл находится в папка куда распаковывался apk/dist и называется out.apk
Повторю launcher.xml, именно после его редактирования и пересборки АПК с ним (может и ещё парочкой xml-ок, не знаю) LauncherPro просто не работает. Там хранятся нужные мне дефолтные настройки, хотелось бы их поменять, да не могу =( даже smali файлы на ура редактируются.
Rang3r,
Может дело в кодировке?я когда-то одну из первых версий переводил,так у меня половина меню не откликалось и выдавало фк.
А на счет ключа спасибо,наверняка в нем вся фишка.позже проверю.Может заодно найдешь строку отвечающую за цвет на кнопке?:)
java -jar apktool.jar d -s file.apk foldername
tools.zip ( 1.13 КБ )
в архиве три файла
apktool-d.cmd - переносишь на него apk-файл содержащий классы(classes.dex): разбирает его в папку с тем же именем (phone.apk -> phone)
apktool-d-s.cmd - переносишь на него apk-файл не содержащий классы: разбирает его в папку с тем же именем (framework-res.apk -> framework-res)
apktool-b.cmd - переносишь на него папку с отредактированными файлами: собирает её в apk с именем out.apk (framework-res -> framework-res/dist/out.apk)
соответственно apktool.jar должен быть в той же папке.
2 Rang3r
скинь исходный apk и тот который ФК вызывает
PS 2 12enie
открываешь файл framework-res\res\values\styles.xml
ищешь там примерно такое (btn_default)
здесь можно изменить на primary_text_dark
далее открываешь файл framework-res\res\color\primary_text_light.xml
здесь можно изменить на bright_foreground_dark
далее открываешь файл framework-res\res\values\colors.xml
тааак,дело пошло,осталось запаковать,у меня только папка build создается.у меня так было когда я сохранял не в той кодировке файл xml.
Редактирую нотепадом ++,кодировку ставлю utf8 (без BOM).но скорей всего я опять туплю
sk0t, скинул в ЛС. Ответить можно и здесь, может кому-нибудь ещё тоже пригодится ответ :happy:
редактирование системных apk при помощи ApkTools (c) Brut.all
между делом решил написать инструкцию по сборке/разборке apk-файлов.
для это нам понадобится:
для примера я разберу/соберу SystemUI.apk
1 шаг)
устанавливаем JDK
создаем каталог "apktools" в корне диска. (для своего удобства я создал путь C:\android\ApkTools ) и распаковываем туда содержимое архива apktools
теперь нам нужно установить framework для своей прошивки(эта операция делается один раз для каждой новой прошивки)
перетаскиваем framework-res.apk от своей прошивки на apktool-if.cmd
дожидаемся завершения операции.
для устройств HTC и прошивки с SENSE тоже самое нужно проделать с файлом com.htc.resources.apk,
SAMSUNG - twframework-res.apk,
Motorola - blur-res.apk и moto-res.apk,
LG - lge-res.apk, Sony Ericsson - SemcGenericUxpRes.apk
Проще говоря - нужно установить таким способом все apk-файлы в каталоге system/framework/
теперь мы можем разбирать системные приложения.
2 шаг)
[разборка:]
берем SystemUI.apk и перетаскиваем на apktool-d.cmd
дожидаемся окончания операции.
получаем каталог с распакованным содержимым SystemUI.apk
изменяем, что хотим.
3 шаг)
[запаковка:]
перетаскиваем каталог SystemUI на apktool-b.cmd
дожидаемся завершения операции.
теперь открываем WINRAR'ом (или любым другим архиватором)
исходный SystemUI.apk и каталог SystemUI\build\apk\
и перемещаясь по каталогу, закидываем измененные файлы в исходный SystemUI.apk,
по аналогичным путям, заменяя файлы.
степень сжатия: без сжатия.
Если редактировали *.xml в папках values, добавляли/удаляли изображения
- resources.arsc менять обязательно!
(в нём находятся все папки values и файл public.xml, в котором присваивается ID всем ресурсам, кстати папка smali, находится в файле classes.dex)
ну разобрали, отредачили, собрали, а дальше ставить как обычный апк или тупо заменить его? разрешения или прочую хрень менять нужно?
Gas, если с телефона заменять то
нужен файл менеджер с
поддержкой root и возможностью
назначать права(root explorer, ES)
Копируем apk в телефон на карту.
Копируем apk с карты в папку /system
Выставляем для apk права 0644
Перемещаем apk в папку /system/app или
/system/framework
Перемещать из /system нужно потому, что
apk может использоваться в данный
момент и система не даст заменить его
при копировании.
SEVENI, немного не в тему, но. что нужно поменять в апк, чтоб можно было установить два одинаковых или скажем две разные версии?
нужно поставить второй менеджер смс. первый стоит с кастомной прошивки, хочу со стока поставить менеджер. тупо установить или заменить старндартный не прокатывает. ничего не работает в итоге.
samsung galaxy S3 4.2.2
W580\K750i\k550
если собрали учет занятого места в прошивке - обращайтесь
zapret, по идее достаточно заменить имя пака, который установится в Data/app
для примера:
Autostarts_v1.7.5\AndroidManifest.xml
но некоторые приложения могут ругаться при сборке, ссылаясь в начальную,
в логе можно будет посмотреть какие файлы в какой строке и заменить их самостоятельно.
+ если хочешь заменить имя в меню, то
Autostarts_v1.7.5\res\values\strings.xml
ну и соответственно
Autostarts_v1.7.5\res\ values-ru \strings.xml
Если таковой имеется.
Возможность открывать ZIP, RAR архивы. 4.0.4
двигаемся по адресу:
и закидываем файлы из архива drawable
двигаемся по адресу:
и закидываем файлы из архива drawable-hdpi
пересобираем(для того, чтобы получить идентификаторы к новым файлам)
двигаемся по адресу:
и ищем след.идентификаторы:
.line 379
const-string v0, "WPL"
const/16 v1, 0x49
const-string v2, "application/vnd.ms-wpl"
const-string v3, "WPL"
const v4, 0x7f020034
const v5, 0x7f020035
и после нее вставляем:
.line 701
const-string v0, "ZIP"
const/16 v1, 0x51
const-string v2, "application/zip"
const-string v3, "ZIP"
.line 711
const-string v0, "RAR"
const/16 v1, 0x51
const-string v2, "application/rar"
const-string v3, "RAR"
сохраняем, собираем, готово.
установите программу, которая умеет открывать zip или rar, к примеру, totalcommander
© SEVENI
расширенное power menu для android 4.0.4
собираем/разбираем framework-res.apk, чтобы получить ID'ы к новым иконкам и текстовым меткам(для каждлого они будут уникальны)
теперь проходим в
и находим там ID'ы меток:
global_action_reboot
global_action_recovery
global_action_download
и ID'ы иконок:
ic_lock_download
ic_lock_reboot
ic_lock_recovery
у меня это:
записываем ID'ы в отдельный текстовый документ " 1 ", для удобства.
теперь нам нужно найти метки оригинальных пунктов в прошивке,
если в power menu есть пункт "Рестарт",
то в файле
Если нет "Рестарта", то ищем "Выключение"
запоминаем строки, выделенные красным.
записываем ID'ы в отдельный текстовый документ " 2 ", для удобства.
собираем framework-res.apk, на этом первая часть закончена.
.line 323
new-instance v0, Lcom/android/internal/policy/impl/GlobalActions$5;
const v1, 0x1080672
invoke-direct , Lcom/android/internal/policy/impl/ GlobalActions$5 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mPowerOff:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
.line 346
new-instance v0, Lcom/android/internal/policy/impl/GlobalActions$6;
const v1, 0x1080673
invoke-direct , Lcom/android/internal/policy/impl/ GlobalActions$6 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mRestart:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
отсюда видим что за выключение у нас отвечает GlobalActions$5 , за рестарт GlobalActions$6
теперь, если есть пункт "Рестарт", то:
делаем копию файла android.policy/smali/com/android/internal/policy/impl/GlobalActions$6.smali
открываем его,
ищем reboot
const-string v1, "GlobalActions restart"
Меняем const-string v1, " GlobalActions restart " на const-string v1, " recovery "
поиском по документу переименовываем все GlobalActions$6 на GlobalActions$16 (почему 16 - на единицу больше от последнего аналогичного по названию файла в android.policy/smali/com/android/internal/policy/impl/)
сохраняем и называем как GlobalActions$16
делаем еще одну копию этого файла, открываем и по аналогии:
ищем reboot
const-string v1, "GlobalActions restart"
Меняем const-string v1, " GlobalActions restart " на const-string v1, " download "
поиском по документу переименовываем все GlobalActions$6 на GlobalActions$17
сохраняем и называем как GlobalActions$17
если нет "Рестарта":
делаем копию файла android.policy/smali/com/android/internal/policy/impl/GlobalActions$5.smali
открываем его,
ищем shutdown
Меняем строку invoke-static , Lcom/android/internal/app/ShutdownThread;-> shutdown (Landroid/content/Context;Z)V так:
invoke-static v2, v1>, Lcom/android/internal/app/ShutdownThread;-> reboot (Landroid/content/Context; Ljava/lang/String; Z)V
теперь перед этой строкой добавляем:
const-string v2, "now"
чуть выше меняем .locals 2 на .locals 3
поиском по документу переименовываем все GlobalActions$5 на GlobalActions$16
сохраняем и называем как GlobalActions$16
далее делаем 2 копии GlobalActions$16
в первой меняем const-string v2, " now " на const-string v2, " recovery "
поиском по документу переименовываем все GlobalActions$16 на GlobalActions$17
сохраняем и называем как GlobalActions$17
во второй меняем const-string v2, " now " на const-string v2, " download "
поиском по документу переименовываем все GlobalActions$16 на GlobalActions$18
сохраняем и называем как GlobalActions$18
Снова открываем android.policy/smali/com/android/internal/policy/impl/GlobalActions.smali
ищем new-array
new-array v0, v0, [Lcom/android/internal/policy/impl/GlobalActions$Action;
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mAccessiblityShortcut:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
iget-object v1, p0, Lcom/android/internal/policy/impl/GlobalActions;->mSilentModeToggle:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mDataModeToggle:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mPowerOff:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mRestart:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
копируем последние 3 строки и вставляем сразу после этого кода 2 раза:
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mAccessiblityShortcut:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
iget-object v1, p0, Lcom/android/internal/policy/impl/GlobalActions;->mSilentModeToggle:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
aput-object v1, v0, v9
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mDataModeToggle:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mAirplaneModeOn:Lcom/android/internal/policy/impl/GlobalActions$ToggleAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;->mPowerOff:Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
iget-object v2, p0, Lcom/android/internal/policy/impl/GlobalActions;-> mRestart :Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
aput-object v2, v0, v1
aput-object v2, v0, v1
aput-object v2, v0, v1
ищем с начала файла строку mRestart (mPowerOff)
.field private mRestart :Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
вспоминаем ID'ы из текстового документа " 2 "
и ищем в этом же GlobalActions
.line 346
new-instance v0, Lcom/android/internal/policy/impl/GlobalActions$6;
const v1, 0x1080673
invoke-direct , Lcom/android/internal/policy/impl/ GlobalActions$6 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;-> mRestart :Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
копируем и вставляем 2 раза сразу после кода:
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 16 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;-> mRecovery :Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
.line 346
new-instance v0, Lcom/android/internal/policy/impl/GlobalActions$17; замена GlobalActions$6 на GlobalActions$17
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 17 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
iput-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;-> mDownload :Lcom/android/internal/policy/impl/GlobalActions$SinglePressAction;
если нет строки new-array:
ищем 1040181 "global_action_power_off" :
.line 346
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$ 5 ;
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 5 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
копируем и после этого кода вставляем 3 раза:
.line 346
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$ 16 ;
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 16 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
.line 346
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$ 17 ;
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 17 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
.line 346
iget-object v0, p0, Lcom/android/internal/policy/impl/GlobalActions;->mItems:Ljava/util/ArrayList;
new-instance v1, Lcom/android/internal/policy/impl/GlobalActions$ 18 ;
invoke-direct , Lcom/android/internal/policy/impl/GlobalActions$ 18 ;->(Lcom/android/internal/policy/impl/GlobalActions;II)V
сохраняем, пользуемся,
автор F.A.Q.: SEVENI
автор идеи: Shk0t
SEVENI, а как быть, если после сборки отредактированных ресурсов файлы *.xml не шифруются, как это сделано в оригинале? Получается что файл в апк попадает в своем читабельном виде
SEVENI, кстати, на стоковом ядре на смартах Sony/SonyEricsson Xperia перезагрузка в рекавери возможна, только при наличии файла boot по пути cache/recovery, который после перезагрузки пропадает! И то, один фиг в рекавери не попадает, пытается в него войти, но не получается, тупо зависает! Легко проверить - создать этот файл и в терминале набрать:
su
reboot
нужно ядро ковырять!
[ Редактировано awg в 20.3.13 07:17 ]
К550->W610->K700->C901->Xperia Sola->Meizu MX2->Meizu M3 Note->Xiaomi Redmi Note 4x (Mido)->Redmi Note 7Pro (Violet)
Вибра при поднятии трубки на том конце.
Есть сложный способ, я по нему не пошел, свой воткнул.
Итак, андроид 4.0.3, разбираем Phone.apk
Нас интересует файл CallNotifier.smali
Декларируем новую переменную, в которую будем заносить ноль после вибры, чтобы потом не вибрило самопроизвольно.
В начале ищем, где прописаны переменые:
Код:
.field private ok2Ring:Z
Добавляем нашу новую после ok2Ring:
Код:
Чуть ниже начинается код:
Код:
В нем еще чуть ниже есть:
Код:
После неё вставляем:
Код:
Здесь отступление:
Номера регистров (v6 и v9) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".
Далее ищем метод:
Код:
В нём ищем перво встречающеяся "ok2Ring":
Код:
move-object/from16 v0, v43
iput-boolean v4, v0, Lcom/android/phone/CallNotifier;->ok2Ring:Z
Здесь отступление:
Номера регистров (v4 и v0) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".
Далее ищем метод:
Код:
В нём ищем перво встречающеяся "ok2Ring":
Код:
.line 632
.local v1, phone:Lcom/android/internal/telephony/Phone;
iput-boolean v6, v8, Lcom/android/phone/CallNotifier;->ok2Ring:Z
Здесь отступление:
Номера регистров (v6 и v8) брать свои, т.е. те, что в коде прописаны, в той же "ok2Ring".
Далее ищем метод:
Код:
В нем ниже ищем вывод в лог:
.line 1121
.local v2, callState:Lcom/android/internal/telephony/Call$State;
sget-object v7, Lcom/android/internal/telephony/Call$State;->DIALING:Lcom/android/internal/telephony/Call$State;
if-eq v2, v7, :cond_c7
sget-object v7, Lcom/android/internal/telephony/Call$State;->DISCONNECTING:Lcom/android/internal/telephony/Call$State;
if-eq v2, v7, :cond_c7
sget-object v7, Lcom/android/internal/telephony/Call$State;->DISCONNECTED:Lcom/android/internal/telephony/Call$State;
if-eq v2, v7, :cond_c7
sget-object v7, Lcom/android/internal/telephony/Call$State;->ALERTING:Lcom/android/internal/telephony/Call$State;
if-eq v2, v7, :cond_c7
.line 1126
const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"
.line 1127
iget-object v7, v10, Lcom/android/phone/CallNotifier;->mAudioManager:Landroid/media/AudioManager;
if-eq v7, v8, :cond_195
Вставлять вибру будем после:
Код:
.line 1126
const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"
На что стоит обратить внимание, для работоспособности:
имена регистров у вас наверняка другие будут (v7, v8, v0)
Как определить нужные регистры?
смотрим выше и ниже код, ищем подобие:
const/4 v7, 0x2
ага, видим что v7 периодически по коду использется для внесения в неё разных констант, запоминаем номер регистра.
еще шарим по коду не выходя за рамки метода "onPhoneStateChanged":
const/4 v8, 0x2
ага, и v8 тоже периодически используется как свободный регистр.
Ну а третий регистр, придется подбирать (у меня v0).
v0 еще и потому, что ниже она юзается тоже как почти свободная:
.line 1168
const/16 v0, 0x3e8
.line 1169
.local v0, IN_CALL_NOTIFICATION_UPDATE_DELAY:I
const/16 v7, 0x1c
const-wide/16 v8, 0x3e8
Отдельно по поводу регистра v10 - номер регистра тоже свой поставить, прямо после кода где вставляем, видно:
Код:
.line 1126
const-string v7, "onPhoneStateChanged: foregroundCall not Dialing, set Audio mode"
invoke-direct - вот он наш нужный, у меня v10
Как ставить:
Т.к. Phone всегда загружен, то перезагружаем тело перед операциями:
1. подменяем файл в /system/app/
2. права на файл выставляем
3. хвост удаляем: /system/app/Phone.odex
4. перезагружаемся
ну либо подменяем через ADB
Учтите, что если выставили неверные регистры, то Phone будет постоянно выдавать ошибку и будет очень проблематично что-либо сделать на телефоне, т.к. окно ошибки будет всегда выскакивать, нужно заранее подготовить отходной путь, например чтобы стояла программа для соединения по WiFi через ADB, чтобы можно было вернуть исходный.
Для того чтобы редактировать APK приложения. Прежде всего их нужно декомпилировать, а после скомпилировать! Как это сделать и чем можно узнать в этом уроке.
В прошлом уроке вы узнали из чего состоят основные внутренности приложения, а также что данные что APK приложения (в дальнейшем просто APK) можно открыть архиватором, но что либо изменить у вас не получиться! Нужна Декомпиляция APK приложения Android!
Содержание:
- Необходимые инструменты
- Настройка
- Декомпиляция приложения с помощью Apktool через командную строку
- Компиляция приложения с помощью Apktool через командную строку
- Что необходимо чтобы работать с системными APK
- Графические надстройки утилиты ApkTool
Читайте также: