Архив автора: admin

История одного recovery. На примере МТС Smart Race2 4G.


Не так давно я рассказывал вам о первом операторском смарфтоне с Android 7.0 (Nougat) на борту — МТС Smart Race2 4G, до полноценного обзора нового устройства руки по не дошли, но он обязательно появится на страницах этого ресурса в ближайшее время. Сегодня же я бы хотел поговорить о «кастомизации», а именно особенностях сборки кастомного recovery (TWRP) под этот аппарат. Пост ориентирован скорее не на конечных пользователей, которые используют возможности TWRP в повседневной жизни, а на разработчиков. Честно говоря, начиная собирать TWRP (естественно из исходников) для данного аппарата я и не предполагал, что придется столкнуться с какими-либо сложностями, т.к. по большому счету платформа Mediatek на базе которой построен гаджет, также как и чипсет MT6737M хорошо изучены и никаких потенциальных проблем со сборкой TWRP для подобных устройств никогда не возникало. Однако в случае с МТС Smart Race2 4G, именно из-за Android 7.0, пришлось столкнуться с определенными сложностями и этот пост — небольшое «руководство-размышление» об их решении.

Сразу скажу, что т.к. аппарат построен на базе Nougat, то собирать TWPR для него обязательно на базе исходников из ветки 7.1 OmniROM (можно конечно собрать android_bootable_recovery и в составе CyanogenMod / LineageOS), но опять же, «платформа» 7.1 обязательна. Почему? Если опустить аргумент об идеологической правильности подобного подхода, скажу, что на базе Marshmallow TWRP также прекрасно соберется, но при попытке запуска под его управлением любых стоковых бинарников, например, vold, logcat и т.п. вы неизбежно получите ошибку cannot locate symbol «__write_chk», т.к. все стоковые бинарники используются экспортируемую функцию __write_chk из libc, которой в Marshmallow просто нет. Таким образом собирая TWRP на исходниках от 6.0 вы автоматически собираете libc без __write_chk, что приведет к неработоспособности части бинарников собранных под Nougat внутри получившегося TWRP. Поэтому если вы часто собираете TWRP для различных устройств и еще не успели склонировать репозитарий того же OmniROM 7.1 — сейчас самое время сделать это, т.к. по всей видимости устройств с Nougat на Mediatek будет появляться все больше и вам рано или поздно придется это сделать.

Других особенностей, касающихся именно процесса сборки TWRP — вообщем-то нет, все штатно, также как и в случае с 6.0. Собранный у меня кастомный recovery отлично запустился на аппарате, но вот как раз тут и начались «приключения». Как известно, раздел userdata в Android N является шифрованным, т.к. объявлен в fstab’е как forceencrypt с хранением ключей шифрования в metadata. Вот как раз это и послужило началом всей истории. Загрузившись в только что собранный TWRP я обнаружил что он запрашивает пароль для дешифровки userdata и не монтирует его. При этом пароль в устройстве, т.е. ни PIN-код для разблокировки, либо загрузки Android, ни графический ключ не был явно задан.

Т.е. фактически TWRP по каким-то причинам не смог расшифровать раздел с помощью default_password. Включение отладочных средств TARGET_USES_LOGD и TWRP_INCLUDE_LOGCAT в BoardConfig.mk при сборке также не помогло установить причину проблемы. Вывод logcat и dmesg в этом плане был малоинформативен.

Конечно в данной ситуации можно было поступить проще (подобное решение можно увидеть в многочисленных сборках TWRP, в котором разработчикам было лень разбираться с шифрованием), например, просто разобрав boot и изменив forceencrypt на encryptable с последующим форматированием раздела userdata и потерей всех данных. Но это ведь не наш путь, т.к. в моем понимании у пользователя устанавливающего TWRP на аппарате уже есть какие-то данные и терять их из-за того что TWRP не может справиться с расшифровкой раздела, как минимум не хотелось бы. Другими словами, TWRP должен монтировать существующий на устройстве раздел userdata, все другие варианты (отключение шифрования и т.п.) являются «полумерами», к тому же еще и снижающими безопасность устройства.

Тогда я вспомнил, что начиная с определенной версии TWPR в нем появилась возможность использования стоковых бинарников vold с помощью включения TW_CRYPTO_USE_SYSTEM_VOLD в сборку, информация об этом есть в этом коммите — crypto: Use system’s vold for decryption. Бегло изучив все что там говорится, а также проанализировав содержимое исходников в /bootable/recovery/crypto/vold_decrypt/ я включил этот флаг в BoardConfig.mk и пересобрал recovery. Т.е. теперь уже TWRP использовал бинарник vold находящийся в system … Однако дешифрование раздела и его монтирование все равно не происходило, т.к. при сборке vold в стоковой прошивке разработчиками была включена проверка boot_mode. Что она из себя представляет?

Для лучшего понимания приведу следующий исходник:


int get_boot_mode(void)
{
int fd;
ssize_t s;
char boot_mode[4] = {'0'};
char boot_mode_sys_path[] = "/sys/class/BOOT/BOOT/boot/boot_mode";

fd = open(boot_mode_sys_path, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
if (fd < 0)
{
SLOGE("fail to open %s: %s", boot_mode_sys_path, strerror(errno));
return 0;
}

s = read(fd, boot_mode, sizeof(boot_mode) - 1);
close(fd);

if(s <= 0)
{
SLOGE("could not read boot mode sys file: %s", strerror(errno));
return 0;
}

boot_mode[s] = '';
return atoi(boot_mode);
}

Здесь get_boot_mode возвращает текущий режим загрузки устройства, который она читает из /sys/class/BOOT/BOOT/boot/boot_mode . Так вот стоковый vold вызывает некий аналог этой get_boot_mode и если устройство загружено в режиме отличном от system, т.е. в recovery mode или в любом другом доступном режиме, то монтирование / дешифрование userdata невозможны в принципе. В логах вы увидите нечто вроде <5>fs_mgr: %s: bootmode(%d) is NOT normal mode, disable ‘default encrytion’, flag=(0x%x -> 0x%x)». Скачав и установив бесплатную demo версию IDA v6.95.160810 мы можем увидеть эту проверку самостоятельно:

Где в дальнейшем используются результаты этой проверки и как именно — разбираться досконально я не стал, однако, факт отключения default encryption в vold при загрузке в режиме recovery, естественно, нас не устраивал. Из этой сложившейся ситуации есть несколько выходов:

  • Непосредственный патч vold для обхода этой проверки.
  • Написание собственной библиотеки с размещением ее в LD_PRELOAD, которая перехватывала бы попытки обращения в цепочке open(«/sys/class/BOOT/BOOT/boot/boot_mode») -> __read_chk -> close от любых приложений и всегда возвращала бы нужное значение (т.е. 0 = normal_mode).
  • Сборка vold из исходников Android N для MT6737M от Mediatek с корректировкой всех проверок в исходниках.
Любая из этих реализаций должна привести к успеху, поэтому какой именно воспользоваться — не имеет большого значения. Здесь главное не забыть, что собранный из исходников или модифицированный vold должен корректно загружаться из init.recovery.vold_decrypt.rc, например так:

service sys_vold /path_to_your_vold/vold
--blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0
--fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
socket vold stream 0660 root mount
socket cryptd stream 0660 root mount
setenv PATH /system/bin
setenv LD_LIBRARY_PATH /system/lib64:/system/lib
disabled
oneshot
Однако, даже решив эту проблему — мы не получим полноценного решения по дешифрованию userdata в TWRP, т.к. платформа использует еще и teei_daemon для поддержки шифрования. Изучить как он запускается и работает можно посмотрев внутрь init.microtrust.rc из boot’а. И наконец последний шаг на пути к успеху, это обеспечение корректного запуска и работы этого демона при дешифровании, «красивым» и правильным шагом здесь, на мой взгляд, является помещение его инициализации в соответствующий init.recovery.vold_decrypt.$(item).rc (разобраться с этим подробнее вам поможет /bootable/recovery/crypto/vold_decrypt/Android.mk).

В качестве результата проделанной работы я получил незаменимый опыт (что главное), а также полноценной работающий TWRP 3.1.1-0:

Как видно из фото — раздел userdata успешно расшифрован и примонтирован (Data succefully decrypted, new block device: ‘/dev/block/dm-0’) created). Mission accomplished 😉

p.s. Во-избежание наболевшего вопроса «а где можно скачать готовую сборку TWRP» — скажу сразу что дата public релиза пока не определена. Однако все необходимые для сборки моменты уже рассмотрены в этой статье и любой желающий, ориентируясь на мои наработки может пройти тем же путем. 



Источник: decker.su

Тест: Выберите свою метлу и узнайте, какая вы ведьма!

Тест: Выберите свою метлу и узнайте, какая вы ведьма!Какая же ведьма без метлы? Ни на шабаш слетать, ни в доме убраться! Но мы поможем вам исправить положение! Внимательно посмотрите на картинку и выберите из 10-ти метел ту, которая вам больше всего приглянулась. Читать

Мониторинг GPU (и не только) с отправкой статистики в Telegram.

В один прекрасный день, отчасти познакомившись с различными статьями в интернете, например вот этой — Raspberry и Telegram: предпосылки создания умного дома и этой — Отправка состояния сервера через Telegram, а также благодаря просьбам нескольких знакомых, занимающихся майнингом на видеокартах, я задумался о реализации возможности отправки статистики состояния GPU (теоретически, это не обязательно именно статистика с GPU, а статистика чего угодно) в Telegram, в рамках периодического мониторинга. На тот момент, когда я заинтересовался этой проблемой общая задача стояла так, есть некий ПК с 6-ю видеокартами на борту. Необходимо периодически в какой-то удобной форме отправлять / отображать с него статистику по температурам и скорости вращения вентиляторов каждого из GPU в процентах. Конечно всегда можно пойти и другим путем, например, настроив на этом ПК тот же Open Hardware Monitor. В нем помимо всего есть также встроенный web-сервер со статистикой (т.е. ни Apache, ни другой web-сервер для отображения статистики через web поднимать не нужно, достаточно настроить Remote Web Server в Open Hardware Monitor), отображение информации при обращении к которому выглядит примерно так: Читать

Зачем нужна разработка программного обеспечения и информационных систем

Зачем нужна разработка программного обеспечения и информационных систем

Зачем нужна разработка программного
обеспечения и информационных систем
================================================================================
ps1014454 on 10/09/2015 07:57:00

В наше время фактически каждому
предприятию или компании требуется
автоматизация многих операций, внедрение
современных информационных систем. Это
значительно упрощает ведение дел
организации, позволяет более продуктивно
разрешать разные задания. Согласитесь, куда
проще иметь дело с продуктом, созданным
целиком с учетом специфических
особенностей вашего дела, нежели пробовать
подстроиться под уже готовые общие
варианты. В этой публикации поговорим
подробнее о том, как выполняется и для чего
необходима разработка программного
обеспечения для предприятия.
Сначала следует решить, для чего конкретно
вашей компании необходимо ПО, какие моменты
оно станет разрешать. Например, требуется
система для проверки и составления отчетов
по какому-то оборудованию, электронные
архивы, договоры, журналы,
sms-информирование. Затем можно обратиться
за помощью к фирме-разработчику и поставить
перед ней четкую задачу.
Далее профессионалы рассмотрят
особенности вашего производства, проведут
моделирование рабочих процессом, посмотрят
функциональные и технические требования,
указанные вами к задаче. После разработки
программного обеспечения, происходит
внедрение его в работу вашей организации,
при этом разработчик предоставляет всю
нужную документацию, осуществляет
тестирование, а помимо этого обучение
сотрудников.
Обратите внимание, разработка
высокоэффективного продукта требует
крайне тесного взаимодействия между
сторонами.
Если вам нужна разработка мобильных
приложений, программного обеспечения для
вашего бизнеса, рекомендуем обратиться в
компанию «Электронные технологии». Кроме
того названная фирма произведет создание
сайта и иные услуги.

Авантюра — вязание из готового комплекта пряжи

Привет всем, мои хорошие!
«Мои хорррррошие!» — как пишет в своем инстаграм Сергей Безруков))) и мне это очень нрррравится! 🙂

Хочу немножко рассказать или точнее записать вязальные процессы.

Я наверное уже писала, что у нас с сестрой тандем — я вяжу а она шьет. Интересно, что когда мы были маленькие, наш папа говорил — дети мои, выбирайте такую профессию, чтобы всегда дополнять друг друга, и тогда все в жизни вам будет нипочем, и будете держаться вместе, и делать одно дело. И подразумевал под этими словами, что типа я буду программистом а сестра будет разбираться в железяках))) Но, в общем, его слова оказались пророческими, — и мы, в каком-то смысле, действительно образовали тандем, нераздельный и всегда творчески наполненный.
А тут в магазине «Трискеле» стали комплектовать лоты из пряжи и ткани, которые очень хорошо сочетаются. Вот здесь можно посмотреть, в разных ценах и конфигурациях.
Долго выбирая, мы остановились на двух комплектах:

Здесь плотный хлопок и 6 мотков разных цветов пряжи Alabama Katia
Здесь хлопок 3 мотка Katia Mississippi и по моточку синего и голубого Cable
и еще дизайнерский хлопок-батист (вуаль)

Вот мы решили что голубой комплект будет мне, а красно-бело-бежевый — ей. Отправив ей ткани, я принялась за первый набор.

Так как мотков всего 6, а на изделие надо 8, то стало ясно, что пряжи «в притык», а хотелось решить задачу полную, использовать весь комплект. Начала я с визуального распределения полос и образца, конечно:

Реглан сверху вниз, вязала до тех пор пока не закончился белый:

Серым закончила низ, остатки поделила наполовину (на рукава) — для этого перемотала мотки в клубки и отмотала от клубков такие же клубки.

Пуговицы очень странным образом подобрались в цвет, они висели на витрине простой забегаловки у нас на рынке одни-единственные, а все вы знаете, как трудно подобрать красный, чтобы был именно тот самый красный с малиново-коралловой ноткой, и это были именно те самые пуговки того самого цвета, короче мои-мои! Судьба!
И вот — тадаааа!

Кофточка готова! В пакетике остатки, ну буквально по нескольку метров, на две новых полоски бы не хватило. Я очень довольна!
И вот моя сестричка уже гуляет в обновке! И совсем скоро у нее день рождения, к чему я так торопилась! Поздравляю тебя, моя хорошая! Сестра это большое богатство)))))
Жду теперь, когда она сошьет что-то в комплект, уверена, это будет что-то очень красивое, и будет носиться вместе! А в моих петельках — моя любовь!
Вот фоточки она мне прислала, сразу как только получила посылку:

Второй лот на очереди! 🙂 Есть несколько идей 😉 но об этом — позже.
Всем желаю хороших удачных проектов, и мира в семье!

Автор: desdemona
Дата публикации: 2017-05-25T02:03:00.000-07:00

Правильное питание. Как грамотно составить меню на неделю

Как начать завтракать так, чтобы энергии хватало на весь день (2)

Здравствуйте друзья!

Хочу вас пригласить на БЕСПЛАТНЫЙ 3-Х ДНЕВНЫЙ ТРЕНИНГ, который проводит моя очень хорошая знакомая Валентина Крошечкинаэксперт по правильному питанию!

Это мероприятия будет проходить 7, 9, 11 июня в 18:05 МСК в прямом эфире!

ПРИНЯТЬ УЧАСТИЕ>>>

Программа тренинга:

День 1

Тема: «Что это такое – Правильное питание?»

1.Вы узнаете, что такое Правильное питание и зачем оно нам нужно. 2.Узнаете, к чему приводит отклонение питания от Правильного. 3.Вы получите Рекомендации эксперта по организации Правильного питания в домашних условиях.

День 2

Тема: «Правильное питание. С чего начать?»

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

День 3

Тема: «Как составить Правильное меню на неделю?»

1.Что нужно знать, чтобы составить ежедневное меню? 2.Что такое белки, жиры, углеводы и в каких продуктах они содержатся? 3.Составление меню на 1 день или на 3 дня вперёд. 4.Поход в супермаркет и на рынок за продуктами. 5.Вы получите 30 рецептов Правильных завтраков, обедов и ужинов.

ПРИНЯТЬ УЧАСТИЕ>>>

PS ВНИМАНИЕ! Все участники получат записи всех занятий тренинга совершенно бесплатно!

Здоровья Вам,

Анастасия и Валентина


travaglinidesign