Модификация Android далека от новой идеи, и когда дело доходит до настройки ОС по Вашему желанию, Xposed является одним из самых мощных инструментов. Хотя есть десятки доступных модулей Xposed, мы выбрали несколько фаворитов, чтобы помочь Вам перевести Android на следующий уровень.
Опытные владельцы устанавливают на свои устройства root-права, благодаря котором можно оптимизировать и подробно настроить каждый элемент операционной системы. Были разработаны готовые модули, чтобы пользователям не приходилось вручную редактировать системные файлы. Одним из самых популярных патчей является Xposed Framework. Как его установить, настроить и использовать на смартфонах Xiaomi и Redmi – читайте в статье.
Если Вы находитесь на этой странице, то, вероятно, задаетесь вопросом: Xposed Framework что это за программа? Xposed Framework это способ изменить операционную систему Android на уровне системы, в котором не требуется установка кастомной прошивки android. Все что вам нужно это root-доступ. Предлагаем Вам подборку того, что можно сделать, используя Xposed Framework.
Все указанные модули Вы найдете в самом Xposed Framework. Установите Xposed Framework, запустите и, используя поиск по модулям, найдите модуль, который требуется и установите его.
- Что такое Xposed?
- Добавить комментарий Если нужно ответить кому-то конкретно, лучше нажать на «Ответить» под его комментарием
- Что это?
- Главные функции
- Основные требования
- Версия фреймворка для Xiaomi
- Download VirtualXposed for GameGuardian APK on Android Device.
- What is GameGuardian APK?
- Чем это лучше, чем прошивать кастомное ПЗУ?
- Модули
- Как установить Xposed Framework
- Как установить модули
- Ваш дубль?
- Получение еще большего количества опций
- Переназначение аппаратных кнопок
- Включение «О’кей, Google» для сторонних лаунчеров
- Установка и активация модулей из Xposed Framework
- Как установить Xposed модули
- Для более глубокой настройки
- Отключение предупреждения о высокой громкости
- Топ 5 лучших модулей Xposed
- Greenify
- GravityBox
- XPrivacyLua
- XInsta
- Dark Tricks
- Раздача интернета, где эта возможность заблокирована
- Для лучшего срока службы батареи
- Для более полезного меню питания
- Правильное удаление Xposed Framework
- Как установить Xposed Framework на MIUI
- Примеры кода
- Отступление
- FAQ
- Есть ли разница в установке между MIUI 12 и чистым Android?
- Что делать, если появляется красная галочка с надписью «Xposed Framework не установлен»?
- Будут ли работать платежные системы после установки Xposed?
- Включение многозадачности
- Добавление опций в меню выключения
- Управление разрешениями приложений
- Установка
- Принцип работы «на пальцах»
- Практическая ценность Xposed
- Создание модуля
- Manifest.xml
- /assets/xposed_init
- Java class
- Заключение
Что такое Xposed?
Вкратце, Xposed Framework позволяет пользователям выбирать, какие функции им нужны, и применять их стоковому ROM, а не постоянно устанавливать новые ROM. Это быстро и просто, но есть несколько вещей, о которых нам нужно поговорить, прежде чем начинать сходить с ума с помощью этого сверхмощного инструмента.
Xposed иногда может вызывать непреднамеренные побочные эффекты при использовании на ROM-устройствах производителей, таких как Samsung или LG. В принципе, модули Xposed обычно разрабатываются с учетом стокового Android, а на устройствах Samsung или LG работает что угодно, кроме стокового Android.
Хотя Вы можете использовать Xposed на этих устройствах, но нужно быть осторожным — Вы никогда не знаете, что может пойти не так, когда Вы начинаете пытаться смешивать вещи, которые могут не подходить друг к другу.
Тем временем Google принял решение выпускать новую версию операционной системы ежегодно. Разумеется, стало накладно кастомизировать прошивки: не успеваешь сделать одну, как появляется новая версия ОС. Так в 2014-ом выходит версия Lollipop и разработчики наконец обращают внимание на фреймфорк с мыслями: «Может все же стоит посмотреть что это такое? Выглядит многообещающим«.
В 2015-ом году вышла очередная версия (Marshmallow) и большая часть сообщества, в итоге, признала разработку весьма стоящей, на порядок сокращающей время разработки кастомизаций стоковых прошивок в виде установки отдельных модулей, расширяющих функционал. «Ничего себе, это же совсем безопасно и есть библиотека готовых полезных модулей!» — воскликнули они.
Сейчас конец февраля 2017-го. Xposed под Nougat все еще не доступен, а толпы страждущих разработчиков и пользователей то и дело открывают темы под тип «Xposed не работает! Он мне нужен! Rovo, пожалуйста!«
Сегодня я расскажу об Xposed Framework.
VirtualXposed — грубо говоря, виртуальный Xposed. Благодаря новому приложению, некоторые модули для этого инструмента модифицирования операционной системы работают без прав суперпользователя. VirtualXposed работает следующим образом: он запускает приложения в виртуальной среде VirtualApp (исходный код этой утилиты доступен на GitHub), а затем «перенаправляет» необходимые процессы в Xposed через Epic (его исходный код тоже открытый).
Страница проекта на GitHub здесь.
Последнее изменение:
![]()
![]()
![]()
У меня приложения не скачиваєтся вибиває ошибку інтернета а с інтернетом все харашо планшет Samsung galexy Tad A
![]()
Тут нет вирусов?
![]()
![]()
Офигеть!!! Оно работает!
Приложение выполнено в стиле лаунчера, открывать модули нужно через него.
Спасибки! ^_^
00оо0о00о0о0о0о0ооо0ооо0о0оо.
![]()
Всегда пожалуйста не забудьте обновиться до самой свежей версии 0.17.4
![]()
Я выложил новую версию
![]()
![]()
Устранены мелкие наполадки, краши и приложение обзавелось более высокой оптимизацией на разных устройствах
![]()
Я выложу более новую версию 0.17.4
![]()
А также дополнения постараюсь
![]()
Не работает приложения никакие не открываются
Добавить комментарий
Если нужно ответить кому-то конкретно,
лучше нажать на «Ответить» под его комментарием
Пользователь портала XDA-Developers под ником weishu создал утилиту VirtualXposed — грубо говоря, виртуальный Xposed. Благодаря новому приложению, некоторые модули для этого инструмента модифицирования операционной системы можно использовать без прав суперпользователя.
Согласно описанию, VirtualXposed работает следующим образом: он запускает приложения в виртуальной среде VirtualApp (исходный код этой утилиты доступен на GitHub), а затем «перенаправляет» необходимые процессы в Xposed через Epic (его исходный код тоже открытый). Таким образом, можно запустить некоторые предназначенные для Xposed модули без предоставления им корневого доступа к операционной системе. Иными словами, с помощью VirtualXposed пользователь может модифицировать систему без какого-либо риска.
- Антивор, история уведомлений и ещё 7 полезных функций Android, спрятанных глубоко в настройках
- Простой способ отключить TalkBack на Android. И как запретить ему включаться
- Сравниваем эмуляторы Android для ПК: какой производительнее, а какой удобнее
- Как ускорить старый Android: 7 простых и 3 продвинутых способа, которые реально работают
- Идеальный пароль от девушки, который бесполезно подсматривать. Устанавливаем на Android
Что это?
Xposed Framework– это платформа для установки различных модулей, вносящих существенные изменения в работу мобильного устройства. Раньше фреймворк работал самостоятельно, но теперь требуется программа Magisk. В отдельной статье мы подробно рассказывали о данной утилите.
То есть, Xposed представляет собой Магиск-модуль, на основе которого функционируют другие патчи. Есть огромное количество модулей для Xposed. На базе Magiskони не работают: требуется наличие самого фреймворка.
Главные функции
Само приложение Xposed не добавляет никаких функций. Без установки патчей программа бесполезна. Единственная задача Framework – обеспечить запуск и функционирование модулей, которые, в свою очередь, значительно расширяют возможности смартфона. С помощью Xposed modules можно:
- изменить строку состояния;
- настроить экран блокировки и рабочий стол;
- увеличить время автономной работы;
- убрать рекламу;
- скрыть наличие root-прав от определенных приложений;
- загружать фото и видео в высоком качестве с сайтов, где это запрещено по умолчанию (например, Instagram, Twitter).
Мы перечислили только основные опции, предоставляемые популярными модулями. Подробнее о лучших дополнениях для Xposed, которые можно установить на Андроид, читайте в следующем пункте.
Основные требования
Прежде всего, для установки Xposed Framework обязателен режим Суперпользователя. Если ваш телефон еще не рутирован, ознакомьтесь с пошаговой инструкцией. Также на устройстве должен стоять софт Magisk Manager. И, конечно же, желателен разблокированный загрузчик и кастомное рекавери.
Все действия вы проводите на свой страх и риск. Любой патч может нанести огромный вред мобильному устройству. Поэтому не забывайте делать резервное копирование.
Версия фреймворка для Xiaomi
Поскольку все современные смартфоны Сяоми работают под управлением Android 9/10 и MIUI11/12, стандартный framework не подойдет. Для девятого и десятого Андроида была специально разработана утилита EdXposed. Именно об установке данной программы сегодня пойдет речь.
Here is the build of VirtualXposed for GameGuardian to hack the games in the virtual environment. I know this is possible with the apps like Parallel space, Go Multiple, 2Face, and many others. However, this method gives you exact results while applying hacks.
In addition to this, the Xposed Framework is preinstalled in this app and works as expected with the modules which don’t interfere with the system things since it doesn’t require root access.
Basically, Everybody knows that GameGuardian is for rooted android devices, but you can run it on the virtual environment. So, this method comes into the picture and works flawlessly.

Table of Contents
- Download VirtualXposed for GameGuardian APK on Android Device.
- How to use VirtualXposed for GameGuardian?
Download VirtualXposed for GameGuardian APK on Android Device.
Weishu developed this application for Non-root Gamers who want to use this hack tool for getting control over the Coins, Money, Lives and Whatever that makes you a winner.
Now, here is the download link
And GameGuardian APK for Android devices – Download
What is GameGuardian APK?
A game hack/alteration tool for Android devices which helps you to modify the count of coins, money, HP, SP, and more. Works on most of the CPU architectures including ARM, ARM 64, x86 and x86_64.
Meanwhile, runs on emulators such as LDPlayer, BlueStacks, Droid4X, MOMO, KOPlayer, Andy, Memu, Leapdroid, AMIDuOS, Windroye, RemixOS, PhoenixOS, AVD, Genymotion, Nox etc.
A Quick guide lets you know the installation procedure and how you can use this tool with the games.
Step 1. Once you downloaded the VirtualXposed for GameGuardian APK from our official source links, now proceed to the installation.
Step 2. Go to the download folder and Tap on the APK. Install it on your android device. Some people might face a security popup while performing and it asks you to allow unknown sources. Allow it.

Step 3. Open the Virtual Xposed and allow some necessary permissions.
Step 4. Now, time to add the GameGuardian app into the virtual space. For this, you have to go through this procedure.
- Long Tap on Home or Open Menu
- Click on Add App
- Select GameGuardian APK from the Internal Storage or from the installed applications if you installed it already.
- Finally, tap on the install button.
Time to hack the game with the Game Guardian APP in the VirtualXposed.
If you have a doubt regarding the installation, then read our full guide from here.
Мы в Guiding Tech — большие поклонники открытости Android и всего того удивительного, что он позволяет нам делать. Добавление пользовательских ПЗУ в автоматизацию для добавления экспериментальных функций. Но чтобы сделать что-либо из этого, вам пришлось оставить комфорт и стабильность стандартного Android и погрузиться в неизведанные воды. Какими бы продвинутыми ни были некоторые пользовательские прошивки, такие как MIUI и твики, они создаются разработчиками и энтузиастами Android в свободное время. Они не проходят месяцы тестирования, чтобы убедиться, что они хорошо работают в любой ситуации. На самом деле не было промежуточного варианта. До настоящего времени.
Краткое примечание: Чтобы установить Xposed, вам необходимо получить root-права, запустить кастомное восстановление и использовать совместимое оборудование. Процесс рутирования зависит от вашего устройства. Проведите исследование перед рутированием и установкой Xposed.
Xposed Framework — это основа для вашего телефона Android с рутированным доступом. Само по себе это не так много. Но он позволяет вам устанавливать другие приложения / моды / настройки с функциональностью системного уровня без необходимости их прошивать через пользовательское восстановление.
Xposed Framework значительно упрощает настройку /мод ваш телефон. Вы можете не только изменить внешний вид своего телефона Android, но также повысить его производительность и настроить функциональность на системном уровне с помощью Xposed Framework.
Чем это лучше, чем прошивать кастомное ПЗУ?
- Легче использовать: Чтобы прошить пользовательское ПЗУ, вам нужно войти в пользовательское восстановление, стереть свой телефон и установить совершенно новую ОС, а затем прошить пару zip-файлов, включая приложения Google. После этого вам нужно переустановить приложения из резервной копии. С другой стороны, установить твики в Xposed так же просто, как установить приложения. Вам даже не нужно заходить в кастомное восстановление, и здесь нет ничего плохого. В конечном счете, прошивка пользовательского ПЗУ — это трудоемкая задача, для выполнения которой требуются много исследований и планирования. Конечно, вам может понравиться все это, и никто вас не остановит.
- Вы можете оставаться на складе: Вы можете использовать Xposed на своем текущем стандартном ПЗУ. Тот, который стабильный и знакомый. Вам не нужно искать что-то, что соответствует вашим потребностям, или учиться использовать новую сложную функцию. Все, что вы делаете, это добавляете поверх того, что уже хорошо работает. По крайней мере, это касается устройств Nexus, Motorola и Google Play Edition.
Модули
Как я сказал ранее, Xposed Framework — это всего лишь фреймворк. Его функциональность расширена за счет Модули, точно так же, как приложения на вашем телефоне Android, расширяют функциональность вашего телефона. Модули в основном .apk файлы, которые вы можете загрузить из любого места в Интернете, и вы устанавливаете их так же, как и любое другое приложение, через боковую загрузку.
Как установить Xposed Framework
Шаг 1: Первое, что нужно сделать, когда вы имеете дело с любым приложением, использующим root-доступ, — это создать резервную копию вашей системы. Загрузитесь в собственное восстановление и сделайте резервную копию, прежде чем двигаться дальше.
Шаг 2: Теперь возьмите последнюю apk файл из здесь.
Шаг 3: Установите приложение с боковой загрузкой. Вам нужно будет включить опцию, позволяющую устанавливать приложения, загруженные не из Play Store. Вы можете сделать это, войдя в Настройки -> Безопасность и проверяя вариант, который говорит Неизвестные источники.
Шаг 4: После этого вам нужно будет запустить приложение Xposed Installer, перейти в Фреймворк раздел и нажмите Установить обновление.
Шаг 5: Перезагрузите устройство, и все готово.
Как установить модули
Но лучший способ сделать это — из самого приложения Xposed Installer.
- Найдите нужный модуль в Загрузки раздел в приложении. Вы также можете просмотреть список модулей здесь.
- Когда вы найдете то, что ищете, внимательно прочтите описание. Это очень важно, потому что многие модули требуют, чтобы вы запустили стандартный Android, и они не будут работать на Samsung Touchwiz или HTC Sense ROM.
- Прочитав описание и убедившись, что ваш телефон поддерживается, нажмите кнопку «Загрузить».
- Модули похожи на обычные приложения для Android. Таким образом, процесс установки такой же.
- После установки модуля вы получите уведомление о том, что модуль неактивен. Коснитесь уведомления, и вы попадете на страницу со списком всех модулей, которые вы загрузили в свою систему.
- Отметьте те, которые хотите активировать, снимите отметки с тех, которые хотите деактивировать.
- Перезагрузитесь, и все изменения будут применены.
Модули — это приложения, поэтому, если вы хотите настроить какие-либо конкретные параметры для модуля, просто откройте приложение и приступайте к взлому. Есть много отличных модулей, которые вы можете попробовать на своем стандартном телефоне Android. Некоторые из них предоставляют определенные функции, например, делают переключатель недавних приложений прозрачным и все такое. Кроме того, существуют универсальные модули, которые позволяют настраивать каждую деталь вашего телефона. Подробнее о них мы поговорим в следующей статье.
Ваш дубль?
Что вы думаете об этом фреймворке? Это может вас заинтересовать? Дайте нам знать в комментариях ниже.
Получение еще большего количества опций
Модули GravityBox и XBlast добавят огромное количество дополнительных опций для Вашего Android устройства. Цель GravityBox — собрать все настройки и опции, которые Вы нашли бы в пользовательских прошивках, в одном месте, позволяя изменить многие параметры без необходимости скачивать отдельные модули и перезагружать устройство.
Надеюсь, прочитав статью, Вы нашли ответ на вопрос «Xposed Framework что это за программа?». Есть много модулей, исправляющих проблемы с конкретными телефонами. На Moto X Вы можете скрыть название оператора в строке состояния.
Переназначение аппаратных кнопок
Модуль Xposed Additions позволяет переназначить аппаратные кнопки на устройствах Android. Вы можете включить использование кнопки громкости, как кнопку камеры, чтобы легче делать фотографии на устройствах без специальной кнопки для камеры. Xposed Additions содержит множество вариантов.
Включение «О’кей, Google» для сторонних лаунчеров
Если у Вас установлен Google Now Launcher, то Вы можете сказать «О’кей, Google», чтобы открыть диалог Google Now и использовать голосовые команды. Вы не можете сделать это в сторонних лаунчерах, но модуль «OK Google for 3rd party launchers / apps (4.4+)» позволяет использовать команду «О’кей, Google» в любом лаунчере.
Установка и активация модулей из Xposed Framework
Дополнения Xposed Framework и Magisk ставятся по одинаковой схеме.
- Заходим в менеджер фреймворка, открываем боковое меню и кликаем «Поиск модулей».
- Просматриваем имеющиеся варианты. Найти нужный патч можно по ключевому слову в строке поиска.
- Нажимаем «Скачать» – «Установить». Высветится уведомление, что модуль установлен, но не активирован.
- Кликаем по этому оповещению. Нас перебросит на страницу со всеми скачанными модулями. Отмечаем галочками те, которые нужно активировать.
- Перезагружаем телефон.
- Скачиваем модуль Xposed Framework в формате apk.
- Устанавливаем приложение с помощью файлового менеджера.
- Перезапускаем операционную систему.
Если модуль не устанавливается как стандартное приложение, попробуйте поставить его на телефон через кастомное рекавери. Скачиваем файл и переводим Сяоми в режим recovery: зажимаем клавишу питания и громкость+.
Появится меню, в котором нажимаем по первой плитке «Install». Указываем путь к файлу. Делаем свайп вправо, чтобы подтвердить процедуру. После того, как установка успешно завершится, кликаем «Reboot System».
Как установить Xposed модули
Как только Xposed установлен и готов к работе, поиск нижеприведенных модулей является быстрым. Просто откройте Xposed Framework, откройте меню и выберите «Поиск модулей».

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

Кроме того, мы предоставим ссылку на каждый модуль, который мы обсудим в этом руководстве, который направит Вас в репозиторий Xposed Module в Интернете. Вы можете прочитать описания разработчиков этих модулей, а также загрузить их прямо оттуда.
Вот модули, которые, по нашему мнению, Вы должны попробовать.
Для более глубокой настройки
Все еще неудовлетворены? Если Вы такой человек, который хотел бы подстроить каждую мелочь — от внешнего вида до функциональности, то GravityBox — это модуль Xposed для Вас.
GravityBox — это в инструмент «все-в-одном», который предлагает множество дополнительных настроек (как эстетических, так и функциональных) для всего: от экрана блокировки до строки состояния и т. д. Мы не можем охватить все, что делает GravityBox, но просто знайте, что если Вы используете Xposed, это обязательное приложение.


Загрузите, установите и начните просматривать меню, чтобы увидеть все, что Вы можете сделать.
Xposed — отличный инструмент для тех, кто использует старые ROM. Фактически, многие пользователи Xposed отказываются обновляться до ничего нового, чем Marshmallow, потому что они так сильно полагаются на модули. В любом случае, если Вы имеете root доступ на телефоне, нет причин не использовать Xposed. На самом деле, может быть, стоит подумать о том, чтобы получить root доступ, если есть определенные функциональности, который Вы ищете.
Отключение предупреждения о высокой громкости
Android отображает предупреждение «Поднять громкость выше безопасного уровня?» всякий раз, когда Вы увеличиваете громкость выше определенного уровня. Это может помочь некоторым людям, чтобы не повредить слух, но это глупое предупреждение, потому что разные типы наушников требуют различные уровни громкости устройства для вывода той же громкости звука.
И это сообщение появляется не один раз, а каждый. Если Вы пытаетесь увеличить уровень громкости, когда устройство находится в кармане, то Вам нужно будет вытащить устройство, разблокировать его, и согласиться с предупреждением, прежде чем продолжить.
Модуль NoSafeVolumeWarning отключает это предупреждение.
Топ 5 лучших модулей Xposed
Рассмотрим дополнения, которые с вероятностью 90% работают на всех смартфонах от Xiaomi. Большинство патчей устанавливаются из репозитория.
Greenify
Инструмент переводит неиспользуемые приложения, сервисы и фоновые процессы в спящий режим. Greenify определяет, какие процессы запускаются во время определенного действия и деактивирует их. За счет этого значительно снижается потребление оперативной памяти, а срок работы батареи на одном заряде увеличивается.
Обратите внимание, что «замороженная» программа не работает в фоновом режиме и не запускается самостоятельно. Например, вы остановили работу будильника, и звуковых сигналов по выставленному времени не будет.
GravityBox

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

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

Ссылка на скачивание
Dark Tricks

Ссылка на скачивание
Приложение для работы с уведомлениями и кнопками.
- Убирает со статус-бара ненужные закрепленные оповещения, например, о включенном VPN или ADB.
- Меняет назначение клавиш: можно настроить включение фонарика при удержании кнопки питания, а с помощью качельки громкости переключать треки.
- Предотвращает случайные пробуждения экрана.
- Меняет значок 4G+ на LTE и наоборот.
Раздача интернета, где эта возможность заблокирована
Если Вам когда-либо понадобилось подключить сотовый телефон к другому устройству, но не можете, потому что это возможность заблокирована Вашим оператором, X Tether — это Ваш инструмент. Здесь нет прямого интерфейса, так как это простой инструмент, который разблокирует собственную привязку к Android.
Для лучшего срока службы батареи
Если бы у Вас когда-либо была причина, чтобы получить root права на телефоне, то для лучшего срока службы батареи. На протяжении многих лет Android стал намного лучше, но Вы действительно можете продлить срок службы аккумулятора своего телефона с помощью пары превосходных модулей Xposed, которые легко работают в тандеме: Greenify и Amplify.
Greenify доступен для всех пользователей Android, даже без root прав. Greenify закрывает спящие приложения, которые Вы не используете, чтобы сэкономить аккумулятор, и это очень удобно. Мы много говорили об этом здесь, поэтому мы не будем углубляться в то, что такое Greenify.
Если Вы имеете root права, то Greenify становится еще лучше. Он может работать вместе с Doze Mode, даже привнося некоторые новые функции из Nougat в более старые версии ОС. Модуль Xposed добавляет еще больше, позволяя Вам погрузить в сон приложения обмена сообщениями, не отказываясь от уведомлений.
Amplify, с другой стороны, позволяет пользователям более детально контролировать Android wakelocks. Это в основном означает, что Вы можете сообщать Android о том, когда и как долго он может покинуть свое состояние сна, что по существу предотвращает его отсутствие каких-либо услуг или приложений, позволяющих ему проснуться и не вернуться в режим сна. В этом модуле есть обширная настройка, хотя она настроена довольно хорошо с самого начала.


Мы рекомендуем устанавливать как Greenify, так и Amplify из Play Store, а затем включить их модули из Xposed.
Для более полезного меню питания
APM + — это простой способ настроить меню питания Android, не только привнеся полезных функций, как кнопка мгновенной перезагрузки, но также возможность добавлять в меню кнопки, такие как Wi-Fi и фонарик.
Правильное удаление Xposed Framework
- Переходим в MagiskManagerи открываем вкладку «Модули».
- Нажимаем по изображения корзины возле патчей «Riru – EdXposed» и «Riru – core». Если снять галочки, дополнения просто выключатся, но не удалятся полностью.
- Удаляем приложение EdXposed Manager как обычный apk-файл (через проводник или пункт в системных настройках).
- Перезапускаем телефон.
Как установить Xposed Framework на MIUI
Рассмотрим процедуру установки Xposed Framework для Android-устройств. Инструкция подойдет как для Миюай, так и для других смартфонов под управлением Андроид 9 и 10.
- Переходим в Magisk Manager и жмем по изображению трех полосок в левом верхнем углу.
- В открывшемся меню кликаем «Репозиторий», и в строку поиска вводим название «Magisk manager for recovery mode (mm)».Данный патч необязателен, но он нужен, если телефон войдет в состояние бутлупа из-за использования Xposed.
- Нажимаем по стрелке возле названия модуля. Подтверждаем загрузку, кликнув «Установка».
- После завершения процесса тапаем по желтой кнопке «Перезагрузка».
- Аналогичным способом устанавливаем из репозитория дополнения «Riru – core» и «Riru – EdXposed». Можно выбрать версию от YAHFA или SandHook.
- Перезагружаем смартфон.
- Убеждаемся, что скачанные модули успешно установились. Для этого в Magisk Manager открываем вкладку «Модули» и проверяем наличие галочки возле каждого патча.
- Далее нужно скачать приложение Xposed Framework Installer (EdXposed Manager). Последнюю версию можно загрузить с форумов 4pdaи XDA-Developers, или с надежного сайта GitHub, перейдя по этой ссылке.
- Открываем в Проводнике загруженный apk файл и устанавливаем стандартным методом.
- Еще раз перезагружаем мобильное устройство, чтобы активировать Xposed Framework.
- Теперь заходим в EdXposed Manager. На стартовой странице должна быть голубая галочка с надписью «EdXposed Framework активирован». Можно приступать к работе с модулями.
Обратите внимание! Если не нашли патчи«Riru – core» и «Riru – EdXposed» в репозитории Магиска, их можно загрузить со стороннего сайта. Ссылка 1. Ссылка 2. Ручная установка проводится через Magisk или TWRP Recovery. Читайте в отдельном материале, как правильно установить Магиск-модули.
Примеры кода
Основной код, если вы конечно не решили всего лишь изменить цвета или шрифты какого-то приложения, происходят в handleLoadPackage. Для этого мы предварительно изучаем исходный код интересующего приложения, придумываем как модифицировать код и описываем нашу логику.
Основная логика работает через findAndHookMethod метод, реже через findAndHookConstructor и findClass. Все основные методы можно подглядеть в классе XposedHelpers.
Выглядит это примерно так:
if (packageName.contains("ubercab.driver"))
{ try { XposedHelpers.findAndHookMethod( "com.ubercab.driver.feature.online.DispatchedFragment", llpm.classLoader, "onCreateView", "android.view.LayoutInflater", "android.view.ViewGroup", "android.os.Bundle", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { } } ); } catch (Throwable t) { XposedBridge.log(t); }
}В первую очередь нам надо обернуть наши «хуки» в try/catch, так как если в вашем коде будет ошибка, без обертки основное приложение может завершить работу c ошибкой, а полный трейс может попасть разработчику, который станет в курсе, что на его приложение наложили модуль. При обертке весь трейс можно вывести в лог Xposed и понять где у нас произошла ошибка и почему.
В findAndHookMethod первый параметр — это название класса, вторая — ссылка на загрузчик класса, третья — название нужного нам метода, далее идет перечисление в виде строк какие переменные передаются в метод и в конце наш callback метод.
Вот пример как можно заполучить контекст класса и воспользоваться им
try{ XposedHelpers.findAndHookMethod("com.ubercab.driver.core.app.DriverApplication", llpm.classLoader, "init", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Application application = (Application) param.thisObject; Context context = application.getApplicationContext(); Intent intent = new Intent("uber.hack.ACTION_BACKGROUND"); context.sendBroadcast(intent); } });
} catch (Throwable t) { XposedBridge.log(t);
} Мы отлавливаем загрузку метода init в классе DriverApplication и через param.thisObject используем контекст для отправки широковещательного сообщения нашему ресиверу или сервису.
или если необходимо изменить передаваемые переменные в метод, то сделать это можно через
try{ XposedHelpers.findAndHookMethod("com.htc.htcdialer.widget.DividerDrawable", paramLoadPackageParam.classLoader, "setDividerColor", "int", "int", new XC_MethodHook() { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { int paramInt1 = (Integer) param.args[0]; int paramInt2 = (Integer) param.args[1]; if (paramInt1 == 4) { if (paramInt2 == -13388315) param.args[1] = Color.RED; if (paramInt2 == -13128336) param.args[1] = Color.BLUE; } } });
} catch (Throwable t) { XposedBridge.log(t);
}Помимо XC_MethodHook можно использовать XC_MethodReplacement. Название говорит само за себя. Мы полностью заменяем какой-то метод нашим собственным. Вот типичный пример когда мне захотелось избавиться от всплывающего уведомления, когда я подключаю телефон по USB к ноутбуку
findAndHookMethod("com.android.settings.PSService", paramLoadPackageParam.classLoader, "SetUSBNotification", "android.content.Context", boolean.class, new XC_MethodReplacement()
{ protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return null; }
});В данном void методе вызывалось уведомление. Я его просто заменил и забыл что мне когда-то это мешало.
Были случаи и посложней. Я своими модулями исправлял ошибки в системных приложениях. Ждать, когда производитель исправит баг в новом ОТА приложении меня не особо прельщало, поэтому я исправлял сам.
public static void tweak_fix98918()
{ // -------------------------------------------------- // https://android-review.googlesource.com/#/c/98918/ // -------------------------------------------------- try { final Class<?> TaskRecord = XposedHelpers.findClass("com.android.server.am.TaskRecord", null); XposedHelpers.findAndHookMethod(TaskRecord, "setFrontOfTask", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { Object mActivities = XposedHelpers.getObjectField(param.thisObject, "mActivities"); boolean foundFront = false; final int numActivities = (Integer) XposedHelpers.callMethod(mActivities, "size"); for (int activityNdx = 0; activityNdx < numActivities; activityNdx++) { final Object r = XposedHelpers.callMethod(mActivities, "get", activityNdx); if (foundFront || XposedHelpers.getBooleanField(r, "finishing")) { XposedHelpers.setBooleanField(r, "frontOfTask", false); } else { XposedHelpers.setBooleanField(r, "frontOfTask", true); foundFront = true; } } if (!foundFront && numActivities > 0) { Object get = XposedHelpers.callMethod(mActivities, "get", 0); XposedHelpers.setBooleanField(get, "frontOfTask", true); } return null; } }); } catch (Throwable t) { XposedBridge.log(t); }
}
// --------------------------------------------------
// https://android-review.googlesource.com/#/c/81970/
// --------------------------------------------------
public static void tweak_fix81970()
{ try { final Class<?> ActiveServices = XposedHelpers.findClass("com.android.server.am.ActiveServices", null); XposedHelpers.findAndHookMethod(ActiveServices, "killServicesLocked", "com.android.server.am.ProcessRecord", "boolean", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { // XposedBridge.log("killServicesLocked happen"); Boolean DEBUG_SERVICE = (Boolean) XposedHelpers.getStaticBooleanField(ActiveServices, "DEBUG_SERVICE"); String TAG = (String) XposedHelpers.getStaticObjectField(ActiveServices, "TAG"); Object app = param.args[0]; boolean allowRestart = (Boolean) param.args[1]; Object services = XposedHelpers.getObjectField(app, "services"); int size = (Integer) XposedHelpers.callMethod(services, "size"); // First clear app state from services. for (int i = size - 1; i >= 0; i--) { Object sr = XposedHelpers.callMethod(services, "valueAt", i); Object stats = XposedHelpers.getObjectField(sr, "stats"); synchronized (XposedHelpers.callMethod(stats, "getBatteryStats")) { XposedHelpers.callMethod(stats, "stopLaunchedLocked"); } Object sr_app = XposedHelpers.getObjectField(sr, "app"); Boolean persistent = XposedHelpers.getBooleanField(sr_app, "persistent"); Boolean stopIfKilled = XposedHelpers.getBooleanField(sr, "stopIfKilled"); if (sr_app != null && !persistent && stopIfKilled) { Object sr_app_services = XposedHelpers.getObjectField(sr_app, "services"); XposedHelpers.callMethod(sr_app_services, "remove", sr); } XposedHelpers.setObjectField(sr, "app", null); XposedHelpers.setObjectField(sr, "isolatedProc", null); XposedHelpers.setObjectField(sr, "executeNesting", 0); XposedHelpers.callMethod(sr, "forceClearTracker"); Object mDestroyingServices = XposedHelpers.getObjectField(param.thisObject, "mDestroyingServices"); Boolean check = (Boolean) XposedHelpers.callMethod(mDestroyingServices, "remove", sr); if (check) { if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr); } Object bindings = XposedHelpers.getObjectField(sr, "bindings"); final int numClients = (Integer) XposedHelpers.callMethod(bindings, "size"); for (int bindingi = numClients - 1; bindingi >= 0; bindingi--) { Object IntentBindRecord = XposedHelpers.callMethod(bindings, "valueAt", bindingi); if (DEBUG_SERVICE) Slog.v(TAG, "Killing binding " + IntentBindRecord + ": shouldUnbind=" + XposedHelpers.getObjectField(IntentBindRecord, "hasBound")); XposedHelpers.setObjectField(IntentBindRecord, "binder", null); XposedHelpers.setObjectField(IntentBindRecord, "requested", false); XposedHelpers.setObjectField(IntentBindRecord, "received", false); XposedHelpers.setObjectField(IntentBindRecord, "hasBound", false); } } // Clean up any connections this application has to // other // services. Object connections = XposedHelpers.getObjectField(app, "connections"); size = (Integer) XposedHelpers.callMethod(connections, "size"); for (int i = size - 1; i >= 0; i--) { Object ConnectionRecord = XposedHelpers.callMethod(connections, "valueAt", i); XposedHelpers.callMethod(param.thisObject, "removeConnectionLocked", ConnectionRecord, app, null); } XposedHelpers.callMethod(connections, "clear"); Object smap = XposedHelpers.callMethod(param.thisObject, "getServiceMap", XposedHelpers.getObjectField(app, "userId")); // Now do remaining service cleanup. services = XposedHelpers.getObjectField(app, "services"); size = (Integer) XposedHelpers.callMethod(services, "size"); for (int i = size - 1; i >= 0; i--) { Object sr = XposedHelpers.callMethod(services, "valueAt", i); Object mServicesByName = XposedHelpers.getObjectField(smap, "mServicesByName"); if (XposedHelpers.callMethod(mServicesByName, "get", XposedHelpers.getObjectField(sr, "name")) != sr) { Object cur = XposedHelpers.callMethod(mServicesByName, "get", XposedHelpers.getObjectField(sr, "name")); Slog.wtf(TAG, "Service " + sr + " in process " + app + " not same as in map: " + cur); Object app_services = XposedHelpers.getObjectField(app, "services"); XposedHelpers.callMethod(app_services, "removeAt", i); continue; } // Any services running in the application may // need to be // placed back in the pending list. Object serviceInfo = XposedHelpers.getObjectField(sr, "serviceInfo"); Object applicationInfo = XposedHelpers.getObjectField(serviceInfo, "applicationInfo"); if (allowRestart && XposedHelpers.getIntField(sr, "crashCount") >= 2 && (XposedHelpers.getIntField(applicationInfo, "flags") & ApplicationInfo.FLAG_PERSISTENT) == 0) { Slog.w(TAG, "Service crashed " + XposedHelpers.getIntField(sr, "crashCount") + " times, stopping: " + sr); EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH, XposedHelpers.getObjectField(sr, "userId"), XposedHelpers.getObjectField(sr, "crashCount"), XposedHelpers.getObjectField(sr, "shortName"), XposedHelpers.getObjectField(app, "pid")); XposedHelpers.callMethod(param.thisObject, "bringDownServiceLocked", sr); } else if (!allowRestart) { XposedHelpers.callMethod(param.thisObject, "bringDownServiceLocked", sr); } else { boolean canceled = (Boolean) XposedHelpers.callMethod(param.thisObject, "scheduleServiceRestartLocked", sr, true); // Should the service remain running? Note // that in the // extreme case of so many attempts to // deliver a command // that it failed we also will stop it here. if (XposedHelpers.getBooleanField(sr, "startRequested") && (XposedHelpers.getBooleanField(sr, "stopIfKilled") || canceled)) { Object pendingStarts = XposedHelpers.getObjectField(sr, "pendingStarts"); if ((Integer) XposedHelpers.callMethod(pendingStarts, "size") == 0) { XposedHelpers.setBooleanField(sr, "startRequested", false); if (XposedHelpers.getObjectField(sr, "tracker") != null) { Object tracker = XposedHelpers.getObjectField(sr, "tracker"); Object mAm = XposedHelpers.getObjectField(param.thisObject, "mAm"); Object mProcessStats = XposedHelpers.getObjectField(mAm, "mProcessStats"); XposedHelpers.callMethod(tracker, "setStarted", false, XposedHelpers.callMethod(mProcessStats, "getMemFactorLocked"), SystemClock.uptimeMillis()); } if (!XposedHelpers.getBooleanField(sr, "hasAutoCreateConnections")) { // Whoops, no reason to restart! XposedHelpers.callMethod(param.thisObject, "bringDownServiceLocked", sr); } } } } } if (!allowRestart) { Object app_services = XposedHelpers.getObjectField(app, "services"); XposedHelpers.callMethod(app_services, "clear"); // Make sure there are no more restarting // services for this // process. Object mRestartingServices = XposedHelpers.getObjectField(param.thisObject, "mRestartingServices"); for (int i = (Integer) XposedHelpers.callMethod(mRestartingServices, "size") - 1; i >= 0; i--) { Object r = XposedHelpers.callMethod(mRestartingServices, "get", i); String processName = (String) XposedHelpers.getObjectField(r, "processName"); Object serviceInfo = XposedHelpers.getObjectField(r, "serviceInfo"); Object applicationInfo = XposedHelpers.getObjectField(serviceInfo, "applicationInfo"); Object info = XposedHelpers.getObjectField(app, "info"); if (processName.equals((String) XposedHelpers.getObjectField(app, "processName")) && XposedHelpers.getIntField(applicationInfo, "uid") == XposedHelpers.getIntField(info, "uid")) { XposedHelpers.callMethod(mRestartingServices, "remove", i); XposedHelpers.callMethod(param.thisObject, "clearRestartingIfNeededLocked", r); } } Object mPendingServices = XposedHelpers.getObjectField(param.thisObject, "mPendingServices"); for (int i = (Integer) XposedHelpers.callMethod(mPendingServices, "size") - 1; i >= 0; i--) { Object r = XposedHelpers.callMethod(mPendingServices, "get", i); String processName = (String) XposedHelpers.getObjectField(r, "processName"); Object serviceInfo = XposedHelpers.getObjectField(r, "serviceInfo"); Object applicationInfo = XposedHelpers.getObjectField(serviceInfo, "applicationInfo"); Object info = XposedHelpers.getObjectField(app, "info"); if (processName.equals((String) XposedHelpers.getObjectField(app, "processName")) && XposedHelpers.getIntField(applicationInfo, "uid") == XposedHelpers.getIntField(info, "uid")) { XposedHelpers.callMethod(mPendingServices, "remove", i); } } } // Make sure we have no more records on the stopping // list. Object mDestroyingServices = XposedHelpers.getObjectField(param.thisObject, "mDestroyingServices"); int i = (Integer) XposedHelpers.callMethod(mDestroyingServices, "size"); while (i > 0) { i--; Object sr = XposedHelpers.callMethod(mDestroyingServices, "get", i); if (XposedHelpers.getObjectField(sr, "app") == app) { XposedHelpers.callMethod(sr, "forceClearTracker"); XposedHelpers.callMethod(mDestroyingServices, "remove", i); if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr); } } Object executingServices = XposedHelpers.getObjectField(app, "executingServices"); XposedHelpers.callMethod(executingServices, "clear"); return null; } }); } catch (Throwable t) { XposedBridge.log(t); }
}Вот так вот я разрешал всем приложениям писать информацию на SD карточку, когда этот функционал урезали в целях безопасности на KitKat.
try { XposedHelpers.findAndHookMethod("com.android.server.SystemConfig", paramLoadPackageParam.classLoader, "readPermission", "org.xmlpull.v1.XmlPullParser", "java.lang.String", new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { String permission = (String) param.args[1]; if (permission.equals("android.permission.WRITE_EXTERNAL_STORAGE")) { Class<?> process = XposedHelpers.findClass("android.os.Process", null); int gid = (Integer) XposedHelpers.callStaticMethod(process, "getGidForName", "media_rw"); Object mPermissions = XposedHelpers.getObjectField(param.thisObject, "mPermissions"); Object localPermissionEntry = XposedHelpers.callMethod(mPermissions, "get", permission.intern()); int[] gids = (int[]) XposedHelpers.getObjectField(localPermissionEntry, "gids"); XposedHelpers.setObjectField(localPermissionEntry, "gids", ArrayUtils.appendInt(gids, gid)); } } });
} catch (Throwable t) { XposedBridge.log(t);
}Доступ к переменным и методам класса осуществляется через класс XposedHelpers. Например:
Object mActivity = XposedHelpers.getObjectField(param.thisObject, "mActivity");Если объект является доступным импортируемым классом, то можно полученный объект сразу привести к нужному типу
(Activity) mActivity = (Activity) XposedHelpers.getObjectField(param.thisObject, "mActivity");и облегчить дальнейший код. Если же объект является каким-то типом внутреннего класса, который нам не доступен для импорта, в дальнейшем использование его методов и свойств также доступно через XposedHelpers.
Резюмируя вышесказанное: мы можем изменять статические и финальные переменные любого класса, в любое время и в любом месте. Проверять переменные передаваемые в методы, изменять их до выполнения, изменять результат отдельных методов, либо полностью замещать их своим кодом.
В большинстве случаев достаточно отловить нужный метод и модифицировать либо изменить его логику можно сразу, как только приложение запускается. Но существует известная проблема с лимитом количества методов в одном DEX файле, поэтому многие громоздкие приложения имеют по 3-5 дополнительных DEX файла. Здесь скрывается подводный камень. Обойти его довольно таки просто:
public void handleLoadPackage( LoadPackageParam paramLoadPackageParam) throws Throwable { final LoadPackageParam llpm = paramLoadPackageParam; String packageName = paramLoadPackageParam.packageName; if (packageName.contains("ubercab.driver")) { // Методы в основном DEX файле try{ XposedHelpers.findAndHookMethod("com.ubercab.driver.feature.main.MainActivity", llpm.classLoader, "onNewIntent", "android.content.Intent", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { // Тут наш код } }); } catch (Throwable t) { XposedBridge.log(t); } // Ловим подгрузку дополнительных DEX файлов. XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { // Тут ищем классы и методы, которые расположены в дополнительных DEX файлах. try { XposedHelpers.findAndHookMethod( "com.ubercab.driver.feature.online.DispatchedFragment", llpm.classLoader, "onCreateView", "android.view.LayoutInflater", "android.view.ViewGroup", "android.os.Bundle", new XC_MethodHook() { // здесь будет код } ); } catch (Throwable t) { XposedBridge.log(t); } } }); }
}Что касается обфусцированных приложений, на первый взгляд нужно переписывать модуль при каждом новом релизе приложения. Выход из этого положения всегда есть, но это отдельная тема. Основной принцип — это найти класс, который не обфусцируется и бэктрейсом определить имена классов и методов.
Отступление
Больше трех лет назад я начал писать цикл статей про модификацию прошивок для Android. В данный момент актуальность данных статей весьма сомнительна: процесс очень трудоемок, требует много времени и инструментов, а малейшая ошибка может обернуться значительными проблемами вплоть до полной перепрошивки телефона.
Я прождал около двух лет в надежде, что кто-то все же опишет на Хабре что такое Xposed Framework и как он может упросить процесс кастомизации приложений, но подозреваю, что мало кто знаком с этим чудным творением. Для своих нужд я написал несколько десятков модулей, некоторые даже публиковал в общем репозитарии, который на данный момент содержит более 1000 готовых к эксплуатации разработок. Каждый модуль — это может быть не одна единственная кастомизация, а целый набор функций с интерфейсом настроек или дополнительного функционала. Яркий пример тому GravityBox или Sense ToolBox.
Я не буду описывать процесс установки и получение root прав, а хочу описать что из себя представляет фреймфорк и как написать простейший модуль.
FAQ
Есть ли разница в установке между MIUI 12 и чистым Android?
Что делать, если появляется красная галочка с надписью «Xposed Framework не установлен»?
Будут ли работать платежные системы после установки Xposed?
Мы подробно обсудили инструмент Xposed Framework. Теперь вы знаете, как им правильно пользоваться. При возникновении неполадок обращайтесь к нам за помощью.
Включение многозадачности
Старые версии Android не имеют возможность запустить два приложения на одном экране, но некоторые сторонние пользовательские прошивки могут это сделать. Чтобы не устанавливать новую прошивку Вы можете использовать модуль xMultiWindow для включения многозадачности на любом устройстве. Она, конечно, не идеальна, но можно ей воспользоваться. Можете смотреть видео на YouTube и одновременно заниматься веб серфингом.
Добавление опций в меню выключения
Пользовательские прошивки добавляют некоторые опции в меню выключение, которое появляется при долгом нажатии кнопки питания. Модуль для Xposed framework под названием Advanced Power Menu позволяет добавить некоторые функции в меню выключения, например, скриншот, перезагрузка или фонарик. Вы можете настроить опции, которые будут появляться в этом меню.
Управление разрешениями приложений
С помощью модуля App Ops в настройках Android появляется опция «Операции в приложениях». Этот интерфейс позволяет управлять разрешениями приложений, как на iOS от Apple.
Установка
Если раньше для установки сторонней прошивки требовалось производить разблокировку загрузчика телефона, то для использования Xposed пользователю необходимо всего лишь иметь root права на телефоне. Даже сейчас получение этих прав на большинстве девайсов не представляет больших сложностей: вы скачиваете приложение, а оно само делает все нужные манипуляции и через несколько минут вы становитесь обладателем телефона с уровнем прав «БОГ».
Принцип работы «на пальцах»
В системе Android есть процесс под название «Zygote». Это и есть основная исполнительная система. Любой процесс запускается как его копия. Zygote запускается через /init.rc как только загружается основное ядро системы. Запуск приложений осуществляется через скрипт /system/bin/app_process, который подгружает необходимые классы и запускает инициализацию приложения через задекларированные методы.
Именно в этом месте на сцену выходит Xposed. При установке фреймворка модифицированный app_process копируется в /system/bin. Суть модификации в том, что в переменную среду добавляется дополнительная jar библиотека, которая может исполнять специальные методы при определенных условиях и случаях. Например, мы можем вмешаться сразу, как только создается виртуальная машина Dalvik или даже перед тем как будет вызван основной метод Zygote. Являясь частью процесса Zygote, мы можем вмешиваться в работу любых методов, даже синтетических и производить любые действия в их контексте.
Практическая ценность Xposed
Предположим, необходимо изменить какой-то метод, и, например, вместо булева значения TRUE вернуть FALSE. Вместо трудоемкого и затратного традиционного метода (разбираем-собираем-тестируем приложение) вы можете «перехватить» этот метод класса и «вживить» свой Java код, который произведет необходимую операцию (изменит, в данном примере, значение) и вернет нужный нам результат. При этом, с Xposed можно: модифицировать или просто посмотреть какие данные передаются в метод, либо после исполнения метода узнать результат обработки данных и в зависимости от требований изменить их или воспользоваться ими.
Бывают случаи, когда вы не хотите, чтобы тот или иной метод вообще срабатывал, либо хотите полностью поменять логику и алгоритм. Xposed позволяет полностью заменить метод, либо не дать ему вообще сработать.
В случае с ресурсами стало вообще все просто. Вы загружаете в свой модуль свои ресурсы, хоть графические элементы, хоть цельные xml файлы и при загрузке модуля в память можете заменять их при инициализации.
А теперь главное — зачастую не приходится даже изменять работу модуля (или производить минимальные доработки) с выходом новой версии прошивки/приложения! Это логично, ведь названия методов, классов и переменных, как правило, остаются прежними.
Не правда ли, удобно?
Создание модуля
Сам модуль — это обычный apk файл, созданный в среде разработки. В нем не обязательно должно присутствовать какое-то Activity либо графические ресурсы. По сути там может быть только один файл с инструкцией, разумеется помимо обязательных файлов, и модуль может работать. Для настройки нам надо сделать три вещи:
Manifest.xml
При установке любого приложения Xposed проверяет наличие определенных заголовков в Manifest.xml. Если есть три нужные строки, то фреймворк сохраняет информацию о приложении в своих настройках и далее вы можете активировать установленный модуль (здесь и далее будут использоваться примеры кода разных модулей, в том числе и для из известных приложений).
<meta-data android:name="xposedmodule" android:value="true" />
<meta-data android:name="xposedminversion" android:value="2.6*" />
<meta-data android:name="xposeddescription" android:value="Uber-Driver application patch tool" /С первой строкой все понятно.
Во второй строке указываем минимальную версию фреймворка для работы с модулем. Каждая версия заточена под определенный релиз Android и чтобы модуль случайно не был запущен на платформе, для которой он не предназначен, указывается версия.
Третья строка определяет как будет идентифицироваться ваше приложение в списке доступных или установленных модулей на вашем телефоне.
/assets/xposed_init
В корне вашего приложения необходимо создать папку assets и положить в него файл с названием xposed_init. Внутри этого файла вы просто пишите в каком Java классе описана работа вашего модуля. Я привык называть класс как XMain. В моем случае в файле присутствует строка
Java class
Сам класс должен содержать один из трех методов для работы с фреймворком. Не обязательно указывать все, можно лишь указать те, с которыми вы планируете делать модификацию приложения или приложений. Я по привычке указываю все как шаблон.
public class XMain implements IXposedHookInitPackageResources, IXposedHookLoadPackage, IXposedHookZygoteInit
{ public void initZygote(StartupParam startupParam) throws Throwable { } public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable { } public void handleLoadPackage( LoadPackageParam paramLoadPackageParam) throws Throwable { }
}Метод initZygote исполняется тогда, когда
ваш модуль
Метод handleLoadPackage исполняется в тот момент, когда Dalvik загружает исходный код
любого
! приложения при запуске. Это очень важный момент. Если у вас в телефоне 10 различных модулей, то через этот метод исходники запускаемого приложения «прогонятся» во всех 10-ти случаях. Для фильтрации используется обычная проверка по названию пакета. Разумеется, если вы хотите изменить работу нескольких приложений, то ставите столько проверок сколько вам нужно.
public void handleLoadPackage( LoadPackageParam paramLoadPackageParam) throws Throwable { final LoadPackageParam llpm = paramLoadPackageParam; String packageName = llpm.packageName; if (packageName.contains("ubercab.driver")) { }
}Метод handleInitPackageResources нужен вам тогда, когда вы хотите подменить ресурсы приложения во время их загрузки в память. Здесь тоже самое как и с handleLoadPackage — вы фильтруете по названию приложения.
public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable { String pkg = resparam.packageName; if (pkg.equals("com.ubercab.driver")) { }
}Важно указать наименование приложения так, как оно указано в манифесте. На этом настройка модуля в среде разработки закончена и можем приступить непосредственно к программированию.
Заключение
Я привел основные трюки и решения задач программирования, с которыми столкнулся за все время разработки различных модулей. Не вижу смысла разбирать каждый случай в деталях, так как опытным программистам достаточно воспользоваться руководствами от автора здесь и здесь.
На этом я планирую закончить цикл статей про модификацию прошивок, но тема практического применения Xposed, надеюсь, не закрыта. Есть в планах большая статья о том, как я работал водителем Uber и разработал Xposed модуль, который давал мне расширенную информацию как о предстоящей поездке, так и во время выполнения заказа, что, к моему удивлению, не предусмотрено в стандартном приложении. Получил весьма и весьма интересный опыт и сделал выводы: как о качестве самой архитектуры Uber, так и о том, какая информацию передается через приложение о пользователях и как, возможно, компания планирует монетизировать свой сервис и полученные данные в будущем.









