安卓 INSTALL_FAILED_UID_CHANGED

78

我一直在使用我的Nexus 4来进行Android调试,但最近遇到了这个错误。经过对此错误的一些研究,发现这似乎是一个应用程序删除不彻底的问题。与其他 Android 设备和模拟器运行正常的应用程序,在我的 Nexus 4 上出现了这个错误。我将设备连接到电脑上,并尝试删除 data/data 文件夹,但仍然出现相同的问题。我还检查了设置-应用程序,以确保它已被卸载。

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


4
您需要从“/data/data/your.package.name”和“/data/app”中删除应用数据,看起来它没有完全卸载。 - Marek Sebera
请查看下面的答案:https://dev59.com/JWQo5IYBdhLWcg3wKcrH#33589210 - asok Buzz
这解决了我的问题: 请查看链接 - Sayem
27个回答

79

有时候您还需要卸载数据文件夹。对我而言,我拥有用户空间中的一个包 com.kikin.cts,以及 /data/data/com.kikin.cts 中的文件夹目录。一直收到 INSTALL_FAILED_UID_CHANGED 的错误提示,但是在删除数据文件夹后,错误就消失了。


11
我遇到了同样的问题,但当我尝试删除文件夹时,出现了“权限被拒绝”的错误。 - Sam
7
我的设备安装在 /data/local/tmp/com(...),但这种方法不起作用。(HTC One, IntelliJ 13) - Nilzor
2
有找到任何解决方案吗?我可以在我的 Mac 上正常构建项目。但是当我切换到我的 Windows 电脑时,我会遇到这个错误。在我的 Windows 电脑上构建项目后,我的设备出现了故障,我将无法再次使用 Mac 构建,因为我会遇到相同的错误。 - Luciano
对于非root设备,也许我们不得不尝试最糟糕的解决方案:恢复出厂设置。 - RxRead
实际上是 adb shell rm -R /data/data/<app-package>,因为它是一个文件夹,所以 -R 将删除文件夹及其内部的所有内容。 - Christoph
显示剩余2条评论

26

对于已经取得Root权限的设备:

运行以下命令:

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

对于非root设备:

  1. 更改应用程序的 ApplicationId。参考此链接进行更改。
  2. 构建并安装应用程序。应用程序将成功安装,因为它被视为新应用程序。
  3. 现在卸载此应用程序。这将清除数据。
  4. 现在将ApplicationId更改为以前的ID。
  5. 构建并安装。神奇...它将安装。

2
不,它不会。对我没有帮助。 - Roman Minenok
有时在执行卸载 #3 操作之前,可能需要重新启动手机。 - VinceStyling
谢谢!我之前使用的是kotlin 1.0.0-beta-1083,现在切换到了1.0.0-beta-1103,并且应用了你的解决方案(需要两者一起进行,否则会出现错误),问题已经解决了! - Deepscorn
1
只有在第三步和第五步之间重新启动设备后,它才对我有效。但它确实有效!太棒了! - SILINIK
它可以是任何东西,比如 abc.abc.abc 或者 aaa.bbb.ccc.test - Rajesh Hegde
显示剩余2条评论

17

重新启动设备并清除项目。 基本上,如果卸载操作没有完成,您可以尝试重新启动来清除。


3
这个看起来有效,我重启了设备,尝试再次运行,但仍出现同样的问题。我去吃午饭,回来后再次将手机插入,它似乎又可以用了。 - AdamM
17
这对我似乎没有用。我猜想与午餐有关。你还记得那天吃了什么吗?:p - Nilzor
62
我吃了披萨、面条和三明治,但都没有奏效。 - Luciano

7
您可能引入了SharedUserID,导致出现此问题。

2
我在我的应用程序中没有使用共享用户ID。 - AdamM
当然可以!这正是我的情况 :), 谢谢。 - Gautam Jain
这对我来说是个问题。谢谢您,先生。 :) - m.rohail.akram

4
在大多数情况下, INSTALL_FAILED_DEXOPTINSTALL_FAILED_UID_CHANGED 表示您没有足够的空间来安装应用程序。请从设备中删除一些未使用的应用程序,或者至少删除当前版本的应用程序。
adb uninstall package-name

非常罕见的情况下,应用数据可能会出现问题。根据您的设备是否已获取 root 权限,您有两个选择:

未获取 root 权限

进行恢复出厂设置 设置 -> 备份和重置 -> 恢复出厂设置(至少适用于三星S5)

已获取 root 权限(或模拟器)

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

3
我想分享一下这个内容,希望能对你有所帮助...我在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版本之间的冲突,则可能仅适用于解决同类问题。

3
对我来说,关键是在“开发者选项”中取消“通过USB验证应用程序”的选中状态。

1
谢谢你的帮助,我开始担心不得不恢复出厂设置我的设备。 - Janne Oksanen

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

5
除非你只是将某些东西拼凑在一起,否则这几乎不是一个解决方案......有点像房子里有异味,而你通过搬家来解决问题。 - Patrick Jackson
6
不仅手机,Google Play也将其视为独立的应用程序。最好更换手机,而不是更改包名称,因为我的应用已经拥有数千名用户。 - Seshu Vinay
@SeshuVinay 对的,不建议用于生产环境。但可以在应用程序上线之前使用。 - Ayush Goyal

3

我在我的 Nexus 5 上拥有 root 权限,但是什么都没有起作用,所以我只能从设置中运行恢复出厂设置。


2

这里有一些现有答案没有涉及到的内容。在模拟器上,我遇到了这个问题。如果我重置用户数据,第一次会出现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不喜欢某些方法名称,但那就是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接