繁体   English   中英

Android INSTALL_FAILED_UID_CHANGED

[英]Android INSTALL_FAILED_UID_CHANGED

我一直在使用我的 Nexus 4 在 Android 上进行调试,但是我最近在这里遇到了这个错误。 在对这个错误做了一些研究之后,这似乎是应用程序没有被正确删除的问题。 我正在调试的应用程序在我的其他 Android 设备以及模拟器上运行良好,此错误仅发生在我的 Nexus 4 上。我将设备插入计算机,并尝试删除数据/数据文件夹,但我仍然收到同样的问题。 我还检查了设置应用程序以检查它是否确实已卸载。

有谁知道如何解决这个问题? 根据一些用户的说法,我需要 root 访问权限才能正确删除数据/数据,这是真的吗? 或者还有其他方法可以解决这个问题吗?

有时您还必须卸载数据文件夹。 对于我来说,我在用户空间的包com.kikin.cts ,并在文件夹目录/data/data/com.kikin.cts 保持获取INSTALL_FAILED_UID_CHANGED ,但在删除数据文件夹后,错误消失了。

对于有根设备:

运行以下命令

adb rm -rf /data/data/<your.package.name>

对于非root设备:

  1. 更改应用程序的 ApplicationId。 请参阅此链接以更改 ApplicationId。
  2. 构建并安装应用程序。 应用程序将成功安装,因为它被视为新应用程序。
  3. 现在卸载这个应用程序。 这将清除数据。
  4. 现在将 ApplicationId 更改为前一个。
  5. 构建和安装。 魔术..它会安装。

重新启动您的设备,并清除您的项目。 基本上,卸载会为您完成此操作,以防万一然后尝试重新启动。

您可能引入了导致这种情况的 SharedUserID。

我得到了另一个适合我的解决方案。 您可以更改应用程序的包名,以便设备将其识别为不同的应用程序并成功完成安装。 对于那些没有 root 访问权限并且也不想重置设备的人来说可能会有所帮助。

我的 Nexus 5 上确实有 root,但没有任何效果,所以我不得不从有效的设置中恢复出厂设置。

对我来说,这个技巧是通过取消选中“开发人员选项”部分中的“通过 USB 验证应用程序”来完成的。

我想我会分享这个以防万一它对某人有帮助......我在 eclipse 中编写了我的应用程序的新版本,并试图在我的手机上运行它,尽管我从 Google Play 商店下载的手机上有一个稍旧的版本。 Eclipse 弹出一个对话框,询问我是否愿意卸载现有的手机版本,我同意了。 卸载有缺陷并导致 INSTALL_FAILED_UID_CHANGED。

我尝试了这里建议的大部分内容,但都没有运气。 我的手机上没有明显的 APK 痕迹,也没有我可以找到要删除的任何数据文件,但是有些东西阻止了我从 Eclipse 将 APK 加载到手机上。 我也无法从 Google Play 下载我之前的 beta 测试版本 - 下载进行到 100%,但随后失败,并显示一条消息报告“未知错误”和一个数字(可能是 -24)。

我对重命名我的包犹豫不决,因为我已经有使用旧包名称设置的 beta 测试人员和应用内产品,但是我在 eclipse 中临时更改了包名称,并且我能够将该新版本安装到手机上然后下载旧的 Google Play 版本也是如此。 两个版本在手机上愉快地并排坐在一起,具有相同的应用程序名称和图标(但幕后的包名称不同)。 然后我可以通过将应用程序图标拖到手机的卸载图标来手动卸载其中一个或两个。 手动卸载解决了冲突,修复了eclipse卸载有缺陷的问题,所以我干脆把我的eclipse包重命名为原来的名字,照旧进行。

这比恢复出厂设置或永久包重命名要轻松得多。 它可能仅在错误来源是 eclipse 版本和 Google Play 版本之间的冲突时才有效,但如果您处于类似情况,则值得一试。

在大多数情况下, INSTALL_FAILED_DEXOPTINSTALL_FAILED_UID_CHANGED意味着您没有足够的空间来安装应用程序。

从您的设备中删除一些未使用的应用程序或至少删除您的应用程序的当前版本。

adb uninstall package-name

在极少数情况下,应用程序数据可能存在问题。 根据您的设备是否已植根,您有两个选择

无根

恢复出厂Settings -> Backup and reset -> Factory data reset (至少对于三星 S5)

植根(或模拟器)

adb shell "rm -rf /data/data/package-name" 

这对我有用:

adb shell rm -rf /system/app/<package.name>

在 ADB shell 中,您可以通过两种方式找到解决方案。 1. 保留数据并找到解决方案 2. 解决方案不持久化数据

1. 的解决方案是通过命令提示符从 ADB 路径运行命令adb chown -R UID:UID /data/data/your.package.name

2.的解决方案是从同一路径运行命令adb rm -r /data/data/your.package.name

过去几天我在我的 Galaxy Note 3 测试设备上遇到了这个问题。 我一直在使用 Calabash-Andrdoid 并在 install_app 方法尝试执行时不断收到错误 INSTALL_FAILED_UID_CHANGED。 我一直在努力解决这个问题,因为我有两个测试设备遇到了这个问题。 我尝试了以上所有方法,包括清空我的 /data/data/ app 和 app.test 文件夹。 我什至删除了 Xamarin 安装的检测后端内容,因为这是我用来开发应用程序的平台。 我找不到任何其他东西可以从设备上手动删除。 当我尝试在第三台设备上完成工作并发现一切运行成功时,我意识到问题出在设备上。 最后,唯一对我有用的是对其中一个设备执行出厂重置 我希望这有帮助。

谢谢,-Shah

这是现有答案未涵盖的内容。 这发生在我身上的模拟器上。 如果我重置用户数据,我会第一次得到 INSTALL_FAILED_DEXOPT,但之后得到 INSTALL_FAILED_UID_CHANGED。 我发现 rm -r /data/data/com.foo.bar 足以重置到第一个状态。

在我的案例中,真正的罪魁祸首是导致 dexopt 失败的 java 方法名称。 密切关注 logcat 中的内容。 这是放弃它的原因:

I/PackageManager( 1275): Running dexopt on: com.foo.bar
E/dalvikvm( 2857): Invalid name: '__jni_setLocation'
E/dalvikvm( 2857): Trouble with item 14787 @ offset 0x43b68
E/dalvikvm( 2857): Cross-item verify of section type 0005 failed
E/dalvikvm( 2857): ERROR: Byte swap + verify failed
E/dalvikvm( 2857): Optimization failed
W/installd(  941): DexInv: --- END '/data/app/com.foo.bar-1.apk' --- status=0xff00, process failed
E/installd(  941): dexopt in='/data/app/com.foo.bar-1.apk' out='/data/dalvik-cache/data@app@com.foo.bar-1.apk@classes.dex' res=65280
W/PackageManager( 1275): Package couldn't be installed in /data/app/com.foo.bar-1.apk

我无法告诉您为什么 dexopt 不喜欢某些方法名称,但这就是问题所在。

好的,所以对于我的LG NEXUS 4 来说,这里是解决方案:(

  • 确保您的工作应用程序 apk 已签名或未签名)

  • 你从手机上卸载了这个文件(当然如果存在的话)

假设它是: app-debug-unaligned.apk

现在在控制台中你写:

adb push app-debug-unaligned.apk /sdcard/
adb shell
su
rm -fr /data/local/tmp/app-debug-unaligned.apk
rm -fr /data/data/app-debug-unaligned.apk

现在退出 adb 并调用

adb shell su -c "pm install /sdcard/app-debug-unaligned.apk"

在职的?

我删除了/data/data/my.package.name/data/app/my.package.name.apk ,问题仍然存在。

但是我找到了一个文件夹/data/user/0/my.package.name ,将其删除并解决了问题。

只需卸载应用程序本身(而不是数据文件夹)然后重新安装它,它应该没问题。 Android 的抱怨是因为您之前可能已经从另一台计算机上调试过该应用程序。

对我来说,还有一点。 简单地删除/data/data/appfolder没有帮助。

另一个原因是我的外部库没有包含在.apk文件中,因为文件夹的名称是lib而不是libs 这导致[INSTALL_FAILED_DEXOPT]apk安装过程中出现[INSTALL_FAILED_UID_CHANGED]

因此,在这种情况下,更改 libs 文件夹名称对我有用。

无根设备的解决方案。 转到应用程序管理器并卸载名为“Selendroid”的应用程序,然后重试。 这个解决方案对我有用。

我解决了这个问题,也许其他人也能用。

我正在重新启动手机,然后再删除一些应用程序。 并再次尝试安装,它的工作!

也许问题是关于存储。 我不知道为什么,但现在可以了。 祝你好运! (抱歉英语不好)

采用

亚行外壳

去壳。
然后运行以下命令:

rm -rf /data/data/包名

请用您自己的包名替换包名,例如 com.map.map

对于从他们的计算机运行 Junit 样式测试并收到此错误的任何人 - 虽然控制台告诉我我的应用程序存在问题(以“com.myapp.stuff”格式打包),但真正的问题是我的测试代码包,如果您在设备上运行,它会作为一个单独的应用程序安装,包名称类似于“com.myapp.stuff.test”。 使用应用程序管理器删除测试代码“应用程序”并删除我的实际应用程序为我解决了这个问题。 我在这里发布这个答案是为了挽救其他人的“废话”时刻。

Mediacom 设备上的相同问题,首先是

$ adb install -r platforms/android/out/android-debug-unaligned.apk
3958 KB/s (22887489 bytes in 5.647s)
     pkg: /data/local/tmp/android-debug-unaligned.apk
     Failure [INSTALL_FAILED_DEXOPT]

然后是一个非常执着的

$ adb install -r platforms/android/out/android-debug-unaligned.apk
4949 KB/s (22887489 bytes in 4.515s)
     pkg: /data/local/tmp/android-debug-unaligned.apk
     Failure [INSTALL_FAILED_UID_CHANGED]

进行出厂重置并没有改变动态(我依次出现了两个错误)。

  • 安装具有不同 ID 的相同应用程序有效
  • 使用以前的 ID 安装不同的应用程序不会

生根不是一个选项,我的解决方案是缓存擦除:现在有问题的应用程序 ID 工作正常,我不必(再次)恢复出厂设置。

希望能帮助到你

我找到了一个既适用于无根设备又适用于模拟器的解决方案。 虽然您无法直接删除非 root 设备上的数据文件夹,但您可以使用pm命令来执行此操作:

  1. 运行adb shell
  2. 运行pm uninstall <app name> (即 com.example.myapp)
  3. 运行pm uninstall <test app name> (ie com.example.myapp.test) - 如果之前没有安装过测试应用,你可能会收到一个错误。

似乎出于某种原因,当从 Android UI 卸载应用程序时这不起作用(可能它不会删除数据文件夹)但是当通过pm命令卸载pm它确实起作用。

在“Nexus 5”和“OnePlus One”上进行了尝试。

显然是因为卸载不当(可能是由于电缆连接错误)。

解决方案从游戏商店下载SDMaid ,并删除尸体文件(垃圾文件)。 重新运行应用程序。 (但你需要让你的设备植根)

我遇到了类似的问题。 原因是您没有卸载应用程序的所有组件。我的解决方案是:手动删除/data/data/com.eg.android.AlipayGphone。

对我来说很好。

我希望它对你有帮助!

安装应用程序更新时会发生这种情况,并且更新版本无法使用与先前版本相同的用户 ID 运行。

为什么会发生这种情况

Android 通常会自行分配用户 ID,当应用更新时,它会继承之前版本的用户 ID。 有一个例外:Android 允许多个应用在同一个用户 ID 上运行, android:sharedUserId是它们在其清单中指定(通过在<manifest>元素中设置android:sharedUserId属性)。 如果新版本请求共享用户 ID,但先前安装的用户 ID 没有,则用户 ID 将更改,您将收到错误消息。 (大概也是在尝试从共享用户 ID 升级到没有的版本时。)

您得到的错误取决于 Android 版本:在 Android 4.4.4 上我看到了INSTALL_FAILED_UID_CHANGED ,而 Android 10 报告INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

如果应用程序在未删除其数据的情况下被卸载(这可以通过adb shellpm uninstall -k ——如果您知道自己在做什么),您也可能会收到此错误。

两个应用程序数据位置在这里发挥作用:

  • 应用私有存储。 最终用户通常无法访问这些数据; 如果您具有 root 访问权限,则可以在文件系统 ad /data/data/packageID找到数据。
  • 私有共享存储:它位于您的 SD 卡上/Android/data/packageID

如何恢复

从中恢复本质上意味着确保没有包(或剩余的应用程序数据)具有相同的包名称和不兼容的用户 ID。 有多种方法可以实现这一点:

如果您在您的设备上拥有 root 权限,您可以执行一些操作以在更新期间保留您的应用程序数据:

  • 备份现有应用程序数据,删除现有版本,重新安装新版本并恢复数据。 就是这样:
    • 使用oandbackup或类似工具,备份您应用的私有数据。 (您不需要备份 APK,但它不会受到伤害。)
    • 如果您的应用有私有共享存储目录( /sdcard/Android/data/packageID ),请在设备上打开 shell,输入su切换到 root 模式,并重命名目录(将包 ID 更改为不存在的)。 这也会将目录的文件所有权从应用程序的用户更改为sdcard
    • 卸载现有的应用程序。
    • 安装新版本。
    • 使用与上述相同的备份工具恢复应用程序的私人数据(而不是APK)。
    • 如果您已将私有共享存储目录移走,请将其移回其旧位置(与上述步骤相同)。 这会将文件所有者更改为应用程序的(新)用户 ID。

如果您在您的设备上没有 root 权限,您的选择会更加有限。

  • 卸载现有应用程序,然后安装新版本。 您将丢失应用程序的私人数据。 如果您的应用程序有一个私有共享存储目录( /sdcard/Android/data/packageID ),您(可能)可以在卸载前备份它,并在安装新版本后恢复它。 如果应用程序允许,最新版本的 Android 支持备份私有应用程序数据; 您也许可以使用备份应用程序以这种方式保存您的应用程序数据,但我还没有尝试过。
  • 如果您已经卸载了旧版本但保留了数据,请重新安装旧版本,然后按上述操作(卸载并安装新版本)。
  • 如果您只是尝试一些东西,您可以给新版本一个不同的包名。 这将使 Android(和应用程序商店)将其视为不同的应用程序。 新版本将看不到前一个的私有数据,如果您将更改包名称的应用程序部署到应用程序商店,它将显示为不同的应用程序,而不是对现有应用程序的升级。 这绝对不推荐在生产中使用,但可以在实验室环境中为您服务。
  • 如果没有其他效果,请执行恢复出厂设置。 这更具破坏性,会删除您的所有应用程序及其数据

生根和恢复出厂设置对我来说不是一种选择,但我能够找到我的 APK 的旧版本并安装它(我猜它是同一个未能正确卸载的)。 再次卸载后,我能够安装新版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM