Android上的INSTALL_FAILED_INSUFFICIENT_STORAGE错误解决方案

And*_*ith 505 installation android android-sdcard

这个INSTALL_FAILED_INSUFFICIENT_STORAGE错误是每个Android开发人员生活中的祸根.无论应用程序大小或可用存储空间如何,都会发生这种情况.重新启动目标设备可以简单地解决问题,但很快就会回来.有数百个(如果不是数千个)消息板帖子来自人们询问问题发生的原因,但谷歌的人们对这个问题感到沮丧.

有一个简单的解决方法.如果您的测试设备运行的是Android 2.2或更高版本,则android:installLocation使用该值将该属性添加到应用程序的清单文件中"preferExternal".这将强制将应用程序安装在设备的外部存储设备上,例如手机的SD卡.

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.andrewsmith.android.darkness"
          android:installLocation="preferExternal"
Run Code Online (Sandbox Code Playgroud)

这更像是一个创可贴,而不是一个修复,如果您希望您的已完成的应用程序安装在设备的内部存储器上,它可能并不理想.但它至少会让开发过程变得更加令人沮丧.

小智 170

这只是一个临时的解决方法,而不是一个真正的修复.

在我遇到这种情况并且对目前的反应不满意之后,我开始尝试从AOSP来源解决这个问题.我找到了一个真正的解决方案.

说明

首先,关于Android如何安装和更新的一些(简化)背景

第一次安装应用程序:

  1. APK文件保存为

    /data/app/-1.apk(1.apk)

当应用程序要更新时:

  1. 更新的APK文件保存为:

    /data/app/-2.apk(2.apk)

  2. 第一个版本(1.apk)被删除.

在我们的下一次更新中:

  1. 新的APK保存为(1.apk),(2.apk)被删除(永远重复).

 

当应用程序更新时,我们大多数人都会遇到这个问题,但删除旧的APK失败了.哪个本身还没有导致更新失败,但它确实导致有两个APK文件/data/app.

下次尝试更新应用程序时,系统无法移动其临时文件,因为(1.apk)和(2.apk)都不为空.由于File#renameTo(File)不会抛出异常,而是返回一个布尔的PackageManager,它无法告诉为什么它返回INSTALL_FAILED_INSUFFICIENT_STORAGE,即使失败与可用空间量无关.

跑:

adb shell "pm uninstall <full.packge.name>"
adb shell "rm -rf /data/app/<full.package.name>-*"
Run Code Online (Sandbox Code Playgroud)

要么

卸载应用程序

使用您喜欢的方法删除两个:

/data/app/<full.package.name>-1.apk

/data/app/<full.package.name>-2.apk

确保没有其他任何东西以类似的方式阻止未来的安装.在我的情况下,我有一个/data/app-lib/<full.package.name>-1目录挥之不去!在这种情况下,SD卡的安装工作,以及随后移动到内部存储器.(/data/app-lib/<full.package.name>没有-1结尾的创作.)

为什么其他"解决方案"有效

  • 安装到外部存储器的代码明显不同,没有相同的问题

  • 卸载应用程序只会删除一个版本的APK文件/data/app.这就是为什么你可以重新安装一次,但不能更新它.

  • 发生此错误时,模拟器中的可用空间量并不真正相关

  • @ Msmit1993,您无权访问非root设备上的数据目录.拥有SDK和ADB并不重要. (9认同)
  • 当您单击“操作”下拉菜单时,Android Studio 的 AVD 管理器现在可以选择“擦除数据”,这似乎也解决了这个问题。 (4认同)
  • 对于真正的懒人,这里是一个bash片段:`function fix_app {adb shell"pm uninstall $ {1}; rm -rf/data/app/$ {1} - *; su -c'rm -rf/data/app -lib/$ {1} - *'"}``$ fix_app com.facebook.katana` (3认同)
  • 我必须清除`/data/local/tmp` (3认同)

Osc*_* S. 108

您需要增加Android模拟器的内存容量.有两种方法:

  1. 右键单击Android项目的根目录,转到"运行方式",然后转到"运行配置...".在左侧的树中找到"Android应用程序"节点,然后选择您的项目并转到窗口右侧的"目标"选项卡,向下看"其他模拟器命令行选项"字段(有时您'我需要使窗口更大)并最终粘贴"-partition-size 1024".单击"应用",然后单击"运行"以使用模拟器.

  2. 转到Eclipse的 Preferences,然后选择"Launch"在"Default emulator option"字段中添加"-partition-size 1024".单击"应用"并像往常一样使用您的模拟器.

  • 奥斯卡,你认为这是在模拟器上发生的.在我的情况下,它发生在实际设备上,这个答案没有解决. (102认同)

Lou*_*ini 29

感谢您发布此问题.我有一些额外的见解可能会帮助一些开发人员.

我正在设备(而不是模拟器)上调试我的应用程序.该设备有21 MB免费开启/data(由"df"显示做"adb shell"),我的应用程序只有5 MB.但是,我确实发现如果我删除了设备上的其他应用程序(无需重新启动手机或重新启动adbd),INSTALL_FAILED_INSUFFICIENT_STORAGE会消失一段时间然后再回来.

因此,调试我的5 MB应用程序似乎需要更多20 MB的空间/data,此外每次调试我的应用程序时都会出现漏洞.

所以我做了"adb shell"并列出了ENTIRE /data目录

cd /data
ls -a -l -R
Run Code Online (Sandbox Code Playgroud)

我查看了5000行输出,看看所有空间的去向.

/data/klog目录中的设备上发现了大量浪费的空间,这些空间来自几个月的调试会话中的旧日志文件.

这些不是我的日志文件:它们是由Android基础架构的某些部分创建的.

我删除了它们并立即保存了58 MB,这些设置应用程序中未归因于任何特定应用程序.我有一个小设备,所以58 MB是非常重要的(约40%).

到目前为止,经过多次运行后,我还没有再次获得INSTALL_FAILED_INSUFFICIENT_STORAGE.让我们希望这是真正的问题,尽管OP表明他的设备有足够的空间(但没说多少).

希望你们中的一些人也可以通过定期删除来逃避INSTALL_FAILED_INSUFFICIENT_STORAGE /data/klog/*.

或者,你至少可以做ls -a -l -R/data,看看你所有的空间是怎么回事,如果确实有真有些(隐藏)空间的问题.

  • 任何想法如何在非根电话上这样做?我无法访问数据目录.很棒的帖子顺便说一句+1 (25认同)

Saa*_*ooq 20

以下有助于:

到目前为止,这对我来说在实际设备上是可靠的.


编辑:事实证明,这不像上面那样可靠.

我尝试了很多解决方案.什么都没有帮助.最后我找到了一个名为SD Maid的应用程序.这有帮助.

它说功能仅限于无根设备.我的根深蒂固,所以很高兴看到人们在那些场景中听到有效的声音,如果它只是一个对我有用的侥幸(无论如何这是一个不可预测的问题).

注意:我与该应用程序无关.刚刚用搜索找到它.


nas*_*han 16

我在应用程序的清单文件中添加了一行,即android:installLocation="preferExternal".通过使用此行,它强制将应用程序安装到外部存储.看下面的例子,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nasir.phonegap"
    android:installLocation="preferExternal" >
Run Code Online (Sandbox Code Playgroud)


小智 16

我通过在AndroidManifest.xml文件中包含android:installLocation="auto"inside <manifest>标签来解决它.

  • 谢谢,成功了!但你能解释一下为什么我们需要这样做吗?谢谢您的帮助! (2认同)

Ral*_*zzo 9

模拟器上的相关问题是/data分区中没有剩余空间.

例如,

% adb shell df

Filesystem             Size   Used   Free   Blksize
/dev                   252M    32K   252M   4096
/mnt/asec              252M     0K   252M   4096
/mnt/obb               252M     0K   252M   4096
/system                154M   154M     0K   4096
/data                   64M    57M     6M   4096
/cache                  64M     1M    62M   4096
Run Code Online (Sandbox Code Playgroud)

以下是/data/app目录的示例视图:

% adb shell ls -l /data/app

-rw-r--r-- system   system      19949 2011-10-12 17:09 CubeLiveWallpapers.apk
-rw-r--r-- system   system      27670 2011-10-12 17:09 GestureBuilder.apk
-rw-r--r-- system   system      34341 2011-10-12 17:09 SoftKeyboard.apk
-rw-r--r-- system   system      20151 2011-10-12 17:09 WidgetPreview.apk
Run Code Online (Sandbox Code Playgroud)

我删除了额外的APK文件.在每次安装时,您都会看到一个新的APK文件.只需删除额外的APK文件.

例如,

adb shell rm /data/app/com.brooklynmarathon.calendarapi2-1.apk
Run Code Online (Sandbox Code Playgroud)

  • 1.运行"adb shell"2. cd进入数据中的每个目录,找到那些无用的大文件.3.使用"rm(filename)"删除它们4.我的反复出现的问题是像"ApiDemos"和"dalvik-cache"这样的垃圾(只删除那个的全部内容) (2认同)

Ser*_*rov 9

在我的情况下失败是由com.android.providers.media应用程序引起的.我在x86 android模拟器上面对这个.我做了什么:

$ adb shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M   209M    14M   4096
....
Run Code Online (Sandbox Code Playgroud)

可用空间太小 /data

$ adb shell du /data
...
409870  /data/data/com.android.providers.media
...
Run Code Online (Sandbox Code Playgroud)

几乎全部都是由单个应用程序消耗的!它是系统应用程序,所以我认为最好不要删除它.相反,我清理了应用数据.

$ adb shell pm clear com.android.providers.media
Success
$ adb shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M     8M   215M   4096
...
Run Code Online (Sandbox Code Playgroud)

磁盘已清除,应用安装成功.


小智 7

我尝试了以下方法:

  • 重新启动了我的设备
  • 删除了以前的 APK
  • 重建我的 APK
  • 在设备中卸载我以前的副本
  • 重新安装

检查它是否与您相同。

  • 是的,重新启动设备是唯一有效的方法(在尝试了此页面的多种解决方案后) (4认同)

pro*_*007 6

仿真器解决方案

打开你的.Android目录。通常在您的主目录中。然后转到avd并打开包含您要更改的 avd 名称的目录。

现在编辑该config.ini文件并添加以下行或修改以下行:

disk.dataPartition.size=1024

1024您想要使用的大小(以 MB 为单位)在哪里。保存文件,然后启动模拟器并wipe user data选中。您的模拟器现在应该具有新的大小。


wry*_*iel 6

我觉得写这个有点奇怪,但我不能100%肯定在某些情况下不是真的(它对我有用).如果您有以下症状:

  • 您一直在使用物理设备(在我的情况下,三星Galaxy Ace),
  • 你连续几天都在发展,
  • 您的手机一直在白天和晚上都是连接的.
  • 几天后你就开始收到这个错误,并且情况越来越糟.
  • 其他答案都不适合你.
  • 你像我一样辞职......

然后,试试这个:

  • 不工作时拔掉手机!

我拔掉了手机,让它休息了整整一天.我的电池消失了一点.在此之后,我重新连接它并再次开始调试.这次一切都很好!我的意思真的很好,就像以前一样.

这个错误是否可能是由于某些与电池相关的硬件原因造成的?用这种方式感觉仍然很奇怪,但是现在我时不时地断开手机(以及夜晚)并且问题没有恢复.


小智 6

回答这个话题的第一篇文章......

症状:有些应用程序没有安装,说没有空间,而且内部和外部存储都有足够的空间!解决方案:默认情况下禁用外部安装

通过defaut设置外部安装:

adb shell pm set-install-location 2
Run Code Online (Sandbox Code Playgroud)

许多无法在外部安装的应用程序(例如adblock +等)无法安装

然后解决方案是

adb shell pm set-install-location 0
Run Code Online (Sandbox Code Playgroud)

要么

adb shell pm set-install-location 1

0: auto (if one is full - or irrelevant !!! - it select the other)
1: internal
2: external
Run Code Online (Sandbox Code Playgroud)


sne*_*nez 5

三星Galaxy Ace在其规格中宣传了158 MB的内部存储,但核心应用程序和服务消耗了大约110 MB(我使用设备上的任务管理器来检查).我的应用程序是52 MB,因为它有很多资产.一旦我删除了一些低至45 MB的应用程序,该应用程序设法安装没有问题.该设备仍然提醒我内部存储几乎已满,我应该卸载一些应用程序,即使我只安装了一个应用程序.

安装.apk软件包的发行版本然后卸载它后,我的设备显示99 MB的可用空间,因此可能是调试信息使设备混乱.请参阅Louis Semprini的回答.


小智 5

由于这个问题仍然存在,我想我会出于开发目的在RacZo 的答案中添加一些内容。如果您没有使用Eclipse插件或由于某种原因您没有源代码,而只有 .apk,您可以在启动模拟器时使用相同的选项从命令行增加分区大小:

emulator -avd <emulator name> -partition-size 1024
Run Code Online (Sandbox Code Playgroud)

据我所知,developer.android.com 上没有记录这个选项,所以我想我会把它贴在这里,这样人们可能会找到这个解决方案。


Tea*_*ous 2

解决方法:

编译为 2.1,不带android:installLocation="preferExternal".

好的?

编译为 2.2,包括android:installLocation="preferExternal".

这仍然会安装在低于 8 的 SDK 版本上(XML 标记被忽略)。