Skip to content

使用ai进行了一些优化 - #5

Open
Townrain wants to merge 26 commits into
wb-hwang:mainfrom
Townrain:main
Open

Townrain wants to merge 26 commits into
wb-hwang:mainfrom
Townrain:main

Conversation

@Townrain

Copy link
Copy Markdown

与原版对比总结
一、安全修复(4 项)
项目 原版问题 修复内容
API Key 日志泄露 Release 构建 OkHttp 日志记录完整 Authorization 头 仅 Debug 构建启用日志 + redactHeader 脱敏 API Key 明文存储 MMKV 明文存储 API Key 改用 EncryptedSharedPreferences 加密存储,自动迁移旧数据 证书固定 无 CertificatePinner 添加 OkHttp CertificatePinner 防止中间人攻击 CancellationException catch (e: Exception) 吞掉 CancellationException 11 处协程上下文添加 catch (e: CancellationException) { throw e } 二、架构优化(4 项)
项目 原版 修复后
Activity 语言配置 6 个 Activity 各自重复 attachBaseContext 抽取 BaseActivity 基类,统一继承 Composable 位置 FloatingWindowContent(128 行)定义在 Service 文件中 移至 ui/components/FloatingWindowContent.kt Gson 实例 每个 OpenAIClient 实例创建独立 Gson 移至 companion object 共享 协程作用域 serviceScope 和 lifecycleScope 混用 统一使用 lifecycleScope 三、网络增强(3 项)
项目 原版 修复后
网络预检 无,无网络时仍尝试 API 调用 isNetworkAvailable() 预检,无网络快速提示 重试机制 无 retryWithBackoff() 指数退避,最多重试 2 次
请求取消 Service 销毁时进行中请求不会取消 保存 Job 引用,onDestroy 时自动取消 四、国际化完善(4 项)
项目 原版 修复后
悬浮窗状态消息 8 个硬编码中文(如"正在截图...") 全部改为 getString(R.string.xxx),支持中英文 通知渠道名 硬编码 "AI答题助手服务" 改用字符串资源
剪贴板标签 硬编码 "AI答案" 改用 context.getString(R.string.clipboard_label) Constants.kt 包含硬编码中文常量 移除硬编码,改用资源引用
五、代码质量(5 项)
项目 原版 修复后
日志管理 6 处 e.printStackTrace() + 调试日志 统一 AppLog 工具,Release 静默 状态消息重复 "设置消息→delay→清除"模式重复 8+ 次 提取 showStatusMessage()/showErrorMessage()/showSuccessMessage() 空安全 savedCropRect!! 强转存在 NPE 风险 改用 ?.let { } ?: run { } 注释不一致 getAutoSubmit()/getAutoCopy() 注释与代码默认值相反 已核查一致(原报告描述有误) 未使用文件 res/layout/activity_main.xml 未被引用 删除
六、构建优化(3 项)
项目 原版 修复后
冗余依赖 text-recognition + text-recognition-chinese 双重依赖 移除 text-recognition(-10MB) 版本管理 依赖版本硬编码在 build.gradle.kts 统一迁移到 gradle/libs.versions.toml ProGuard -keep class androidx.compose.** { *; } 过于宽泛 移除,让 Compose 编译器插件自动生成规则 七、JSON 解析优化(核心功能改进)
项目 原版 修复后
批量答题 仅支持单题 支持多题返回,显示所有答案
解析策略 单一 Gson 解析 5 级降级策略:直接解析→提取修复→正则数组→正则对象→文本提取
中文标点处理 无 状态机方式只替换字符串外的中文标点,保留字符串内内容
系统提示词 "若无法推断则 answer 置空" "必须填写 answer,禁止留空"
格式支持 仅支持单对象 同时支持数组和单对象格式
八、测试补充(2 项)
项目 原版 修复后
单元测试 仅占位测试 2+2=4 OpenAIClientTest(10 个)+ AppConfigTest(8 个) 测试覆盖 ≈ 0% 覆盖 extractJsonPayload、isApiConfigValid 核心逻辑 九、其他改善(3 项)
项目 原版 修复后
OkHttp 连接池 无配置 ConnectionPool(5, 5, TimeUnit.MINUTES) retryOnConnectionFailure 未显式设置 显式启用 true
错误处理精确化 onDestroy 中 catch (e: Exception) 改为 catch (e: IllegalArgumentException) 文件变更统计
类型 数量 文件
新建 6 BaseActivity.kt, AppLog.kt, FloatingWindowContent.kt, OpenAIClientTest.kt, AppConfigTest.kt, PROJECT_ANALYSIS_REPORT.md 修改 15 OpenAIClient.kt, AppConfig.kt, FloatingWindowService.kt, Constants.kt, MainActivity.kt, SettingsActivity.kt, ModelSettingsActivity.kt, AboutActivity.kt, ConfirmTextActivity.kt, ImageCropActivity.kt, ScreenCaptureManager.kt, TextRecognitionManager.kt, ClipboardUtil.kt, ImageCropUtil.kt, build.gradle.kts, libs.versions.toml, proguard-rules.pro, strings.xml(×2), README.md(×2) 删除 1 res/layout/activity_main.xml

Townrain and others added 26 commits May 15, 2026 18:50
与原版对比总结
一、安全修复(4 项)
项目	原版问题	修复内容
API Key 日志泄露	Release 构建 OkHttp 日志记录完整 Authorization 头	仅 Debug 构建启用日志 + redactHeader 脱敏
API Key 明文存储	MMKV 明文存储 API Key	改用 EncryptedSharedPreferences 加密存储,自动迁移旧数据
证书固定	无 CertificatePinner	添加 OkHttp CertificatePinner 防止中间人攻击
CancellationException	catch (e: Exception) 吞掉 CancellationException	11 处协程上下文添加 catch (e: CancellationException) { throw e }
二、架构优化(4 项)
项目	原版	修复后
Activity 语言配置	6 个 Activity 各自重复 attachBaseContext	抽取 BaseActivity 基类,统一继承
Composable 位置	FloatingWindowContent(128 行)定义在 Service 文件中	移至 ui/components/FloatingWindowContent.kt
Gson 实例	每个 OpenAIClient 实例创建独立 Gson	移至 companion object 共享
协程作用域	serviceScope 和 lifecycleScope 混用	统一使用 lifecycleScope
三、网络增强(3 项)
项目	原版	修复后
网络预检	无,无网络时仍尝试 API 调用	isNetworkAvailable() 预检,无网络快速提示
重试机制	无	retryWithBackoff() 指数退避,最多重试 2 次
请求取消	Service 销毁时进行中请求不会取消	保存 Job 引用,onDestroy 时自动取消
四、国际化完善(4 项)
项目	原版	修复后
悬浮窗状态消息	8 个硬编码中文(如"正在截图...")	全部改为 getString(R.string.xxx),支持中英文
通知渠道名	硬编码 "AI答题助手服务"	改用字符串资源
剪贴板标签	硬编码 "AI答案"	改用 context.getString(R.string.clipboard_label)
Constants.kt	包含硬编码中文常量	移除硬编码,改用资源引用
五、代码质量(5 项)
项目	原版	修复后
日志管理	6 处 e.printStackTrace() + 调试日志	统一 AppLog 工具,Release 静默
状态消息重复	"设置消息→delay→清除"模式重复 8+ 次	提取 showStatusMessage()/showErrorMessage()/showSuccessMessage()
空安全	savedCropRect!! 强转存在 NPE 风险	改用 ?.let { } ?: run { }
注释不一致	getAutoSubmit()/getAutoCopy() 注释与代码默认值相反	已核查一致(原报告描述有误)
未使用文件	res/layout/activity_main.xml 未被引用	删除
六、构建优化(3 项)
项目	原版	修复后
冗余依赖	text-recognition + text-recognition-chinese 双重依赖	移除 text-recognition(-10MB)
版本管理	依赖版本硬编码在 build.gradle.kts	统一迁移到 gradle/libs.versions.toml
ProGuard	-keep class androidx.compose.** { *; } 过于宽泛	移除,让 Compose 编译器插件自动生成规则
七、JSON 解析优化(核心功能改进)
项目	原版	修复后
批量答题	仅支持单题	支持多题返回,显示所有答案
解析策略	单一 Gson 解析	5 级降级策略:直接解析→提取修复→正则数组→正则对象→文本提取
中文标点处理	无	状态机方式只替换字符串外的中文标点,保留字符串内内容
系统提示词	"若无法推断则 answer 置空"	"必须填写 answer,禁止留空"
格式支持	仅支持单对象	同时支持数组和单对象格式
八、测试补充(2 项)
项目	原版	修复后
单元测试	仅占位测试 2+2=4	OpenAIClientTest(10 个)+ AppConfigTest(8 个)
测试覆盖	≈ 0%	覆盖 extractJsonPayload、isApiConfigValid 核心逻辑
九、其他改善(3 项)
项目	原版	修复后
OkHttp 连接池	无配置	ConnectionPool(5, 5, TimeUnit.MINUTES)
retryOnConnectionFailure	未显式设置	显式启用 true
错误处理精确化	onDestroy 中 catch (e: Exception)	改为 catch (e: IllegalArgumentException)
文件变更统计
类型	数量	文件
新建	6	BaseActivity.kt, AppLog.kt, FloatingWindowContent.kt, OpenAIClientTest.kt, AppConfigTest.kt, PROJECT_ANALYSIS_REPORT.md
修改	15	OpenAIClient.kt, AppConfig.kt, FloatingWindowService.kt, Constants.kt, MainActivity.kt, SettingsActivity.kt, ModelSettingsActivity.kt, AboutActivity.kt, ConfirmTextActivity.kt, ImageCropActivity.kt, ScreenCaptureManager.kt, TextRecognitionManager.kt, ClipboardUtil.kt, ImageCropUtil.kt, build.gradle.kts, libs.versions.toml, proguard-rules.pro, strings.xml(×2), README.md(×2)
删除	1	res/layout/activity_main.xml
#### v0.6 (联网搜索增强 & 悬浮窗优化)

* **Tavily 联网搜索**
  - 集成 Tavily 搜索引擎 API,单题模式下自动搜索相关资料并注入 LLM 上下文
  - 搜索结果作为答题参考,提升冷门题目的准确率
  - 设置页可配置 Tavily API Key(加密存储)和启用开关
  - 支持测试 Tavily 连接
  - 智能提取搜索关键词:从 OCR 文本中提取题干和选项,过滤 UI 噪音
  - 多题模式自动跳过搜索,避免无效 API 调用
* **悬浮窗交互重构**
  - 悬浮按钮支持自由拖拽移动,可吸附到屏幕左/右边缘
  - 点击截图,拖拽移动,一个按钮两个功能
  - 卡片从按钮正下方出现,不遮挡按钮位置
  - 按钮位置不受卡片显隐影响,窗口宽度变化时按钮稳定
  - 修复悬浮窗遮挡下层应用触摸的问题(WRAP_CONTENT 窗口)
* **悬浮窗外观自定义**
  - 设置页新增悬浮窗外观配置:按钮大小(32~80dp)、按钮透明度、卡片透明度
  - 实时生效,无需重启 Service
* **Bug 修复**
  - 修复第二次截图输出第一次答案的问题(等待 Compose 重组完成 + 清除 ImageReader 旧帧)
*
#### v0.7 (视觉模型集成 & 多题优化)

* **视觉模型 (VLM) 集成**
  - 支持使用视觉模型直接分析截图,替代 OCR 识别
  - 抽象 VisionProvider 接口,支持 OpenAI 兼容格式
  - 通过工厂模式创建 Provider,便于扩展
  - 设置页可配置视觉模型 API 地址、Key、模型名称
  - 支持测试视觉模型连接
  - VLM 失败时自动降级为 OCR 模式
* **多题模式优化**
  - VLM 自动分离多题截图中的每道题目
  - 每道题单独进行联网搜索,提升搜索精准度
  - 逐题调用 LLM 答题,确保每道题都能获得答案
  - 状态显示优化:`搜索中 (1/8)`、`获取答案中 (2/8)` 等
* **图片压缩优化**
  - 修复图片尺寸超过 API 限制的问题(2048x2048)
  - 同时限制宽度和高度,等比缩放
* **超时优化**
  - 视觉模型 API 超时时间从 60 秒增加到 120 秒
* **架构优化**
  - 新增 `api/vision/` 模块,独立管理视觉模型相关代码
  - VisionFilterResult 支持分离题目列表
  - AppConfig 扩展视觉模型配置项
#### v0.8 (UI 高级感优化)
* **毛玻璃材质**
  - 所有卡片采用微渐变 + 半透明 + 渐变边框,告别纯色平面
  - 悬浮窗答案卡片支持毛玻璃效果,透明度可由设置页调节
  - 暗色模式下卡片有"浮起来"的玻璃质感
* **渐变发光按钮**
  - 底部答题按钮从纯色升级为横向渐变(primary → secondary)
  - 带发光阴影效果,视觉焦点更突出
* **实时主题切换**
  - 设置页新增外观模式:跟随系统 / 浅色模式 / 深色模式
  - 切换即时生效,无需重启应用
  - 状态栏样式自动同步
* **色彩体系重构**
  - 浅色模式:明蓝主色 `#4A6CF7`,暖米背景 `#F6F5F3`
  - 暗色模式:深蓝主色 `#2563EB`,深灰蓝背景 `#0F1118`
  - 通知栏颜色与主题统一
* **圆角与间距**
  - 统一圆角 16-24dp,更大呼吸感
  - 按钮圆角 18dp,胶囊形 FilterChip
* **状态栏适配**
  - 使用 `enableEdgeToEdge` 适配状态栏
  - 浅色模式深色图标,暗色模式浅色图标
* **清理冗余功能**
  - 移除"题目内容范围"输入框及相关代码
* **并行答题模式**
  - 新增并发答题设置卡片,支持启用/禁用并行模式
  - 可配置最大并发数(1-10),默认3
  - 高并发数(>5)显示警告提示,避免API限流
  - 分别为LLM、VLM、联网搜索提供测试按钮,可测试各API延迟
  - 多题模式下自动并行处理,显著提升答题速度
* **进度显示优化**
  - 并行模式显示 `答题中 (3/8)` 格式,实时更新进度
  - 部分题目失败时显示警告,只返回成功的结果
* **测试功能增强**
  - 测试按钮显示实际延迟时间(毫秒)
  - 支持测试LLM、VLM、Tavily三个API的并发性能
  - 测试结果独立显示,互不干扰
* **GitHub Actions 自动打包**
  - 新增 CI/CD 工作流,支持自动构建 Debug APK
  - 推送 `v*` 标签时自动发布 Release
* **Bug修复 (10个)**
  - 修复VLM失败后OCR降级失效的问题
  - 修复VLM配置修改后不生效的问题
  - 修复截图时Bitmap内存泄漏
  - 修复按返回键意外停止悬浮窗服务
  - 修复并发请求竞态条件
  - 修复裁剪Activity临时文件残留
  - 修复语言切换后通知栏残留幽灵通知
  - 修复HTTP错误响应未正确关闭连接
  - 修复VLM连接测试格式错误
  - 修复JSON解析正则贪婪匹配问题
* **性能优化**
  - 全局共享Gson实例,减少内存分配
  - HTTP响应使用use{}自动关闭,防止连接泄漏
  - LLM Temperature参数可配置化
  - Compose重组延迟提取为常量
* **代码质量**
  - 添加Mutex互斥锁防止并发请求
  - 统一错误处理和资源释放
  - 完善ProGuard规则
* **版本号** v1.0.0
* **正则过滤开关**
  - 联网搜索设置页新增"多题正则过滤"开关(默认开启)
  - 关闭后,OCR 检测到多题时仍会进行联网搜索
* **思考模式开关**
  - LLM 模型设置页新增"启用思考模式"开关(默认关闭)
  - 开启后向 API 发送 `reasoning_effort: "medium"` 参数
  - 适用于 o1、DeepSeek-R1 等推理模型
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants