Думаю, каждый, у кого есть устройство на базе ОС Android, хотя бы слышал о «секретных кодах».
Однако поиск на Хабре показал, что на эту тему нет ни одной статьи.
Но некоторые коды весьма мощные: например, один из кодов на моем Samsung Galaxy Tab позволяет настроить GPS, что ускоряет поиск спутников, другой позволяет строго установить режим сетевого подключения (GPRS, EDGE, 3G. .
), что позволяет хорошо экономить заряд батареи при перескакивании между режимами.
Но я расскажу историю не столько о возможностях кодов, сколько об исследовании механизма запуска приложений с использованием кодов в ОС Android, о том, как найти все коды (и приложение, в которое все это вылилось).
И еще немного о том, как сделать приложение, которое будет реагировать на ваш код. Под катом 6 картинок, немного кода и много текста.
Для самых нетерпеливых прошу сразу написать результаты в конце статьи и только потом читать технологию.
Введение
Про коды в Android слышал давно.
Самый распространенный из них — *#*#4636#*#* — это информация о телефоне, аккумуляторе, состоянии сети и т. д.
Но недавно я установил программу Автозапуск , сделал поиск установленных приложений и (о чудо!) увидел странное событие «Введен секретный код».
На него ответила целая куча заявок! Этот факт побудил меня провести более глубокий поиск по этой теме.
Вот что я узнал: {Не желая обременять основную часть публики лишними пояснениями, торжественно клянусь подробнее объяснить неясные места в комментариях, если стану членом уважаемого сообщества.
}
Первая часть.
События в Android Как вы знаете, каждое приложение Android содержит манифест. Это специально созданный XML-файл, содержащий информацию о целевой версии ОС, какие разрешения требуются для работы приложения и т. д. Самое интересное в этом манифесте — разделы, описывающие BroadcastReceivers. Это классы, которые реагируют на возникновение определенных событий.
Таких событий много, например: совершен исходящий вызов (android.intent.action.NEW_OUTGOING_CALL), изменилось состояние режима «полет» (android.intent.action.ACTION_AIRPLANE_MODE_CHANGED)… Официальный список можно видимый на сайте Андроид .
Однако список ни в коем случае не является полным, т.к.
каждое приложение может создавать свое событие.
Это создает некоторый хаос в документации при попытке выяснить, на что может реагировать приложение.
Именно в этом хаосе было успешно спрятано событие, представляющее большой интерес: android.provider.Telephony.SECRET_CODE
Как показало открытие исходных кодов стандартной звонилки в Android, когда вы вводите в звонилке что-то, начинающееся с *#*# и заканчивающееся на #*#*, происходит поиск и передается сообщение BroadcastRecever, который это слушает. конкретный код (то есть между *#* # и #*#*)
Часть вторая.
Реакция на код
Теперь давайте посмотрим, что требуется от приложения, чтобы отреагировать на возникновение этого события: <receiver android:name=".
receivers.DebugReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE" />
<data android:scheme="android_secret_code" android:host="727" />
</intent-filter>
Где:
— начало раздела BroadcastReceiver и указание того, какой приёмник следует вызывать при возникновении данного события.
— собственно событие, на которое реагирует получатель, набирая код. - и вот самое интересное.
Блок данных отвечает за дополнительные параметры события и необходим для события секретного кода.
Поле android:host здесь означает именно тот код, который разбудит нашу спящую красавицу ото сна.
Те.
Для запуска Приемника ".
receivers.DebugReceiver", приложения, из манифеста которого этот блок (подробнее о нем позже), нужно в звонилке набрать *#*#727#*#* Как видите, добавить скрытые функции в ваши приложения Android очень просто.
Не буду говорить, что делать в Ресивере, там свой путь, лично я называю его отладочной активностью.
Часть третья.
Мы ищем партизан Теперь перейдем к поиску Приемников, реагирующих на коды.
Моей первой мыслью (и первой реализацией) был такой код: for(int i=0;i<10000;i++)
{
Intent intent = new Intent("android.provider.Telephony.SECRET_CODE",
Uri.parse(" android_secret_code://"+ i.toString()));
ComponentName cn = intent.resolveActivity(pm);
.
}
Я не помню точный код; его удалили за ненадобностью, поскольку было найдено лучшее решение.
Это решение просто перечисляет все коды от 0 до 10000 — диапазона, в котором находится значительная часть кодов.
Но не все.
Именно это «не все» побудило меня искать более детально и привело к новому решению:
1) Возьмите список всех установленных приложений через PackageManager: List<android.content.pm.PackageInfo> pil = pm.getInstalledPackages(PackageManager.GET_DISABLED_COMPONENTS);
2) Из каждого пакета извлекаем его манифест: AssetManager am = context.createPackageContext(p.packageName, 0).
getAssets();
xml = assets.openXmlResourceParser("AndroidManifest.xml");
3) Простая магия с разбором манифеста и поиском нужных Receivers, IntentFilters, Actions.
4) Прибыль.
У этого метода есть только один недостаток: он был замечен в приложении.
Суперпользователь от ChainsDD. Дело в том, что у этого приложения кривый манифест выглядит примерно так: <receiver android:name=".
receivers.DebugReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SECRET_CODE" />
<data android:scheme="android_secret_code"/>
</intent-filter>
Как видите, он не указывает код, на который следует реагировать, и Receiver вызывается при вводе любого кода.
Декомпилировав эту программу, я убедился, что это было сделано по ошибке и не из желания вести журнал всех вводимых кодов, потому что.
в самом Приёмнике производится проверка на равенство кода коду заданное значение, и если код не равен заданному значению, то ничего не происходит :( т.е.
этот Приемник запускается каждый раз при вводе кода, чего можно было бы избежать, указав, какой код должен будить Приемник.
Часть последняя.
Для самых терпеливых.
Последнюю часть я оставил для презентации результатов.
Результатом всех этих исследований стала замечательная (не побоюсь этого слова) программа, аналогов которой на рынке не нашлось: Секретные коды Помимо описанной выше возможности поиска секретных кодов, программа также позволяет: — Запустить найденные коды — Комментируйте/читайте комментарии других пользователей о кодах.
Это сделано для того, чтобы люди, боящиеся FactoryFormat, могли убедиться в безопасности кода перед его запуском, а отчаянные экспериментаторы могли написать, что делает тот или иной код. Я лично запускал ВСЕ доступные коды на Samsung Galaxy Tab 7" и закомментировал все коды, отображающие хоть какую-то информацию.
(Кстати, FactoryFormat я успешно пережил, поскольку заранее сделал резервную копию всех приложений и данных.
) — Назначьте кодам значки для большей наглядности списка кодов.
Для начала 6 скриншотов:
Основная деятельность:
Поиск кода:
Поиск кода завершен:
Список кодов:
Код активности:
Некоторые из доступных значков кода:
P.S. На ScreenShots всего 3 кода, потому что.
они были сделаны на эмуляторе.
На моем Galaxy Tab их более 100. P.P.S статья опубликована по просьбе Владислава Аксенова в связи с отсутствием у него аккаунта (кому понравилась статья и кто не против инвайта, вот почта, пришлите на: [email protected]).
Написал статью Черный лебедь .
Спасибо кроватти за приглашение!
Вот QR:
Теги: #разработка Android #секретные коды #разработка Android
-
Обзор 10,1-Дюймового Нетбука Dell Inspiron
19 Oct, 24 -
10 Основных Элементов Успешного Веб-Сайта
19 Oct, 24 -
Как Я Купил Домен
19 Oct, 24 -
Галочки В «Вопросах»
19 Oct, 24 -
Будущие Выпуски Firefox
19 Oct, 24 -
Мой Первый Плагин Eclipse
19 Oct, 24