在安装应用程序更新时会发生这种情况,并且更新的版本无法使用与先前版本相同的用户 ID 运行。
为什么会发生这种情况
Android 通常会自行分配用户 ID,当应用更新时,它会继承之前版本的用户 ID。有一个例外:Android 允许多个应用在同一个用户 ID 上运行,前提是它们在清单中指定(通过在元素中设置android:sharedUserId
属性)。<manifest>
如果新版本请求共享用户 ID,但之前安装的没有,则用户 ID 将更改,您将收到错误消息。(大概也是在尝试从共享用户 ID 升级到没有的版本时。)
您收到的错误取决于 Android 版本:在 Android 4.4.4 我见过INSTALL_FAILED_UID_CHANGED
,而 Android 10 报告INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
。
如果应用程序在未删除其数据的情况下被卸载,您也可能会收到此错误(可以通过adb shell
and来完成pm uninstall -k
- 如果您知道自己在做什么)。
这里有两个应用数据位置:
- 应用程序专用存储。最终用户通常无法访问此数据;如果您有 root 访问权限,您可以在文件系统 ad 中找到数据
/data/data/packageID
。
- 私人共享存储:这位于您的 SD 卡上
/Android/data/packageID
。
如何恢复
从中恢复本质上意味着确保没有具有相同包名称和不兼容用户 ID 的包(或剩余的应用程序数据)。有多种方法可以实现这一点:
如果您在设备上拥有 root 权限,则可以执行一些手术以在更新期间保留您的应用数据:
- 备份现有应用数据,删除现有版本,重新安装新版本并恢复数据。就是这样:
- 使用oandbackup或类似工具,备份您应用的私人数据。(您不需要备份 APK,但它不会受到伤害。)
- 如果您的应用有私有共享存储
/sdcard/Android/data/packageID
目录su
(这也会将目录的文件所有权从应用程序的用户更改为sdcard
.
- 卸载现有应用程序。
- 安装新版本。
- 使用与上述相同的备份工具恢复应用程序的私有数据(不是APK)。
- 如果您已将私有共享存储目录移走,请将其移回其旧位置(与上述步骤相同)。这会将文件所有者更改为应用程序的(新)用户 ID。
如果您在设备上没有 root 权限,则您的选择会受到更多限制。
- 卸载现有应用程序,然后安装新版本。您将丢失应用程序的私人数据。如果您的应用有私有共享存储目录 (
/sdcard/Android/data/packageID
),您可以(可能)在卸载前备份它,并在安装新版本后恢复它。如果应用允许,最新版本的 Android 支持备份私有应用数据;您也许可以使用备份应用程序以这种方式保存您的应用程序数据,但我还没有尝试过。
- 如果您已经卸载了旧版本但保留了数据,请重新安装旧版本,然后按照上述步骤进行(卸载并安装新版本)。
- 如果你只是尝试一些东西,你可以给新版本一个不同的包名。这将使 Android(和应用商店)将其视为不同的应用。新版本将看不到之前版本的私有数据,如果您将更改了包名称的应用程序部署到应用商店,它将显示为不同的应用程序,而不是对现有应用程序的升级。这绝对不建议在生产中使用,但可以在实验室环境中为您服务。
- 如果没有其他方法,请执行恢复出厂设置。这更具破坏性,并将删除您的所有应用程序及其数据。