结论:方案完全可行!
该方案通过将安装逻辑从主应用分离到独立的 UpdateHelper 应用,成功解决了 Android 8.x 中 "Package is frozen" 的问题。
UpdateHelper/build.gradle - 模块构建配置(application 类型)UpdateHelper/proguard-rules.pro - ProGuard 混淆规则✅ UpdateHelper/src/main/java/com/yuyetech/updatehelper/MainActivity.java
✅ UpdateHelper/src/main/java/com/yuyetech/updatehelper/InstallReceiver.java
UpdateHelper/src/main/AndroidManifest.xml - 应用清单UpdateHelper/src/main/res/layout/activity_main.xml - 主界面布局UpdateHelper/src/main/res/values/strings.xml - 字符串资源UpdateHelper/src/main/res/values/themes.xml - 主题样式bBeng-HeartRate-4.66-pad/settings.gradle - 添加 UpdateHelper 模块bBeng-HeartRate-4.66-pad/uniplugin_module/src/main/java/io/dcloud/uniplugin/InstallModule.java
installApkWithUpdateHelper() 方法UpdateHelper/README.md - 完整的使用说明文档主应用 (com.YuyeTech.HeartRate)
↓
1. 检测到更新,下载 APK
↓
2. 调用 installApkWithUpdateHelper(apkPath)
↓
3. InstallModule.stopLockTask() 退出 Kiosk
↓
4. 启动 UpdateHelper (com.yuyetech.updatehelper)
↓
UpdateHelper
↓
5. MainActivity.onCreate() 启用 Kiosk
↓
6. 显示进度界面
↓
7. PackageInstaller 执行安装
↓
8. InstallReceiver 接收安装完成广播
↓
9. MainActivity.launchMainApp() 退出 Kiosk
↓
10. 启动主应用
↓
主应用 (已更新版本)
activity.stopLockTask()KioskManager.attach(this) → startLockTask()KioskManager.exitKiosk() → stopLockTask()PackageInstaller APIPendingIntent 接收安装结果广播cd bBeng-HeartRate-4.66-pad
./gradlew :UpdateHelper:assembleDebug
adb install UpdateHelper/build/outputs/apk/debug/UpdateHelper-debug.apk
adb shell dpm set-device-owner com.YuyeTech.HeartRate/com.ble.mylockview.admin.KioskDeviceAdminReceiver
需要在主应用的 Device Admin 配置中添加 UpdateHelper 的包名。
const installModule = uni.requireNativePlugin('InstallModule');
installModule.installApkWithUpdateHelper(apkPath, (result) => {
console.log(result);
});
包名配置
com.yuyetech.updatehelpercom.YuyeTech.HeartRateDevice Owner 要求
图标资源
ic_launcher 图标到 res/mipmap-*/ 目录测试环境
adb logcat | grep -E "UpdateHelper|InstallReceiver"
adb logcat | grep -E "InstallModule"
adb shell dumpsys activity activities | grep LockTask
错误处理增强
用户体验优化
安全性增强
兼容性改进
UpdateHelper 模块已成功创建并集成到主项目中。该方案通过进程隔离和固定屏幕切换,完美解决了 Android 8.x 中 "Package is frozen" 的问题。所有核心功能已实现,可以直接编译和测试使用。