Android上的INSTALL_FAILED_INSUFFICIENT_STORAGE错误解决方案

时间:2011-01-17 00:50:46

标签: android installation android-sdcard

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

有一个简单的解决方法。如果您的测试设备运行的是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"

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

31 个答案:

答案 0 :(得分:156)

这只是临时解决方法,而不是真正的解决方法。

在我遇到这种情况并且对当前的反应不满意之后,我开始工作了 试图从AOSP来源中找出它。我找到了一个 REAL 解决方案。

解释

首先,关于Android如何安装和更新

的一些(简化)背景知识
  

第一次安装应用时:

     
      
  1. APK文件保存为

         

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

  2.         

    要更新应用时:

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

           

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

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

    4.         

      在我们的下一次更新中:

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

我们大多数人在更新应用程序时遇到的问题,但删除旧的APK失败。哪个本身尚未导致更新失败,但确实导致/data/app中有两个APK文件。

下次尝试更新应用时,系统无法移动其临时文件,因为(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>-*"

卸载应用

使用您喜欢的方法删除 BOTH

  

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

     

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

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

为什么其他“解决方案”有效

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

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

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

答案 1 :(得分:107)

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

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

  2. 转到Eclipse's首选项,然后选择“启动”在“默认模拟器选项”字段中添加“--partition-size 1024”。单击“应用”并照常使用您的模拟器。

答案 2 :(得分:28)

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

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

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

所以我做了“adb shell”并列出了带有

的整个/data目录
cd /data
ls -a -l -R

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

我在/data/klog目录中以旧日志文件的形式在我的设备上发现了大量浪费的空间。

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

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

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

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

或者,您至少可以ls -a -l -R /data查看所有空间的位置,如果确实存在某些(隐藏)空间问题。

答案 3 :(得分:19)

以下有用:

  • 打开设备的shell

    adb shell
    
  • 导航到首次复制传入APK的临时目录

    cd /data/local/tmp
    
  • 列出可用文件并根据需要删除

    rm * // use at your own risk, good practice to list files first
    

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


编辑:结果证明这不像上面那样可靠。

我尝试了很多解决方案。什么都没有帮助。最后我发现了一个名为SD Maid的应用。这有帮助。

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

注意:我与该应用无关。只是通过搜索找到它。

答案 4 :(得分:15)

我已经通过在AndroidManifest.xml文件中的android:installLocation="auto"标记中包含<manifest>来解决了这个问题。

答案 5 :(得分:14)

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nasir.phonegap"
    android:installLocation="preferExternal" >

答案 6 :(得分: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

以下是/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

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

例如,

adb shell rm /data/app/com.brooklynmarathon.calendarapi2-1.apk

答案 7 :(得分:8)

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

$ adb shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M   209M    14M   4096
....

/data

上的可用空间过低
$ adb shell du /data
...
409870  /data/data/com.android.providers.media
...

几乎所有人都被单个应用程序消耗了!它是系统应用程序,所以我认为最好不要删除它。相反,我清理了应用数据。

$ adb shell pm clear com.android.providers.media
Success
$ adb shell df
Filesystem             Size   Used   Free   Blksize
...
/data                  224M     8M   215M   4096
...

磁盘已清除且应用已成功安装。

答案 8 :(得分:6)

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

  • 您一直在使用物理设备(在我的情况下,三星Galaxy Ace),
  • 你连续几天都在发展,
  • 您的手机始终连接,白天和黑夜。
  • 几天后你就开始收到这个错误了,而且情况一直在恶化。
  • 没有其他答案适合您。
  • 你像我一样辞职......

然后,试试这个:

  • 当您不工作时拔下手机!

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

这个错误是否可能是由于某些与电池相关的硬件造成的?这种方式仍然让人觉得奇怪,但现在我不断地断开手机(当晚)并且问题没有恢复。

答案 9 :(得分:5)

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

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

答案 10 :(得分:5)

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

症状:有些应用没有安装,说没有空间 实际上,内部和外部存储空间都充足! 解决方案:默认情况下禁用外部安装。

通过defaut设置外部安装:

adb shell pm set-install-location 2

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

然后解决方案是

adb shell pm set-install-location 0

或者

adb shell pm set-install-location 1

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

答案 11 :(得分:4)

在Eclipse中,

Run -- > Debug Configurations --> Select "target",并选择要启动的首选模拟器目标。

然后在“其他模拟器命令行选项”下面添加:

  

-partition-size 1024

然后关闭模拟器并单击调试图标,这将启动您选择的首选模拟器。

enter image description here

希望它有助于......!

答案 12 :(得分:3)

由于此问题仍然存在,我认为我会为RacZo's answer添加一些内容以用于开发目的。如果您没有使用Eclipse插件,或者由于某种原因您没有源,但只有.apk,则可以在启动模拟器时使用相同的选项从命令行增加分区大小:

emulator -avd <emulator name> -partition-size 1024

据我所知,developer.android.com上没有记录此选项,所以我想我会在这里发布,以便人们可以找到这个解决方案。

答案 13 :(得分:3)

我使用新的Nexus 4和使用Adobe AIR构建的APK遇到了这个问题。我的清单中已经有了android:installLocation =“preferExternal”。我注意到我还使用adb install选项(在共享大容量存储上安装软件包,如sdcard)调用-s,这看起来有些过分。

-s删除adb install标记为我解决了问题。

答案 14 :(得分:2)

当我尝试在完整ROM更新后使用SD card shell在ADB目录中批量安装约50个应用时,我遇到了同样的错误:

for x in *.apk; do pm install -r $x; done

其中一些已安装,但很多都因错误INSTALL_FAILED_INSUFFICIENT_STORAGE而失败。所有失败的应用程序都有名称空间。我批量重命名并再次尝试。这一切都奏效了。我没有重启或任何东西。可能这不是你们所面临的问题,但这可能有助于我找到与我面临同样问题的人。

答案 15 :(得分:2)

我遇到了这个问题,因为我在使用Sideload Wonder Machine将应用程序安装到我的实际手机时收到此错误。我发现问题是我在/ payload目录中有多个.apk文件。我认为这是支持的东西,但当我删除除了一个.apk以外的所有内容时,错误就消失了。

答案 16 :(得分:2)

如果您使用的是真实设备,则只需耗尽内存。只需转到Android设置 - &gt; 应用程序,并将某些应用程序移至SD卡或卸载某些应用程序。

如果您使用的是模拟器,请参阅RacZo's answer

答案 17 :(得分:2)

只需从命令行从模拟器卸载应用程序,或转到设置并卸载应用程序。这将阻止错误的发生。

答案 18 :(得分:2)

我尝试了以下内容:

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

检查它是否与您的工作原理相同。

答案 19 :(得分:1)

如果您在模拟器上运行应用程序,并且此问题仍然存在,请检查您的通知管理器。如果它显示一个图标并显示“手机内存已满”,则表示您已在模拟器上安装了这么多应用程序。从“设置&gt;&gt;管理应用程序&gt;&gt;选择应用程序&gt;&gt;卸载”卸载当前不需要的多个应用程序。 那套。
现在重新运行程序。

答案 20 :(得分:1)

确保在尝试运行模拟器时未将Android设备与USB连接

答案 21 :(得分:1)

解决方案很简单。

打开AVD Manager。编辑您的AVD。

在硬件部分中,有一些属性在其右侧列出了“新建...”和“删除”。

按新。选择数据分区大小。设置为“512MB”(需要MB)。而且你已经完成了。如果仍然遇到问题,请使用相同的方法增加系统和缓存分区。

这一切都记录在这里: http://developer.android.com/guide/developing/devices/managing-avds.html

答案 22 :(得分:1)

今天我使用手机进行Eclipse测试/调试时出现此错误。

我的错误是我在应用程序名称中使用了挪威特殊字符(“æ”,“ø”,“å”)。当我重构应用程序名称(使用“o”而不是“ø”)时,应用程序安装正确..

可能不是你的问题,但可能会注意到其他人也会遇到同样的错误。

答案 23 :(得分:1)

模拟器解决方案

打开您的.Android目录。通常在您的主目录中。然后转到avd,然后打开具有您想要更改的avd名称的目录。

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

disk.dataPartition.size=1024

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

答案 24 :(得分:1)

在尝试了这个线程中的所有其他内容之后,我发现我自己的问题是因为.apk文件的路径太长了。所以我cd到了.apk所在的目录并做了:

cd /Very/Long/Path/To/Package/
adb install mypackage.apk

而不是

adb install /Very/Long/Path/To/Package/mypackage.apk

它工作......安装得很好。

想到这可能会帮助别人。

答案 25 :(得分:0)

我手机上没有root访问权限,而且我的应用程序无法安装在SD卡上。 /data/上有15 MB的空间,我的应用程序不到2 MB。

我有一段时间了;清理Eclipse项目并重新启动手机,但最终停止工作(可能在更新后)。

清理我的应用程序缓存已经解决了我的问题,并且不需要重新启动手机或卸载应用程序。

市场上有一些应用程序可用于一次清除多个应用程序的缓存。搜索“干净”。

答案 26 :(得分:0)

在我的情况下,通过在 eclipse.ini

中更改 -Xmx768m 的值来增加eclipse的扩展内存。

答案 27 :(得分:0)

我最终从设备上卸载了应用程序,然后在Eclipse中重新安装它。这是我经常使用我的设备上的问题,但今天我从开发中得到了这个消息。

答案 28 :(得分:0)

有点耗时,但它应该适用于任何情况:

通过USB连接并启用USB存储。将APK文件从本地版本复制到手机(您可能需要在应用程序设置下允许未知来源)。

然后点击APK文件,Android将安装它。就像我说的那样,这很费时间,但它可能比不时重启更快。

答案 29 :(得分:0)

我也遇到了同样的问题,我做了“工厂数据重置”,之后工作正常。

答案 30 :(得分:0)

解决方法:

在没有android:installLocation="preferExternal"的情况下编译为2.1。

OK?

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

这仍将安装在小于8的SDK版本上(忽略XML标记)。