PackageInstallerTest
用于检测 PackageInstaller API 是否正常的测试应用。 该 API 自 API 级别 21(Android 5.0)起可用。 从 API 级别 31(Android 12)起,PackageInstaller 支持静默升级。
MIUI 破坏了此 API
在 MIUI 12.5 之前,开启 MIUI 优化时无法正常使用。具体表现为com.miui.packageinstaller
未实现android.content.pm.action.CONFIRM_INSTALL
。
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.content.pm.action.CONFIRM_INSTALL flg=0x10000000 pkg=com.miui.packageinstaller (has extras) }
关闭 MIUI 优化时使用 Google 安装器,恢复正常。
在 MIUI 12.5 及以后,部分版本恢复正常,随即又被破坏。问题来源于系统,无法通过升级软件包安装器修复,但依然可通过关闭 MIUI 优化绕过问题逻辑。
E/PKMSImpl: MIUILOG- assertCallerAndPackage: uid=10018, installerPkg=io.github.vvb2060.packageinstaller.test, msg=Permission denied
API 注意事项
在 Android 12 之前,此 API 常见用途为安装拆分包,非拆分 apk 大多使用 intent 传递给系统安装器安装。
在 Android 12 及以后,由于支持静默升级,可能会全面开始使用此 API,这是本应用诞生的直接原因:提供示例代码以供测试。
静默升级的要求有:
- 已经允许安装未知应用操作。可主动要求用户开启,也可发起一次安装,系统自会要求用户开启。
- 升级自身或由自己安装的应用。升级其它应用时,需要该应用的安装者为自己,即以前通过 PackageInstaller API 安装的应用,系统安装器无效。
- apk 已经适配 Android 10 或更高。即 Target API >= 29,此条件以后会增加。
- 30 秒以内没有静默升级过同一款应用。参考 SilentUpdatePolicy。
永远做好接收STATUS_PENDING_USER_ACTION
的准备,即使满足上述全部要求。
用户非常容易把静默升级当成应用崩溃,因此需要合理的引导。
应用打开时触发的升级可接收android.intent.action.MY_PACKAGE_REPLACED
广播弹出更新完成通知。
对于更新完成后自动打开应用的需求,在 Android 10 及以上的系统要求具有悬浮窗权限。
但更建议在后台进行升级,如果需要用户确认可发送通知。 由于安装会话除非显式放弃,否则一直可用,包括在重启设备后,因此也可等待下次打开应用时让用户确认(此功能本演示应用未实现,一律直接丢弃)。