更新记录

1.0.0(2026-10-11) 下载此版本

djiz-power-safe

工业设备硬断电保护插件(uni-app x / uni-app · UTS · 仅 Android)

解决什么问题

工业平板、自助终端、触摸一体机等设备以直接拔电方式关机(非系统正常关机)。若在 App 安装/升级后约几分钟内断电,会触发:

  • 安装时 PackageManager 把 APK 内的 SO 解压到 /data/app/.../lib/arm64/
  • 解压后的数据先停留在 Linux 内核 page cache(内存),尚未写入物理磁盘
  • 此时断电 → page cache 丢失 → 磁盘上的 SO 字节损坏
  • SO 的 ELF header 完好仍可被 dlopen 加载,但 JNI_OnLoad / RegisterNatives 函数体损坏 → JNI 方法未注册
  • App 启动即 java.lang.UnsatisfiedLinkError: No implementation found for ... 循环崩溃,每 3 秒一次,无法自愈

这是 DCloud 社区持续多年的同类问题(均为工业/一体机设备,官方未能复现):

  • https://ask.dcloud.net.cn/question/162252 (清数据后立即断电 → 白屏,必现)
  • https://github.com/dcloudio/uni-app/issues/5073 (没电强制关机 → 卡启动页闪退)
  • https://bbs.itying.com/topic/69458252a899160047f62a00 (硬断电 → 白屏/闪退)

方案原理

App 每次启动(onLaunch)时执行一次文件系统 sync 命令,强制内核把全部脏页(含解压到 /data 的 SO)刷入物理磁盘,把断电危险窗口期从约 几分钟压缩到秒级。

正常关机(长按电源 → 关机流程)内核会自动 sync,不受此问题影响;只有硬断电(拔电/电池耗尽/无电池设备)才需要本插件。

用法

App.uvue 的 onLaunch 中(建议放在崩溃监控初始化之后):

import { syncNowAsync } from '@/uni_modules/djiz-power-safe'

// onLaunch 内:
syncNowAsync((result) => {
  console.log('[power-safe] sync ' + (result.success ? '成功' : '失败') +
    ' command=' + result.command + ' 耗时=' + result.durationMs + 'ms')
})

每次启动都执行(不做"只跑一次"标记):sync 本身耗时几百毫秒,且顺带把 App 自己产生的脏页一并刷盘,只会更安全。

API

函数 说明
syncNowAsync(callback?) 推荐。后台线程执行 sync,不阻塞启动。callback 可为 null
syncNow() 同步阻塞执行,返回 PowerSyncResult。脏页多时可能耗时数秒
PowerSyncResult { success, command, durationMs, error }

插件内部依次尝试 /system/bin/sync → /system/xbin/sync → sync(PATH),任一路径退出码为 0 即成功,以兼容不同 ROM 的 PATH 配置与 SELinux 策略。

验证是否生效

adb logcat -d | findstr djiz-power-safe
# 期望输出:[djiz-power-safe] 文件系统 sync 完成:/system/bin/sync,耗时 xxx ms

终极验证(工业设备):

  1. 卸载重装 APK → 启动一次 App(触发 sync)→ 立即断电
  2. 重新上电 → App 应能正常启动(旧版本此场景必现循环崩溃)

诚实边界(请知悉)

  1. 安装完成 → App 首次启动之间断电,插件无能为力(进程尚未运行过)。现场规程应约定:装完 APK 立刻点开一次。
  2. sync 是全局刷盘,若个别 ROM 的 SELinux 策略拦截 App 执行系统命令,插件会返回失败并在 logcat 留下错误信息,请据 error 字段排查。
  3. 本插件防的是"断电导致文件损坏";由 SO 缺失(extractNativeLibs=false)导致的另一类启动崩溃,需在 AndroidManifest 显式声明 extractNativeLibs="true",见各社区帖。

技术细节

  • 纯 UTS 实现(编译为 Kotlin),无 aar、无 so、无权限申请、不联网、不采集数据
  • 适用:uni-app x(Android)与 uni-app(vue3,HBuilderX 3.7+)UTS 插件机制
  • minSdkVersion 21

平台兼容性

uni-app(3.8.5)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - √ - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(3.8.5)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - √ - - -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × √ √

djiz-power-safe

工业设备硬断电保护插件(uni-app x / uni-app · UTS · 仅 Android)

解决什么问题

工业平板、自助终端、触摸一体机等设备以直接拔电方式关机(非系统正常关机)。若在 App 安装/升级后约 几 分钟内断电,会触发:

  • 安装时 PackageManager 把 APK 内的 SO 解压到 /data/app/.../lib/arm64/
  • 解压后的数据先停留在 Linux 内核 page cache(内存),尚未写入物理磁盘
  • 此时断电 → page cache 丢失 → 磁盘上的 SO 字节损坏
  • SO 的 ELF header 完好仍可被 dlopen 加载,但 JNI_OnLoad / RegisterNatives 函数体损坏 → JNI 方法未注册
  • App 启动即 java.lang.UnsatisfiedLinkError: No implementation found for ... 循环崩溃,每 3 秒一次,无法自愈

这是 DCloud 社区持续多年的同类问题(均为工业/一体机设备,官方未能复现):

  • https://ask.dcloud.net.cn/question/162252 (清数据后立即断电 → 白屏,必现)
  • https://github.com/dcloudio/uni-app/issues/5073 (没电强制关机 → 卡启动页闪退)
  • https://bbs.itying.com/topic/69458252a899160047f62a00 (硬断电 → 白屏/闪退)

方案原理

App 每次启动(onLaunch)时执行一次文件系统 sync 命令,强制内核把全部脏页(含解压到 /data 的 SO)刷入物理磁盘,把断电危险窗口期从约 20 分钟压缩到秒级。

正常关机(长按电源 → 关机流程)内核会自动 sync,不受此问题影响;只有硬断电(拔电/电池耗尽)才需要本插件。

用法

App.uvue 的 onLaunch 中(建议放在崩溃监控初始化之后):

import { syncNowAsync } from '@/uni_modules/djiz-power-safe'

// onLaunch 内:
syncNowAsync((result) => {
  console.log('[power-safe] sync ' + (result.success ? '成功' : '失败') +
    ' command=' + result.command + ' 耗时=' + result.durationMs + 'ms')
})

每次启动都执行(不做"只跑一次"标记):sync 本身耗时几百毫秒,且顺带把 App 自己产生的脏页一并刷盘,只会更安全。

API

函数 说明
syncNowAsync(callback?) 推荐。后台线程执行 sync,不阻塞启动。callback 可为 null
syncNow() 同步阻塞执行,返回 PowerSyncResult。脏页多时可能耗时数秒
PowerSyncResult { success, command, durationMs, error }

插件内部依次尝试 /system/bin/sync → /system/xbin/sync → sync(PATH),任一路径退出码为 0 即成功,以兼容不同 ROM 的 PATH 配置与 SELinux 策略。

验证是否生效

adb logcat -d | findstr djiz-power-safe
# 期望输出:[djiz-power-safe] 文件系统 sync 完成:/system/bin/sync,耗时 xxx ms

终极验证(工业设备):

  1. 卸载重装 APK → 启动一次 App(触发 sync)→ 立即断电
  2. 重新上电 → App 应能正常启动(旧版本此场景必现循环崩溃)

诚实边界(请知悉)

  1. 安装完成 → App 首次启动之间断电,插件无能为力(进程尚未运行过)。现场规程应约定:装完 APK 立刻点开一次。
  2. sync 是全局刷盘,若个别 ROM 的 SELinux 策略拦截 App 执行系统命令,插件会返回失败并在 logcat 留下错误信息,请据 error 字段排查。
  3. 本插件防的是"断电导致文件损坏";由 SO 缺失(extractNativeLibs=false)导致的另一类启动崩溃,需在 AndroidManifest 显式声明 extractNativeLibs="true",见各社区帖。

技术细节

  • 纯 UTS 实现(编译为 Kotlin),无 aar、无 so、无权限申请、不联网、不采集数据
  • 适用:uni-app x(Android)与 uni-app(vue3,HBuilderX 3.7+)UTS 插件机制
  • minSdkVersion 21

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

不采集任何数据,不联网,仅调用系统 sync 命令刷盘

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。