Как установить циферблат (watch face) .apks на часы Suunto 7
Преамбула
Предыстория такая. Переподключил google wear часы к другому телефону, соответственно все программы на часах сбросились. Что по идее неправильно, так как гугл аккаунт тот же самый. Не об этом речь, а о том, что я потерял свой любимый вотч фейс.
Решение банально установить заново не увенчалось успехом, потому что санкции. Не качает мой оплаченный циферблат из google play. Циферблат я нашел, но только файл .apks. Начал разбираться, что это за формат и как его туда установить. Выяснилось что это сборный файл из нескольких установочных файлов под разные платформы. На телефон его можно установить с помощью программы для телефона SAI (split apks installer). Так же познакомился с программой установки для телефона easy fire tools, но она умеет устанавливать только .apk. С помощью SAI я сделал раздельный дамп из apks. Попробовал установить их через easy fire tools и мне сказало, что нужно чтобы был установлен базовый apk файл. Не получилось, но я не отчаивался. Далее выяснил что apks это по факту zip архив, в котором несколько .apk файлов, которые и надо установить в часы. Может быть есть более легкий способ, но мой тоже рабочий.
Подготовка
Для решения задачи установки понадобится сам .apks файл и утилита adb из пакета platform-tools.
Нужно распаковать platform-tools и перейти в эту папку. В ней нужно создать папку с файлами установки watch. Распаковать туда архив .apks
у меня там было 3 файла
base.apk
split_config.xhdpi.apk
split_config.ru.apk
Включить developer mode на часах
Для этого нужно в меню Настройки -> Система -> О системе нажать 7 раз пункт "Номер сборки". Пока не появится надпись, что вы стали разработчиком. В меню разработчика нужно включить, отладку adb и отладку по Wifi. Компьютер и часы должны быть в одной сети или между сетями должна быть маршрутизация. Когда часы подключатся к wifi мы увидим там ip адрес. Для меня это был 192.168.0.5.
Подключение к часам и установка
Переходим в папку platform-tools и выполняем команду
$ ./adb connect 192.168.0.5:5555
connected to 192.168.0.5:5555
Для установки множества файлов нужно использовать команду
$ ./adb install-multiple watch/base.apk watch/split_config.xhdpi.apk watch/split_config.ru.apk
Success
Поздравляю, всё успешно установилось.
Для одного .apk это было бы так
$ ./adb install file.apk
Выключить developer mode на часах
$ ./adb shell settings put global development_settings_enabled 0
$ ./adb shell settings put global adb_enabled 0
$ ./adb connect 192.168.0.5:5555
failed to connect to '192.168.0.5:5555': Connection refused
Первая команда скрывает пункт меню "Для разработчика". Вторая - отключает отладку adb. После этих комманд телефон по ip адресу не подключается. Но эти режимы можно в дальнейшем включить снова через меню developer mode.
Дополнительно
В процессе поиска решений пытался установить .apks с помощью bundletool и в итоге ничего не получилось. Видимо не с моей программой или я не до конца разобрался.
$ java -jar bundletool-all-1.14.1.jar install-apks --apks="watch_face.apks" --adb=../platform-tools/adb
[BT:1.14.1] Error: null
Тем не менее bundletool работает у меня получилось скачать device info. Классный опыт.
$ java -jar bundletool-all-1.14.1.jar get-device-spec --adb=../platform-tools/adb --output=device.json
{
"supportedAbis": ["armeabi-v7a", "armeabi"],
"supportedLocales": ["ru-RU"],
"deviceFeatures": ["reqGlEsVersion\u003d0x30000", "android.hardware.bluetooth", "android.hardware.bluetooth_le", "android.hardware.faketouch", "android.hardware.location", "android.hardware.location.gps", "android.hardware.microphone", "android.hardware.nfc.any", "android.hardware.nfc.hce", "android.hardware.nfc.hcef", "android.hardware.ram.low", "android.hardware.screen.portrait", "android.hardware.sensor.accelerometer", "android.hardware.sensor.barometer", "android.hardware.sensor.compass", "android.hardware.sensor.gyroscope", "android.hardware.sensor.heartrate", "android.hardware.sensor.light", "android.hardware.sensor.stepcounter", "android.hardware.sensor.stepdetector", "android.hardware.touchscreen", "android.hardware.touchscreen.multitouch", "android.hardware.type.watch", "android.hardware.usb.accessory", "android.hardware.wifi", "android.software.connectionservice", "android.software.cts", "android.software.file_based_encryption", "android.software.home_screen", "android.software.input_methods", "android.software.live_wallpaper", "android.software.securely_removes_users", "android.software.slices_disabled", "android.software.verified_boot", "android.software.voice_recognizers", "com.google.clockwork.hardware.sensor.llob", "com.google.clockwork.hardware.sidekick_graphics", "com.google.clockwork.hardware.traditional_watch_mode", "com.google.clockwork.unified", "com.soy.android.watch", "com.soy.android.watch.wear", "com.soy.android.watch.wear.low_power_sports_display", "com.soy.android.watch.wear.low_power_sports_engine", "com.soy.android.watch.wear.multisport", "com.soy.android.watch.wear.multisport.salmon", "com.soy.android.watch.wear.multisport.v1_2_0", "com.soy.android.watch.wear.multisport.v1_3_0", "com.soy.android.watch.wear.multisport.v2_0_0", "com.soy.android.watch.wear.multisport.v2_1_0", "com.soy.android.watch.wear.multisport.v2_2_0"],
"glExtensions": ["GL_OES_EGL_image", "GL_OES_EGL_image_external", "GL_OES_EGL_sync", "GL_OES_vertex_half_float", "GL_OES_framebuffer_object", "GL_OES_rgb8_rgba8", "GL_OES_compressed_ETC1_RGB8_texture", "GL_AMD_compressed_ATC_texture", "GL_OES_texture_npot", "GL_EXT_texture_filter_anisotropic", "GL_EXT_texture_format_BGRA8888", "GL_EXT_read_format_bgra", "GL_OES_texture_3D", "GL_EXT_color_buffer_float", "GL_EXT_color_buffer_half_float", "GL_QCOM_alpha_test", "GL_OES_depth24", "GL_OES_packed_depth_stencil", "GL_OES_depth_texture", "GL_OES_depth_texture_cube_map", "GL_EXT_sRGB", "GL_OES_texture_half_float", "GL_OES_texture_half_float_linear", "GL_EXT_texture_type_2_10_10_10_REV", "GL_EXT_texture_sRGB_decode", "GL_OES_element_index_uint", "GL_QCOM_user_clip_planes", "GL_EXT_EGL_image_external_wrap_modes", "GL_EXT_multisampled_render_to_texture", "GL_EXT_robustness", "GL_OES_get_program_binary", "GL_EXT_debug_label", "GL_QCOM_tiled_rendering", "GL_OES_standard_derivatives", "GL_OES_vertex_array_object", "GL_EXT_YUV_target", "GL_EXT_sRGB_write_control", "GL_EXT_discard_framebuffer", "GL_OES_surfaceless_context", "GL_KHR_no_error", "GL_EXT_debug_marker", "GL_OES_EGL_image_external_essl3", "GL_QCOM_shader_framebuffer_fetch_rate", "GL_EXT_EGL_image_storage"],
"screenDensity": 320,
"sdkVersion": 28,
"sdkRuntime": {
}
}
Обзор на часы Suunto 7
Наверно поздно, но лучше поздно, чем никогда. Suunto 7 - это однозначно крутые часы, с очень небольшим по современным меркам временем работы от батареи. И это основной минус этих часов. Время работы часов ограничено, потому что используется WearOS 2. Скажем так, я в них немного разочаровался, когда поехал на трейл на 16 часов. И через 4-5 часов они разрядились. Я выкладываю трек и получаю сообщение от человека, у которого аккаунт в Strava, а куда вы делись с четверти маршрута... А другие часы например Huawei Runner они спокойно без лишних действий выдерживают 16 часов и пишут трек. Но сравнивать их с suunto нет смысла. Это другой класс, в них нет wifi, они не показывают карту (suunto 7 выглядят как часы Джеймся Бонда) и нет других возможностей, относящихся к wear os, которые может быть и не нужны, но они есть в suunto 7. Время работы можно раскачать, убрать суперточное позиционирование, выключить всё, но все равно неделя недостижима. Если бы китайцы сделали к ним ёмкую батарейку на ремешок например, это были бы часы бестселлер. Сослагательного наклонения нет, но можно сказать, что Suunto 7 это спорный прототип, но с возможностью прикоснуться к новому, получить новый юзер экспириенс. Потому что в них лучшие материалы, выверенные спортивные интерфейсы от лучших разработчика спортивных часов, спортивного инвентаря, diving компьютеров, отображение карты, и остальные смарт функции.... но при этом нет тупого компаса, визуального логгера трека, но это можно найти, установить или запрограммировать. Это инженерный компромисс, так решили, что черт с ней, с батареей, покажем что мы можем, компания suunto сейчас показывает, то что будет завтра. Спортсмену покупать не советую Suunto 7, только если вы программист. Suunto 7 - это вещь для программиста.