ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DroidVNC-NG 预置偏好(Preseed Preferences)完全指南:defaults.json 与 Managed App Restrictions 实战配置

DroidVNC-NG 预置偏好(Preseed Preferences)完全指南:defaults.json 与 Managed App Restrictions 实战配置 移动开发网络【免费下载链接】droidVNC-NGAndroid VNC remote desktop server for local networks项目地址https://gitcode.com/gh_mirrors/dr/droidVNC-NG点击查看免费下载DroidVNC-NG 是一款面向局域网远程控制的 Android VNC 服务端应用。本文围绕其「预置偏好」机制展开当偏好项尚未被用户手工修改时应用可以自动套用来自defaults.json文件或托管应用限制Managed App Restrictions的默认值从而实现批量部署、MDM 集中管理与无人值守启动。读完本文你将掌握两种预置方式的文件位置、全部可配置字段、chord 快捷键语法以及它们背后的源码实现与加载优先级。一、预置偏好机制概述DroidVNC-NG 的偏好读取遵循「用户设置优先、预置默认值兜底」的回退链应用内设置SharedPreferences中用户显式修改过的值若用户未修改则使用预置的默认值若未提供任何预置则回退到应用内置的出厂默认值。预置默认值的核心实现位于 Defaults.kt它是一个 KotlinSerializable数据类每个字段对应一条偏好项。项目提供两种预置渠道二者共享同一套键名JSON 文件方式在应用外部文件目录放置defaults.json适合单机手动部署托管应用限制方式由 Device Owner设备所有者应用通过 Android 的 Managed Configurations 下发适合 MDM / EMM 批量管理。在 Defaults.kt 的构造函数中可以看到两者的读取有明确优先级若设备存在非空的应用限制配置则完全采用应用限制值并提前 return否则才尝试读取defaults.json。也就是说两种方式同时存在时托管应用限制会覆盖 JSON 文件。二、方式一通过 defaults.json 文件预置1. 文件位置defaults.json必须放在应用的外部文件目录下external files directory/Android/data/net.christianbeier.droidvnc_ng/files/defaults.json其中external files directory因设备而异设备显示两个外部存储时通常是/storage/emulated/0设备只有一个外部存储时通常是/sdcard。放置好文件后应用Defaults构造会在启动时通过context.getExternalFilesDir(null)定位并解析它见 Defaults.kt。2. 完整配置示例文档给出的示例defaults.json可以整体替换所有默认值且不必提供全部字段——缺失的字段会自动回退到应用内置默认值{ port: 5901, portReverse: 5555, portRepeater: 5556, scaling: 0.7, viewOnly: false, showPointers: true, fileTransfer: true, password: supersecure, accessKey: evenmoresecure, startOnBoot: true, startOnBootDelay: 0, chordRecents: Control_LShift_LEscape, chordHome: Home, chordBack: Escape, chordPower: End, chordVolumeUp: Control_LAlt_LPage_Up, chordVolumeDown: Control_LAlt_LPage_Down, chordRotate: Control_LAlt_LDelete }3. 字段说明与内置默认值下表依据 Defaults.kt 的字段定义与app_restrictions.xml整理供配置时对照字段类型内置默认值说明interfaceNamestring自动选择绑定的网络接口名称仅在 JSON 渠道可设托管限制渠道未定义此项portinteger5900正向 VNC 监听端口portReverseinteger5500反向连接端口portRepeaterinteger5500Repeater 中继端口scalingfloat1.0 / 屏幕密度画面缩放系数默认按设备显示密度自动计算viewOnlyboolfalse仅查看模式禁用输入showPointersboolfalse是否显示客户端指针fileTransferbooltrue是否启用文件传输passwordstringVNC 访问密码accessKeystring随机生成的 32 位十六进制串应用访问密钥对请求 Activity 做鉴权startOnBootbooltrue开机是否自动启动服务startOnBootDelayinteger0开机自动启动的延迟秒数chordRecentsstringControl_LShift_LEscape「最近任务」快捷键组合chordHomestringHomeHome 键组合chordBackstringEscapeBack 键组合chordPowerstringEnd电源对话框组合chordVolumeUpstringControl_LAlt_LPage_Up音量加组合chordVolumeDownstringControl_LAlt_LPage_Down音量减组合chordRotatestringControl_LAlt_LDelete旋转快捷键仅特定硬件有效见下文4. 两个特殊字段的覆盖语义从 Defaults.kt 的实现可以看出JSON 解析后并非所有字段都无条件覆盖scaling仅当 JSON 中给出的值 0时才覆盖自动生成的缩放默认值0或负值会被忽略accessKey仅当 JSON 中给出非空字符串时才覆盖。因为应用首次运行时会向 SharedPreferences 写入一个随机生成的 access key键为defaults_access_key若 JSON 里写空字符串去覆盖会把鉴权密钥清空所以代码特意跳过空值interfaceName同理JSON 中为空时保持自动选择网络接口。三、chord 键盘快捷键语法详解chord*系列字段的值是 VNC 客户端可以按下以触发设备键盘快捷键动作的组合键chord。1. 语法规则一个 chord 由一个或多个按键用连接而成每个按键以其 X11 keysym 名称书写去掉XK_前缀大小写敏感修饰键Control_L/Control_R、Alt_L/Alt_R、Shift_L/Shift_R。左右侧可互换匹配且可任意顺序排列触发键任意X11 键名均可不限于应用内选择器提供的按键。解析逻辑位于 InputKeyShortcut.kt字符串按切分逐个 token 识别修饰键最后一个非修饰符 token 即触发键并通过 InputKeysyms.kt 的名称查找表解析为对应的 keysym 值keysym为 0 表示未分配。应用内选择器只提供 Home、End、Esc、Del、Ins、Backspace、PageUp、PageDown、方向键、Tab、Enter、F1–F12 等常用按键见 InputKeyShortcut.kt 的TriggerKey枚举但通过defaults.json或托管限制可以绑定任意keysym 名称只是该键在选择器中没有条目、仅显示其 XK 名称。例如Control_LAlt_LDelete表示「Ctrl Alt Delete」单独的Home表示不按修饰键、只按 Home 键。2. 空值与冲突行为空字符串或未知键名会关闭对应快捷键。未知触发键在 InputService.java 中会被记录为警告日志且该快捷键不生效若同一个 chord 被分配给两个不同的快捷键动作只有声明顺序靠前的那一个生效同时两者都会被 InputService.java 记录警告。应用内「键盘快捷键」配置界面InputKeyShortcutSetupActivity.kt会查询Manager.conflicts拒绝重复分配但 JSON / 托管限制渠道没有 UI 拦截因此日志是管理员唯一的反馈途径。3. 重要注意绑定的按键会被吞掉绑定到快捷键的按键会被消费掉不再传递到设备上的应用。因此应避免把需要正常输入的按键绑定为快捷键。这是文档明确强调的注意事项——快捷键在输入链路中优先拦截并执行设备动作如返回、Home、音量而不会把该按键作为普通输入送入前台应用。4. chordRotate 的硬件限制chordRotate仅在基于RK3288的、存在「横屏下竖屏显示」硬件怪癖portrait-in-landscape quirk的设备上生效其他硬件上该设置会被忽略。源码印证了这一行为InputService.java 的buildShortcuts()会先检查Utils.hasPortraitInLandscapeQuirk()在不具备该怪癖的设备上直接把 ROTATE 动作的 chord 置空并记日志因此其他设备上该快捷键始终处于关闭状态。四、方式二通过 Managed App Restrictions 预置如果应用运行在Device Owner设备所有者方案下则可以通过 Android 的托管应用限制managed app restrictions即 Managed Configurations下发同样的键值。Android 官方设备策略控制器DPC会把键值通过RestrictionsManager暴露给应用。1. 支持的键与类型声明预置支持的键、类型与默认值声明在 app_restrictions.xml 中与 JSON 渠道的字段一一对应其中注意port/portReverse/portRepeater/startOnBootDelay为integer类型viewOnly/showPointers/fileTransfer/startOnBoot为bool类型password/accessKey为string类型scaling比较特殊由于 Android restriction 不支持 float 类型scaling以string类型声明XML 中有注释说明应用侧在 Defaults.kt 中会将其解析为浮点数只有 0才生效解析失败NumberFormatException时记录Invalid scaling value in app restrictions警告并忽略interfaceName未出现在 restrictions 声明中故该渠道无法配置网络接口。全部chord*项均为string类型settings_chord_description字符串strings.xml提供了与应用内设置一致的语法说明。2. 更新时机注意应用限制的更新只在服务重启时才会被应用。托管限制经由RestrictionsManager.applicationRestrictions读取属于一次性拉取并不会实时监听变更。因此在下发新的限制值后需要重启 DroidVNC-NG 服务或整机重启才能生效。五、源码视角预置默认值的加载链路1. Defaults.kt统一入口与优先级Defaults(context)构造函数的执行顺序Defaults.kt可概括为生成 / 读取持久化的随机accessKey默认值存于 SharedPreferences 键defaults_access_key按屏幕密度计算默认scaling1.0 / density密度最小取 1读取RestrictionsManager.applicationRestrictions若非空则逐字段覆盖并直接返回否则定位files/defaults.json用kotlinx.serialization反序列化为Defaults对象逐字段覆盖scaling、accessKey遵守上述非空/非零保护规则。该对象被 MainService.java、MainActivity.java、InputService.java 等多个组件实例化作为PreferenceManager.getXxx(key, defaults.getXxx())的回退值。2. InputService快捷键绑定与运行时执行InputService.java 的buildShortcuts()会把每个动作的 chord 字符串优先取用户设置否则取Defaults中来自预置配置的默认 chord交给InputKeyShortcut.Manager.from()构建绑定表运行时 VNC 客户端按键到达 onKeyEvent() 时会按修饰键状态、触发键 keysym精确匹配并执行对应设备动作。chord 的解析与匹配逻辑被刻意设计为不依赖 Android 运行时可单元测试见 InputKeyShortcutTest.kt。3. OnBootReceiverstartOnBoot 与 startOnBootDelay 的实际应用开机自动启动由 OnBootReceiver.java 实现收到ACTION_BOOT_COMPLETED后先以Defaults作为回退读取startOnBoot为 true 时才继续随后将startOnBootDelay换算为毫秒1000 × delay大于 0 时通过AlarmManager.setAndAllowWhileIdle延迟启动前台服务否则立即startForegroundService。注意 Android 11API 30及以上要求 InputService无障碍服务已就绪否则会自动放弃开机自启并记录警告。这意味着预置startOnBoot: true时设备需预先完成无障碍服务授权。六、配置验证与排错建议放置defaults.json后重启应用或重启服务观察 Logcat 中Defaults标签的输出读取到文件时会打印Loading defaults from json file读取到应用限制时会打印Loading defaults from app restrictions可据此确认预置渠道是否命中快捷键语法错误、重复绑定会由InputService的buildShortcuts输出形如no usable trigger key in chord ...、chord ... is assigned to more than one action的警告TAG 为InputService按提示修正 JSON / 托管限制中的 chord 字符串即可若预期生效的预置值未出现优先检查文件路径是否正确、JSON 是否为合法 UTF-8 且字段名与上表完全一致大小写敏感、托管限制更新后是否已重启服务部署到多台设备时scaling、accessKey两个字段的「非零/非空才覆盖」语义意味着不想干预时可直接省略这两个键应用会自动使用按密度计算的缩放与随机生成的安全密钥。至此无论你是要在单台设备上通过defaults.json快速定型 VNC 服务参数还是借助 MDM 的 Managed App Restrictions 对成批设备做集中预配置都可以依据本指南的键名、默认值与源码行为完成可靠部署。赞分享移动开发网络【免费下载链接】droidVNC-NGAndroid VNC remote desktop server for local networks项目地址https://gitcode.com/gh_mirrors/dr/droidVNC-NG点击查看免费下载相关推荐baoyu-cover-image 偏好配置完全指南EXTEND.md Preferences Schema 深度解析baoyu cover image 偏好配置完全指南EXTEND.md Preferences Schema 深度解析 baoyu cover image 是AI 技能AI 插件QuickRecorder 屏幕录制免费开源的 macOS 录屏工具使用指南QuickRecorder 屏幕录制免费开源的 macOS 录屏工具使用指南 QuickRecorder 是基于 ScreenCapture Kit 的 ma桌面应用音视频屏幕录制UnitySteer为Unity游戏注入生命力的智能运动引擎UnitySteer为Unity游戏注入生命力的智能运动引擎 在游戏开发的复杂生态中赋予AI角色真实而自然的运动表现一直是开发者面临的核心挑战。UnityS开发工具上一篇如何用LizzieYzy做免费围棋AI分析新手完整复盘指南下一篇如何用 genshin-wish-export 完整导出原神祈愿记录快速上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表