Будильник Кроха вышел в RuStore и Google Play. Это маленький будильник для Android: без рекламы, без интернета и без аккаунта. Установочный файл первой версии весит около 300 КБ.

Ниже рассказываю, откуда он взялся, что я в нём оставил, что убрал и на чём экономить было нельзя.

Главный экран Будильника Кроха: три будильника с днями недели, в шапке время ближайшего сигналаГлавный экран. В шапке ближайший сигнал и сколько до него осталось

Большой будильник, в котором стало тесно

Мой главный будильник, Простой будильник, постепенно оброс всем, о чём меня просили: сменные графики, таймеры, секундомер, напоминания с календарём, темы, синхронизация между устройствами. Сейчас в нём больше 60 тысяч строк кода, а установочный файл весит десятки мегабайт.

Это хорошее приложение, и у него есть свои люди: те, кто работает по сменам, кому нужны напоминания и таймеры. Но у такого размера есть цена. Человеку, который хочет просто вставать в семь утра по будням, всё это не нужно, а пробираться мимо приходится каждый раз.

Я подумал: а что, если достать из большого будильника его ядро и собрать вокруг него отдельное приложение? Крохотное, но такое, чтобы всё нужное для подъёма было на месте.

Что людям на самом деле нужно от будильника

Перед тем как писать код, я перечитал отзывы на свои будильники в сторах.

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

А доверие ломалось на одном: будильник не прозвонил. Красивый будильник, который проспал, удаляют в тот же день.

Будни и выходные одной кнопкой я сделал основой редактора. Из остального получились три правила для нового приложения:

  1. Работает сразу. Первый экран показывает список будильников и ничего не просит разрешить. До первого будильника ни одного вопроса.
  2. Звонит точно. Минута в минуту, после перезагрузки, после обновления, при смене часового пояса.
  3. Ничего лишнего. Ни интернета, ни аккаунта, ни рекламы, ни покупок.

Что я взял из большого будильника

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

Эту часть я перенёс в Кроху целиком и не упрощал. Остальное собрал заново, причём только то, что нужно будильнику:

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

И добавил две вещи, без которых будильником неудобно пользоваться каждый день.

Режим паузы. Уехали в отпуск или заболели: включаете паузу, и все будильники молчат несколько дней или до выбранной даты, а потом сами возвращаются. Выключать их по одному и вспоминать потом, какие были включены, не нужно.

Режим паузы: срок 1, 3, 7 или 14 дней либо до даты, ниже видно, какой будильник зазвонит первым после паузыРежим паузы. Приложение сразу говорит, по какой день будильники молчат и какой зазвонит первым

Быстрый будильник. Кнопка с молнией на главном экране: нажали +10 и ещё раз +10, получили сигнал через 20 минут. Удобно, когда нужно ненадолго прилечь или не забыть про духовку.

На чём я не стал экономить

Вес приложения я резал везде, кроме одного места. Вот что делает Кроха, чтобы прозвонить вовремя:

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

Экран звонка: время 06:30, название будильника Подъём, кнопка Отложить на 5 мин и свайп ВыключитьЭкран звонка. Отложить можно кнопкой, выключить только свайпом

Есть и честные ограничения, их не обойдёт ни один будильник. Выключенный телефон он сам не включит: если включить его в течение 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 КБ. Это в сто с лишним раз меньше большого будильника.

Чего Кроха не умеет

Таймера, секундомера, сменных графиков, напоминаний, синхронизации и облака в нём нет. Так задумано: всё, что делает будильник большим, осталось в большом будильнике. Если вам нужны смены, таймеры и напоминания, они по-прежнему живут в Простом будильнике.

А обычный утренний будильник я хочу довести до ума именно здесь.

Где скачать

Кроха бесплатный, рекламы и покупок в нём нет.

Если что-то сработало не так или чего-то не хватает, напишите в чат канала в Telegram или в MAX, либо оставьте пожелание на доске идей. Я читаю всё сам.