Godot-аддон: определение VPN и наличия интернета на Android, плюс открытие
системного экрана настроек VPN. Тонкая обвязка над движко-независимым ядром
android-vpn-detector-core,
подключённым git submodule'ом. Ставится в addons/vpn_detector/.
Студийный аддон Abyss Moth. Лицензия MIT.
- Ядро (
android-vpn-detector-core, submodule вandroid_plugin/core/) - чистый Android-классVpnDetectorCoreбез зависимостей от движка. То же ядро можно тянуть в Unity через C#-мост. - Обёртка (
VpnDetectorPlugin extends GodotPlugin) - регистрирует синглтонVpnDetector, делегирует в ядро и ретранслирует состояние сигналом в GDScript. Ядро компилируется прямо в AAR обёртки черезsourceSet, поэтому итоговый.aarсамодостаточен.
Нужны submodule'ы:
git clone --recurse-submodules https://github.com/AbyssMoth/godot-vpn-detector
# или после обычного clone:
git submodule update --init --recursiveПри установке аддона как готового (копированием папки или через менеджер) submodule с
исходниками ядра не нужен - хватает предсобранного bin/vpn-detector-release.aar.
- Скопировать
addons/vpn_detector/в проект (или поставить через менеджер аддонов). - Включить плагин
VPN DetectorвProject > Project Settings > Plugins. - На Android-экспорте подключится
bin/vpn-detector-release.aar.
Низкоуровнево - синглтон VpnDetector (только на Android). Удобнее - переносимый
VpnDetectorService (vpn_detector_service.gd), который вне Android работает no-op:
var vpn := VpnDetectorService.new()
add_child(vpn) # можно и автолоадом
vpn.vpn_status_changed.connect(_on_changed)
vpn.start_monitoring()
if vpn.is_vpn_active():
vpn.open_vpn_settings()
func _on_changed(is_vpn: bool, has_internet: bool) -> void:
passВне Android: is_available() -> false, is_vpn_active() -> false,
has_internet_connection() -> true, open_vpn_settings() -> false.
vpn_status_changed(is_vpn_active: bool, has_internet: bool)
Шлётся только при реальном изменении состояния (rising/falling edge).
Готовый .aar уже лежит в bin/vpn-detector-release.aar (самодостаточный: содержит и
обёртку, и ядро). Пересобирать нужно только после правок исходников. Три способа:
- Двойной клик (одна кнопка):
- macOS:
build_aar.command - Windows:
build_aar.bat - Linux/macOS из терминала:
./build_aar.sh
- macOS:
- Авто при экспорте: если рядом есть исходники ядра (submodule
android_plugin/core) и они новее.aar, плагин пересоберёт его сам во время Android-экспорта. При установке через zip-менеджер (submodule отсутствует) авто-пересборка не срабатывает и берётся готовый.aar- это безопасно. - Вручную:
cd android_plugin gradle clean :plugin:assembleRelease --no-daemon cp plugin/build/outputs/aar/plugin-release.aar ../bin/vpn-detector-release.aar
Требования: Android SDK (ANDROID_HOME), JDK 17+ (рекомендуется 17-22; собирается и на
новых, но на старых Gradle бывают несовместимости), AGP 8.13.0, compileSdk 36, minSdk 23.
Скрипты сами подтянут submodule ядра, если он не инициализирован. Готовый .aar в репо -
это фолбэк, чтобы аддон работал сразу без сборки.
Отключить чужой VPN программно нельзя - Android этого не разрешает. open_vpn_settings
лишь открывает игроку системный экран, где он выключит VPN вручную. Это ограничение
платформы, а не недоработка.