linux.14: Linux

From: vit01 (mira, 1) 17.09.17 04:09 UTC
To: All
Subject: Используем Crond вместе с Android
Несведущий читатель на вопрос "как использовать крон на андроиде?" наверняка скажет, что надо скомпилировать обычный демон или стащить его из busybox и, собственно, сразу запускать в консоли.

Увы, это способ нерабочий. Почему? Потому что для экономии батареи андроид, когда мы его не используем, уходит в сон и вместе с собой тащит спать все запущенные приложения. Так что наш консольный Cron застопорится вместе с девайсом и начнёт либо пропускать задания, либо выполнять их в неправильное время.

Можно поставить так называемый постоянный WakeLock. Это значит запретить устройству спать. Я так уже пробовал (и Cron отлично работал), но заряд батареи быстро иссякал через несколько часов.

Что делать?

Нативные приложения используют системный AlarmManager, чтобы выполнять свои задачи по расписанию. Поэтому ОС просыпается в чётко заданное время. (уведомления IDEC Mobile и прочие следилки работают именно так).

Можно сделать Android-версию Crond, работающую через AlarmManager, и такие реализации существуют. Не так давно подобная свободная тулза появилась в F-Droid. Программа так и называется: crond.

Скачать: https://f-droid.org/packages/it.faerb.crond/

После запуска жмём "Enable crond" и ставим галочку "Use wake lock for script execution". Не беспокойтесь, этот WakeLock не постоянный, он работает только во время выполнения наших скриптов, чтобы исключить случайные сбои из-за засыпаний.

// Дальше имеет смысл читать только если у вас есть root-доступ

Лично у меня в повторяющиеся действия входит:

1. Выключение звонка по ночам и во время занятий
2. Включение громкости обратно, когда пары закончились
3. Разрешать или запрещать мобильный интернет в строго определённые часы, чтобы приложения не жрали трафик (и батарею), когда не надо, и синхронизировались, когда надо.

С мобильным интернетом проще всего:

====
# svc data disable # отключить
# svc data enable # включить обратно
====

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

Берём готовый баш-скрипт, который складываем куда-нибудь в /data и не забываем сделать chmod +x:

====
#!/system/xbin/bash

help() {
	echo "use ./script [ phone | apps | alarm | bluetooth ] LEVEL where level is int"
	exit 1
}

PHONE=1
APPS=3
ALARM=4
BLUETOOTH=6

if [ "$1" = "phone" ]; then
	SERVICE=$PHONE
elif [ "$1" = "apps" ]; then
	SERVICE=$APPS
elif [ "$1" = "alarm" ]; then
	SERVICE=$ALARM
elif [ "$1" = "bluetooth" ]; then
	SERVICE=$BLUETOOTH
else
	help
fi

if [ "$2" = "" ]; then
	help
fi

LEVEL=$2

COMMAND="service call audio 3 i32 $SERVICE i32 $LEVEL i32 1"
echo $COMMAND
exec $COMMAND
====

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

Теперь занимаемся crontab. Кронтаб у андроида (и у того приложения) принято хранить в /data/crontab. Синтаксис у него привычный, как у людей.

Вот образец моего

====
0 5,15 * * * su -c "/data/phone-set phone 7"
0 5,15 * * * su -c "/data/phone-set alarm 7"
0 5,15 * * * su -c "/data/phone-set apps 5"

20 8 1-6 * * su -c "/data/phone-set phone 0"
20 8 1-6 * * su -c "/data/phone-set alarm 2"
20 8 1-6 * * su -c "/data/phone-set apps 0"

0 0 * * * su -c "/data/phone-set phone 0"

30 23 * * * su -c "svc data enable"
0 1 * * * su -c "svc data disable"
====

То есть в 5 утра и в 15 дня включаем звонок и будильник на максимум. В 8-20 (за 10 минут до начала пар) глушим звонок и убавляем будильник. В 23 часа включаем мобильный интернет, в полночь опять глушим звонок и в час ночи выключаем интернет.

Важно! После правки crontab в редакторе надо перезайти в приложение crond, чтобы он подцепил изменения.

В андроиде так же можно управлять wifi, bluetooth и gps через консоль и делать многие другие годные штуки под вашу фантазию. Во всяких гуглоплеях встречаются приложения-планировщики, но стандартный unix-way никто не отменял, тем более, моим способом можно позволить себе гораздо больше, потому что в вашем распоряжении весь арсенал консольных утилит. Да и доверие к своим скриптам есть, в отличие от всяких васянских приложух с рекламой.
[660 / 749]