将android:installLocation改为internalOnly后更新触发Play Store错误963的咨询
问题解答
1. 该现象是否为预期行为?
没错,这个现象完全是预期行为。
Google Play的更新逻辑中,当你将应用的android:installLocation从auto改为internalOnly时:
- 如果旧版本安装在内部存储:更新流程可以直接覆盖安装,因为符合新版本的安装位置要求,所以能正常完成。
- 如果旧版本安装在外部SD卡:由于新版本强制要求只能安装在内部存储,而Play Store的更新机制无法自动将应用从外部存储迁移到内部存储,因此会触发错误代码963,阻止更新继续。
2. 如何规避错误并确保新版本安装到内部存储?
既然新版本必须依赖BOOT_COMPLETED广播(外部存储无法接收该广播),可以通过以下两种方案解决:
方案一:发布过渡版本(推荐)
- 先发布一个过渡版本,保持
android:installLocation="auto"不变,但在应用中添加逻辑:- 启动时检测当前应用的安装位置(通过
PackageManager.getPackageInfo().applicationInfo.flags判断是否包含FLAG_EXTERNAL_STORAGE)。 - 如果检测到应用在外部存储,弹出清晰的提示,引导用户手动将应用迁移到内部存储:
- 可以通过发送Intent打开系统的应用详情页面:
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName())),让用户在“存储”选项中选择“移至内部存储”。
- 可以通过发送Intent打开系统的应用详情页面:
- 同时在过渡版本的更新说明中告知用户,完成迁移后才能安装后续的新版本。
- 启动时检测当前应用的安装位置(通过
- 等待大部分用户完成迁移后,再发布最终版本,将
android:installLocation改为internalOnly。
方案二:在更新说明中明确引导用户
直接发布internalOnly的新版本,但在Play Store的更新描述中用醒目的文字提醒用户:
如果您之前将应用安装在SD卡上,请先进入系统设置的应用详情页面,将应用移至内部存储后,再尝试更新。
这种方案相对简单,但可能会导致部分用户因未注意提示而遇到963错误,影响更新体验。
补充说明
之所以新版本必须设置为internalOnly,是因为Android系统的机制限制:当应用安装在外部SD卡时,SD卡的挂载时机晚于BOOT_COMPLETED广播的发送时间,因此系统不会向外部存储的应用发送该广播,导致新增的接收器无法正常工作。
内容的提问来源于stack exchange,提问作者lauxjpn
相关产品推荐
相关产品推荐

