Неофициальная приборная панель для Haval H9 с головным устройством на Android 9
и дополнительным экраном Display ID 2 размером 1920×720.
- Package name:
net.adminrunet.h9cluster - Разработчик:
admin.ru.net - Контакт: arkasha18@gmail.com
- Модель распространения: source-available
Проект не связан с Great Wall Motor, Haval или производителем головного устройства и не одобрен ими. Названия и товарные знаки принадлежат их правообладателям.
- независимые темы
Classic,SportиHorizon; - скорость, обороты, пробег, топливо и запас хода;
- температура охлаждающей жидкости и наружного воздуха;
- температура масла автоматической трансмиссии;
- угол рулевого колеса;
- давление в четырёх шинах;
- четыре отдельные скорости колёс;
- момент маховика, расход топлива и напряжение бортовой сети;
- выбор темы на основном экране;
- независимые настройки конкретной темы, если она предоставляет собственный редактор;
- автоматический запуск панели на
Display ID 2.
Основные автомобильные данные читаются через штатный Binder-сервис:
com.gwm.android.adapter.server.GwmAdapterService
Приложение использует только операции чтения, регистрацию слушателя и снятие регистрации. Команды управления автомобилем, запись параметров и активные диагностические запросы не выполняются.
Для высокочастотного чтения оборотов используется read-only подписка на
svc://fdbus_mcu_ipc. Необходимые ARM64-библиотеки из штатной системы
головного устройства находятся в app/src/main/jniLibs/arm64-v8a/ и
включаются в APK. Это сторонние бинарные компоненты; лицензия проекта на них
не распространяется. Подробности приведены в
THIRD_PARTY_NOTICES.md.
Если совместимые нативные библиотеки отсутствуют или не загружаются, приложение автоматически продолжает работу и получает RPM через Binder; тахометр при этом может обновляться реже.
Температура масла АКПП читается без CAN-команд и UDS-запросов из уже
обновляемого штатным ПО снимка /dev/shm/can_data_collect на TBOX. Приложение
подключается к TBOX только для выполнения команды чтения; firewall, файлы и
настройки TBOX не изменяются.
Пароль TBOX не хранится в репозитории. Перед production-сборкой передайте его как Gradle property либо переменную окружения:
H9_TBOX_PASSWORD='...' ./gradlew assembleReleaseДля GitHub Actions используйте Repository Secret H9_TBOX_PASSWORD. Во время
сборки пароль преобразуется в две случайно маскированные последовательности,
поэтому открытой строки в DEX нет. Без секрета APK собирается нормально, но
источник температуры АКПП остаётся отключённым.
Маскирование защищает только от простого поиска строки и не является криптографическим хранилищем: автономный APK технически содержит всё необходимое для восстановления секрета во время работы. Не используйте в публичных сборках пароль, применяемый для других систем.
Значение для интерфейса приходит в общем ClusterState:
transmissionTemperatureC— температура в градусах Цельсия;hasTransmissionTemperature()—false, пока первое значение не получено;transmissionTemperatureUpdatedAtMs— время последнего обновления поSystemClock.elapsedRealtime().
Карточка ATF выводится во всех зарегистрированных темах справа от защищённой
зоны штатного правого поворотника. Если значение не получено либо не
обновлялось более
15 секунд, интерфейс показывает — °C.
Цвет числа и рамки карточки помогает заметить рост температуры:
- до
99 °C— штатный белый цвет; 100–109 °C— жёлтый;110–119 °C— оранжевый;- от
120 °C— красный.
Для защиты от переключения цветов около границы используется гистерезис:
возврат из красного диапазона происходит ниже 115 °C, из оранжевого — ниже
107 °C, из жёлтого — ниже 97 °C. Это информационные пороги интерфейса, а
не замена штатному индикатору перегрева и требованиям руководства автомобиля.
Docker-образ содержит JDK 17, Android SDK 35 и Python-зависимости инструментов создания тем. Исходники, APK и ключи подписи в образ не копируются.
На компьютерах Apple Silicon также указывайте linux/amd64, поскольку Android
Build Tools внутри контейнера рассчитаны на эту архитектуру:
docker build --platform linux/amd64 -t h9-cluster-build .
docker run --rm --platform linux/amd64 \
-v "$PWD:/workspace" -w /workspace \
h9-cluster-buildПо умолчанию контейнер выполняет assembleDebug и lint. Готовый образ из
GitHub Container Registry можно использовать без локальной сборки:
docker pull --platform linux/amd64 \
ghcr.io/arkasha18/h9-cluster-build:android35-jdk17
docker run --rm --platform linux/amd64 \
-v "$PWD:/workspace" -w /workspace \
ghcr.io/arkasha18/h9-cluster-build:android35-jdk17Требуются:
- JDK 17;
- Android SDK Platform 35;
- Android SDK Build Tools 35;
- ARM64-устройство с Android 9 для проверки в автомобиле.
Debug APK собирается без ключей:
./gradlew assembleDebugРезультат:
app/build/outputs/apk/debug/app-debug.apk
Автономный Demo APK с автоматически меняющимися тестовыми значениями:
./gradlew assembleDemoРезультат:
app/build/outputs/apk/demo/app-demo.apk
Demo не подключается к GWM Adapter, FDBus, CAN или TBOX. Для проверки на одном экране эмулятора:
adb shell settings delete global overlay_display_devices
adb shell wm size 1920x720
adb shell wm density 240
./gradlew installDemo
adb shell am start -W \
-n net.adminrunet.h9cluster.demo/net.adminrunet.h9cluster.SettingsActivityКнопка сохранения откроет приборную панель на том же экране. Любой клик по панели или системная кнопка Back вернёт настройки. Чтобы вернуть стандартный размер эмулятора:
adb shell wm size reset
adb shell wm density resetДля двухэкранной проверки:
adb shell settings put global overlay_display_devices '1920x720/240'
adb shell am force-stop net.adminrunet.h9cluster.demo
adb shell am start -W \
-n net.adminrunet.h9cluster.demo/net.adminrunet.h9cluster.SettingsActivityПри наличии Display ID 2 приборная панель автоматически откроется на нём.
Даже если H9_TBOX_PASSWORD настроен локально, Demo variant принудительно
оставляет поля секрета пустыми. Проверка unit-контракта, APK и lint:
./gradlew testDemoUnitTest lintDemo assembleDemo
tools/verify_demo_apk_secrets.sh \
app/build/outputs/apk/demo/app-demo.apkДля release-сборки используйте собственный ключ. Секреты рекомендуется хранить
в пользовательском ~/.gradle/gradle.properties, который находится за
пределами репозитория:
H9_CLUSTER_STORE_FILE=/absolute/path/to/your-release-key.p12
H9_CLUSTER_STORE_TYPE=PKCS12
H9_CLUSTER_STORE_PASSWORD=your-password
H9_CLUSTER_KEY_ALIAS=your-key-alias
H9_CLUSTER_KEY_PASSWORD=your-passwordПосле этого:
./gradlew assembleReleaseФайлы ключей, локальные свойства, APK/AAB и каталоги сборки исключены через
.gitignore.
Порядок выпуска подписанной версии приведён в docs/RELEASING_RU.md.
GitHub Actions для каждого Pull Request:
- собирает зафиксированный Docker toolchain;
- проверяет генерацию Forum Kit и обработку графики темы;
- тестирует, проверяет lint и собирает Debug и Demo variants;
- проверяет отсутствие TBOX secret material в Demo APK;
- сохраняет Debug и Demo APK отдельными временными Actions artifacts;
- после попадания проверенного commit в
mainпубликует toolchain в GHCR.
Production-ключ не используется GitHub Actions и должен оставаться только на компьютере владельца.
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am start -W -n net.adminrunet.h9cluster/.SettingsActivity
adb shell am start --display 2 -W \
-n net.adminrunet.h9cluster/.PreviewActivityПроверка подключения к штатному Adapter и TBOX:
adb logcat -s GwmClusterDataSource FdbusRpmReader TransmissionTempДля успешного Binder- и TBOX-подключения в журнале появляются:
GWM adapter connected; live listener active
Connected to read-only TBOX temperature source
В репозиторий не входят:
- ключи подписи и пароли;
- собранные APK/AAB;
- дампы автомобиля и сетевые снимки;
- заводские APK, ODEX/VDEX и конфигурации;
- декомпилированный smali-код;
- TBOX-бинарники и диагностические инструменты;
- локальные исследовательские отчёты и исходные диагностические материалы.
Эти материалы не нужны для компиляции рабочего приложения. Соответствующие
локальные каталоги перечислены в .gitignore.
Каталог docs/ содержит:
- инструкцию подготовки JDK, Android SDK, Python и локального Codex;
- готовые промпты для трёх этапов разработки темы;
- нейтральный шаблон
1920×720, маски прозрачности и системных оверлеев; - актуальный автономный Demo-проект
H9_Cluster_Dashboard_Demo_Base_Source_v3.zipс тестовыми значениями; H9_Cluster_Codex_Forum_Kit_v3.zipдля передачи полного комплекта другому разработчику.
Каталог tools/ содержит воспроизводимые Python-инструменты:
build_forum_design_template.py— создаёт нейтральный комплект масок;edit_classic_background.py— формирует подложку и независимый overlay Classic с утверждённой геометрией.
Для запуска инструментов нужны Python 3, Pillow и NumPy:
python3 -m venv .venv
.venv/bin/python -m pip install Pillow numpyПодробный процесс описан в docs/FORUM_DESIGN_PROMPTS_RU.md.
- ошибки и предложения: Issues;
- вопросы, идеи и демонстрация тем: Discussions;
- правила участия: CONTRIBUTING.md;
- история версий: CHANGELOG.md;
- уязвимости: SECURITY.md.
Перед отправкой изменений ознакомьтесь с правилами сообщества. В Pull Request автоматически проверяются сборка и Android Lint.
Шрифты, Gradle Wrapper и нативные .so являются сторонними компонентами и не
переводятся под PolyForm. Полный перечень приведён в
THIRD_PARTY_NOTICES.md.
Код и оригинальные ресурсы проекта, права на которые принадлежат
admin.ru.net, доступны по
PolyForm Noncommercial License 1.0.0.
Некоммерческое использование, изменение и распространение разрешены бесплатно на условиях лицензии. Коммерческое использование требует отдельного письменного соглашения с правообладателем: arkasha18@gmail.com.
Это source-available, а не OSI Open Source проект. Сторонние компоненты остаются под собственными лицензиями.
Программное обеспечение предоставляется «как есть». Использование приложения в автомобиле выполняется на риск пользователя. Перед поездкой необходимо убедиться, что панель не мешает штатным предупреждениям и обязательным индикаторам автомобиля.