IMPLEMENTATION_SUMMARY.md 4.9 KB

UpdateHelper 实现总结

✅ 方案可行性评估

结论:方案完全可行!

该方案通过将安装逻辑从主应用分离到独立的 UpdateHelper 应用,成功解决了 Android 8.x 中 "Package is frozen" 的问题。

📦 已创建的文件

1. 模块配置文件

  • UpdateHelper/build.gradle - 模块构建配置(application 类型)
  • UpdateHelper/proguard-rules.pro - ProGuard 混淆规则

2. 源代码文件

  • UpdateHelper/src/main/java/com/yuyetech/updatehelper/MainActivity.java

    • 实现固定屏幕(Kiosk)功能
    • 实现 APK 安装逻辑
    • 显示安装进度
    • 处理安装完成后的跳转
  • UpdateHelper/src/main/java/com/yuyetech/updatehelper/InstallReceiver.java

    • 监听安装完成广播
    • 通知 MainActivity 安装结果

3. 资源文件

  • 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 - 主题样式

4. 集成修改

  • bBeng-HeartRate-4.66-pad/settings.gradle - 添加 UpdateHelper 模块
  • bBeng-HeartRate-4.66-pad/uniplugin_module/src/main/java/io/dcloud/uniplugin/InstallModule.java
    • 新增 installApkWithUpdateHelper() 方法
    • 实现退出 Kiosk → 启动 UpdateHelper 的逻辑

5. 文档

  • 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. 启动主应用
    ↓
主应用 (已更新版本)

🎯 核心技术实现

1. 固定屏幕切换

  • 主应用退出activity.stopLockTask()
  • UpdateHelper 启用KioskManager.attach(this)startLockTask()
  • UpdateHelper 退出KioskManager.exitKiosk()stopLockTask()

2. 安装逻辑

  • 使用 PackageInstaller API
  • 实时进度更新(通过文件写入进度计算)
  • 通过 PendingIntent 接收安装结果广播

3. 进程隔离

  • UpdateHelper 是独立应用,包名不同
  • 主应用进程可以被完全杀掉
  • 避免 "Package is frozen" 错误

📋 使用步骤

1. 编译 UpdateHelper

cd bBeng-HeartRate-4.66-pad
./gradlew :UpdateHelper:assembleDebug

2. 安装 UpdateHelper

adb install UpdateHelper/build/outputs/apk/debug/UpdateHelper-debug.apk

3. 设置 Device Owner(如果尚未设置)

adb shell dpm set-device-owner com.YuyeTech.HeartRate/com.ble.mylockview.admin.KioskDeviceAdminReceiver

4. 将 UpdateHelper 添加到 LockTask 列表

需要在主应用的 Device Admin 配置中添加 UpdateHelper 的包名。

5. 在主应用中调用

const installModule = uni.requireNativePlugin('InstallModule');
installModule.installApkWithUpdateHelper(apkPath, (result) => {
    console.log(result);
});

⚠️ 注意事项

  1. 包名配置

    • UpdateHelper: com.yuyetech.updatehelper
    • 主应用: com.YuyeTech.HeartRate
    • 确保两者不同
  2. Device Owner 要求

    • UpdateHelper 需要与主应用共享 Device Owner 权限
    • 或者 UpdateHelper 也需要单独设置为 Device Owner
  3. 图标资源

    • 需要添加 ic_launcher 图标到 res/mipmap-*/ 目录
    • 否则编译可能失败
  4. 测试环境

    • 建议在真实设备上测试
    • 模拟器可能无法完全模拟 Device Owner 行为

🔍 调试方法

查看 UpdateHelper 日志

adb logcat | grep -E "UpdateHelper|InstallReceiver"

查看主应用日志

adb logcat | grep -E "InstallModule"

检查 LockTask 状态

adb shell dumpsys activity activities | grep LockTask

📝 后续优化建议

  1. 错误处理增强

    • 添加网络错误处理
    • 添加文件权限检查
    • 添加安装失败重试机制
  2. 用户体验优化

    • 添加取消安装功能
    • 优化进度显示动画
    • 添加安装失败后的错误提示
  3. 安全性增强

    • 验证 APK 签名
    • 添加 APK 完整性校验
    • 防止恶意 APK 安装
  4. 兼容性改进

    • 支持 Android 不同版本
    • 处理不同厂商的定制系统
    • 适配不同屏幕尺寸

✨ 总结

UpdateHelper 模块已成功创建并集成到主项目中。该方案通过进程隔离和固定屏幕切换,完美解决了 Android 8.x 中 "Package is frozen" 的问题。所有核心功能已实现,可以直接编译和测试使用。