feat: 4ma 用车计时助手 v1.0

- 无障碍服务监听7MA出行小程序,匹配关键词自动开始/结束计时
- 事件驱动截图+ML Kit离线中文OCR兜底,解决WebView无障碍树不稳定
- 常驻计时通知(15/18/30分钟提醒)与结束用车按钮
- 浅色主题主界面:权限状态、具体实现、安全/免责/法律声明
- 电池白名单+自启动引导+onUnbind自动重绑守护
- 无网络权限,完全离线运行
This commit is contained in:
kirl committed 2026-09-01 16:19:16 +08:00
commit 2cf3cbad56
34 files changed
+2158

No files matched your search

+160
View File
@@ -0,0 +1,160 @@
# 无障碍助手(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 D
```
之后 `adb 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` 只是进入名单,未必真正分派)。
### 真机验证步骤(已跑通)
1. 打开应用 → 点「打开无障碍设置」;在系统无障碍设置中找到「ASIST - 验证助手」→ 打开开关并确认。
2. `adb shell setprop log.tag.A11yHelper D`(仅影响当前会话,重启失效)。
3. 切换任意 App/页面,`adb logcat -d -s A11yHelper` 即看到事件日志。
### 日志查看速查
- 查看设备默认日志级别:`adb shell getprop log.tag`
- 临时开启 DEBUG:`adb shell setprop log.tag.A11yHelper D`