Пишем приложение на Mi Band 7 с сервисной частью

Вступление

Недавно я купил себе Mi band 7, по началу хотел купить 6-ую версию, пока не узнал, что на 7-ой обновилась операционная система и теперь она поддерживает установку приложений. Да, официально они об этом не заявили, но умельцы уже сделали множество приложений. Они ставят их как циферблаты, и это вполне обычные приложения. Но все эти приложения работают только локально на самом MiBand 7, не имея возможности взаимодействовать ни с телефоном, ни с интернетом. Я углубился в байткод приложения и документацию по Zepp OS чтобы найти способ создавать приложения, взаимодействующие с интернетом, в этой статье я опишу свой путь. В итоге у меня получилось сделать запрос в интернет с часов и даже запустить мост для отладки приложений. 

7f4926a7529963bdea8fb62dbc16dcc8.png

Эта статья написана чисто в ознакомительных целях. Я не призываю никого к переработке кода для добавления новых функций с целью использования и распространения переделанного ПО.

Почему приложения официально не поддерживаются?

Мне интересен этот вопрос, но к сожалению я не знаю причин. Похоже что Xiaomi Band 7 сделала для xiaomi компания zepp. И им было проще не поддерживать другую операционную систему, а использовать уже имеющиеся наработки для часов zepp. Поэтому на этих часах стоит система ZeppOS. Вероятно Xiaomi решила не платить за все фишки системы и поэтому функционал часов программно ограничен.

Начало

Для начала, чтобы разобраться как работает система, я попробовал поставить пару приложений от MelianMiko. Ставил самым простым способом, через приложение для установки циферблатов, подробности можете почитать на 4PDA. Я немного поразбирался в структуре приложений и вот что я понял: приложение это bin файл, который является простым zip архивом с, как минимум, несколькими файлами: app.json (Manifest), app.js (Код инициализации и деинициализации приложения при запуске), index.js (Код страницы), icon.png. Далее я пошел на сайт официальной документации по ZeppOS, там описано как включать режим отладки через приложение ZeppApp. Но попробовав подключить часы через это приложения я получил ошибку:

9379361db3d18ccd1e6481abbf172d1a.png

Я решил на этом не останавливаться, скачал это приложение версии 7.0.1, декомпилировал через apktool в байткод и через jadx в java код:

apktool d com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk
jadx com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk -d com.huami.watch.hmwatchmanager_7.0.1-play_100802_JADX

Далее для исследование кода проще использовать результат jadx, но скомпилировать обратно получится только результат apktool, поэтому изменения придется делать в байткоде.

Для начала я убедился что это приложение поддерживает ну или когда-то поддерживало MiBand. Для этого я нашел несколько упоминаний MiBand 7 (Официально он называется Xiaomi Smart Band 7). Его кодовое название в приложении «MILI_L66».

4e32e85b6f3cb6d3375088125bd3f8e3.png

Далее я решил обмануть приложение (пока без его изменения) и попробовал подключить свои часы к приложению, притворившись другими часами. Для этого я отсканировал qr для сетапа на своих часах я получил такую ссылку:

https://hlth.io.mi.com/download?redir=7800&mac=CE82E4D50231&pnpNumber=103&pnpVersion=258

d23c468c18d86d822c9c6bb5ee304258.jpeg

В ней указан мак адресс, pnpNumber, pnpVersion — это похоже какие-то идентификаторы устройства. Я пробовал их заменить, но это не помогло, поэтому я решил посмотреть, какие qr коды у других устройств zepp при сетапе. В гугл я нашел видео в привязкой Amazfit Band 7, отсканировал код, получил такую ссылку:

https://api-watch.huami.com/forwarding/watchUS?macAddress=C9EC6C59A185&pnpNumber=117&pnpVersion=259

Эта ссылка ссылается совсем на другое доменное имя. Далее я решил попробовать просто подставить в этот URL macAddress из своего qr кода и сделать з этого qr код. И это помогло, мои часы подключились, приложение засетапило их как Amazfit Band 7. 

842de16c5e7e2ac5641064f9ede592cc.png

Я обнаружил что весь функционал из приложения Xiaomi здесь есть и я могу полноценно настраивать свои часы. Но после сетапа приложения понимало что у меня не Amazfit, а Mi Band и не давало возможности ставить никакие приложения и циферблаты для Amazfit. Поэтому дальше я решил переделать приложение.

Перекомпиляция приложения

Чтобы приложение дало мне возможность ставить mini apps на часы, я решил заставить его думать что у меня не Xiaomi Smart Band 7, а Amazfit Band 7. Для этого таже как и для Mi Band 7, нашел кодовое название для Amazfit Band 7 — «MiliBari»:

b4a0b451a17d120803cbfdc8d0e2e9aa.png

Далее нашел все упоминания MILI_L66 и MILI_BARI. Самым интересным показался класс HMDeviceSource:

59fa6a36c5d60163d9503a940ab4430e.png

Вы можете в нем увидеть коды соответствующие разным типам устройств — их идентификаторы.

Далее необходимо переключиться на байткод, который нам выдал apktools. 

Здесь я тоже нашел байткод класса HMDeviceSource$a.smali и изменил в нем 3 строки как на скриншотах:

a63fe07361aa312af14a27f004b409de.png292bf5fe3a55157ad1747848d5323a6c.png

Теперь можно собрать его обратно, подписать, установить. Оригинальное приложение придется сначала удалить, так как подпись теперь не оригинальная.

apktool b com.huami.watch.hmwatchmanager_7.0.1-play_100802 --use-aapt2
apksigner sign --ks-key-alias alias_name --ks-pass pass:123456 --ks release-key.keystore com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk
adb install com.huami.watch.hmwatchmanager_7.0.1-play_100802/dist/com.huami.watch.hmwatchmanager_7.0.1-play_100802.apk

Теперь можно снова логиниться в приложении и подключать Mi Band как я описывал выше, изменяя qr код.

Работа перекомпилированного приложения

После этих манипуляций приложение начало отображать функционал как для amazfit band 7! Ура! На изображении сначала будет Mi Band 7, но если поменять циферблат, то оно сменится на amazfit band 7. У меня циферблат от Аmazfit встал как родной. 

14a4be6dd281d711023ea41919435762.png

Также теперь появилась кнопка App Store, там можно поставить приложения из магазина для amazfit band 7. Не все заработали идеално, но большинство. Их почему-то в магазине пока только 5. Видимо пока весьма маленькое сообщество разработчиков)

4b94fc2c66a4de0be091d0ad5749184f.png

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

Создание проекта

На 4PDA я нашел проекты пользователя MelianMiko. Он сделал и симулятор mi band, и множество приложений, и утилиту для сборки проектов — zmake. Можете ими воспользоваться для создания простых приложений, но как я понял zmake создает проекты только без сервисной части, выполняемой на телефоне. Еще в отличии от официального сборщика он, не сжимает код в bin файл, а оставляет в формате js (Тут может ошибаюсь, поправьте если не так). Симулятор к сожалению не работает под Linux и MacOS, поэтому я им не пользовался, вместо него использовал официальный симулятор Amazfit band 7. 

Для создания проекта я использовал официальную утилиту zeus для ZeppOS. Новый проект можно создать командой zeus create project-name. Необходимо выбрать »1.0 API», апи второй версии MiBand 7 не поддерживает. 

Далее опишу содержимое собранного приложения, это не очень нужная информация, просто для общего ознакомления.

Когда проект будет готов, его можно собрать командой zeus build. В папке dist появится архив в формате zab, его можно открыть как простой zip архив. В нем манифест с описанием приложения и архив common.zpk, который тоже открывается как zip архив. В нем уже можно увидите основные составляющие приложения:

c153f48716b8fddfc69ff38ae01c4eea.png

  • Файл device.zip содержит код выполняемый на часах, ему можно сменить формат на bin и поставить даже через приложение для установки циферблатов.

  • Файл app-side.zip сожержит код выполняемый на стороне телефона.

  • Вроде еще может быть файл, описывающий настройку mini app с помощью приложения телефона.

Отличный набор примеров приложений, в том числе с сервисной частью, есть на github. Я, как основу, взял пример «fetch-api».

Настройка моста

Тут нет ничего особенного, все из документации ZeppOS. Необходимо залогиниться в один аккаунт в приложении на телефоне и в приложении симуляторе. Включить режим разработчика в приложении и потом выбрать часы в списке устройств, открыть внизу настройки разработчика и в выпадающем списка нажать кнопку включения моста. После подключиться к мосту надо и в приложении симуляторе, нажав кнопку Bridge. 

ce535c60d0d284804006818d3919a174.png

Теперь можно пользоваться консольной утилитой zeus для отладки проекта:

zeus bridge
сonnect 
install

Запрос в интернет по кнопке на часах.

Как я уже писал выше, я взял за основу пример проекта с официального гитхаб аккаунта zepp os, «fetch-api». Изменив код в app-side, я сделал запрос с телефона на домен ident.me, чтобы получить мой текущий внешний ip, ради примера. 

8fa7ef97ca9f6850c55e9483c784923c.png

Вывод

В итоге я получил небольшое приложение на часах, которое может когда угодно выводить мне мой внешний ip. Это конечно не та цель, к которой я стремился.  Моей целью было продемонстрировать, то что на самом деле у часов Mi Band 7 есть скрытый, программно ограниченный функционал. Эти часы могут не просто менять циферблаты, но и работать с приложениями. И даже отправлять данные через телефон в интернет и получать ответ. Такие приложения можно использовать например для управления умным домом) Вероятно в будущих версиях часов об этом официально заявят, но пока такого нет. Даже на Band 7 Pro официално не стоит zepp os.

7de3c57c12c3cdfaf31deeb1ebfedfd4.jpg

P.S. Это была моя первая статья. Надеюсь вам было интересно, пишите комментарии, буду рад любой критике!

© Habrahabr.ru