Android INSTALL_FAILED_UID_CHANGED

时间:2013-04-29 11:23:27

标签: android

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

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

27 个答案:

答案 0 :(得分:76)

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

答案 1 :(得分:25)

对于有根设备:

运行以下命令

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

对于非root设备:

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

答案 2 :(得分:17)

重新启动您的设备,然后清除您的项目。 基本上,如果没有尝试重新启动,卸载就可以为你完成。

答案 3 :(得分:5)

您可能引入了一个导致此问题的SharedUserID。

答案 4 :(得分:3)

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

答案 5 :(得分:3)

对我而言,诀窍是取消选中&#34;通过USB验证应用程序&#34;在&#34;开发者选项&#34;部分。

答案 6 :(得分:3)

在大多数情况下,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" 

答案 7 :(得分:2)

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

答案 8 :(得分:2)

这对我有用:

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

答案 9 :(得分:2)

从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

答案 10 :(得分:2)

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

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

我对重命名我的软件包犹豫不决,因为我已经安装了beta测试人员和使用旧软件包名称设置的应用内产品,但我在eclipse中更改了软件包名称 暂时 我能够将新版本安装到手机上,然后下载旧的Google Play版本。两个版本都在电话旁边快乐地坐在一起,使用相同的应用程序名称和图标(但幕后不同的包名称)。然后,我可以通过将应用程序图标拖动到手机的卸载图标来手动卸载其中一个或两个。手动卸载删除了冲突并修复了eclipse的有缺陷的卸载,因此我只是将我的eclipse包重命名为原始名称并继续进行。

这比工厂重置或永久包重命名要痛苦得多。它可能仅在错误源是eclipse版本和Google Play版本之间的冲突时起作用,但是如果你处于类似情况则值得一试。

答案 11 :(得分:2)

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

谢谢, -Shah

答案 12 :(得分:1)

好的,对于我的 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"

工作?

答案 13 :(得分:1)

这是现有答案未涵盖的内容。这是在模拟器上发生的。如果我重置用户数据,我第一次得到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不喜欢某些方法名称,但这就是问题所在。

答案 14 :(得分:0)

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

为什么会这样

Android 通常自己分配用户 ID,当应用更新时,它会继承之前版本的用户 ID。有一个例外:Android 允许多个应用在同一个用户 ID 上运行,前提是它们在其清单中指定(通过在 android:sharedUserId 元素中设置 <manifest> 属性)。如果新版本请求共享用户 ID,但先前安装的用户 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 访问权限,则可以在文件系统广告 /data/data/packageID 中找到数据。
  • 私人共享存储:它位于 /Android/data/packageID 的 SD 卡上。

如何恢复

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

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

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

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

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

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

  1. 运行adb shell
  2. 运行pm uninstall <app name>(即com.example.myapp)
  3. 运行pm uninstall <test app name>(即com.example.myapp.test) - 如果之前未安装测试应用,则可能会收到错误。
  4. 由于某种原因,从Android UI卸载应用程序时,这不起作用(可能它不会删除数据文件夹)但是当通过pm命令卸载它确实有效。

    在“Nexus 5”和“OnePlus One”上尝试过它。

答案 17 :(得分:0)

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

<强>解 从Play商店下载SDMaid,删除尸体文件(垃圾文件)。 重新运行应用程序。 (但你需要让你的设备生根)

答案 18 :(得分:0)

我遇到了类似的问题。共鸣是你没有卸载app的所有组件。我的解决方案是: 手动删除/data/data/com.eg.android.AlipayGphone。

对我有用。

我希望它对你有帮助!

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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工作正常,我没有必要重置(再次)。

希望有所帮助

答案 21 :(得分:0)

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

答案 22 :(得分:0)

使用

  

adb shell

转到shell 然后运行命令follow:

  

rm -rf / data / data / package name

请使用您自己的包名称,例如com.map.map

答案 23 :(得分:0)

我解决了这个问题,也许它会对其他人有用。

我正在重启手机,然后再删除一些应用。 并再次尝试安装,这是工作!

也许问题就是存储。我不知道为什么,但现在它的工作。祝好运! (抱歉英语不好)

答案 24 :(得分:0)

非root设备的解决方案。转到应用程序管理器并卸载名为&#34; Selendroid&#34;的应用程序。然后重试。这个解决方案适合我。

答案 25 :(得分:0)

对我而言,还有更多内容。只需删除/data/data/appfolder就无济于事了。

另外一个原因是我的外部库未包含在.apk文件中,因为文件夹的名称是 lib 而不是 libs 。这导致[INSTALL_FAILED_DEXOPT]安装apk,然后[INSTALL_FAILED_UID_CHANGED]

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

答案 26 :(得分:-1)

生根和出厂重置对我来说不是一个选项,但我能够找到我的APK的旧版本并安装它(我猜测它是无法正确卸载的那个)。再次卸载后,我能够安装新版本。