Будильник Кроха вышел в RuStore и Google Play. Это маленький будильник для Android: без рекламы, без интернета и без аккаунта. Установочный файл первой версии весит около 300 КБ.
Ниже рассказываю, откуда он взялся, что я в нём оставил, что убрал и на чём экономить было нельзя.
Главный экран. В шапке ближайший сигнал и сколько до него осталось
Большой будильник, в котором стало тесно
Мой главный будильник, Простой будильник, постепенно оброс всем, о чём меня просили: сменные графики, таймеры, секундомер, напоминания с календарём, темы, синхронизация между устройствами. Сейчас в нём больше 60 тысяч строк кода, а установочный файл весит десятки мегабайт.
Это хорошее приложение, и у него есть свои люди: те, кто работает по сменам, кому нужны напоминания и таймеры. Но у такого размера есть цена. Человеку, который хочет просто вставать в семь утра по будням, всё это не нужно, а пробираться мимо приходится каждый раз.
Я подумал: а что, если достать из большого будильника его ядро и собрать вокруг него отдельное приложение? Крохотное, но такое, чтобы всё нужное для подъёма было на месте.
Что людям на самом деле нужно от будильника
Перед тем как писать код, я перечитал отзывы на свои будильники в сторах.
Плохие оценки чаще всего ставили по двум причинам. Первая: приложение при первом запуске встречало стеной разрешений, и человек удалял его, так и не поставив ни одного будильника. Вторая: нельзя было быстро поставить будильник с понедельника по пятницу.
А доверие ломалось на одном: будильник не прозвонил. Красивый будильник, который проспал, удаляют в тот же день.
Будни и выходные одной кнопкой я сделал основой редактора. Из остального получились три правила для нового приложения:
- Работает сразу. Первый экран показывает список будильников и ничего не просит разрешить. До первого будильника ни одного вопроса.
- Звонит точно. Минута в минуту, после перезагрузки, после обновления, при смене часового пояса.
- Ничего лишнего. Ни интернета, ни аккаунта, ни рекламы, ни покупок.
Что я взял из большого будильника
Самое ценное в Простом будильнике не таймеры и не темы, а механика срабатывания. Она годами обкатывалась на живых телефонах, и за это время я собрал, кажется, все грабли: перезагрузки, смену часовых поясов, перевод часов, обновления приложения, прошивки, которые останавливают всё, что работает в фоне.
Эту часть я перенёс в Кроху целиком и не упрощал. Остальное собрал заново, причём только то, что нужно будильнику:
- дни недели и кнопки Будни, Выходные, Каждый день;
- разовый будильник, который выключается сам после звонка;
- пропуск одного ближайшего звонка без выключения будильника;
- откладывание с ограничением числа повторов;
- свои мелодии и плавное нарастание громкости;
- виджет с ближайшим будильником;
- экспорт и импорт списка в файл, чтобы переехать на новый телефон без облака.
И добавил две вещи, без которых будильником неудобно пользоваться каждый день.
Режим паузы. Уехали в отпуск или заболели: включаете паузу, и все будильники молчат несколько дней или до выбранной даты, а потом сами возвращаются. Выключать их по одному и вспоминать потом, какие были включены, не нужно.
Режим паузы. Приложение сразу говорит, по какой день будильники молчат и какой зазвонит первым
Быстрый будильник. Кнопка с молнией на главном экране: нажали +10 и ещё раз +10, получили сигнал через 20 минут. Удобно, когда нужно ненадолго прилечь или не забыть про духовку.
На чём я не стал экономить
Вес приложения я резал везде, кроме одного места. Вот что делает Кроха, чтобы прозвонить вовремя:
- ставит сигнал тем же системным способом, что и штатные часы. Поэтому в строке состояния появляется значок будильника, а режим экономии энергии такой сигнал не откладывает;
- рядом ставит запасной сигнал, на 15 секунд позже основного;
- пересчитывает будильники после перезагрузки, после обновления приложения, при переводе часов и смене часового пояса. После перезагрузки для этого не нужно даже разблокировать телефон;
- играет звук по системному каналу будильников, поэтому беззвучный режим и обычный режим Не беспокоить его не глушат;
- если файл вашей мелодии пропал, звонит встроенной, а не молчит;
- выключается только свайпом, чтобы сигнал нельзя было погасить случайным касанием сквозь сон.
Экран звонка. Отложить можно кнопкой, выключить только свайпом
Есть и честные ограничения, их не обойдёт ни один будильник. Выключенный телефон он сам не включит: если включить его в течение 15 минут после времени сигнала, Кроха прозвонит сразу, а если позже, оставит отметку, что будильник не прозвонил. Кнопка Остановить в системных настройках приложения стирает сигналы до следующего запуска. А режим полной тишины и нулевая системная громкость будильника глушат всё.
Почему будильники на Android иногда молчат
Чаще всего дело в самом телефоне. Многие прошивки экономят батарею слишком старательно: останавливают приложение в фоне, запрещают ему автозапуск, не дают показать экран поверх блокировки. У Xiaomi, Huawei, Samsung, Oppo и Vivo эти настройки свои и спрятаны в разных местах.
Заставить систему передумать приложение не может. Зато может показать, что именно не так. В Крохе для этого есть экран "Почему будильник может не сработать": меню на главном экране, Настройки, раздел Надёжность и данные. В зависимости от версии Android и прошивки он проверяет до шести вещей:
- разрешены ли точные будильники;
- разрешены ли уведомления;
- может ли сигнал открыться на весь экран;
- разрешён ли показ поверх других приложений;
- не ограничивает ли приложение экономия батареи;
- не мешает ли автозапуск: если в прошивке есть такой экран, кнопка ведёт прямо в него.
У каждой проверки свой статус и кнопка, которая открывает нужную системную настройку. Искать её по всему телефону не приходится.
Если будильник подводит на вашем телефоне прямо сейчас, я собрал настройки по шагам для каждой марки на отдельной странице: почему не срабатывает будильник на Android.
Проверка настроек телефона. Здесь всё в порядке, поэтому напротив каждой строки зелёная отметка
Как уместить будильник в 300 КБ
Бюджет у проекта был один мегабайт, и я проверял размер после каждой новой функции. Превышение считалось ошибкой, которую надо чинить, а не поводом поднять планку.
Ни одной сторонней библиотеки. Кроха написан на Kotlin и платформенных View, без Compose, AndroidX и Material. Один только Compose с Material 3 после сжатия занял бы от 2,5 до 3,5 МБ, то есть в несколько раз больше всего бюджета. В списке зависимостей проекта ровно одна строка, и та нужна тестам.
Мелодии сгенерированы скриптом. Три встроенные мелодии занимают 30 КБ на все три. Остальной выбор даёт сама система: рингтоны телефона и любой ваш аудиофайл.
Значки и шрифт. Значки интерфейса нарисованы векторами, а своих файлов шрифта внутри приложения нет.
Код сжимается при сборке. Всё, что не используется, в установочный файл не попадает.
При этом на проверках я не экономил: в проекте около 13 тысяч строк кода и почти 400 автотестов.
В итоге первая версия весит около 300 КБ. Это в сто с лишним раз меньше большого будильника.
Чего Кроха не умеет
Таймера, секундомера, сменных графиков, напоминаний, синхронизации и облака в нём нет. Так задумано: всё, что делает будильник большим, осталось в большом будильнике. Если вам нужны смены, таймеры и напоминания, они по-прежнему живут в Простом будильнике.
А обычный утренний будильник я хочу довести до ума именно здесь.
Где скачать
Кроха бесплатный, рекламы и покупок в нём нет.
- Будильник Кроха в RuStore
- Будильник Кроха в Google Play
- Страница приложения: скриншоты, возможности и ответы на частые вопросы
Если что-то сработало не так или чего-то не хватает, напишите в чат канала в Telegram или в MAX, либо оставьте пожелание на доске идей. Я читаю всё сам.