Содержание статьи
Основанный на ядре Linux и полностью открытый Android как будто создан для разных хаков и модификаций. За все время существования ОС на ее основе были созданы сотни кастомных прошивок, найдены десятки способов изменения ее внешнего вида и поведения, появилась функциональность, не предусмотренная Google. Однако получить нужные функции до недавнего времени можно было, лишь перепрошив устройство, что неудобно и в ряде случаев опасно.
Введение, или как они это делают
Хакерам, модерам и прочим энтузиастам известно несколько способов изменения внешнего вида, поведения и других параметров Android. Три наиболее популярных:
- Правка файлов /system/framework/framework.jar, /system/framework/framework-res.jar и /system/app/SystemUI.apk, которые содержат описание интерфейса и ресурсы, нужные для его отображения. Редактируя эти файлы, можно изменить внешний вид практически любого компонента интерфейса, начиная от размера кнопок и заканчивая цветом надписей.
- Правка исходных текстов компонентов системы. С помощью этого способа можно изменить что угодно — от реакции на нажатие кнопок громкости до полного изменения поведения системы. Другими словами, можно переделать ОС под себя.
- Декомпиляция и правка системных приложений, не имеющих исходных текстов. Таким образом можно изменить фирменные приложения Google, такие как Google Play и Gmail, исходники которых поисковый гигант не выкладывает.
Проблема всех этих способов в том, что они не позволяют менять Android «на живую». Нельзя взять со смартфона файл /system/framework/framework-res.jar, исправить его и скопировать обратно в систему. Технически в этом нет ничего сложного, достаточно получить root, перемонтировать /system в режиме чтения-записи и выполнить необходимые действия, однако изменения не вступят в силу до перезагрузки, да и загрузится ли система с новым файлом — большой вопрос.
Кроме того, изменив системный компонент, нельзя быть уверенным, что модификация заработает на другом смартфоне, даже если на нем установлена та же версия системы. А если версии различаются, то надежды нет совсем. В некоторых случаях модификацию вообще не удастся установить, так как загрузчик может быть залочен, а системный раздел защищен от записи (привет Motorola).
Из-за этих ограничений разработчики выпускают модификации либо в составе готовых прошивок, либо в виде обновлений, предназначенных для определенных версий ОС и моделей смартфонов. И те и другие следует устанавливать через консоль восстановления, перед этим сделав бэкап предыдущей прошивки и соблюдая последовательность, так как, установив одну модификацию поверх другой, затрагивающей тот же файл, мы потеряем функциональность первой.
В общем, слишком много хлопот для разработчиков и слишком много проблем для пользователей. К счастью, существует гораздо более дружелюбный способ установки модификаций и расширений.
Перехват управления
Суть способа в следующем. Практически любая современная операционная система состоит из ядра и большого количества взаимосвязанных компонентов, в Linux это /boot/vmlinuz и библиотеки из каталогов /lib и /usr/lib, в Windows это ядро kernel32.dll и большое количество DLL-библиотек из системного каталога, в Android это опять же ядро Linux в выделенном разделе и большое количество Java-классов, упакованных в тот самый файл /system/framework/framework.jar.
Практически все компоненты, за исключением ядра, могут быть загружены либо во время инициализации ОС, либо по мере необходимости. Это значит, что компонент можно подменить на модифицированный, что, по сути, и происходит, когда мы устанавливаем одну из модификаций Android классическим способом: один или несколько файлов заменяются и загружаются системой при следующем включении.
Однако, как мы уже выяснили, у такого способа куча проблем, и поэтому лучше использовать другой путь, а именно: вклиниться в процесс загрузки файла (а в случае Android это Java-класс), затем перехватить вызовы его методов и направить по другому адресу. Так мы убьем сразу двух зайцев: не сломаем систему, поскольку не будем изменять системные компоненты вообще, и решим проблему с неудобством установки модификаций, так как сможем направить перехваченные вызовы (методы) Java-класса кому угодно, например обычному непривилегированному приложению. Именно так работает Xposed.
Xposed Framework
Любой класс в Android загружается с помощью небольшого нативного приложения /system/bin/app_process. Его задача — запустить виртуальную машину Dalvik, загрузить необходимые для работы системные классы (окружение исполнения) и передать управление классу (на самом деле происходит обращение к сервису Zygote, который форкает уже готовую ВМ и окружение в режиме copy-on-write, но в нашем случае это неважно).
Xposed представляет собой модифицированную версию app_process, которая при запуске первым делом загружает в память специальный Java-класс-перехватчик, а лишь после него — оригинальный Java-класс. Перехватчик выступает в качестве посредника для любых вызовов Java-методов, инициированных оригинальным классом и, в случае необходимости, перенаправляет их классу-обработчику.
Последний как раз и занимается тем, что изменяет поведение системы. Например, для определения цвета текста приложения используют метод GetColor класса android.content.res.Resources. Если класс-обработчик перехватит этот метод и вернет вместо кода серого цвета код зеленого, все надписи в интерфейсе станут зелеными. Модификации могут быть и более сложными, например когда они связаны с альтернативной реализацией сразу нескольких методов и целых классов.
В комплекте Xposed готовых классов-обработчиков нет, но он позволяет любому разработчику распространять их в виде обычных APK-пакетов, а пользователю просто установить и активировать с помощью специального интерфейса. Другими словами, с помощью Xposed можно устанавливать и удалять модификации Android как обычные приложения, без необходимости в прошивке, копировании в системный каталог и без какого-либо риска.
Модули
В терминологии Xposed классы-обработчики называются модулями, и в данный момент их насчитывается уже более сотни. Причем это не какие-то игрушки с изменением цветов из предыдущего примера, а серьезные доработки, такие как движок тем, глубокие модификации строки состояния, секьюрити-патчи, блокиратор рекламы, менеджер полномочий приложений и многое другое. В оставшейся части статьи я расскажу о наиболее интересных модификациях, а пока о том, как установить Xposed.
Xposed невозможно найти в маркете, с точки зрения Google это вредоносное приложение, которое может навредить системе. Это, конечно же, не так, но мы не будем спорить с Google, а просто скачаем приложение из интернета (файл XposedInstaller_2.1.4.apk). После установки приложение запросит права root, а затем выведет на экран интерфейс с несколькими кнопками. Нажимаем Install/Update и перезагружаем смартфон.
Все установленные пакеты, содержащие модули Xposed, будут автоматически появляться на вкладке Modules приложения. Включить их можно, просто поставив галочку напротив, а затем перезагрузив смартфон. К сожалению, искать и скачивать модули придется самостоятельно, так как в Google Play большинства из них нет, а работа по созданию родного репозитория Xposed еще не завершена.
Модификации интерфейса
Наибольшего внимания заслуживают модули, которые каким-либо образом изменяют внешний вид операционной системы. Таких модулей на просторах инета довольно много, и среди них есть бриллианты из разряда must have. В этом разделе мы поговорим о них.
Maximize widgets on lockscreen. Простой модуль, который автоматически разворачивает виджеты на экране блокировки при включении смартфона. Очень удобен при использовании больших информационных виджетов наподобие DashClock. В CyanogenMod, кстати, есть аналогичная функциональность (Настройки -> Экран блокировки -> Развернутые виджеты).
AOSP Lockscreen. Модуль заменяет экран блокировки на стандартный из поставки Android, без модификаций производителя смартфона. Будет полезен тем, кто хочет получить look and feel обычного Android, не устанавливая стороннюю прошивку.
AppSettings. Добавляет в любую прошивку функциональность, аналогичную настройкам приложений в прошивке ParanoidAndroid. С его помощью можно изменять значение DPI для отдельно взятых приложений, отключить показ строки состояния во время их работы, отключить гашение экрана или изменить язык. С помощью изменения DPI можно сделать так, чтобы приложение работало в планшетном режиме на телефоне (DPI = 160) или в телефонном на планшете (DPI > 240).
Battery Themeing. Модуль с большим количеством различных стилей отображения заряда батареи, от круговых до различных символов и изображений.
XThemeEngine. Полноценный движок тем, практически повторяющий аналогичный движок в прошивке CyanogenMod. Позволяет полностью изменять внешний вид интерфейса, включая иконки, но по техническим причинам несовместим с темами для CyanogenMod. Встроенного репозитория тем также нет, так что их придется искать самостоятельно. Небольшую коллекцию можно найти здесь.
Icon Themer. Еще один движок тем, в этот раз для замены иконок. Позволяет использовать комплекты иконок, созданные для Nova Launcher, Apex Launcher и ADW Launcher, в любых ланчерах. Сотни различных айконпаков можно найти в Google Play.
WisdomSky Xploit. Модуль для глубокой кастомизации строки состояния. Позволяет изменять цвета, стиль отображения часов и батареи и многое другое.
Коллекции твиков
Кроме модулей узконаправленной функциональности, есть и целые коллекции твиков в стиле «все в одном». Они позволяют делать множество вещей — от изменения цвета часов в строке состояния до включения различных скрытых функций, вроде переворота локскрина в зависимости от положения экрана или эффекта выключения экрана в стиле старого телевизора (его можно найти в прошивках устройств серии Nexus и CyanogenMod).
GravityBox — одна из таких коллекций твиков и доработок с акцентом на рядовых пользователей. Наиболее интересные возможности:
- Всплывающие наэкранные клавиши навигации в стиле PIE из ParanoidAndroid. После активации наэкранные клавиши управления внизу экрана исчезают, а вместо них появляются всплывающие с одной из сторон экрана кнопки. Очень удобная must have функциональность (также доступна в приложении LMT Launcher).
- Возможность изменения расположения и удаления кнопок (тайлов) быстрого управления питанием в шторке. Также доступно несколько дополнительных кнопок, включая фонарик и быстрое включение точки доступа.
- Возможность изменения строки состояния, ее цвета, цвета текста и стиля отображения батареи и часов, изменения фонового изображения и прозрачности шторки.
- Расширенное меню выключения с возможностью перезагрузки в recovery.
- Переключение композиций в стандартном плеере с помощью долгого нажатия на кнопки громкости.
- Исправление самого известного небага Android — отображение фото звонящего не на весь экран (есть в виде отдельного модуля).
- Эффект выключения экрана в стиле старого телевизора.
- Авторазворот виджетов на локскрине.
- Включение режима вибро при перевороте смартфона экраном вниз.
- Патч для уязвимости Master Key (возможность внедрения любых файлов в системный APK-пакет и его установки без предупреждений) (есть в виде отдельного модуля).
- Гибкое управление подсветкой кнопок и светодиодом.
- Исправление множества багов, присутствующих в прошивках для MTK6589-устройств (китайские смартфоны 2013 года выпуска).
Еще одна популярная коллекция — это MoDaCo Toolkit, сборник довольно специфичных и узконаправленных твиков и хаков с акцентом на смартфоны HTC от известного комьюнити MoDaCo. Возможности:
- Совместимость с рабочим столом Facebook Home.
- Маскировка смартфона под устройство с разрешением экрана 720p. Полезно владельцам 1080p-смартфонов и планшетов, которым недоступны некоторые приложения в Google Play.
- Неограниченный угол поворота экрана при наклоне устройства.
- Различные твики строки состояния.
- Возможность изменения настроек build.prop на лету (BOARD, BRAND, DEVICE, MODEL, PRODUCT). Можно использовать для получения доступа к приложениям в Google Play.
- Работа чипа NFC даже во время сна устройства. Для тех, кто часто пользуется NFC-метками (есть как отдельный модуль.
- Множество твиков для HTC One: отключение предупреждения о завышенном уровне громкости (одним модулем), дополнительные опции выключения (перезагрузка, recovery), включение смартфона кнопкой громкости, отключение бесполезной опции Kid Mode в Power Menu (долгое нажатие кнопки включения), иконка Blinkfeed на рабочем столе.
На самом деле в составе тулкита гораздо больше модификаций и твиков, но они настолько специфичные и нужны столь малому количеству пользователей, что смысла описывать их все на страницах журнала я не вижу и вместо этого отправляю читателя на страницу приложения на xda-developers.
Tweakbox — один из первых модулей и коллекций твиков для Xposed. Интересен тем, что обладает небольшой, но действительно необходимой функциональностью. В комплекте: разные стили отображения батареи и уровня сигнала, регулировка уровней критического заряда батареи (по дефолту 5 и 15%), запись разговоров, отключение функции включения экрана при отключении от зарядника (есть в CyanogenMod), переключение между композициями с помощью качельки громкости, изменение поведения при долгом нажатии на кнопку «Домой», ТВ-эффект выключения экрана.
Безопасность
Кроме упомянутого в предыдущем разделе модуля, закрывающего баг Master Key, для Xposed доступно еще несколько интересных секьюрити-модулей. Один из них — это XPrivacy, система принудительного ограничения приложений в полномочиях. Второй — PeerBlock, аналог одноименного приложения для ПК, предназначенного для блокировки разных рекламных, небезопасных и фишинговых сайтов. Далее мы подробно рассмотрим функциональность каждого из них.
Начнем с XPrivacy, модуля для ограничения приложений в полномочиях, который работает в связке с системой безопасности Android. Его задача — дать пользователю контроль над тем, какие именно полномочия (например, доступ к интернету, возможность отправки SMS или запись данных на карту памяти) будут разрешены приложению, а какие — нет. По умолчанию Android дает приложению доступ ко всем запрошенным им полномочиям, но с помощью XPrivacy некоторые из них можно отозвать.
XPrivacy распространяется в виде обычного APK-пакета, который, помимо модуля, также включает в себя графический менеджер полномочий. Кроме установки APK-пакета, придется прошить через кастомный recovery фикс для Xposed, необходимый для корректного ограничения некоторых полномочий (впрочем, модуль работает и без него). Фикс можно получить на сайте goo.im (goo.im/devs/M66B/xprivacy), выбрав подходящий для своей версии Android: Xposed_fix_4.0_v2.zip, Xposed_fix_4.1.zip, Xposed_fix_4.2.zip или Xposed_fix_4.3.zip. Работу других модулей он не нарушит.
После установки и активации модуля в Xposed в меню приложений появится иконка XPrivacy, которая открывает приложение для управления полномочиями. Главный экран приложения — это список всего софта, установленного в системе. По отношению к любому из них можно активировать систему ограничения, просто поставив галочку напротив и выбрав в открывшемся окне разрешенные привилегии. При этом система сама даст подсказки на счет безопасности тех или иных полномочий, выделив небезопасные жирным шрифтом, а наиболее опасные — розовым фоном. К первым, кстати, относятся доступ к учетным записям и ID устройства, а ко вторым — интернет и хранилище данных. Приложения, запрашивающие небезопасные полномочия и доступ в интернет, также будут выделены в основном списке приложений с помощью соответствующих иконок.
Особо отмечу, что там, где это возможно, XPrivacy использует фиктивные данные вместо явного возврата кода ошибки приложению. То есть если запретить приложению читать информацию о местоположении и владельце смартфона, модуль не станет закрывать доступ к этим данным, а вернет фиктивное местоположение и рандомно сгенерированную инфу о юзере. Эта особенность выгодно отличает XPrivacy от других подобных решений, так как очень редко приводит к падению приложений из-за отозванных привилегий.
Второй модуль, PeerBlock, — это альтернативная реализация одноименного приложения для Windows. Вся его работа заключается в том, чтобы блокировать доступ операционной системы и приложений к определенным интернет-адресам на основе правил и списков. По сути, это аналог Adblock+, но с возможностью гибкого управления, а самое главное, работающий на более низком уровне ОС (а не в виде прокси, который сам общается с сервером и затем отдает данные системе).
В настоящее время PeerBlock использует два метода определения блокируемых хостов: по наличию Ad в адресе хоста и на основе списков адресов, находящихся в каталоге /sdcard/PeerBlockLists/ в обычных текстовых файлах. Первый активирован по умолчанию; чтобы активировать второй, придется скачать список хостов с какого-либо ресурса, например www.iblocklist.com. Далее файл достаточно положить в указанный каталог, запустить приложение PeerBlock for Android и на вкладке Block Lists нажать кнопку Rebuild cache blocklist.
Cydia Substrate
По своей сути Xposed — это Android-аналог популярного приложения Cydia Substrate для iOS, созданного небезызвестным Saurik, автором репозитория Cydia. Substrate используется в джейлбрейкнутых i-устройствах повсеместно для создания разного рода модификаций. Часто фреймворк устанавливается в процессе взлома устройства вместе с одноименным репозиторием.
Совсем недавно Saurik выпустил версию Cydia Substrate для Android. Фреймворк получился куда более продвинутым, чем Xposed, он создает меньший оверхед на систему, позволяет модифицировать как Java-код, так и нативный, с более продвинутым методом перехвата управления, основанным на внедрении кода и функцией защиты от глючных модификаций (достаточно загрузить смартфон с зажатой кнопкой уменьшения громкости для отключения всех модулей).
Тем не менее, за полгода существования Cydia Substrate для Android так и не получила распространения. Встроенный маркет содержит всего две модификации: движок тем WinterBoard и Cydia Backport с секьюрити-патчами. Оба написаны самим Saurik.
Greenify
Еще один очень интересный Xposed-модуль — это Greenify, система, которая превращает смартфон в выборочное однозадачное устройство. Это означает, что после его установки у тебя появится возможность «заморозить» любое приложение, так что ты сможешь продолжать им пользоваться, но оно не будет работать в фоне. К примеру, у тебя установлен твиттер-клиент, который каждый час просыпается и начинает обновлять ленту, просыпается днем, ночью, в любое время года. И каждый раз, когда он просыпается, процессор переводится в менее энергоэффективный режим, а драйвер Wi-Fi выходит из спячки, из-за чего драгоценный заряд батареи постепенно утекает в никуда.
Greenify позволяет полностью отключить любую фоновую активность любого приложения, при этом оставив его полностью работоспособным, так что ленту можно будет обновить самостоятельно, когда нужно. По сути, это мягкий аналог таск-киллера, за тем исключением, что он не убивает приложение (с точки зрения энергопотребления это еще хуже, чем фоновая работа), а просто запрещает ему выполнять фоновые операции.
Greenify почти полностью автоматизирован, поэтому все, что нужно сделать, — это запустить его, нажать кнопку + и выбрать из списка наиболее активные приложения. Система сама рассортирует приложения по количеству просыпаний, укажет, для чего они просыпаются и когда запланировано следующее бодрствование. Все это на русском, так что разобраться будет просто. Единственное, я бы не рекомендовал замораживать системные приложения и виджеты.
Перехват управления не новая идея, она реализована в UNIX-подобных ОС средствами предварительно загрузки библиотек (LD_PRELOAD) и перехвата системных вызовов с помощью ptrace. В Windows существуют техники под названием сплайсинг и сабклассинг, кстати, их используют многие бэкдоры и трояны.
Выводы
Xposed — невероятно удобная и эффективная система модификации Android, которую можно смело вносить в список must have приложений для всех root-юзеров. Описанные в статье модули лишь малая часть из того огромного количества модификаций, которые можно найти в интернете.
Полезные ссылки
INFO
На странице Xposed есть файл Xposed-Disabler-CWM.zip, который следует использовать для прошивки через recovery в том случае, если фреймворк установился криво и теперь смартфон не загружается.