Repository navigation
DarQ v3.1 Release Notes
本次更新是一次面向新系统的大版本:全面适配 Android 17,彻底根治 root 模式在新系统上的静默失效,并新增「扩展深色应用」与可开关的调试日志。
🚀 Android 17 全面适配
-
彻底根治 Android 17 上 root 模式完全失效的问题:
- 根因定位:
android.app.IProcessObserver这个 @hide AIDL 在 Android 15 新增了onProcessStarted,而且是插在onForegroundActivitiesChanged前面(不是追加在末尾)。DarQ 以compileSdkVersion 32编译,object : IProcessObserver.Stub()只实现了旧版的 3 个方法,但运行时继承的是设备 boot classpath 上那版声明了 4 个抽象方法的 Stub —— 匿名类天生不完整; - 为什么 15 / 16 能凑合用:
enableProcessObserverBroadcastOnProcessStarted这个 aconfig flag 当时默认关闭,系统压根不会调用onProcessStarted,缺失的那个方法永远碰不到; - 为什么 17 直接崩:该 flag 打开后系统真的开始回调,缺失的方法抛出
AbstractMethodError。由于抛的是Error而不是RuntimeException,Binder 那层的catch (RemoteException | RuntimeException)接不住 —— root 服务静默死亡,不弹窗、无日志、getprop也看不出任何异常; - 修复:补齐 AIDL 的
onProcessStarted声明并改为oneway对齐 AOSP,DarqService的 observer 补上对应空实现。
- 根因定位:
-
属性写入加入回读校验:
debug.hwui.force_dark的写入原先异常被全部吞掉,写失败完全无感知。现在每次写入后回读校验,失败会明确记录。
🌙 全新「扩展深色应用」(Android 17+)
-
对接 Android 17 新增的 force invert color 机制:
- 与旧版 Force Dark 不同,扩展深色无视应用自身的 opt-out,对浅色应用直接反色,覆盖更彻底;
- 主页「强制深色应用」下方新增独立卡片,Android 17 以下自动隐藏;
- 复用同一个应用选择器,标题与列表按用途自动区分,两个列表互相独立。
-
实现思路与强制深色完全一致:
- 扩展深色的全局开关和
debug.hwui.force_dark一样是全局的,DarQ 复用已有的前台应用监听,在每次前台切换时重算一次「当前应用该不该用扩展深色」,因此只对勾选的应用生效; - 勾选的应用同时写入系统的「强制启用」名单,让不符合系统启发式的应用也能被反色;
- 额外优势:
ViewRootImpl注册了 force-invert 状态监听,开关变化会立刻触发深色重算,不需要等待窗口重建,切换比强制深色更跟手。
- 扩展深色的全局开关和
-
已知限制:图片与视频内容无法被反色,应用内的商品图、封面图等仍会保持原色,这是反色机制的固有限制。
📋 可开关的调试日志
-
开发者选项 → 服务信息下方新增「调试日志」开关:
- 打开后输出 root 服务的关键节点:绑定模式(Root / Shizuku)、
Shell.rootAccess()结果、属性写入回读、前台应用切换、白名单同步; - 关闭时每次调用只有一次布尔判断,几乎零开销;
- 抓取方式:
adb logcat -s DarQService:v DarQServiceProvider:v AndroidRuntime:E。
- 打开后输出 root 服务的关键节点:绑定模式(Root / Shizuku)、
-
新增的日志设施
DarqLog让这类「静默失效」问题不再需要改代码重新编译才能定位。
🎨 细节修复
- 开关样式统一:开发者选项新增的开关改用模块自带的 MD3 实现,清除主题 Tint 干扰,与主页总开关样式完全一致。
- 服务连接层日志补全:输出绑定模式与实际失败原因,便于排查 Root / Shizuku 模式切换问题。
- 前台检测链路日志:前台回调、包名反查、observer 注册失败都会留下记录,不再静默。
📦 下载与安装说明
- 推荐直接下载下方 Assets 中的安装包进行更新。
- 本版本全面兼容 Android 10 ~ Android 17,支持 LSPosed 模块模式、Shizuku 免 Root 模式及传统 Root 模式运行。
- 「扩展深色应用」需要 Android 17(API 37)及以上,低版本系统会自动隐藏该卡片。