- 无障碍服务监听7MA出行小程序,匹配关键词自动开始/结束计时 - 事件驱动截图+ML Kit离线中文OCR兜底,解决WebView无障碍树不稳定 - 常驻计时通知(15/18/30分钟提醒)与结束用车按钮 - 浅色主题主界面:权限状态、具体实现、安全/免责/法律声明 - 电池白名单+自启动引导+onUnbind自动重绑守护 - 无网络权限,完全离线运行
8.0 KiB
8.0 KiB
无障碍助手(Accessibility Helper)最小开发环境
日期:2026-09-01 目标:用不依赖 Android Studio 的最简命令行环境开发一个申请无障碍权限的辅助小工具。 全部工具链均位于本工作区(
c:\Users\Tan\Desktop\7maHelper),自包含、可复现。
一、环境总览
| 组件 | 版本 | 是否必需 | 说明 |
|---|---|---|---|
| JDK | 17.0.20.1 LTS | ✅ | 编译 Java/Kotlin;AGP 8.x 要求 JDK 17+ |
| Android SDK cmdline-tools | latest (11076708) | ✅ | 提供 sdkmanager / avdmanager |
| platform-tools (adb) | 37.0.1 | ✅ | 设备连接、APK 安装 |
| Android 平台 | android-35 | ✅ | compileSdk 35 需要 |
| build-tools | 35.0.0 / 34.0.0 | ✅ | 34 为 AGP 8.7 默认,自动补装 |
| Gradle | 8.10.2 | ✅ | 构建工具(含 Wrapper) |
| Android Gradle Plugin | 8.7.2 | ✅ | 自动下载 |
| Android Studio | — | ❌ | 本方案不使用 |
二、已安装组件及路径
1. JDK 17 (Microsoft OpenJDK)
- 安装方式:
winget install Microsoft.OpenJDK.17 - 路径:
C:\Program Files\Microsoft\jdk-17.0.20.101-hotspot - 验证:
java -version→openjdk version "17.0.20.1" 2026-08-18 LTS
2. Android SDK(位于工作区)
- 根目录:
c:\Users\Tan\Desktop\7maHelper\android-sdk - cmdline-tools:
android-sdk\cmdline-tools\latest(含bin\sdkmanager.bat) - platform-tools:
android-sdk\platform-tools\adb.exe - platforms:
android-sdk\platforms\android-35 - build-tools:
android-sdk\build-tools\35.0.0、android-sdk\build-tools\34.0.0 - licenses:
android-sdk\licenses(已接受全部许可) - 下载来源:
https://dl.google.com/android/repository/commandlinetools-win-11076708_latest.zip
3. Gradle 8.10.2(位于工作区)
- 发行版:
c:\Users\Tan\Desktop\7maHelper\tools\gradle-8.10.2 - 可执行:
tools\gradle-8.10.2\bin\gradle.bat - 下载来源:
https://services.gradle.org/distributions/gradle-8.10.2-bin.zip - Wrapper:项目内有
gradlew.bat(首次使用会从其下载源拉取发行版到%USERPROFILE%\.gradle\wrapper\dists)
4. 已配置的持久化环境变量(setx)
JAVA_HOME = C:\Program Files\Microsoft\jdk-17.0.20.101-hotspot
ANDROID_HOME = C:\Users\Tan\Desktop\7maHelper\android-sdk
ANDROID_SDK_ROOT = C:\Users\Tan\Desktop\7maHelper\android-sdk
setx只对新打开的终端生效;当前会话需手动加载。- 免重启方式:在项目根目录运行
.\env.ps1(推荐)或.\env.cmd。
三、项目结构
7maHelper\
├── SETUP.md ← 本文件(环境记录)
├── env.ps1 / env.cmd ← 会话环境变量脚本
├── build.cmd ← 一键构建脚本
├── settings.gradle
├── build.gradle ← 声明 AGP 版本 8.7.2
├── gradle.properties ← jvmargs / androidX
├── local.properties ← sdk.dir 指向工作区 SDK
├── gradlew / gradlew.bat / gradle\wrapper\ ← Gradle Wrapper
├── android-sdk\ ← Android SDK(自包含)
├── tools\ ← Gradle 发行版 & 下载缓存
└── app\
├── build.gradle ← 应用模块(无第三方依赖)
└── src\main\
├── AndroidManifest.xml ← 声明 MainActivity 与无障碍服务
├── java\com\example\accessibilityhelper\
│ ├── MainActivity.java
│ └── MyAccessibilityService.java
└── res\
├── layout\activity_main.xml
├── values\strings.xml / styles.xml
└── xml\accessibility_service_config.xml
四、构建与产物
- 构建命令(推荐):
.\build.cmd- 注:脚本已改为先
cd /d "%BASE%"再执行gradle assembleDebug,避免-p "<路径>"因路径结尾反斜杠导致引号被吞、Gradle 把assembleDebug误并入项目目录的问题。
- 注:脚本已改为先
- 等同命令:
$env:JAVA_HOME = "C:\Program Files\Microsoft\jdk-17.0.20.101-hotspot" $env:ANDROID_HOME = "c:\Users\Tan\Desktop\7maHelper\android-sdk" c:\Users\Tan\Desktop\7maHelper\tools\gradle-8.10.2\bin\gradle.bat assembleDebug - 产物 APK:
app\build\outputs\apk\debug\app-debug.apk(约 10.5 KB)
五、安装到设备 / 调试
ADB 已在 android-sdk\platform-tools\adb.exe(或系统已有的 37.0.1):
adb install -r app\build\outputs\apk\debug\app-debug.apk
adb shell am start -n com.example.accessibilityhelper/.MainActivity
应用内点击按钮会跳转到系统「无障碍设置」,开启 MyAccessibilityService 后即生效。
六、功能说明(当前示例)
MainActivity:入口,点击按钮打开系统无障碍设置。MyAccessibilityService:继承AccessibilityService,在onAccessibilityEvent中可读取窗口内容、模拟点击等辅助操作(示例中为占位)。- 服务配置
res/xml/accessibility_service_config.xml:监听窗口状态/内容变化。
七、扩展建议(进阶)
- 若需 AndroidX/Compose,可在
app/build.gradle添加依赖并保留android.useAndroidX=true。 - 建议将
android-sdk\与tools\加入.gitignore,避免提交到版本库。 - 卸载/清理:删除本目录即可(不含系统级安装的 JDK,JDK 卸载需用 winget 或控制面板)。
八、真机测试记录(2026-09-01)
设备:V2403A(Vivo),Android 16(API 36,getprop ro.build.version.sdk = 16)
连接:adb devices → 10AE742Z7C00148 device ✅
测试流程与结果
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1. 安装 APK | adb install -r app\build\outputs\apk\debug\app-debug.apk |
✅ Success |
| 2. 启动应用 | adb shell am start -n com.example.accessibilityhelper/.MainActivity |
✅ 主界面显示(标题「ASIST - 验证助手」+「打开无障碍设置」按钮) |
| 3. 无障碍设置 | 应用出现在系统「无障碍设置」的已下载应用列表 | ✅ 服务注册成功 |
| 4. 启用服务 | adb shell settings put secure enabled_accessibility_services "com.example.accessibilityhelper/.MyAccessibilityService" |
✅ Enabled services / Bound services 均包含本服务 |
| 5. 事件日志 | adb logcat -d -s A11yHelper |
⚠️ 见下方说明 |
关键说明:关于事件日志为空 —— 其实是日志级别被过滤
- 最初通过 adb
settings put启用服务后,dumpsys accessibility显示服务已绑定且无崩溃,但logcat看不到A11yHelper日志。 - 真正的根因:该设备默认日志级别为
log.tag = I(INFO),会屏蔽Log.d(DEBUG 级)。服务其实一直在正常接收事件,只是日志被隐藏了(logcat 缓冲里完全没有D级条目,getprop log.tag显示[I])。 - 解决办法(无需重编译):为指定标签单独开启 DEBUG 级:
之后
adb shell setprop log.tag.A11yHelper Dadb logcat -d -s A11yHelper即可看到事件日志。 - 你也可以在代码里把
Log.d改成Log.i(INFO 级,默认就能看到)来规避此问题。 - 已在真机验证到的事件:
type=32(TYPE_WINDOW_STATE_CHANGED)、type=2048(TYPE_WINDOW_CONTENT_CHANGED),来源包括com.android.settings、com.bbk.launcher2等。 - 注意:Vivo ROM 建议在系统「无障碍设置」里手动打开开关(
settings put只是进入名单,未必真正分派)。
真机验证步骤(已跑通)
- 打开应用 → 点「打开无障碍设置」;在系统无障碍设置中找到「ASIST - 验证助手」→ 打开开关并确认。
adb shell setprop log.tag.A11yHelper D(仅影响当前会话,重启失效)。- 切换任意 App/页面,
adb logcat -d -s A11yHelper即看到事件日志。
日志查看速查
- 查看设备默认日志级别:
adb shell getprop log.tag - 临时开启 DEBUG:
adb shell setprop log.tag.A11yHelper D