Модификация стоковых прошивок для android

Модификация стоковых прошивок для Android. Часть 4

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

На прошлых скриншотах были следующие меню в моем самодельном твикере и вызвало множество приватных вопросов о реализации.

Предпочтительный слот
Выберите SIM карту на которой использовать передачу данных
Уведомление о соединении
Запретить оповещение об интернет подключении
Автоматическая запись звонков
Все звонки будут записаны стандартным диктофоном согласно его настройкам
Запретить энергосбережение
Запретить иконку энергосбережения в слайдере и статус баре
Запретить выключатели
Отключение в слайдере статус бара

Предпочтительный слот

Так как я являюсь ярым поклонником двухсимочных телефонов, данная функция мне нужна для того, чтобы иметь возможность использовать интернет от любого из операторов, где есть покрытие. 3G/GPRS/EDGE покрытие у всех разное, а необходимость быть действительно мобильным — для меня задача первостепенная. По умолчанию интернет работает на первой основной сим карте, но в некоторых местах оператор не имеет 3G и предоставляет слабую пропускную способность, урезая EDGE тайм слоты на канале передачи данных, соответственно передача идет по GPRS. Имя такой твикер я могу легко переключиться на второго оператора и иметь подключение по крайней мере под EDGE.

Модифицировать прошивку для этого не обязательно, а достаточно вызвать диалог и указать что вам необходимо. Сразу отмечу, что данный код применим к телефонам HTC и был написан согласно библиотеке android.net.HtcIfConnectivityManager.

Уведомление о соединении

В прошлой статье я писал о ненужном уведомлении, что мой телефон в данный момент использует передачу данных и показывает какой APN используется. Честно говоря, мне это не то что нужно, а раздражало, что и послужило поводом отключения данной функции. Польностью вырезать из прошивки я не стал, так как публикую свои работы для общего пользования, а при создании модифицированных прошивок хорошим тоном считается оставлять конечному пользователю выбирать что ему нравится, а что нет.

Осталось только найти в каком месте данный функционал срабатывает. Надо отдать должное, программисты HTC хорошо оптимизировали код, его приятно читать и легко находить нужное место. У ООП есть конечно и свои минусы, так как порой необходимый фрагмент кода нужно искать по целой цепочке методов. Еще одно преимущество, HTC Sense создан на шаблонах, которые по прохождению кода собираются как конструктор Lego, в оконцовке превращаясь в полноценный графический интерфейс. В стандартной документации исходного кода Android предлагается для каждого вызова (intent или dialog) рисовать отдельный шаблон (layout) и первое время искать приходилось очень долго, так как я искал интерфейс оболочки в самой XML разметке, а не в коде программы.

И так, в 4-ом Аднроиде есть замечательная функция, которая позволят узнать кто родитель уведомления. Достаточно долго нажать на уведомление и появится меню, в котором можно посмотреть приложение, которое является инициатором. В моем случае оказалось, что это приложение Телефон (Phone.apk).

Потрошим приложение

Распаковываем и декомпилируем приложение с помощью APK-Multi-Tool. Для этого предварительно надо скачать, установить и настроить его. Все описано в документации.
1. Кладем Phone.apk в папку place-apk-here-for-modding
2. Открываем любим архиватором и удаляем от туда файл classes.dex. Это ускорит работу и избавит вас от ошибок декомпилятора.
3. Запускаем скрипт Script.bat и выбираем 9-ый пункт Decompile apk. Нам нужно распаковать приложение и покопаться в файлах res/values. После распаковки исходники будут лежать в папке .\projects\Phone.apk\

Поиски кода

1. Так как у меня интерфейс русский, то мне нужна папка с русскими словами .\res\values-ru.
2. На скриншоте из прошлой статьи видим, что у нас есть слово «Подключено» и оно явно находится в нашей локализации.
3. Ищем по всем файлам наше слово… и не находим 🙁
4. У нас есть еще иконка в виде двух стрелок, поищем ее. Идем в папку \projects\Phone.apk\res\drawable-hdpi и видим ее stat_sys_apn.png.
5. Ищем идентификатор картинки по ее названию.

6. Мы нашли шестнадцатиричный ID картинки 0x7f02007f, что в десятичном у нас 2130837631 (переводится в виндовом калькуляторе).
7. Теперь у нас есть два пути:
а) взять classes.dex, сконвертировать его в jar и открыть в gd-gui;
b) воспользоваться baksmali.jar и распотрошить Dalvik код (описывалось в первой части статей).
Я предпочитаю первый вариант, так как читать удобней (описывалось в первой статье, я главе «Распаковка и анализ оригинального файла»).
8. Открыв сконвертированный classes.dex в gd-gui, сохраним наш исходный код.
9. Сделаем поиск 2130837631 в наших исходниках:

Читайте также:  Android java permissions internet

10. там же в gd-gui идем смотреть что это за код.

11. Так как это просто метод, то значит он от куда-то вызывается. Давайте поищем.

12. Открываем в jd-gui файл com\android\phone\PhoneApp.java и понимаем что вызов у нас срабатывает в следующем блоке

Модификация кода

Мы конечно можем пересетить переменную HtcFeatureList.FEATURE_APN_CONNECTION_NOTIFICATION, но как уже я говорил, это является дурным тоном жестко избавляться от кода, если вы публикуете прошивки и правильней будет сделать возможность выбора для пользователя. Разумеется, если вы делаете для себя и четко уверены, что вам это не нужно, можно вырезать радикально, но я все же не советую.
1. Так как у меня есть свой твикер, который хранит настройки в системной области (об этом в будущей статьей), нам нужно в начале этого блока сделать проверку что-то вроде:
Почему именно такой код? Я его просто подсмотрел несколькими строками выше:

нам же нужно всего-то посмотреть значение настройки с другой переменной.
2. Все, мы нашли что нам нужно и теперь готовы писать свой патчик. Даем команду java -Xmx512m -jar baksmali.jar -a -d -o Phone -x Phone.apk

— это API вашей версии Android. Для JB — это 16
— папка, где находятся все фреймворки прошивки.

В моем случае это была команда
java -Xmx512m -jar baksmali.jar -a 16 -d S:\dev\Android\Android-Kitchen\WORKING_JB_15\system\framework -o Phone -x Phone.apk
3. В нашей вновь созданной папке появилась папка Phone, а в ней наши файлы с Dalvik кодом.
4. Отыскиваем файл по пути \\com\android\phone\PhoneApp.java и смотрим код:

5. Теперь после этой строки нам надо вставить нашу собственную проверку. Я нашел аналогичный код где проверяется настройка preferred_tty_mode. Нам ничего не стоит его взять и скопировать себе, поменяв название настройки и не беря первые две служебные строки

и в итоге получается

8. Даем команду java -Xmx512m -jar smali.jar -a 16 Phone -o classes.dex
9. В нашей папочке появляется файлик classes.dex
10. Снова открываем Phone.apk файл архиватором и заменяем в нем существующий classes.dex на наш только что созданный.
11. Все, наш Phone.apk содержит модифицированный программный код.

Автоматическая запись звонков

Реализацию данного твика я описал во второй части статей. Только там я покаывал код без использования твикера, так что выкладываю полную версию

Запретить энергосбережение

Патчить исходный код мне не пришлось, но в твикере реализовал следующий (урезанный для примера) программный код

Запретить выключатели

мне пришлось потратить некоторое время. Узнать от куда растут ноги просто так не получится как в случае с «Уведомление о соединении», так как это стандартный интерфейс. Мне пришлось распаковать framework-res.apk, framework-htc-res.apk, com.htc.resources.apk, Phone.apk, Rosie.apk и SystemUI.apk. Как раз в SystemUI и оказались изображения и строки Wi-Fi, Bluetooth, Мобильный интернет и т.д.

Точно также как и в случае с уведомлениями.

Потрошим приложение

1. Кладем SystemUI.apk в папку place-apk-here-for-modding нашего APK-Multi-Tool.
2. Открываем любим архиватором и удаляем от туда файл classes.dex. Это ускорит работу и избавит вас от ошибок декомпилятора.
3. Запускаем скрипт Script.bat и выбираем 9-ый пункт Decompile apk. Нам нужно распаковать приложение и покопаться в файлах res/values. После распаковки исходники будут лежать в папке .\projects\SystemUI.apk

Поиски кода

1. Так как у меня интерфейс русский, то мне нужна папка с русскими словами .\res\values-ru.
2. На скриншоте из прошлой статьи видим, что у нас есть слово «В самолёте» и оно явно находится в нашей локализации.
3. Ищем по всем файлам наше слово… и находим

4. Нас интересует status_Bar_quick_setting_airplane. Делаем поиск по этой строке.

5. Мы нашли шестнадцатиричный ID текстовой строки 0x7f0900b2, что в десятичном у нас 2131296434 (переводится в виндовом калькуляторе).
6. Берем наш classes.dex из SystemUI.apk, конвертируем в jar и открываем в gd-gui;
7. Открыв сконвертированный classes.dex в gd-gui, сохраним наш исходный код для поиска в нем.
8. Сделаем поиск 2131296434 в наших исходниках и. ничего не находим 🙁
9. Делаем поиск по всей папке .\projects\SystemUI.apk\res\ и получаем следующие:

10. Из результатов понимаем, что для наших быстрых настроек есть готовый шаблон status_bar_expanded_quick_settin.xml

11. Открываем xmk файл и видим, что layout имеет ID layoutquicksetting

12. Ищем по layoutquicksetting и находим идентификатор 0x7f0c004c (2131492940)

13. Ищем по исходникам, что получили в пункте 8 и опять не находим. Два раза не найти — вещь не стандартная. Из опыта знаем, что gd-gui не всегда умеет декомпилировать код и выдает // INTERNAL ERROR // , поэтому попробуем распаковать до smali.
14. Даем команду java -Xmx512m -jar baksmali.jar -a -d -o SystemUI -x SystemUI.apk

Читайте также:  Клиент zabbix для android

— это API вашей версии Android. Для JB — это 16
— папка, где находятся все фреймворки прошивки.

Источник

Модификация стоковых прошивок для Android. Часть 4

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

На прошлых скриншотах были следующие меню в моем самодельном твикере и вызвало множество приватных вопросов о реализации.

Предпочтительный слот
Выберите SIM карту на которой использовать передачу данных
Уведомление о соединении
Запретить оповещение об интернет подключении
Автоматическая запись звонков
Все звонки будут записаны стандартным диктофоном согласно его настройкам
Запретить энергосбережение
Запретить иконку энергосбережения в слайдере и статус баре
Запретить выключатели
Отключение в слайдере статус бара

Предпочтительный слот

Так как я являюсь ярым поклонником двухсимочных телефонов, данная функция мне нужна для того, чтобы иметь возможность использовать интернет от любого из операторов, где есть покрытие. 3G/GPRS/EDGE покрытие у всех разное, а необходимость быть действительно мобильным — для меня задача первостепенная. По умолчанию интернет работает на первой основной сим карте, но в некоторых местах оператор не имеет 3G и предоставляет слабую пропускную способность, урезая EDGE тайм слоты на канале передачи данных, соответственно передача идет по GPRS. Имя такой твикер я могу легко переключиться на второго оператора и иметь подключение по крайней мере под EDGE.

Модифицировать прошивку для этого не обязательно, а достаточно вызвать диалог и указать что вам необходимо. Сразу отмечу, что данный код применим к телефонам HTC и был написан согласно библиотеке android.net.HtcIfConnectivityManager.

Уведомление о соединении

В прошлой статье я писал о ненужном уведомлении, что мой телефон в данный момент использует передачу данных и показывает какой APN используется. Честно говоря, мне это не то что нужно, а раздражало, что и послужило поводом отключения данной функции. Польностью вырезать из прошивки я не стал, так как публикую свои работы для общего пользования, а при создании модифицированных прошивок хорошим тоном считается оставлять конечному пользователю выбирать что ему нравится, а что нет.

Осталось только найти в каком месте данный функционал срабатывает. Надо отдать должное, программисты HTC хорошо оптимизировали код, его приятно читать и легко находить нужное место. У ООП есть конечно и свои минусы, так как порой необходимый фрагмент кода нужно искать по целой цепочке методов. Еще одно преимущество, HTC Sense создан на шаблонах, которые по прохождению кода собираются как конструктор Lego, в оконцовке превращаясь в полноценный графический интерфейс. В стандартной документации исходного кода Android предлагается для каждого вызова (intent или dialog) рисовать отдельный шаблон (layout) и первое время искать приходилось очень долго, так как я искал интерфейс оболочки в самой XML разметке, а не в коде программы.

И так, в 4-ом Аднроиде есть замечательная функция, которая позволят узнать кто родитель уведомления. Достаточно долго нажать на уведомление и появится меню, в котором можно посмотреть приложение, которое является инициатором. В моем случае оказалось, что это приложение Телефон (Phone.apk).

Потрошим приложение

Распаковываем и декомпилируем приложение с помощью APK-Multi-Tool. Для этого предварительно надо скачать, установить и настроить его. Все описано в документации.
1. Кладем Phone.apk в папку place-apk-here-for-modding
2. Открываем любим архиватором и удаляем от туда файл classes.dex. Это ускорит работу и избавит вас от ошибок декомпилятора.
3. Запускаем скрипт Script.bat и выбираем 9-ый пункт Decompile apk. Нам нужно распаковать приложение и покопаться в файлах res/values. После распаковки исходники будут лежать в папке .\projects\Phone.apk\

Поиски кода

1. Так как у меня интерфейс русский, то мне нужна папка с русскими словами .\res\values-ru.
2. На скриншоте из прошлой статьи видим, что у нас есть слово «Подключено» и оно явно находится в нашей локализации.
3. Ищем по всем файлам наше слово… и не находим 🙁
4. У нас есть еще иконка в виде двух стрелок, поищем ее. Идем в папку \projects\Phone.apk\res\drawable-hdpi и видим ее stat_sys_apn.png.
5. Ищем идентификатор картинки по ее названию.

6. Мы нашли шестнадцатиричный ID картинки 0x7f02007f, что в десятичном у нас 2130837631 (переводится в виндовом калькуляторе).
7. Теперь у нас есть два пути:
а) взять classes.dex, сконвертировать его в jar и открыть в gd-gui;
b) воспользоваться baksmali.jar и распотрошить Dalvik код (описывалось в первой части статей).
Я предпочитаю первый вариант, так как читать удобней (описывалось в первой статье, я главе «Распаковка и анализ оригинального файла»).
8. Открыв сконвертированный classes.dex в gd-gui, сохраним наш исходный код.
9. Сделаем поиск 2130837631 в наших исходниках:

10. там же в gd-gui идем смотреть что это за код.

Читайте также:  Внешний вид яндекс андроид

11. Так как это просто метод, то значит он от куда-то вызывается. Давайте поищем.

12. Открываем в jd-gui файл com\android\phone\PhoneApp.java и понимаем что вызов у нас срабатывает в следующем блоке

Модификация кода

Мы конечно можем пересетить переменную HtcFeatureList.FEATURE_APN_CONNECTION_NOTIFICATION, но как уже я говорил, это является дурным тоном жестко избавляться от кода, если вы публикуете прошивки и правильней будет сделать возможность выбора для пользователя. Разумеется, если вы делаете для себя и четко уверены, что вам это не нужно, можно вырезать радикально, но я все же не советую.
1. Так как у меня есть свой твикер, который хранит настройки в системной области (об этом в будущей статьей), нам нужно в начале этого блока сделать проверку что-то вроде:
Почему именно такой код? Я его просто подсмотрел несколькими строками выше:

нам же нужно всего-то посмотреть значение настройки с другой переменной.
2. Все, мы нашли что нам нужно и теперь готовы писать свой патчик. Даем команду java -Xmx512m -jar baksmali.jar -a -d -o Phone -x Phone.apk

— это API вашей версии Android. Для JB — это 16
— папка, где находятся все фреймворки прошивки.

В моем случае это была команда
java -Xmx512m -jar baksmali.jar -a 16 -d S:\dev\Android\Android-Kitchen\WORKING_JB_15\system\framework -o Phone -x Phone.apk
3. В нашей вновь созданной папке появилась папка Phone, а в ней наши файлы с Dalvik кодом.
4. Отыскиваем файл по пути \\com\android\phone\PhoneApp.java и смотрим код:

5. Теперь после этой строки нам надо вставить нашу собственную проверку. Я нашел аналогичный код где проверяется настройка preferred_tty_mode. Нам ничего не стоит его взять и скопировать себе, поменяв название настройки и не беря первые две служебные строки

и в итоге получается

8. Даем команду java -Xmx512m -jar smali.jar -a 16 Phone -o classes.dex
9. В нашей папочке появляется файлик classes.dex
10. Снова открываем Phone.apk файл архиватором и заменяем в нем существующий classes.dex на наш только что созданный.
11. Все, наш Phone.apk содержит модифицированный программный код.

Автоматическая запись звонков

Реализацию данного твика я описал во второй части статей. Только там я покаывал код без использования твикера, так что выкладываю полную версию

Запретить энергосбережение

Патчить исходный код мне не пришлось, но в твикере реализовал следующий (урезанный для примера) программный код

Запретить выключатели

мне пришлось потратить некоторое время. Узнать от куда растут ноги просто так не получится как в случае с «Уведомление о соединении», так как это стандартный интерфейс. Мне пришлось распаковать framework-res.apk, framework-htc-res.apk, com.htc.resources.apk, Phone.apk, Rosie.apk и SystemUI.apk. Как раз в SystemUI и оказались изображения и строки Wi-Fi, Bluetooth, Мобильный интернет и т.д.

Точно также как и в случае с уведомлениями.

Потрошим приложение

1. Кладем SystemUI.apk в папку place-apk-here-for-modding нашего APK-Multi-Tool.
2. Открываем любим архиватором и удаляем от туда файл classes.dex. Это ускорит работу и избавит вас от ошибок декомпилятора.
3. Запускаем скрипт Script.bat и выбираем 9-ый пункт Decompile apk. Нам нужно распаковать приложение и покопаться в файлах res/values. После распаковки исходники будут лежать в папке .\projects\SystemUI.apk

Поиски кода

1. Так как у меня интерфейс русский, то мне нужна папка с русскими словами .\res\values-ru.
2. На скриншоте из прошлой статьи видим, что у нас есть слово «В самолёте» и оно явно находится в нашей локализации.
3. Ищем по всем файлам наше слово… и находим

4. Нас интересует status_Bar_quick_setting_airplane. Делаем поиск по этой строке.

5. Мы нашли шестнадцатиричный ID текстовой строки 0x7f0900b2, что в десятичном у нас 2131296434 (переводится в виндовом калькуляторе).
6. Берем наш classes.dex из SystemUI.apk, конвертируем в jar и открываем в gd-gui;
7. Открыв сконвертированный classes.dex в gd-gui, сохраним наш исходный код для поиска в нем.
8. Сделаем поиск 2131296434 в наших исходниках и. ничего не находим 🙁
9. Делаем поиск по всей папке .\projects\SystemUI.apk\res\ и получаем следующие:

10. Из результатов понимаем, что для наших быстрых настроек есть готовый шаблон status_bar_expanded_quick_settin.xml

11. Открываем xmk файл и видим, что layout имеет ID layoutquicksetting

12. Ищем по layoutquicksetting и находим идентификатор 0x7f0c004c (2131492940)

13. Ищем по исходникам, что получили в пункте 8 и опять не находим. Два раза не найти — вещь не стандартная. Из опыта знаем, что gd-gui не всегда умеет декомпилировать код и выдает // INTERNAL ERROR // , поэтому попробуем распаковать до smali.
14. Даем команду java -Xmx512m -jar baksmali.jar -a -d -o SystemUI -x SystemUI.apk

— это API вашей версии Android. Для JB — это 16
— папка, где находятся все фреймворки прошивки.

Источник

Оцените статью