Модификация стоковых прошивок для Android. Часть 1
Несколько лет назад, когда я впервые познакомился с Android, я услышал от своего коллеги по работе, что Android предусматривает возможность установки модифицированных или самодельных прошивок. Признаться, тогда я был далек от этого. И даже пол года назад меня едва интересовали подобные вещи. Глубоко в душе, я был уверен: то, что делает производитель, уже предназначено для нормального использования.
Каково же было мое разочарование, когда я приобрел телефон из поднебесной, где заводскими настройками было запрещено использование Google, Skype, Facebook и других приложений. В принципе, на некоторые вещи можно было закрыть глаза, но когда мой телефон не подразумевал использование учетной записи Google — я взял с себя обещания обязательно разобраться во что бы мне это не стало.
Прошло пол года и мои кастомные прошивки с успехом используются по всему миру.
В данной серии статей пойдет речь о том, как делать reverse программирование для Android, реализовывать патчи, твики и моды.
Преамбула
И так! Давайте сперва определимся с понятиями, которые будут использоваться в данной статье. Ваше привычное понимание, при этом, может сильно отличаться.
Патч — изменение или замена существующего программного кода с целью модификации алгоритма программы.
Мод — как правило, добавление дополнительного функционала в существующий программный код без изменения алгоритма.
Твик — усовершенствование функционала программы с целью облегчения доступа к параметрам системы.
Также хочу заметить, что все примеры будет взяты для телефона HTC, но это не значит, что данная информация не может быть использована на других телефонах.
Обращаю ваше внимание, что я, как автор, не несу ответственности за возможную потерю данных на вашем телефоне в результате использования информации ниже.
Подготовка среды
Обойдусь без подробных инструкций как пользоваться тем или иным программным обеспечением. Если вам интересна данная статья и вы дочитали до этих строк, то я надеюсь, что вы уже опытный пользователь и имеете опыт использования, ну или хотя бы экспериментирования в данной области. Инструкций, статей и результатов тестирования полно в открытом доступе, впрочем, как и на Хабре. Также обойдусь без описания некоторых терминов, иначе статья получится очень большой и нудной. Будем писать только по делу. Уверен, что среда у вас уже давно стоит. Если нет, то предлагаю скачать и установить.
1. Android SDK. Это среда разработки приложений для Андроид. Для того чтобы делать модификации, нам обязательно придется проверять наш программный код. Среда разработки самое лучшее, что мы можем использовать.
2. Android Kitchen. Данная утилита позволит вам работать с образами системных партиций официальной ну или неофициальной прошивки.
3. JD-GUI. Декомпилятор программного кода языка Java. Сразу отмечу, что это самый лучший декомпилятор в плане удобства использования.
4. DJ Java Decompiler. Еще один декомпилятор, или дизассемблер, как некоторые любят называть, программного кода языка Java. Не удобен в плане использования, но разбирает код, который иногда не понимает JD-GUI.
5. smali. Еще один дизассемблер, но уже dalvik кода. smali нужен для дизассемблирования, а backsmali ассемблирования кода.
6. dex2jar. Утилита для конвертации исполняемых файлов Dalvik кода.
Преобразование прошивки
Разумеется, прошивка, которая стоит у вас на телефон от производителя оптимизирована с целью сокращения энергопотребления. Для того чтобы прошивку можно было изменять, ее необходимо преобразовать в формат, позволяющий изменять код. Для этого используется Android Kitchen. Можно конечно и руками, как я и делал раньше, пока не нашел эту самую «кухню». Как вытаскивать системную область из телефона, устанавливать среду, делать DEODEX прошивки, вы можете прочитать в интернете. Если вам уже ничего не понятно, я думаю стоит повременить со статьей, пока вы не наберете достаточно опыта.
После того, как прошивка из оптимизированного вида (ODEX — оптимизированный dalvik исполняемый код, если мне не изменяет память) стала DEODEX (то бишь НЕ оптимизированной), все исполняемые файлы готовы к модификации.
Непосредственно модификации
Создание патчей
Как я уже и рассказывал, мой телефон изначально имел запрет на использование Google. Ну хоть ты тресни, на Playstore не зайти, учетную запись не настроить, телефонная книга толком не синхронизируется. Зачем нужен такой Android? Долго копаясь в логах (logcat) самого устройства, я нашел записи, которые говорили о том, что использование Google запрещено. Самое не удобное в Android, вы видите лог, но не знаете какое системное приложение его производит. Чтобы отыскать от куда ноги растут, мне пришлось распотрошить все системные приложения до дизассемблированного Java кода. Это заняло достаточно времени, но я до сих пор пользуюсь проделанной работой при анализе и поиске нужного кода. Этапы получения подобного инструментария следующие:
1. Сделать DEODEX всей прошивки
2. Вашу новую DEODEX прошивку надо будет собрать и прошить на телефон. Как это делается — тема другой статьи.
3. Из каждого файла, находящегося в /system/framework вытащить файл classes.dex и переконвертировать в JAR посредством dex2jar.
4. Каждый полученный JAR открыть в JD-GUI и пере-сохранить в исходный код
5. Распаковать исходный код из архива.
В итоге у меня получилось столько папок, сколько было JAR файлов в /system/framework, и каждая папка имела структуру исходных кодов Java.
Путем несложных манипуляций, я быстро отыскал то место, которое генерировало записи в logcat.
Не будем рассматривать всю логику запрета, так как для каждого случая это отдельная история. Мне пришлось потратить пару часов, прежде чем я нашел где производятся проверки, построить в голове блок схему алгоритма и понять куда надо лезть, чтобы алгоритм чуть чуть «попортить».
Оказалось все просто. Есть подпрограмма, которая на основе заранее установленных констант, при обращении отвечала, относится ли телефон к Китаю или же нет.
Код находился в файле HTCExtension.jar, а класс, который содержал данную подпрограмму находился в \com\htc\util\contacts\BuildUtils$Customization.java
Распаковка и анализ оригинального файла
1. Сперва нам надо взять оригинальный DEODEX JAR файл, который отвечает за нужную нам часть кода. В нашем случае HTCExtension.jar.
2. Открыть любым архиватором и вытащить от туда classes.dex
3. С помощью конвертера dex2jar преобразовать его в JAR файл. Команда: dex2jar.bat classes.dex
4. Открыть полученный classes_dex2jar.jar файл в JD-GUI.
5. Да, чаще всего JD-GUI декомпилирует код не так как он выглядит в оригинале, оно и понятно, но читать вполне можно. В исходнике мы видим, что подпрограмма проверяет параметры проекта и языковой флаг прошивки. В нашем прискорбном случае возвращается значение TRUE.
6. Чтобы сделать патч, нам надо дизассемблировать сам Dalvik код. Для этого используем baksmali. Удобнее всего создать отдельную папку и положить туда три файла вместе: HTCExtension.jar, smali.jar и baksmali.jar. Даем команду java -Xmx512m -jar baksmali.jar -a -d -o HTCExtension -x HTCExtension.jar
— это API вашей версии Android. Для JB — это 16
— папка, где находятся все фреймворки прошивки.
В моем случае это была команда
java -Xmx512m -jar baksmali.jar -a 16 -d S:\dev\Android\Android-Kitchen\WORKING_JB_15\system\framework -o HTCExtension -x HTCExtension.jar
7. В нашей вновь созданной папке появилась папка HTCExtension, а в ней наши файлы с Dalvik кодом.
8. Отыскиваем файл по пути \com\htc\util\contacts\BuildUtils$Customization.java и смотрим код:
9. Страшно, не правда ли? Ничего же не понятно. Но, это дело поправимое. Создав несколько своих патчей и набив тем самым руку, вы легко сможете модифицировать код без сторонних средств. В нашем случае, в этом коде
происходит присваивание переменной v0 значение 1, то есть TRUE. Далее идут всякие проверки, и если телефон не китайский, то значение переменной изменяется:
10. Самый простой способ спасти отца русской демократии, это изменить код на следующий:
, то есть поменять значение переменной с 1 на 0. То есть что бы ни было, всегда бы возвращалось значение FALSE и в JD-GUI код выглядел бы как
11. Да, метод ,будет работать. Но мы же не ищем легких путей — это раз. Во-вторых не совсем красиво. Хочется кода что-то вроде
12. А как нам получить Dalvik код данного исходного кода? Для новичков мы сделаем небольшой трюк.
Создание Dalvik кода
1. Открываем Android SDK.
2. Создаем новый проект, и в наш единственный тестовый класс пишем следующий код
3. Компилируем наш проект и затем берем собранное приложение из рабочей области.
4. Кладем собранное приложение в папку, где мы с вами потрошили JAR файл.
5. Даем команду
8. Все, код для патчинга готов.
Накатывание патча
1. Dalvik код замусорен маркерами, указывающими строку кода в оригинальном исходном файле. Это нужно при выводе ошибок, если таковые имеются в вашей программе. Без указаний строк код также прекрасно работает.
2. Удаляем строки с нумерацией строк, копируем и заменяем метод (подпрограмму) в нашем \com\htc\util\contacts\BuildUtils$Customization.java файле.
3. Сохраняем файл. Да, забыл сказать, редактор нужен нормальный, например Notepad++ или EditPlus. Кому какой нравится.
Компиляция и сборка патченного JAR файла
1. С помощью backsmali мы распотрошили наш JAR файл, а теперь его надо собрать обратно.
2. Даем команду java -Xmx512m -jar smali.jar -a 16 HTCExtension -o classes.dex
3. В нашей папочке появляется файлик classes.dex
4. Снова открываем HTCExtension.jar файл архиватором и заменяем в нем существующий classes.dex на наш только что созданный.
5. Все, наш HTCExtension.jar содержит модифицированный программный код.
Замена оригинального файла на патченный
Обычно, для рядовых пользователей создаются специальные скрипты, которые через recovery заменяются. Но нам такое не интересно. Во-первых долго и нудно, во-вторых мы же опытные пользователи и можем себе позволить некоторые тонкости.
1. Заменить текущий рабочий файл можно следующими командами, если у вас уже стоит DEODEX прошивка и имеется root доступ:
1-ая команда закидывает патченный файл на флешку
2-ая команда открывает shell
3-ая команда дает root доступ
4-ая команда монтирует систему в режим чтения/записи
5-ая команда делает резервную копию файла
6-ая команда перезаписывает существующий файл новым патченным.
7-ая команда настраивает разрешения
8-ая команда удаляет кэш
9-ая команда делает перезагрузку устройства.
2. Спасибо что дочитали до этого пункта, осталось немного.
3. После перезагрузки ваш новый патченный код вступит в силу.
4. Если код не работает или выскакивает ошибка, то путем не хитрых комбинаций можно вернуть назад резервную копию.
Эпилог
Да, кому-то показалось данная статья слишком специфичной, кому-то мало-понятной, а кому-то бесполезной. Я специально обошелся без углубленной детализации и иллюстраций как это все выглядит в живую и на практике. Во-первых, данный труд будет неблагодарный и только породить еще больше вопросов. Во-вторых, не хочу видеть армию пользователей на форумах, которые жалуются, что убили свой телефон.
К следующей статье я расскажу как делать Твики. Будет пример использования автоматической записи телефонных звонков родными средствами телефона. Спасибо за ваше внимание.
Источник
FAQ. кастомные прошивки, рутинг, ядро и т.д.
небольшой фак для нубов, здесь не все, лишь некоторые моменты
1. Что такое root?
Если вы являетесь администратором на компьютере с Windows, то у вас есть доступ ко всей операционной системе, и вы можете делать все, что вам нравиться. Вот то, что, по существу, и происходит когда вы делаете root своего устройства. С правами суперпользователя, вы можете обойти любые ограничения, которые наложены на ваше устройство производителем. Вы можете устанавливать больше приложений, вы можете кастомизировать ваше устройство в большей степени, и вы потенциально можете ускорить работу вашего устройства во множестве направлений.
2. Зачем делать root?
Одним из самых очевидных стимулов для рутинга вашего Android устройства, является возможность избавиться от предустановленного производителем софта. Вы сможете настроить ваше устройство в качестве точки доступа Wi Fie, даже если такая опция была не доступна по умолчанию. Вы можете получить доступ ко всей файловой системе, установке специальных приложений, который требуют root доступа и даже установить кастомные (custom ROMs, сделанные сторонними разработчиками) прошивки, которые добавляют дополнительные функции и оптимизируют производительность телефона или планшета. Много кто поддается соблазну возможности полностью кастомизировать свой телефон. Вы также сможете вручную разрешать или запрещать доступ приложениям. Вы так же сможете устанавливать последние версии Android, еще до того как производитель вашего устройства выпустит официальную версию. Ну и конечно же, вы сможете разгонать (overclock) ваш процессор или, если необходимо, понизить его частоту.
По существу, есть три минуса рутинга вашего устройства.
Первый минус это аннулирование гарантии. Некоторые производители будут использовать рутинг в качестве предлога для аннулирования гарантии. Но стоит всегда помнить, что у вас есть возможность сделать анрут (unroot), то есть возврат системы вашего телефона в заводское состояние. Если вам необходимо отправить девайс на ремонт, просто прошейте его официальной прошивкой которая быля установлена при покупке.
Второй минус это возможность превратить ваше телефон в “кирпич”. Всякий раз, когда вы вмешиваетесь в систему вашего устройства, есть, пусть и небольшой, риск сломать его (брикнуть, превратить в кирпич и т.д.). Очевидный способ избежать этого — тщательно выполнять инструкции. Убедитесь, что руководство которому вы следуете подходит для вашего устройства, и что любая кастомная прошивка, которую вы решили использовать, создана именно для вашей модели. Если вы исследуете вопрос прежде чем приступить к его выполнению и уделяете внимание тому что говорят другие, более опытные пользователи, шансы сломать ваше устройство ничтожно малы.
Третий минус это риски для безопасности. Рутинг может способствовать некоторым угрозам безопасности. В зависимости от того какие сервисы или приложения вы используете на своем устройстве, рутинг может создать некоторые уязвимости в системе безопасности. Например, Google, отказывается поддерживать Google Wallet для root устройств.
Вы должны быть готовы идти на компромиссы с этими факторами, прижде чем решить на root.
4. Что такое recovery (рекавери, режим восстановления).
Recovery это отдельная от Android среда в которую вы можете загрузить свое устройство. В этом режиме вы можете найти инструменты, основной целью которых является предоставление способа сброса настроек операционной системы, когда невозможно загрузиться в систему.
Стандартный режим восстановления от Android очень простой и управляется с помощью регулировки клавиш звука и кнопки питания устройства.
Кастомные рекавери выполняют те же задачи, что и стандартный рекавери Android, но имеют дополнительные функции, как например, возможность делать полное резервное копирование системы или прошить устройство новой прошивкой. Важно отметить, что кастомные рекавери рекомендуется использовать пользователям с правами root, однако наличие такового не обязательно, достаточно иметь разблокированные bootloader (загрузчик) на вашем устройстве. Вобщем, рекавери может спасти вашу задницу когда вы напортачили, но так же имеет много других важных функций.
5. Что такое кастомная прошивка (Custom ROM)?
Заводская прошивка это версия операционной системы устройства которая поставляется вместе с ним. Заводская прошивка представляет собой полностью автономную версию ОС, включая ядро (kernel, делает всю систему работоспособной), приложения, сервисы и т.д., в общем, все что вам необходимо для работы с устройством, но настроено все это по-своему и кем-то другим.
Так что же значит “кастомная” (от англ. “custom” — изготовленный на заказ)? Поскольку операционная система Android имеет открытый исходный код, разработчики могут свободно брать и модифицировать заводские прошивки, очищать их от “мусора” (предустановленных приложений и сервисов), оптимизировать, что-то добавлять, и вообще делать все что им позволит их воображение и навыки.
6. Зачем устанавливать кастомные прошивки?
Есть множество причин, вот некоторые из них:
— Обновление версии ОС. Вы можете загрузить последние доступные версии Android, которые могут заставить ваше старое устройство выглядеть как новое.
— Персонализация. Есть целый ряд всевозможных особенностей и “фишек”, которые могут быть настроены в соответствии с вашим вкусом. Например, пользовательские темы могут привнести новизну во внешний вид вашего устройства.
— Повышение производительности. Кастомные ромы и рутинг позволяют своим пользователям находить ненужные приложения присутствующие на их устройствах и избавляться от них, таким образом, увеличивая скорость обработки и продлевая жизнь батареи.
— Установка приложения на внешнюю SD карту. В данный момент это невозможно на заводских прошивках. Если на вашем устройстве не хватает места для установки новых приложений, то эта функция просто незаменима для вас.
— Лучшее качество сигнала. С помощью кастомной прошивки можено улучшить вашу полосу частот (base band), что в свою очередь увеличивает сигнал и качество звонка.
7. Почему, иногда, не стоит устанавливать кастомные прошивки.
— Выход устройства из строя. Это одна из главных причин почему люди не решаются на рутинг своего девайса. Некоторые устройства после рутинга могут превратиться в бесполезное железо, и единственным вариантом остается покупка нового, так как производительно может не выполнять условия гарантии если они узнают о попытке рутнига устройства.
— Потеря всех данных. Когда вы устанавливаете новую прошивку, это очистит всю вашу систему и, следовательно, вы потеряете все ваши установленные приложения и данные.
— Фактор риска. Большинство приложений будет с открытым исходным кодом и доверие которые вы возлагаете на разработчиков приложения может сыграть с вами злую шутку, повредив устройство в будущем.
— Перезагрузка. Если процесс рутинга был выполнен неуспешно, то есть есть шанс попадания в бесконечный цикл загрузки. Хотя это может показаться довольно устрашающей перспективой, это может произойти, только если вы не будете следовать инструкциям правильно или сделаете что-то очень глупое. В настоящее время существует не так уж и много способов превращения вашего девайса в “кирпич” (полный и безвозвратный вывод из строя). Потеря данных может быть исправлена при помощи резервного копирования, а бесконечная загрузка при помощи режима восстановления (Recovery), который обсуждался ранее.
8. Какая кастомная прошивка самая лучшая?
Никогда не спрашивайте этот вопрос, это очень субъективно. Создание прошивки занимает много времени, энергии и сил, и спрашивать какая прошивка лучше всех оскорбительно для разработчиков прошивок. Попробуйте несколько прошивок и выберете ту которая вам нравится больше всего.
9. Что такое Kernel (ядро)?
Это центральный модуль операционной системы. Это часть операционной системы, которая загружается первым делом и остается в основном памяти. Поскольку ядро остается в памяти, очень важно чтобы оно занимало как можно меньше места, обеспечивая при этом все необходимые сервисы нужные для других частей операционной системы и приложений. Как правило, ядро отвечает за управление памятью, процессами и задачами.
Если бы ваше устройство было фильмом, то ядро было бы его режиссёром. Это мозг вашего телефона или планшета. И хотя это самая важная часть устройства, это всего лишь один-единственный .IMG файл размером всего в пару MB.
10. Каковы преимущества кастомного ядра.
— Регулировка частот CPU и установление профилей вроде “по требованию”, “эанергосбережение” и т.д.
— Разон и понижение скорости CPU
— Разгон и понижение скорости GPU
— Регулировка напряжения
— Регулировка чувствительности сенсорного экрана
— Оснащение вашего телефона подсветкой уведомлений
— Кастомные recovery, которые позволяют вам делать полное резервное копирование и восстановление всей прошивки и установку из .zip файлов
— Минимальная яркость экрана, выходящая за пределы ограничений заводского ядра
— Экономия батареи (с правильными настройками)
Есть еще много технических преимуществ кастомного ядра с хорошо написанным кодом. К счастью, вам не надо сильно беспокоиться об этом, поскольку, большинство работы выполнено самим разработчиком.
11. Какой Kernel лучше всех.
Ответ такой же как и на вопрос “Какая прошивка самая лучшая?”.
12. Как разогнать процессор моего устройства?
Вам не удастся разогнать процессор с заводским ядром. У вас должно быть кастомное ядро прежде чем вы сможете осуществить это. Как только у вас есть кастомный kernel, вам необходимо установить приложение для разгона, например SetCPU или NoFrillsCPU, подойдет любое.
13. Безопасно ли разгонять процессор устройства?
Это не полностью безопасно, но найти человека который испортил своё устройство из-за overclock’инга (разнога CPU) довольно тяжело. Помните, что все это вы осуществляете на свой страх и риск. Также помните, что все телефоны имеют различный потенциал для разгона. Если вы “перестараетесь”, то есть вероятность попадания в бесконечный цикл загрузки (говорилось выше). Это можно починить установкой ядра с более низкой частотой.
14. Что такое GAPPS?
Gapps сокращение от Google Apps. Это приложения сделанные Google, такие как Google Maps, Plastore, Gmail, Google Search и так далее. Они доступны для скачивания в Play Store и так же могут быть прошиты на устройство из .zip файла в режиме восстановления (recovery). Не все Gapps доступны в разных странах.
15. Что такое “грязная” прошивка или “чистая” прошивка.
“Чистая” прошивка это удаление кэша, далвик кэша и данных перед прошивкой zip файла или установкой кастомной/заводской прошивки через recovery.
“Грязная” установка это то же самое, только с удалением кэша и далвик кэша, без удаления данных.
“Чистая” прошивка рекомендована, так как вызывает меньше проблем в будущем. Если в инструкциях по прошивке указано прошивать с очисткой данных, далвика и кэша, то делайте именно так и никак иначе. Да, вы потеряете все свои данные в этом случае, но не беспокойтесь, этот способ не коснется вашей внутренней или внешней карты памяти. Вы потеряете все ваши приложения, настройки и данные из игр, ваш телефон будет вести себя так как будто он только куплен.
Вы можете делать прошивку “грязным” способом когда прошиваете небольшие модификации системы из .zip файлов, или даже небольшое обновление прошивки (за исключением случаев когда в инструкциях указано выполнить “чистую” прошивку). В этом случае вы не потеряете никаких данных, но иногда это может вызвать проблемы, например, приложения закрываются сами или что-то в этом роде, это могло быть предотвращено при “чистой” прошивке. Так что лучше всего прошивать с удалением всех данных.
Источник