Секретные коды, или как я писал свое приложение для android

    Думаю все, у кого есть устройство на базе ОС Android, хотя-бы краем уха слышали о «секретных кодах».
    Однако поиск по Хабру показал что здесь нет ни одной статьи на данную тему. А ведь некоторые коды довольно могущественные: например один из кодов на моем Samsung Galaxy Tab позволяет настроить GPS что ускоряет поиск спутников, другой — жестко установить режим связи с сетью(GPRS, EDGE, 3G...) что в местах с нестабильной связью позволяет хорошо сэкономить батарею на скачках между режимами.
    Но повествование я поведу не сколько про возможности кодов а про исследование механизма запуска приложений по кодам в ОС Android, как найти все коды(и приложение в которое это всё вылилось). И еще немного про то, как сделать приложение которое будет отзываться на свой код.
    Под катом 6 картинок, немного кода и много текста… Самых нетерпеливых прошу сразу в конец статьи помацать результаты а уж потом — читать технологию.


    Вступление



    Про коды в Android я слышал давно. Наиболее распространённый — *#*#4636#*#* — это информация о телефоне, батарее, состоянии сети и т.д.
    image
    Но недавно я установил себе программу Autostarts, сделал поиск по установленным приложениям и (О чудо!) увидел странное событие «Secret Code Entered». На него отвечала целая куча приложений! Этот факт подвигнул меня на более глубокий поиск на эту тему. Вот что я выяснил:

    {Не желая грузить основную часть публики излишними пояснениями торжественно клянусь разжевать подробнее в комментариях непонятные участки, если стану участником уважаемого сообщества.}

    Часть первая. События в Android



    Как известно, каждое приложение Android содержит в себе манифест. Это специально сформированный XML файл содержащий информацию какая целевая версия ОС, какие возможности разрешения требуются приложению для работы и т.д. Самое интересное в этом манифесте — секции описывающие BroadcastReceiver'ы. Это классы, которые реагируют на наступление определенных событий. Этих событий много, например: совершается исходящий звонок(android.intent.action.NEW_OUTGOING_CALL), изменилось состояние режима «полёт» (android.intent.action.ACTION_AIRPLANE_MODE_CHANGED)… Официальный список можно увидеть на сайте Android.
    Однако список отнюдь не полон т.к. каждое приложение может создавать своё событие. Это вносит некоторый хаос в документацию при попытке выяснить на что может реагировать приложение.

    Именно в этом хаосе удачно спряталось событие, которое представляет огромный интерес: android.provider.Telephony.SECRET_CODE

    Как показало вскрытие исходных кодов штатной звонилки в Андроиде что при вводе чего-либо начинающегося на *#*# и заканчивающегося #*#* в номеронабирателе происходит поиск и передача сообщения тому 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>


    где:
    <receiver android:name=".receivers.DebugReceiver"> — начало секции BroadcastReceiver и указание какой именно Receiver должен быть вызван при наступлении данного события.
    <action android:name=«android.provider.Telephony.SECRET_CODE» /> — собственно событие на которое реагирует ресивер, набор кода.
    <data android:scheme=«android_secret_code» android:host=«727» /> — а вот и самое интересное место. Блок data отвечает за дополнительные параметра события и для события секретного кода — обязателен. Поле android:host здесь означает именно тот код, который пробудит нашу спящую красавицу от сна.
    Т.е. что-бы запустить Receiver ".receivers.DebugReceiver", приложения из манифеста которого этот блок (о нем чуть позже), нужно в звонилке набрать *#*#727#*#*

    Как видно, добавить скрытые возможности в свои приложения Android очень даже просто.
    Что делать в Receiver'е я умолчу, там уже ваш собственный путь, лично я — вызываю отладочное Activity.

    Часть третья. Ищем партизанов



    Теперь перейдем к поиску Receiver'ов, реагирующих на коды. Первой мыслью (и первой реализацией) был вот такой вот код:
    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) Простая магия с разбором манифеста и поиском нужных Receiver'ов, IntentFilter'ов, Action'ов.
    4) Профит.

    У этого метода есть всего один недостаток: он был замечен на приложении SuperUser от 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 вызывается при вводе любого кода. Декомпилировав эту программу я убедился что сделано это по ошибке а не следуя желанию вести лог всех введенных кодов, т.к. в самом Receiver'е происходит проверка на равенство кода заданному значению и если код не равен заданному — то ничего не происходит :( т.е. этот Receiver запускается при каждом вводе кода, чего можно было избежать указав какой именно код должен пробуждать Receiver.

    Часть последняя. Для самых терпеливых.



    Последнюю часть оставил для презентации результатов.
    Результатом всех этих расследований стала замечательная(не побоюсь этого слова) программа, аналогов которой на маркете обнаружено не было: Секретные Коды

    Кроме описанной выше возможности искать секретные коды программа также позволяет:
    — Запускать найденные коды
    — Комментировать/читать комментарии других пользователей о кодах. Это сделано что-бы люди которые боятся FactoryFormat'а могли удостоверится что код безопасен до его запуска, а бесшабашные экспериментаторы — написать что делает тот или иной код. Мной лично было запущенны ВСЕ доступные коды на Samsung Galaxy Tab 7" и откомментированны все коды которые выводят хоть какую-то информацию. (Кстати успешно пережил FactoryFormat, т.к. заранее сделал backup всех приложений и данных.)
    — Назначать кодам значки для большей наглядности списка кодов.

    На закуску 6 ScreenShot'ов:
    Главное Activity:
    image

    Activity поиска кодов:
    image

    Поиск кодов завершен:
    image

    Список кодов:
    image

    Activity кода:
    image

    Некоторые из доступных значков для обозначения кода:
    image

    P.S. на SreenShot'ах всего 3 кода т.к. они делались на эмуляторе. На моём Galaxy Tab'е их более 100-а.

    P.P.S статья опубликована по просьбе Владислава Аксёнова ввиду отсутствия у него аккаунта (кому понравилась статья и не жалко инвайта, вот e-mail, высылайте: grafmailgraf@mail.ru).
    Написал статью BlackSwan. Спасибо krovatti за инвайт!

    Вот и QR-ка:
    image

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 8 924 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 73

      0
      P.P.S статья опубликована по просьбе Владислава Аксёнова ввиду отсутствия у него аккаунта (кому понравилась статья и не жалко инвайта, вот e-mail, высылайте: grafmailgraf@mail.ru).
      А как же песочница?
        +4
        Он уже пробовал, никто не дал инвайта.
          +4
          Некоторые годные статьи действительно не попадают в песочницу, а УГ — навалом.
            +7
            В песочнице эта статья 2 недели провисела, но никто не обратил внимания :( Видимо мало кто читает песочницу
              0
              Я как раз просматривал песочницу дня два назад и ничего интересного там не нашёл. Видимо, опоздал. :)
          0
          А как же открытая регистрация?
            +5
            Что она по-вашему ему даст?
            +2
            А почему коды «секретные», если все о них знают? :)
              0
              Это название уже давно прижилось.
              +9
              Я получил таки инвайт, большое спасибо krovatti
                +9
                Всегда пожалуйста! Ради хорошего человека ничего не жалко.
                  +1
                  «Зарегистрирован: 07 октября 2011 в 18:29 по приглашению пользователя krovatti »
                    +2
                    Дата какая-то не такая, в смысле.
                      +3
                      07 октября 2011 в 18:29 он зарегал read-only аккаунт.
                        +3
                        Именно. А читаю так вообще больше трех лет
                        +3
                        Такая. Дата регистрации верная. Человек зарегистрировался, как ридонли и с этого момента он зарегистрирован. А инвайт просто позволил «прокачать» его аккаунт. Пруф не могу найти, но похожая формулировка была в посте у ТМ.
                          +1
                          «Второй вариант — «прокачать» аккаунт «Read Only» до полноценного. Для этого нужно написать интересный пост в «Песочницу» или загрузить в профиле инвайт, полученный от кого-то из зарегистрированных пользователей.»

                          habrahabr.ru/info/help/registration/
                            +1
                            Совершенно верно. Именно это я и имел ввиду.
                        +3
                        Вот так вот в хабр через кровать и попадают )
                          +1
                          Через кровати. Или точнее кроватти )
                            0
                            Доставило )
                        0
                        А я-то думал, как все эти антивирусы работают. А оказывается можно получить доступ к файлам не только своего приложения, но и любого другого. (За ненадобностью тему не копал просто).

                        Вообще, многообразие возможностей в Андроиде порой поражает. А в документации многие из них не то чтобы совсем не описаны, но нужно очень внимательно сопоставить написанное в одной части документации с написанным в другой, при том, что это на первый взгляд не очень-то взаимосвязанные вещи.
                          0
                          При поиске кодов пишет — «фомирование списка» — опечатка
                            +1
                            Спасибо, поправлю в следующем апдейте.
                            0
                            На HTC Sensation XE слегка едет верстка при прорисовке кнопки выбора иконки (Android 4.0.3):

                            А вообще — отличное приложение, спасибо!
                              +1
                              С версткой именно в этом месте небольшой прикол. На половине устройств всё норм — на другой вот-так… Всё из-за измененного стиля списка, но что с ним делать — пока не знаю
                                0
                                Понятно. Ну да и ничего страшного, оно не напрягает =)
                                  0
                                  Как вариант — использовать стандартный. Будет совпадать с темой аппарата и выглядеть более органично (но оставаться банальным списком с чёрным фоном на стандартных андроидах).
                                    0
                                    Не получится использовать стандартный по то простой причине что мне нужен список значков а стандартный список позволяет выводить только текст. Так что прийдётся решить проблему с именно этим стилем и не использовать стадартный.
                                      0
                                      Ну почему же такая уверенность? Это уже обсуждалось, так что при желании очень даже получится: раз и два.
                                        0
                                        Мы кажется о разных вещах говорим. Вопрос выше касается Spinner'а, а вы кажется просто о списках :)
                                +1
                                Если не сложно — откоментируйте на маркете программу, т.к. кто-то упёрто её там минусует последнее время… Аж странно…
                                  +1
                                  По-моему. на маркете минусовать можно один раз. Поэтому ваше «кто-то упёрто её там минусует последнее время» не совсем соответствует действительности. Это уже группа, а не одиночка.
                                    +2
                                    Нет, может мне просто везет на не очень адекватных людей, не спорю… Но большинство людей поставивших 1-цу за прогу оставила не очень адекватные коменты, учитывая что на все вопросы есть ответы в описании. А про людей которые тупо матюкнулись — я вообще молчу…
                                      0
                                      У отзывов есть ссылки Отзыв бесполезен и Спам. Почаще нажимайте на них.
                                        +1
                                        Нажимаю, в итоге комменты в конце, но оценки-то на месте :( рейтинг портят.
                                        А относительно группы — так это реально (я не говорю про конкретный случай, я обобщаю) т.к. встречал темы на форумах по сбору групп по коллективному плюсованию прог друг-друга. Почему бы не минусовать конкурентов параллельно?
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            Справедливости ради — эта прога Тонеева там гораздо раньше, но да, мы с ним пересекаемся в целевых аудиториях :)
                                              0
                                              спасибо за qr код %)
                                                0
                                                Добавили код
                                      +1
                                      Приложение в чем-то может и полезное, но дизайн никуда не годиться. Если не чувствуете себя Тёмой в дизайне пользовательских интерфейсов, то лучше используйте стандартные контролы с дефолтными свойствами.
                                        +1
                                        А что, собственно, не так? Все кого я спрашивал, включая себя, дизайном довольны. Лично у меня он оставляет ощущение лёгкости, воздушности и весны…
                                        Но я всегда рад выслушать любые советы и предложения.
                                          0
                                          Да нормальный дизайн. Для меня, покрайней мере. Хотя, если честно, для такой программы был бы прекрасен дизайн на стандартных контролах. Ну это лично моё мнение. НО против текущего дизайна против ничего не имею.
                                            +1
                                            Я так в начале и сделал, но потом эта серость стандартного дизайна стала утомлять, т.к. я её довольно часто запускаю )
                                            +4
                                            Есть рекомендуемые нормы для UI приложений, и отклоняться от них имеет смысл только в очень немногих случаях. Хотя главное, приложением должно быть удобно пользоваться.
                                            Если Вам, а тем более, пользователям приложения, дизайн нравиться — то все ок.
                                            Несколько моих замечаний на скриншотах:
                                              0
                                              Я подумаю над этим всем, есть действительно баги, но есть и вещи которые задуманны изначально.
                                              Касательно последнего пункта — это же стандартный диалог выбора из списка. Сомневаюсь что могу его сделать в несколько столбцов.
                                                0
                                                Можно сделать AlertDialog с кастомным layout, в котором иконки расположить в GridLayout, например.
                                                  0
                                                  Это равносильно написанию собственного Spinner'а, т.к. это его родной диалог. Сомневаюсь что действительно это так сильно необходимо.
                                                    0
                                                    GridLayout с авто-заполняющимся контентом я делал, это несложно: layout для попапа, layout для каждого элемента и десяток строчек кода для связки.
                                                    Поверьте, каждая подобная программа – это лицо системы, из-за подобных потом и говорят, что интерфейсы рисуют кто во что горазд. Потратить на интерфейс больше времени, чем на код — это нормально. Если вы не можете себе этого позволить – найдите дизайнера.
                                                      0
                                                      Я не могу себе позволить дизайнера ) И опять-же речь не о alert'ах, listLayout'ах, gridLayout'ах а о Spinner'e
                                                        0
                                                        А чем спиннер не список?) Реализация лишь будет немного отличаться. Можно и просто сделать не спиннер, а кнопку со списком по нажатию… В общем, главное — желание.
                                                          +1
                                                          Ладно, считайте уговорили. Я подумаю на эту тему. Обещаю.
                                                        0
                                                        Дизайнер не будет конфигурировать layout, он может только подготовить макет. Это должен делать кодер, но вообще это дело программиста :)
                                            0
                                            Пару моментов, при беглом осмотре:
                                            1. над дизайном стоит поработать, в ландшафтном режиме тоже.
                                            s018.radikal.ru/i503/1204/08/21d59029701c.jpg
                                            s40.radikal.ru/i088/1204/16/7e7740c58461.jpg
                                            s019.radikal.ru/i631/1204/ad/686e3c062dd7.jpg

                                            2. искать коды — запустить поиск:
                                            а) в диалоге «поиск завершен» — кнопки yes/no зашиты прямо в коде, не айс.
                                            б) запускаем поиск, возвращаемся в меню, потом обратно на поиск кодов, при нажатии запустить поиск, падаем с exception.

                                              0
                                              Ок, спасибо.
                                              Над дизайном я подумаю, просто нет под рукой телефона с низким разрешением по этому обрезания кнопок и прочих гадостей не встретил. Разберемся
                                              А баг с поиском — странно что он вернулся, я считал что уже поборол его. Починим :)
                                                0
                                                ну обрезание кнопок и т.д., можно даже с layouteditor заметить.
                                                кстати, взять тоже меню, зачем перед и после каждой кнопки кладете FrameLayout?
                                                с поиском вы тоже как-то очень намудрили, не проще было написать один asynctask?
                                                  0
                                                  FrameLayout'ы там для того что-бы кнопки равномерно распределялись по всей высоте экрана.
                                                  С поиском — не знаю, выбрал то решение которое пришло в голову в плане отображения прогресса…
                                              0
                                              У меня Samsung Galaxy 3. Программа отличная, нашла кучу кодов, но к дизайну лишь одна претензия — травка внизу делает нечитаемыми символы на ее фоне.
                                                +1
                                                Программа интересная, но бесполезная.
                                                  0
                                                  Почему бесполезная? Вы видели сколько сайтов/форумов/тем посвящено кодам для того или иного устройства? Их просто море. А как известно «если звезды зажигают значит это кому-нибудь нужно»(с)Антуан де Сент Экзюпери.
                                                  Возможно Вы не нашли у себя на устройстве полезных кодов — тогда пардон, лично для Вас — прога несет мало пользы. Однако смею заметить что даже общий для всех код 4636 тоже полезен.
                                                    0
                                                    Ну, как сказать. Может я перерос тот возраст, когда полезно колупать железку.
                                                    Имхо, полезность программы определяется возможностью программы облегчить жизнь.
                                                    Если вам стало легче жить, от знания состояния аккума, то, для вас безусловно программа полезна.
                                                    Задачник, органайзер, читалка, напоминалка, даже фонарик в конце концов.
                                                    Это полезно. Оно облегчает жизнь.

                                                    А технические данный аппарата — это всего лишь интересно.
                                                      0
                                                      Нет, я не спорю что на вкус и цвет… Просто формулировка «бесполезная программа» звучит слишком безапелляционно. Лично для себя я нашел 2 очень полезных кода
                                                      1) Мгновенная перезагрузка устройства которой, кстати, вовсе не требуется рут, в отличии от программ с маркета
                                                      2) Код по запуску которого открывается диалог «открыть с помощью» с перечнем ВСЕХ возможных Activities. Там можно найти еще некоторые спрятанные фичи которые и кодами не вызовешь
                                                      0
                                                      «если звезды зажигают значит это кому-нибудь нужно»(с)Антуан де Сент Экзюпери

                                                      Маяковский, вообще-то. :)
                                                        0
                                                        Ок, уточню: я цитировал русский перевод Маленького принца. Обычно не указывают переводчика и того, у кого фразу он спëр.
                                                    0
                                                    а на сколько правомерно, или даже безопасно, использовать эти коды? Понятно дело что код для вывода какой то инфы в лог или показа доп. статистики это не страшно. Но вот приватные настройки GPS, и прочее это чем то может быть чревато?
                                                    По каждому сомнительному кода лезть в интернет и смотреть чем это может аффекнуться?
                                                      0
                                                      Я не юрист и про правомерность сказать не могу но с точки зрения безопасности — опасны только коды фабричного сброса и то, только пропажей личных данных. Все коды — это тонкие настройки устройства, фабричные тесты и отладочная информация. Но да, если к коду нет описания а Вы не знаете как сделать полную резервную копию всех данных и настроек — лучше не запускайте код или исчите описание действия в гугле.
                                                      0
                                                      Автор, вы же не сказали САМОГО ГЛАВНОГО!
                                                      Какой код у FactoryFormat?
                                                        0
                                                        У разных производителей — разный. У самсунга вроде как 767*3855. Как минимум такой у меня.
                                                        У HTC — вообще такого нет. Про остальніх не знаю
                                                        0
                                                        Ну почему на iPhone приложения с няшным интерфейсом, а на Android разрабатывают с UI 30х годов :(
                                                          +4
                                                          Потому что на iPhone зарабатывает, а на Android делают Just4Fun?
                                                            0
                                                            *занавес*
                                                          0
                                                          Автору — спасибо из за статью, и за программу!
                                                          Одно замечание, чисто из любопытства: как так получается, что код 4636 на устройстве HTC работает, а в программе — не находится и не отображается? Программа не находит его в манифестах? Любопытно… Если она не находит этот код, то, может, она не находит и какие-то другие?
                                                            0
                                                            Такое, увы, возможно. Если разработчики убрали код из манифеста и жестко его обрабатывают в звонилке. Еще вариант плохого поведения разработчиков я наблюдал у разработчика SuperUser.apk. у него есть свой код но в манифесте стоит *, т.е. он ловит все коды и проверяет на соответсвие своему коду зашитому прямо в код.

                                                            Но, на всякий случай, вышлите мне дебаг-инфу проги. Для этого вызовите код 727 нажмите там кнопочу. получится файлик SCRLog.log в корне карты памяти. Вот его мне пришлите как нибудь. Буду признателен :)

                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                          Самое читаемое