Кодерская мастерская
137 subscribers
1 photo
14 files
39 links
Блог Данила Пылаева
Download Telegram
Кодерская мастерская
Обновляем git for windows Сегодня я совершенно неожиданно узнал, что git for windows умеет обновлять сам себя! Открываем ваш любимый shell, пишем git update-git-for-windows, и всё. Вообще всё, после этого нужно просто дать согласие на обновление, и оно скачается…
Очень важное дополнение к предыдущему посту!
При обновлении git for windows описанным способом он затирает глобальный конфиг! Не наступите на мои грабли!
И в рот я наоборот такие апдейты вертел, так вам скажу. Я понятия не имею, что было в этом конфиге, ну то есть editor там был прописан, но скорее всего что-то ещё, и бэкапа у меня нет, я даже и не подумал эту директорию в бэкап включать, ибо туда никто кроме меня не залезет, ага-ага.
Windows 11 альцгеймер edition

Недели 3 назад до меня наконец докатилось обновление 24h2. С некоторых пор я специально ничего не обновляю если нет необходимости, т.е. жду, пока само поставится.
Так вот начало ставиться, скачало 6 процентов, и вдруг...
"Невозможно скачать и установить это обновление, так как оно еще не готово для вашего устройства."

Ну ладно, подожду, и даже смирюсь с тем, что на диске c остался какиш на 3.5 гб, специально не буду трогать, пусть он сам решает как с ним быть.
И вот сегодня обновление наконец докатилось полностью! Подумал я.
Ну вроде вот оно снова качается, 4 процента, 6, ух ты! 8 процентов, пожалуй в этот раз всё и правда по-настоящему.
Но не успел я даже закончить эту мысль, как: "Невозможно скачать и установить это обновление, так как оно еще не готово для вашего устройства.".
Интересно, сколько циклов мне предстоит пройти. Выглядит конечно как какой-то локальный баг, ибо проц 12 поколения всё же, под него поддержка должна быть безусловно, и сильно сомневаюсь, что сообщение об ошибке правдиво.
🤔2
Зачем нужны ide / редакторы кода?
Чтобы вместо написания кода полтора часа потратить на настройку очередной фичи или починку очередного сломавшегося функционала.
Сегодня в какой-то момент перестало работать циклическое переключение по областям интерфейса с помощью f6, у меня ушло 30 минут на то, чтобы выяснить причину.
Причина в следующем, в какой-то момент, в secondary sidebar-е появляется предложение заюзать копилот, и при нажатии f6 в редакторе кода или shift+f6 в статус баре фокус по-хорошему должен упасть туда, но почему-то не может! И в итоге просто никуда не перемещается. Ну и на первый взгляд нет никакого очевидного способа скрыть эту плашку, кроме как скрыть весь сайдбар, ибо вроде он не сильно нужен.

#IDEНаОе
Кажется, мне стоит высказать свою точку зрения на некоторые виды нестандартного творчества.
В предыдущем посте я поделился с вами интересным, на мой взгляд, роликом. Изначально я увидел его в одном из тг-каналов, ради интереса заглянул в комменты, и неожиданно прочитал много негатива.
Все такие комментарии примерно об одном: получилось хреново, можно было и лучше, автору совсем нечего делать и тому подобное.
А ещё, кстати, сегодня заметил, что под моим постом про говновоза кто-то поставил палец вниз, что тоже является проявлением негативной реакции.
И вдруг до меня дошло, что не для всех может быть очевидна та составляющая, которая вызывает восхищение в подобного рода творениях.
Давайте приведу пару примеров:
Однажды мне встретился ролик, в котором блогер сделал хранилище данных из... ковид-тестов, просто потому что почему бы и нет.
Вот это видео (на английском), на самом деле с тестами у него ничего не вышло, но там есть много интересного, например файловая система на icmp-пакетах: https://youtu.be/JcJSW7Rprio
Или, допустим, пару лет назад я развлекался с языком программирования звуковых игр bgt, пытаясь заставить работать его с программой для голосового общения TeamTalk, причём, на моё удивление, вполне успешно.
Так вот у кого-то может возникнуть вопрос: а в чём же смысл такого рода поделий, какую пользу они приносят, зачем оно надо вообще?
Файловая система на пингах очень медленная, рано или поздно теряет данные, информация не переживает потерю питания или интернета, то есть она не имеет практической ценности.
Тоже можно сказать и о программе стриминга в teamtalk на bgt, она не имеет интерфейса, функционал максимально ограничен, а код невероятно ужасен.
А объединяет все эти продукты разума следующее: всё это сделано с применением глубоких знаний и/или сложных технологий, потребовало приличного количества времени и погружения в тему, и в результате вышло нечто впечатляющее, даже если таковым не кажется для обывателя.
И обывателя можно понять, если человек не представляет, как компьютер хранит данные, в каком порядке исполняется софт, и что такое вообще выполнение программного кода (а это между прочем процесс достаточно абстрактный), то ему просто невозможно объяснить, в чём прикол скрипта на bgt, который вообще-то не должен создавать в оперативной памяти структуру данных и передавать указатель на неё в библиотечную функцию, но как-то всё же создаёт и передаёт.
Точно также если человек не шарит в теме нейронных сетей и не осознаёт их возможностей и ограничений, он не сможет понять прикола очередного сто-пятисотого кавера говновоза и его уникальности.
Пока писал эти строки я пришёл к мысли, что, вероятно, в мире абстрактной живописи происходит что-то похожее, какую-то размазьню на аукционах продают за миллионы долларов, но может быть для знатоков визуальных абстракций эта размазня тоже самое, что и музыкальная установка из 512 флоппи-дисководов для инженеров, программистов и звукорежиссёров, которые мыслят достаточно глубоко и понимают всю сложность проделанной работы и грандиозность получившейся системы.
Например трек из предыдущего поста у меня вызвал восхищение, потому что работа, проделанная для его создания, невероятна, человек нарезал более 300 фильмов (если это конечно правда) на отдельные слова, возможно какие-то из них почистил нейронкой от шумов, собрал их все в нужном порядке, а потом смантировал так, чтобы не сбился ритм!
То есть да, звучит отстойно конечно, какие-то рандомные фразы положены на музыку, интонации не в тему, да и вообще дичь же какая-то, вот только смысл совсем не в этом.
Кавер же на говновоза... во-первых он достаточно качественно получился сам по себе, а сервисы по типу суно, как правило, не выдают такой чистый результат с первого раза. И с пятого тоже, и с десятого могут не выдать. Ну а во-вторых не умеют языковые модели так чисто текст изобретать, особенно на русском, а значит что автор довольно складные стихи про какиш написал, что тоже заслуживает внимания.
В общем не весь, на наш взгляд, мусор и бред является таковым, возможно мы просто недостаточно хорошо разбираемся в теме.
🔥2👍1
Пока на дворе 2025 год, sourceforge продолжает оставаться где-то в девяностых.

":3,2 КБ/с – 63,8 КБ из 2,9 ГБ, Осталось 11 дней"

PS:
Там конечно можно выбрать зеркало и скачать в пару сотен раз быстрее, сейчас попробую это сделать, но почему блин автоселект такой плохой?..
Кодерская мастерская
Пока на дворе 2025 год, sourceforge продолжает оставаться где-то в девяностых. ":3,2 КБ/с – 63,8 КБ из 2,9 ГБ, Осталось 11 дней" PS: Там конечно можно выбрать зеркало и скачать в пару сотен раз быстрее, сейчас попробую это сделать, но почему блин автоселект…
Промежуточное решение для скачивания с sourceforge

Начинаем что-то качать, видим низкую скорость. Копируем ссылку, по которой качается файл, и получаем что-то вроде:
https://altushost-swe.dl.sourceforge.net/project/crdroid/peridot/11.x/recovery/recovery.img?viasf=1

Как я понял, поддомен перед dl - это зеркало sf, заменяем его на master (т.е. вместо всего, что до первой точки, пишем master), переходим по получившейся ссылке, и качаем быстрее, а может и нет, тут как повезёт.
Решение промежуточное, потому что фиг его знает где найти список доменов зеркал, но в моём случае и с master скорость неплохая.
Параметр viasf=1, кстати, обязателен, без него вместо скачивания происходит редирект.
Планирую пару больших постов-гайдов, состоящих из многих этапов, как лучше выкладывать?
Anonymous Poll
74%
Несколькими сообщениями подряд, всё и сразу!
26%
По одной небольшой части, на протяжении нескольких дней / недель
Кодерская мастерская
Запоздалое дополнение к посту с дополнением Aida Menu. Вот я задействовал Be my ai, логику и научный тык одновременно, потратил около получаса своего времени, написал замечательный аддон, чтобы воспользоваться им полтора раза, и вроде круто, да? Ведь ну я…
Судя по вашим реакциям кто-то хотел видеть aida menu в аддон-сторе, так что теперь он там.
Процесс приёма, кстати, занял две недели! Отвратительнейший экспириенс, так вам скажу. Хотя мейнтейнеру, по сути, надо отсмотреть пару строк текста и нажать одну кнопку.
Не ленитесь писать разработчикам

Много лет я использую Tasker, это android-приложение для создания различных автоматизаций.
В приложении этом были некоторые проблемы доступности, но не настолько критичные, чтобы они мне мешали.
Однако пару версий назад разработчик выпустил бета-версию нового интерфейса, который пока не включен по умолчанию, но когда я его включил, то увидел достаточно много проблем доступности.
И тогда, имея негативный опыт коммуникации с некоторыми разработчиками и сообществами, я, тем не менее, решил написать автору приложения. Я описал несколько проблем, предложил помощь в бета-тестировании и тому подобное.
Заодно я также описал и те проблемы, которые были в классическом интерфейсе, и на моё удивление разработчик ответил достаточно быстро, и, самое главное, добавил предложенные фичи!
Причём не просто добавил, а даже записал демку!
Новый ui разработчик исправлять не стал, так как он пока сырой, будет переделываться и модернизироваться, но пообещал, что обязательно учтёт нюансы доступности, когда интерфейс станет более-менее стабильным.
Но на новый ui, на самом деле, будто бы и пофиг, главное, что он добавил фишечки в старый! И теперь работать с ним стало комфортнее, а разработчику это почти ничего не стоило.
Поэтому, моё мнение следующее: не ленитесь писать разработчикам о проблемах, особенно разработчикам мелких продуктов. Да, всегда есть шанс потратить своё время впустую на написание сообщений / писем, и никогда не получить ответа, но довольно часто они как минимум дают обратную связь, а порой ещё и вносят правки, или добавляют фичи.
Вот кстати демка, можно поржать с того, как чел не умеет использовать talkback 🙂
https://youtube.com/shorts/bf1A9QX1dLo
👍1🔥1
Включаем adb на любой кастомной прошивке

Данный пост будет интересен тем, кто любит играться с прошивками android-смартфонов, и порой сталкивается с проблемой запуска скринридера при первоначальной настройке, или хочет иметь возможность подключения через adb для любых других действий с прошивкой сразу из коробки.
Никакого кликбейта кстати, adb появляется сразу, при первом старте прошивки.
Ниже изложенный гайд, к сожалению, сыроват, тестировался мной один раз на одном устройстве, и у вас разумеется что-то может не взлететь, но основной принцип я изложу, а дальше, при желании, вы сами сможете докрутить под свою задачу.
Сразу предупреждаю, что гайд подразумевает наличие неких знаний, например об основных принципах работы телефона и его загрузки, о смысле наличия рут-прав и т.п.
Иначе говоря, гайд рассчитан на тех, кто уже немного успел поковыряться с прошивками android-устройств и что-то в этом понимает. В любом случае вы всегда можете задавать вопросы в комментариях, поехали уже наконец.

Начну немного издалека: когда-то, очень много лет назад, телефоны поставлялись с обычной флеш-памятью, размеченной на обычные разделы, в которых вот так прям сразу лежала система.
Система, лежащая в разделе system, конечно была доступна только для чтения, но при наличии рут-прав можно было сделать что-то вроде mount -o rw,remount /, и системный раздел можно было модифицировать прямо на горячую.
В команде выше / сработает на девайсах, где системный раздел монтируется как корневой (system-as-root), у меня был именно такой телефон, насколько мне известно, сейчас так делают все производители прошивок, как стоков, так и кастомов.
На ещё более ранних моделях, которых я в руках не держал, система монтируется в /system, и там перемонтировать нужно именно его, но это сейчас не столь важно.

Более того, при наличии кастомного recovery, например twrp, можно было загрузиться в него, смонтировать систему на запись, и произвести там необходимые манипуляции.
Так вот на подобных устройствах, где ещё не завезли super partition, и все разделы лежат наверху, работает следующая штука:
1. Шьём прошивку, вероятнее всего через twrp.
2. Включаем телефон, даём системе инициализироваться, если там нету скринридера, можно потыкать кнопку питания, вероятнее всего телефон будет блямкать звуком выключения экрана, и это будет значить, что первоначальная распаковка случилась, и раздел data инициализировался.
3. Снова загружаемся в twrp.
4. Ждём пока расшифруется раздел data, монтируем систему на запись.
5. Редактируем build.prop, прописывая туда некие строки для включения adb.
6. Подкладываем ключ от adb в раздел data.
7. Грузимся в прошивку, и телефон поднимает авторизованный adb!

Для описанного в шагах 5 и 6 я когда-то написал такой батник:
adb shell mount -o rw /system_root
adb shell sed -i '$ a\persist.service.adb.enable=1' /system_root/system/build.prop
adb shell sed -i '$ a\persist.service.debuggable=1' /system_root/system/build.prop
adb shell sed -i '$ a\persist.sys.usb.config=mtp,adb' /system_root/system/build.prop
adb push %userprofile%\.android\adbkey.pub /data/misc/adb/adb_keys


Этот код монтирует системный раздел, дописывает в build.prop параметры для включения отладки, и подкладывает публичный ключ adb-демона, чтобы adbd на телефоне не требовал авторизацию компьютера при подключении.
Очевидно, что ключ должен быть создан демоном перед данной процедурой, для этого достаточно хотя бы раз воспользоваться adb, или запустить демона командой adb start-server.
Способ работает на относительно старых телефонах без раздела super, но с некоторыми нюансами:
1. Это возможно, если для телефона имеется полноценное управляемое через adb recovery, по типу twrp.
2. Ключ получится подложить только в том случае, если рекавери умеет расшифровывать дата-раздел, с чем частенько бывают проблемы, ну или если в прошивке отключено шифрование.

UPD 2026-05-31, на самом деле батник для копирования ключей написал Бека (gozaltech), забыл упомянуть при написании, исправляюсь.
👍1
Кодерская мастерская
Включаем adb на любой кастомной прошивке Данный пост будет интересен тем, кто любит играться с прошивками android-смартфонов, и порой сталкивается с проблемой запуска скринридера при первоначальной настройке, или хочет иметь возможность подключения через…
Время шло, инженеры придумали раздел super, придумали новые способы шифрования и разметки, и на новых телефонах способ больше не работает.
Во-первых, система теперь лежит в логическом разделе внутри раздела super. И штука то вроде хорошая, она позволяет производителю более гибко обновлять прошивку, но часто там используется специальная файловая система EROFS (Enhanced Read-Only File System).
Как следует из названия, данная файловая система не подразумевает модификацию после создания, и перемонтировать что-то так просто уже не получится.
В кастомных прошивках, как я понял, используется ext4 внутри super-разделов, и их менять можно, но мне, например, это никак не помогло.
Я имею на руках телефон Poco f6, и то ли он достаточно свежий, то ли индусы обленились, но для этого телефона нет полноценного twrp.
Twrp для poco f6 не умеет монтировать подразделы внутри super на запись, не умеет не то что расшифровывать userdata, а даже монтировать его! Ну и, соответственно, не умеет ставить пакеты в систему.
Всё, что я смог там сделать, это установить magisk, и то он после загрузки в прошивку плевался и крыл рекавери трёхэтажным матом, отказываясь работать без правильной установки, которую, к счастью, он производит самостоятельно.
И так мы имеем комбо, прошивку можно поставить из рекавери, которое поставляется вместе с кастомом, но далее мы не можем модифицировать ни системный раздел, ни userdata.
Рекавери от прошивки, кстати, управляется с кнопок громкости и питания, что позволяет прошиться полностью вслепую, особенно если под рукой есть другой телефон.
С разделом super допустим можно заморочиться, его можно сначала выколупать из прошивки, потом распаковать, далее смонтировать system, внести изменения, заново собрать super и прошить через fastboot.
И, вероятнее всего, даже лазать в раздел userdata не обязательно, т.к., как я понял в build.prop можно прописать параметр, который заставит adbd принимать любой ключ, но я нашёл иной подход.
Подход базируется на возможностях magisk, который позволяет не только выдавать рут-права различным приложениям, но и запускать произвольные скрипты на различных этапах загрузки телефона.

Для начала немного теории:
При загрузке телефона выполняется много интересных этапов, например pbl, brom, abl и т.п., но я пропущу их, ибо во-первых сам плохо разбираюсь в теме, а во-вторых мы работаем на несколько уровней выше, и эта тема сейчас не важна.
Важно, что в какой-то момент у нас запускается ядро, которое что-то там поднимает, монтирует, читает конфиги, и в конечном итоге запускает самый первый, так называемый init-процесс.
init находится в небольшой файловой системе, так называемом ramdisk, который хранится в boot-разделе, и его легко можно прошить через fastboot.
То есть ядро читает и распаковывает в оперативку ramdisk, а затем запускает из него бинарник init.
init запускается с привилегиями root-пользователя, и начинает производить запуск всех остальных процессов, необходимых для работы android.
Разумеется большинство таких процессов запускаются уже без рут-прав, потому что они им не требуются, по крайней мере такова задумка разработчиков.
Если же мы, как пользователи ОС, хотим всё же рут-права получить, тогда и идут в дело инструменты по типу Magisk или kernel su.
Как же работает magisk?
magisk делает очень простую вещь, он патчит ramdisk, внедряется в бинарный файл init, или полностью подменяет его.
Когда ядро запускает init, magisk запускает исходный init, и система загружается как обычно, но также он намеренно оставляет лазейку, через которую преложения, не имеющие рута, могут поднять свои привилегии.
Magisk позволяет добавлять так называемые модули, которые патчат системные файлы, или запускают фоновые скрипты при загрузке устройства.
Однако модули устанавливаются в раздел userdata, поэтому в данном случае они бесполезны.
Но есть у magisk одна интересная фича, которой можно воспользоваться.
Как написал выше, magisk патчит ramdisk, который лежит в отдельном небольшом разделе, и в этот ramdisk можно подложить скрипты, которые будут запущены от рута!
Кодерская мастерская
Время шло, инженеры придумали раздел super, придумали новые способы шифрования и разметки, и на новых телефонах способ больше не работает. Во-первых, система теперь лежит в логическом разделе внутри раздела super. И штука то вроде хорошая, она позволяет производителю…
Скрипты могут выполнить произвольный код, и включить нам adb.

И так вот примерно как это можно сделать:
Для начала добываем раздел с рамдиском, ранее для загрузки использовался один раздел boot, который содержал и ядро, и ramdisk, в новых девайсах делают два раздела, boot содержит только ядро, а init_boot только ramdisk.
Такой подход позволяет разработчикам прошивок более гибко обновлять ядро и/или ramdisk, в чём проблема обновлять всё сразу я так и не понял, но им виднее.
То есть если в прошивке только boot, он и содержит ramdisk, а если есть init_boot, то рамдиск скорее всего там.
В моём случае всё было именно так, для вашего девайса / прошивки расклад может быть иным.

Разделы с файлами прошивки их авторами запаковываются во всякие интересные форматы, CRDroid на poco f6, например, содержит в себе файлик payload.bin.
Из такого файла разделы можно достать каким-нибудь распаковщиком, я пользовался otadump.
Он шустрый, написан на современном и популярном rust, ну и, собственно, решает поставленную задачу: достаёт разделы из payload.bin.
В доке написано, что прога работает напрямую с zip-файлами, но мне как-то не фартануло, поэтому я извлёк payload с помощью 7zip-а.
Последний релиз с exe-шником был выпущен 2 года назад, возможно zip будет хавать, если руками собрать из последнего коммита, но мне было лень этим заниматься.
Для распаковки выполняем что-то вроде:
otadump.exe -o . --partitions init_boot payload.bin


init_boot я таким способом конечно извлёк, а через пару недель вдруг выяснил, что для CRDroid он постовляется отдельно, и его можно было просто скачать, пропустив эти увлекательные этапы с поиском распаковщика под винду и извлечением раздела.

Далее нам нужно установить magisk manager на любой телефон, наличие рута и разблокированного загрузчика не обязательно, менеджер нам нужен только для патчинга файла.
Отдельного инструмента, который работал бы на винде или линуксе я не нашёл, есть бинарник, который постовляется вместе с magisk, но он написан на смеси rust с c++, и отделить его для сборки под другую платформу и использования вне рутированного устройства не самая тривиальная задача.
Поэтому самым простым способом является установка менеджера на любой android.
Это можно сделать, даже если у вас всего один телефон, правда у вас не будет права на ошибку, ведь когда вы всё сломаете, и причиной фейла станет неправильно пропатченный рамдиск, патчить заново будет уже нечем, но мне трудно представить сценарий, в котором бут может быть пропатчен неправильно.
Однако файл можно перепутать с другим файлом, перезаписать, потерять, случайно удалить и тп., так что будьте аккуратнее.

Закидываем init_boot.img на телефон с менеджером, запускаем его, жмём на установку, выбираем способ установки - патчинг файла.
Затем выбираем ранее скинутый образ, патчим его, и получаем новый патченный образ, кажется magisk кладёт его рядом с исходным.
Теперь мы можем прошить прошивку, через fastboot зашить init_boot, и получить рутированную систему, но нам нужно сделать немного больше.

Сейчас мы получили образ, который содержит подменённый бинарь init, а также некоторые другие файлы magisk-а.
Для того, чтобы подложить туда кастомные скрипты, образ нужно разобрать.
Я использовал image kitchen, это некий комбайн для модификации прошивок, чего-то более простого, для модификации только рамдисков, я не нашёл.
Точнее модифицировать рамдиски умеет бинарник, поставляемый вместе с magisk, как по мне делать это всё на телефоне через adb будто бы не очень удобно, но если вдруг захочется, то это возможно, и рут вероятно для этого не нужен.
Кодерская мастерская
Скрипты могут выполнить произвольный код, и включить нам adb. И так вот примерно как это можно сделать: Для начала добываем раздел с рамдиском, ранее для загрузки использовался один раздел boot, который содержал и ядро, и ramdisk, в новых девайсах делают…
Открываем предпочитаемый shell в директории image kitchen (это та, где батники лежат), и запускаем unpackimg.bat с путём до патченного образа.
Файл будет разобран в директорию image kitchen, это не очень удобно на мой взгляд, но так работает инструмент, и в общем-то на один раз сойдёт, а если использовать его часто, то можно под себя батники поправить.
Или можно использовать флаг --local, он как-то посредственно документирован, но как я понял, если добавить его первым аргументом, скрипт распакует образ в текущую рабочую директорию.

После распаковки мы получаем две директории, split_img и ramdisk.
В split_img лежат всякие сервисные файлы, которые используются kitchen-ом для реконструкции образа, а вот в ramdisk находится самое интересное.
Там лежат как раз те папки и файлы, которые получаются при распаковке рамдиска ядром, и мы можем внести нужные изменения.
Изменения нужно внести в директории overlay.d, если её нет в ramdisk, возможно наступил какой-нибудь 2125 год, и magisk больше не создаёт её, или вы распаковали не тот образ.

И так, magisk умеет запускать из overlay.d скрипты, которые пишутся на Android Init Language, в них можно использовать ограниченный набор команд, однако нам хватит его.
В теории можно из такого скрипта запустить полноценный sh скрипт, или любой другой бинарник, но там есть какие-то нюансы с se linux, с которыми я не стал разбираться, и пошёл по простому пути.
По сути нам нужно сделать всё те же две вещи, включить adb, и прописать наш публичный ключ.
Создаём в overlay.d файл custom.rc, и пишем в нём:

on boot
setprop persist.service.adb.enable 1
setprop persist.service.debuggable 1
setprop persist.sys.usb.config adb
write /data/misc/adb/adb_keys your-public-adbkey
chmod 0640 /data/misc/adb/adb_keys
chown 1000 2000 /data/misc/adb/adb_keys


Вместо your-public-adbkey нужно подставить содержимое файла с публичным ключом, а точнее первую и единственную строку из него.
В винде ключ лежит по адресу c:\Users\user\.android\adbkey.pub.
В конце строки после пробела указано имя компьютера и имя пользователя, который создал ключ, они как правило опциональны, и я не копировал его в rc-файл, чтобы получить аргумент без пробелов.
Из документации по этому мини-языку не очень понятно, как именно команда write относится к пробелам, поэтому я перестраховался, скорее всего она выполнится при любом варианте.

В общем этот скрипт устанавливает системные свойства для включения adb, пишет ключ в userdata и устанавливает права на него (без них не взлетит).
Триггер boot, по которому выполняются эти команды, срабатывает в самом конце последовательности загрузки, когда раздел data уже расшифрован и готов к записи.

После добавления файла, ramdisk нужно запаковать обратно, это можно сделать запустив repackimg.bat.
Он зачем-то запрашивает админские права, это единственное, что не нравится мне в image kitchen. Возможно там при распаковке на некоторые файлы выставляются права, с которыми при упаковке они не читаются, звучит сомнительно, но других теорий у меня нет.
После упаковки получаем файл ramdisk-new.cpio.lz4 - это чистый ramdisk, он нам не нужен, а также image-new.img, и это наш теперь уже дважды патченный образ.

На этом этапе всё готово к прошивке, берём, допустим, рекавери от вендора, зашиваем прошивку как положено.
Затем грузимся в fastboot, шьём в init_boot файл image-new.img.
И наконец загружаемся в прошивку, которая, если ничего не сломалось, успешно инициализируется и поднимет adbd, который с радостью пустит нас в систему.
Кодерская мастерская
Открываем предпочитаемый shell в директории image kitchen (это та, где батники лежат), и запускаем unpackimg.bat с путём до патченного образа. Файл будет разобран в директорию image kitchen, это не очень удобно на мой взгляд, но так работает инструмент, и…
Ну а там уж ставим talkback, синтезатор, включаем это дело, и в бой!

Сделать это можно примерно так:
adb shell settings put secure touch_exploration_enabled 1

adb shell settings put secure enabled_accessibility_services com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService


Если в системе нет синтов, то достаточно поставить google tts, apk-шку которого можно найти на просторах интернета, должно само взлететь либо сразу, либо после ребута.
а если хочется что-то своё, то переключить можно так:
settings put secure tts_default_synth com.reecedunn.espeak

То есть значением переменной tts_default_synth нужно сделать имя пакета приложения синта. В примере я использовал espeak, но пока его заведёшь телефон настраивать дальше уже не захочется, поэтому лучше ставить что-то более стабильное.

Если по какой-то причине рут вам не нужен, после настройки достаточно прошить стоковый init_boot, adb, скорее всего, получится отключить стандартными средствами через ui.

Материалы по теме:
otadump: (https://github.com/crazystylus/otadump)
Тред по image kitchen, там же можно скачать его: https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/
magisk developer guide (тут можно почитать про возможности magisk в целом, и про overlay в частности): https://topjohnwu.github.io/Magisk/guides.html
magisk tools (документация по поставляемым с magisk бинарникам, для перепаковки образов применяется утилита magiskboot): https://topjohnwu.github.io/Magisk/tools.html
Android Init Language: https://android.googlesource.com/platform/system/core/+/master/init/README.md
Кодерская мастерская
Снова докатилась, что думаете?
Ну что ж, с, кажется, четвёртого раза 24h2 всё же поставилась, занял этот процесс минут 40, за это время я бы вручную её воткнул с нуля, ещё бы и чай успел попить, ну да ладно.
После обновления она почему-то удалила с рабочего стола ярлык на Crazy party, а ещё решила, что 80 гигов на c ей мало, и без моего ведома включила сжатие системных файлов.
А ещё она решила, что на моём отдельном разделе с личными файлами самое место для временной папки на 5 гигов, которую удалять сама она не собирается.
ВОзможно это потому, что места свободного на ц действительно маловато, но ей бы хватило с запасом.
А, ну и чтобы я не расслаблялся, она изменила настройки bluetooth, и у меня отвалилась клавиатура, пришлось идти 5 метров до ноутбука и чинить, полезная фича в общем-то, позволяет сделать добровольно принудительную зарядку.
Конечно же есть ещё 100500 багов, которые не успел найти за первые 5 часов, поэтому о них как-нибудь в другой раз.
🔥1
Я провалил тест от hh на базовое знание python, на два вопроса из 10 ответил не верно, последние два просрал по времени, и того 6 из 10, причём неверные не показываются, что, на мой взгляд, дичь какая-то.
На сегодня пока всё, скоро пост про установку ubuntu по сети.
Char Desc Merge

На днях сделал аддон для nvda, и забыл о нём написать. Исправляюсь.
Char Desc Merge - это дополнение, которое позволяет добавить в любую локаль nvda описания символов из любой другой локали nvda.
Объясню на примере, допустим вы используете английскую nvda, и читаете русский текст. Если попытаться получить описание буквы а, мы должны получить слово "Анна", но этого не происходит.
Так случается потому, что nvda ищет описания только для текущей, а затем для английской локали, то есть если локаль русская, то проверяются русские и английские символы, если локаль французская, то французские и английские, хотя у них у всех латиница вроде... Ну в общем вы поняли.
Дополнение решает эту проблему, его настройки встраиваются в настройки nvda, единственная опция - список флажков, в котором нужно отметить локали, и nvda станет искать описания символов в словарях выбранных локалей.
Аддон можно найти в магазине дополнений, он размещён в канале dev.

Издатель addonWorkshop - это я, все мои аддоны будут размещаться от этого имени, так сделано для решения технических проблем с автоматизацией выкладки аддонов в магазин.
А ещё не путайте с addonFactory, это уже не я, это Бека AKA Gozaltech, но его аддоны тоже заслуживают внимания.
Кстати Могу рассказать про автоматизацию публикации дополнений, пишите в комменты, интересна ли вам эта тема.
👍2
На случай если кто-то ещё безусловно верит ИИ, вот очередной пример его факапа.
Пишу я значит некую быстрописную штуку, которую надо сделать, использовать полтора раза и забыть про неё навсегда.
Решил использовать библиотеку requests, хочу задать дефолтный таймаут, vscode не очень торопится мне подсказывать.
Пытаюсь быстренько нарыть что-то в исходниках, и всё выглядит так, будто timeout в Session передать нельзя.
При попытке загуглить получаю сгенерированный ИИ ответ, что мол сетни в сессию атрибут timeout, и оно полетит.
Разумеется я не поверил, и провёл элементарнейший тест:
>>> s=requests.Session()
>>> s.timeout=0.0001
>>> s.get('https://danstiv.ru')
<Response [200]>

Не работает! А почему?
А потому что мы снова оказались в дивном новом мире галлюцинаций, точнее не мы, а ии, и не оказался, а всегда там был.
На всякий случай я использовал документированный способ, и всё сработало как надо.
>>> s.get('https://danstiv.ru', timeout=0.0001)
Traceback (most recent call last):
...
...
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='danstiv.ru', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000002E3BC7E62A0>, 'Connection to danstiv.ru timed out. (connect timeout=0.0001)'))

Такие дела. Перепроверяйте ИИ.
Мне приснилась Джанга для девопсов:
2 или более участников логинятся на сервак, и по очереди выбивают процессы, кто уронил систему, тот проиграл.

Теперь мне непонятно одно: я это где-то прочитал и забыл, или на самом деле подсознание с нуля сгенерировало?..
👍2🔥1🤣1