|
|
преди 11 часа | |
|---|---|---|
| .. | ||
| src | преди 2 седмици | |
| IMPLEMENTATION_SUMMARY.md | преди 2 седмици | |
| README.md | преди 2 седмици | |
| build.gradle | преди 2 седмици | |
| proguard-rules.pro | преди 2 седмици | |
| 内存分配问题修复说明.md | преди 2 седмици | |
| 资源释放机制说明.md | преди 2 седмици | |
UpdateHelper 是一个独立的 Android 应用模块,专门用于在 Kiosk(固定屏幕)模式下安全地安装 APK 更新包。它解决了主应用在安装自身更新时遇到的 "Package is frozen" 错误。
当主应用尝试安装自身更新时,Android 8.x 会在安装过程中冻结当前包,导致:
SecurityException: Package ... is currently frozen! 错误通过 UpdateHelper 配合固定屏幕功能,实现以下闭环逻辑:
stopLockTask() 解除当前的固定状态,然后通过 Intent 启动 UpdateHelperstartLockTask() 将自己固定在屏幕上。这样在主应用安装期间,屏幕依然处于锁定状态,用户无法退出到系统桌面PackageInstaller.SessionCallback 实时获取安装进度并显示在 Helper 界面上ACTION_MY_PACKAGE_REPLACED 广播。当主应用更新完成并重启后,该广播会触发主应用启动PackageInstaller API 提交安装任务SecurityException: Package is frozen 错误UpdateHelper/
├── build.gradle # 模块构建配置
├── proguard-rules.pro # ProGuard 混淆规则
├── src/main/
│ ├── AndroidManifest.xml # 应用清单文件
│ ├── java/com/yuyetech/updatehelper/
│ │ ├── MainActivity.java # 主 Activity(固定屏幕 + 安装逻辑)
│ │ └── InstallReceiver.java # 安装完成广播接收器
│ └── res/
│ ├── layout/
│ │ └── activity_main.xml # 主界面布局(进度显示)
│ ├── values/
│ │ ├── strings.xml # 字符串资源
│ │ └── themes.xml # 主题样式
│ └── mipmap/ # 应用图标
└── README.md # 本文件
在主应用的 InstallModule 中,使用新方法 installApkWithUpdateHelper:
// 在 uni-app 中调用
const installModule = uni.requireNativePlugin('InstallModule');
installModule.installApkWithUpdateHelper(apkPath, (result) => {
if (result.success) {
console.log('已启动更新助手');
} else {
console.error('启动失败:', result.message);
}
});
installApkWithUpdateHelperUpdateHelper 通过 Intent 接收以下参数:
apk_path (String): APK 文件的完整路径main_package (String): 主应用的包名(用于安装完成后跳转)UpdateHelper 需要以下权限:
INSTALL_PACKAGES:安装应用权限(系统级,需要 Device Owner)REQUEST_INSTALL_PACKAGES:请求安装权限(Android 8.0+)READ_EXTERNAL_STORAGE:读取 APK 文件RECEIVE_BOOT_COMPLETED:监听包替换广播UpdateHelper 需要与主应用共享 Device Owner 权限。确保:
UpdateHelper 依赖 myLockView 模块以使用 Kiosk 功能:
dependencies {
implementation project(':myLockView')
}
applicationId 与主应用不同ic_launcher 图标文件到 res/mipmap/ 目录adb logcat | grep UpdateHelpermyLockView 模块是否正确集成startLockTask() 是否成功调用InstallReceiver 的日志./gradlew :UpdateHelper:assembleDebugadb install UpdateHelper/build/outputs/apk/debug/UpdateHelper-debug.apk启用详细日志:
adb logcat | grep -E "UpdateHelper|InstallReceiver"