Содержание статьи
- Вместо введения
- Привет. Для начала не мог бы ты назвать топ-5 особенностей своего ядра, ради которых пользователю вообще стоит устанавливать его?
- Расскажи немного о себе и о том, почему ты начал пилить свое ядро.
- Какие функции ты добавляешь в ядро и почему?
- То есть ты считаешь, что лучше использовать алгоритм Conservative?
- А что ты скажешь про InteractiveX, который используется в leanKernel, и другие алгоритмы?
- Отойдем немного от энергосбережения и поговорим о другой функциональности. Много ли функций появилось в ядре в результате запросов пользователей?
- Существует ли функциональность, которая есть в других ядрах, но никогда не появится в твоем? Почему?
- Почему ты не выпускаешь ядра для CyanogenMod?
- А почему вообще для разных прошивок и версий Android нужны разные ядра? В чем конкретно проблема?
- Расскажи о каких-нибудь интересных случаях, связанных с разработкой ядра. C каким аппаратом было работать тяжелее всего?
- Есть какая-то идея, которую до сих пор не удалось воплотить, или баг, с которым не удалось разобраться?
- Почему ты ограничиваешься только устройствами Nexus и OnePlus One? Есть ли планы расширить линейку поддерживаемых устройств?
- Что нам ждать в будущем от твоего ядра?
- Ты следишь за разработчиками других кастомных ядер? Заимствуешь у кого-то код?
- Были ли проблемы с публикацией FKUpdater в Google Play?
- Спасибо за ответы. Желаем успехов в развитии ядра и твоих приложений.
Франциско Франко (Francisco Franco) — весьма уважаемый в узких кругах Android-разработчик, известный в первую очередь как создатель кастомного ядра franco.kernel для смартфонов линейки Nexus и превосходного приложения для управления настройками ядра FKUpdater. В перерывах между кодингом ядра Франко занимается и кучей других проектов, поэтому его не так-то легко поймать, но нам он все-таки уделил время и ответил на несколько вопросов.
Вместо введения
Для тех, кто не в теме: кастомное ядро — это модифицированное Linux-ядро для Android-аппаратов с набором различных изменений, касающихся оптимизации, разлочки механизмов разгона и андервольтинга, поддержки дополнительных файловых систем и так далее. Обо всем этом мы уже во всех подробностях писали в журнале (статья «Операция на сердце») и, кстати, упоминали franco.kernel.
Ядро Франко по праву считается одним из лучших, и, кроме официальных версий для Nexus, его можно найти и для многих других устройств. По сравнению с ядрами от других разработчиков, немалое количество из которых, кстати говоря, не обладают особыми знаниями в дизайне ядра, franco.kernel отличается простотой и ориентированностью не на функционал, а на стабильность, скорость и экономию энергии. По этой причине, а также благодаря наличию превосходного инструмента настройки ядра franco.kernel заслужило большую любовь среди пользователей и среди владельцев устройств Nexus считается эталоном.
Мы задали Франко несколько вопросов, которые прольют свет на его философию разработки, на то, какие изменения и зачем он вносит в ядро, как он к этому пришел и на то, чего нам следует и не следует ждать от его ядра. Приятного чтения.
Привет. Для начала не мог бы ты назвать топ-5 особенностей своего ядра, ради которых пользователю вообще стоит устанавливать его?
- Держит батарею лучше, чем сток.
- Работает из коробки и не требует каких-либо дополнительных настроек. Ты просто прошиваешь ядро и забываешь о нем.
- Возможность тонкой калибровки дисплея.
- Дополнительные твики для увеличения качества и громкости звука.
- В ядре нет спорного и нестабильного кода.
Расскажи немного о себе и о том, почему ты начал пилить свое ядро.
Я из Португалии. Один год я учился на айтишника в Лиссабонском университете, но бросил, чтобы посвятить себя разработке для Android.
Занимаюсь я не только личными инди-разработками: семь месяцев проработал в Силиконовой долине в стартапе CloudCar, стоявшем у истоков Android Auto, с января 2014 года консультирую португальский стартап и с этой командой был пару месяцев в Сан-Франциско в середине 2014 года.
Увлечение архитектурой ядра, Linux и шелл-скриптингом пришло во время учебы. Примерно тогда же я купил свой первый смартфон на Android — LG P500. Его производительность мне показалась слишком низкой, поэтому я решил поиграть с настройками /sys и /proc, чтобы подкорректировать некоторые параметры ядра.
Это были времена Android 2.2, поэтому производительность все равно оставалась на достаточно низком уровне. Тогда я пошел на кардинальный шаг и переместил кеш Dalvik на RAM-диск, так что приложения стали открываться мгновенно. В результате такого хака понадобилось пересоздавать кеш Dalvik при каждой загрузке аппарата, но оно того стоило. Спустя некоторое время я решил эту проблему, разместив кеш Dalvik на разделе /cache и создав ссылку на него в оперативке.
Вскоре стало ясно, что с помощью простых хаков и скриптов далеко не уедешь, и я задумал скомпилировать свое ядро, внеся в него некоторые модификации. Поначалу было тяжело, Linux-ядро очень сложное и комплексное, поэтому понять его исходники без какой-либо подготовки чрезвычайно сложно, и в то время я делал просто колоссальное количество ошибочных правок. Однако со временем удалось разобраться.
С помощью пожертвований мне удалось собрать деньги на смартфон Huawei X5. Это был мой первый опыт работы с чипом Qualcomm high end уровня, и мне удалось разогнать его с 800 до безумных 2000 МГц. Пожертвования от пользователей продолжали поступать, поэтому в скором времени я приобрел Nexus S, а позже — Galaxy Nexus. Как раз в это время я выложил в маркет FKUpdater. Приложение хорошо продавалось, поэтому вскоре необходимость в сборе денег пропала и я начал самостоятельно финансировать мое увлечение.
Какие функции ты добавляешь в ядро и почему?
Я меняю очень много параметров, но обычно стараюсь больше работать над алгоритмом управления частотой процессора (governor) и поведением отдельных ядер (когда следует их включать и отключать). Я стараюсь развивать ядро в сторону продления жизни смартфона от батареи — именно это нужно большинству пользователей. Также я реализовал механизм калибровки дисплея (цвета, гамма), настройки громкости наушников и некоторые другие функции.
В качестве примера того, что я обычно делаю, приведу Nexus 6. Стоковое ядро этого смартфона имеет функцию резкого повышения частоты процессора до 1,5 ГГц сразу после того, как ты коснешься экрана. Эта функция обеспечивает лучшую отзывчивость смартфона, однако реализована она не совсем удачно. Частота задирается на целых три секунды, и в результате во время использования смартфона все четыре ядра постоянно находятся онлайн на высокой частоте. Как следствие — повышенный расход батареи.
Что сделал я? Во-первых, поменял алгоритм управления частотой с Interactive на Conservative и установил период опроса процессора в 10 мс (0,01 с), что позволило реагировать на изменение нагрузки намного быстрее. Плюс я изменил функцию повышения частоты при касании, увеличив максимальную частоту до 1,7 ГГц, но серьезно снизил время действия этой функции, всего до 40 мс (0,04 с). Так как алгоритм энергосбережения начал реагировать на изменение нагрузки намного быстрее, 40 мс оказалось вполне достаточно, чтобы интерфейс успел отрисовать картинку (при 60 кадрах в секунду отрисовка одного кадра занимает всего 16 мс).
Также я написал собственный драйвер, который контролирует отключение ядер процессора намного эффективнее стокового MPDecision. Этот драйвер используется и в ядрах для других устройств.
То есть ты считаешь, что лучше использовать алгоритм Conservative?
Interactive или Conservative. Первый очень хорошо себя зарекомендовал, и, кроме Google, его развитием занимается Qualcomm (он используется по умолчанию со времен Snapdragon 805). С другой стороны, мне очень нравится, как ведет себя Conservative, он более честен, чем Ondemand, и может быть настроен практически для всех сценариев применения.
А что ты скажешь про InteractiveX, который используется в leanKernel, и другие алгоритмы?
InteractiveX — это обычный Interactive с ограничением максимальной частоты процессора на время сна устройства (когда экран выключен). Что касается других алгоритмов — на самом деле большинство из них созданы «случайными разработчиками», и это не что иное, как копи-паст Interactive или Ondemand с изменением нескольких значений и имени. Я не говорю, что это относится ко всем из них, но ко многим.
Отойдем немного от энергосбережения и поговорим о другой функциональности. Много ли функций появилось в ядре в результате запросов пользователей?
На самом деле не очень. Я следую моим собственным идеям. Но если кто-то сможет меня убедить, что функция X или Y хороша для ядра, то я ее добавлю.
Существует ли функциональность, которая есть в других ядрах, но никогда не появится в твоем? Почему?
Да, например такие вещи, как doubleTapToWake (пробуждение устройства с помощью двойного касания экрана. — Прим. ред.) или любое другое изменение/драйвер с реализацией функционала, который без соответствующей поддержки в железе приводит к повышенному расходу батареи. Единственные устройства, поддерживающие функцию doubleTapToWake на уровне железа, — это One Plus One и Nexus 6, и только в ядре для этих устройств я реализовал соответствующий функционал (точнее, он уже был реализован в стоке).
Кроме того, я не люблю добавлять код, который не был одобрен командой разработчиков Linux. Существует много так называемых «разработчиков», которые интегрируют в ядро рандомный код, найденный непонятно где.
Почему ты не выпускаешь ядра для CyanogenMod?
У меня нет проблем с CM, но иногда они вносят изменения в стоковое ядро, и поэтому необходимо делать два разных ядра, а у меня нет ни времени, ни терпения работать сразу над двумя версиями. Например, если говорить о Nexus 7 2012 года, а также Nexus 5 и 6, то мое ядро подходит и для стока, и для CM. Но оно не подойдет для Nexus 4 и Nexus 7 2013 года, работающих на CyanogenMod.
А почему вообще для разных прошивок и версий Android нужны разные ядра? В чем конкретно проблема?
Потому что userspace-библиотеки, работающие с ядром, могут изменяться от одной версии Android к другой и соответствующие изменения должны быть внесены и в ядро (чаще всего в драйверы).
Например, есть такая штука, как ioctl. Это механизм, с помощью которого код пространства пользователя может общаться с драйверами пространства ядра. А теперь представь, что код управления камерой пытается инициализировать драйвер камеры в ядре, делая несколько вызовов ioctl, но драйвер некоторые из них просто не понимает. Как результат имеем неработающую камеру (и это один из самых простых примеров).
Также часто возникают проблемы с API. Например, код пространства пользователя и пространства ядра может разделять один общий заголовочный файл. В новой версии Android этот файл может измениться и, если ты прошьешь ядро от старой (и, следовательно, несовместимой) версии, что-нибудь обязательно отвалится.
Если говорить о несовместимости стока и других прошивок, таких как CyanogenMod, то хороший пример — это все тот же Nexus 4. Со времен Android 4.3 в CyanogenMod для этого аппарата используется модифицированный HardwareComposer, требующий соответствующих изменений в драйверах, иначе смартфон просто не загрузится или будет отображать на экране артефакты.
Расскажи о каких-нибудь интересных случаях, связанных с разработкой ядра. C каким аппаратом было работать тяжелее всего?
Сегодня я не так часто сталкиваюсь с непредсказуемым поведением ядра в сравнении с тем периодом, когда я начинал. Худшее, что может случиться, — это полная неработоспособность смартфона после внесения изменений. Или GSM-модуль отвалится, а еще круче — случайно отключить первое процессорное ядро и получить фриз всей системы.
Насчет сложного в разработке устройства... хороший вопрос. У меня были сложности с HTC One M8. После сборки и заливки ядра модуль Wi-Fi просто не хотел работать. И дело было даже не в моих правках: OEM-производители просто не хотят идти по пути Google в том, что касается инструментов сборки, версий компиляторов и опций сборки. Это очень напрягает.
Кроме того, у меня были проблемы с Nexus 4, понять код поддержки экрана которого не так-то просто. Возникали некоторые проблемы с чипами Qualcomm в том, что касается увеличения громкости звука.
Есть какая-то идея, которую до сих пор не удалось воплотить, или баг, с которым не удалось разобраться?
Несколько дней назад я пытался найти способ обойти баг, из-за которого мой Nexus 6 не останавливает процесс ухода в сон при возникновении прерывания и обрабатывает его только после выхода из сна. Я так и не смог разобраться, в чем проблема.
Почему ты ограничиваешься только устройствами Nexus и OnePlus One? Есть ли планы расширить линейку поддерживаемых устройств?
Потому что мне нужен разблокированный загрузчик и полная история коммитов в код ядра (насколько я знаю, только Google, Motorola и Cyngn хранят и открывают полные логи). У меня нет желания работать с устройствами, производители которых вынуждают меня ломать загрузчик или ждать, пока они выложат полные и актуальные исходники ядра.
Что нам ждать в будущем от твоего ядра?
У меня нет каких-то определенных планов, но я всегда ищу способы продления жизни устройства от батареи.
Ты следишь за разработчиками других кастомных ядер? Заимствуешь у кого-то код?
Нет, ни за кем не слежу, но часто болтаю с Imoseyon (разработчик кастомного ядра leanKernel, идейно близкого franco.kernel. — Прим. ред.) и обсуждаю с ним идеи и наработки. Иногда просматриваю CodeAurora (официальный репозиторий кода ядер для чипсетов Qualcomm. — Прим. ред.) и беру оттуда патчи с фиксами.
Были ли проблемы с публикацией FKUpdater в Google Play?
Нет, у меня никогда не было проблем с FKUpdater. На самом деле это было первое приложение в маркете, обладающее таким набором функций по состоянию на декабрь 2011 года. Через некоторое время многие другие «разработчики» также пошли по этому пути и выпустили приложения для своих ядер. Однако ни одно из них не сравнится с FKUpdater в том, что касается удобства, дизайна и функциональности.
Спасибо за ответы. Желаем успехов в развитии ядра и твоих приложений.
Вам спасибо.
Приложения Франко в Google Play
Кроме FKUpdater, в маркете можно найти и несколько других не менее интересных приложений за авторством Франко:
- Peek — приложение, эмулирующее функцию Active Display в смартфонах Motorola. Суть работы: если экран смартфона выключен, пришедшее уведомление включит его, а затем покажет текст и подробности уведомления;
- Per-App Modes — позволяет настроить профили производительности для отдельно взятых приложений. С помощью этого приложения, в частности, можно залочить процессор и GPU на максимальной частоте при запуске игр и тяжелого софта или, наоборот, выставить минимально возможную частоту работы процессора и самый консервативный режим энергосбережения при чтении книги. Не требует root и работает на любом устройстве;
- Servicely — уничтожитель вредных сервисных процессов. Суть приложения крайне проста — ты устанавливаешь Servicely, активируешь его и выбираешь те приложения, которые любят жрать батарею не по делу (например, постоянно обновлять свое состояние через сеть). Servicely просыпается каждую минуту и убивает все сервисные процессы этого приложения. Не стоит путать приложение с таск-киллерами, которые убивают все приложение целиком;
- Nexus Display Control — приложение для тюнинга драйвера дисплея с целью изменения цветовой температуры, интенсивности RGB и гаммы. Работает только на Galaxy Nexus, Nexus 4 и Nexus 5. Требует кастомное ядро (не обязательно franco.kernel);
- Simple Reboot — простое приложение для выполнения разных вариантов перезагрузки (recovery, bootloader, etc.);
- Simple CPU Monitor Extension — плагин для виджета DashClock, информирующий о текущих настройках энергосбережения процессора.