The Jerusalem PostIsraeli man allegedly brutally murders wife with an axe in front of their four childrenInquirerLOOK: Manila South Cemetery crowd reaches 2,200 on All Souls’ DayPunchTinubu celebrates Sultan’s 20 years on throneBollywood HungamaA.R. Rahman becomes the new face of Brooke Bond Taj Mahal Tea; Oscar-Winning composer launches ‘Awaken Your Masterpiece’ campaignDaily MaverickAfghanistan asks US to act responsibly on deporting Afghan immigrants back homeCNN TürkYeni haftada sağanak ve fırtına etkili olacak! Perşembe gününe dikkatColliderThe Biggest Horror Movie of 2026 Is Officially Ready to Scare NetflixRTL BoulevardGouden Film voor De Grote Sinterklaasfilm en de Vliegende PietenSouth China Morning PostHow Hong Kong’s fintech strategy is progressing – and where growth still lagsRappler[New Rx] What if the Philippines leased an island for 100 years?GIGAZINE得票数で負けている陣営を選挙区の区切り方だけで勝たせる無料ゲーム「elect.horse」を実際にプレイしてみたThe Straits TimesJohor-S’pore SEZ records $28b of approved projects, ministers note ‘good progress’ on various fronts
The Daily Newsstand · Free, Always
Monday, November 2, 2026

Android Go, Termux и обои

Translate

Давайте мы сразу договоримся: я знаю, что такое чистый код, ООП, SOLID, KISS и ещё куча других умных аббревиатур («знаю» и «понимаю» — всё ещё разные вещи, кстати). Весь код, который тут представлен, не является учебным пособием, примером как надо или ещё чем‑то в этом роде. Всё, что тут есть, — это лишь риск прострелить себе колени. Осознанно.

Предыстория

Итак. Есть у меня работа, а у работы, к моему великому сожалению, есть чаты. И специально для того, чтобы не захламлять свой основной телефон этими самыми чатами, откопал я в своём ящике второй телефон. А если быть более точным, то Itel A17. Откровенное чудо китайской техники. Маленький, лёгкий, прочный (сколько раз он у меня по кафелю летал), так ещё и заряд способен добрые три дня держать, если им пользоваться по минимуму. Правда, программно‑технические свойства оставляют желать лучшего. Android Go, 1 ГБ оперативной памяти (из которых свободны лишь 400 МВ), четыре ядра слабенького процессора. Но лично мне этого оказалось достаточно.

Спустя месяц, глядя на это существо, понял я, что мне надоели обои. Хочется поставить что‑то другое, красивое, с огоньком. Ну и полез я искать обои. Правда, спустя некоторое время поисков (а это вовсе другая история) пришел я к выводу, что хочу поставить обои в режиме слайд‑шоу. Ну знаете, чтобы картинки менялись время от времени без моего прямого вмешательства. И тут меня ждало открытие — оказывается, Go'ша не умеет в слайд‑шоу. Просто потому, что разноцветная буква решила, что это пользователям не нужно.

Я пошел на перестрелку

Ну нет и нет, можно было бы смириться. Можно, но нельзя. Потому я расчехлил Termux. Поставил на него micro (мне, конечно, нравится nano, но на телефоне им больно пользоваться), докинул clang, накатил Termux Api, отредактировал файлы и вышел на тропу войны против корпоративного произвола.

Изначально встал вопрос: на чём писать? В силу того, что я сейчас активно пытаюсь двигаться в направлении микроконтроллеров и Си, было принято решение писать решение на нём же. С некоторым дополнительными, бесполезными, можно даже сказать, вредными, но нюансами. На МК за эти нюансы мне бы, конечно, голову оторвали, но мы же не на МК, верно?

Код делает быр‑быр‑быр

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

Скрытый текст
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <time.h>

#define COMM "termux-wallpaper -f "
#define PATH "/storage/emulated/0/all/"
#define BUFFER_SIZE 256
#define SLEEP_TIME 600

const char* const images[] = 
{
"0.png",
"1.png",
"2.png",
"3.jpg"
};

char buffer[BUFFER_SIZE];

void SetWall(uint8_t l)
{

	uint8_t r = rand() % (sizeof(images) / sizeof(images[0]));
	uint8_t b = 0;
	uint8_t c = 0;

	while(COMM[c] != '\0')
	{
		buffer[b] = COMM[c];
		b++;
		c++;
	}

	c = 0;

	while(PATH[c] != '\0')
	{
		buffer[b] = PATH[c];
		b++;
		c++;
	}

	c = 0;
	
	while(images[r][c] != '\0')
	{
		buffer[b] = images[r][c];
		b++;
		c++;
	}

	if (l == 1)
	{
		buffer[b] = ' ';
		b++;
		buffer[b] = '-';
		b++;
		buffer[b] = 'l';
		b++;
	}

	buffer[b] = '\0';
}


int main ()
{
  srand(time(NULL));

	while(1)
	{
		sleep(SLEEP_TIME);
		SetWall(0);
		system(buffer);

		SetWall(1);
		system(buffer);
	}

	return 0;
}

Что тут происходит, зачем, для чего и, о Господи, почему? Давайте по порядку.

У нас есть общий цикл, который просто крутится на фоне. Благодаря ему и sleep(), скрипт буквально спит по десять минут. Раз в десять минут он просыпается, случайно выбирает пару картинок и, вызвав через system() команду termux‑wallpaper (‑l), меняет обои и снова засыпает. Убого? Да. Работает? Тоже да.

Минусы!

Давайте мы сразу опустим гнилые помидоры обратно в ящик, и никто не пострадает. Начнем по нарастающей.

Убивает ли этот код здравый смысл? Это ещё скромно сказано.

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

Почему нет проверки переполнения буфера? Ну, просто потому, что я знаю команду, путь, имена файлов. Да, написать проверку просто и быстро. Но мне было откровенно лень, я осознанно приставляю ружье к своим коленям и жму на спусковой крючок. Пока ещё не выстрелило.

Почему не подключена стандартная библиотека строк? Потому что мне было просто по кайфу побаловаться и написать свою склейку через три кривых цикла. Это полностью неправильно и противоречит здравому смыслу. С другой же стороны, я написал слайдер обоев для телефона, который любой нормальный человек уже давно выкинул бы. Разве здравый смысл нам всё ещё важен? Вот и я думаю, что нет.

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

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

Почему используем system()? Да, правильно было бы сделать свой fork и самому им рулить, но... А зачем? Нет, я понимаю, что правильно, но зачем, если при срабатывании system() система ведёт себя стабильно? В своём форке был бы смысл, если бы устройство откровенно фризило в моменте, но этого нет, так что считаю, что это была бы оптимизация ради оптимизации.

Почему два вызова system()? Я бы с удовольствием сделал бы один, да проблема в том, что у termux‑wallpaper нет общей команды для смены обоев сразу на двух экранах. Потому да, вызовов два.

Почему не взял Bash? Во‑первых, как я и сказал, я двигаюсь в сторону Си. А значит, почему бы не повеселиться? Во‑вторых, я чисто из интереса провел замеры. RES на запущенном бинарнике Си в момент сна, спустя три дня работы, показал 2.7 МВ, а SHR — 2.5 МВ. Аналогичный же скрипт на Bash выдал результат 5.1 МВ и 4.0 МВ соответственно. В первую же минуту запуска. В момент сна. Да, всего 2.4 МВ разницы, но это скорее просто интересный момент.

Android Go душит процессы, как с этим бороться? Вот тут самое комичное. Если вы скинете шторку уведомлений, то увидите у Termux кнопочку Wake Lock. Ага, нажимаете на неё — и всё, термукс вместе с крутящимся бинарником перманентно висит и не пытается быть убитым. Грязно и неправильно? Определенно. Красиво? Без сомнений.

Вместо выводов

Сказать по правде, этот скрипт для меня — откровенное баловство, возможность потрогать Си, Линукс через Си, поставить обои и просто повеселиться и не сойти с ума на работе, где я уже пятый день работаю в поте лица 13-часовую смену. В любом случае спасибо, что дочитали, всем удачи, и чтобы ваши костыли не простреливали вам колени. Вы ведь их тоже пишете?

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.