解决Android上的INSTALL_FAILED_INSUFFICIENT_STORAGE错误

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"

这更像是一种创可贴,而不是补救措施,如果你想要完成的应用程序安装在设备的内部内存中,这可能不太理想。但它至少会让开发过程不那么令人沮丧。

522439 次浏览

处理:

编译为2.1,不使用android:installLocation="preferExternal"

好吗?

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

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

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

  1. 右键单击Android项目的根目录,选择“运行为”,然后选择“运行配置”。在左侧树中找到“Android Application”节点,然后选择你的项目,在窗口右侧的“Target”选项卡中找到“附加模拟器命令行选项”字段(有时你需要让窗口变大),最后粘贴“-partition-size 1024”在那里。单击Apply,然后单击Run以使用模拟器。

  2. 转到Eclipse's Preferences,然后在" Default emulator option "字段中选择" Launch " Add " -partition-size 1024 "。单击“应用”并像往常一样使用模拟器。

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

我也遇到了同样的问题,我做了一个“工厂数据重置”,在那之后它工作得很好。

如果你使用的是真正的设备,你只是耗尽了内部内存。只需转到Android设置-> 应用程序,并移动一些应用程序到SD卡或卸载一些应用程序。

如果您正在使用模拟器,请参阅RacZo的回答

模拟器上的一个相关问题是当/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

谢谢你提出这个问题。我有一些额外的见解,可能会帮助一些开发人员。

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

因此,似乎调试我的5 MB应用程序需要更多的20 MB的空间在/data,此外,每次我调试我的应用程序都有一些泄露。

所以我做了“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。

或者,如果确实存在一些(隐藏的)空间问题,您至少可以在/data中执行ls -a -l -R来查看所有空间的去向。

我的手机没有root权限,也没有准备好把我的应用程序安装在SD卡上。/data/上有15 MB的可用空间,我的应用程序在2 MB以下。

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

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

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

三星Galaxy Ace在其规范中宣传了158 MB的内部存储,但核心应用程序和服务消耗了大约110 MB的内部存储(我使用设备上的任务管理器来检查这一点)。我的应用是52 MB,因为它有很多资产。一旦我删除了其中一些小于45 MB的文件,应用程序就可以顺利安装了。尽管我只安装了一个应用程序,但设备仍在提醒我内部存储空间快满了,我应该卸载一些应用程序。

在安装了。apk包的发布版本,然后卸载它之后,我的设备显示了99 MB的可用空间,所以可能是调试信息把设备弄得乱七八糟。看到# EYZ0。

当我尝试在完整的ROM更新后使用亚洲开发银行 shell在SD卡目录中批量安装大约50个应用程序时,我遇到了同样的错误:

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

其中一些已经安装,但许多都失败了,出现了INSTALL_FAILED_INSUFFICIENT_STORAGE错误。所有失败的应用程序名称中都有空格。我批量重命名它们,并再次尝试。这次一切都成功了。我没做重启什么的。也许这不是你们面临的问题,但这可能会帮助那些和我面临同样问题的人。

我尝试了以下方法:

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

检查它对你是否同样有效。

由于这个问题仍然存在,出于开发目的,我想我应该在RacZo的回答中添加一些东西。如果你没有使用Eclipse插件,或者因为任何原因你没有源代码,而只有.apk,你可以在启动模拟器时使用相同的选项从命令行增加分区大小:

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

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

有点耗时,但它应该在任何情况下工作:

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

然后点击APK文件,安卓将安装它。就像我说的,这很耗时,但它可能比偶尔重新启动更快。

模拟器解决方案

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

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

# EYZ0

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

在我的例子中,通过增加eclipse的扩展内存,通过改变eclipse.ini中的-Xmx768m值来解决这个问题

解决办法很简单。

打开AVD管理器。编辑你的AVD。

在下面的硬件部分,有一些属性列在“New…”和“Delete”的右边。

新媒体。选择数据分区大小。设置为“512MB”(必须为MB)。做完了。如果您仍然遇到问题,请使用相同的方法增加您的系统和缓存分区。

全都记录在这里: # EYZ0 < / p >

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

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

在运行模拟器时,请确保没有将android设备与usb连接

如果您正在模拟器上运行应用程序,并且如果此问题仍然存在,请检查通知管理器。如果它显示一个图标,并通知“手机内存已满”,这意味着您已经在模拟器上安装了如此多的应用程序。
.从“设置>>管理应用程序>>选择应用程序>>卸载”中卸载当前不想要的多个应用程序 集。< br > 现在重新运行程序

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

  • 你一直在使用物理设备(对我来说,是三星Galaxy Ace)工作,
  • 你这几天都在发育,
  • 你的手机一直都是联网的,日日夜夜。
  • 几天后就开始出现这个错误,而且情况越来越糟。
  • 没有一个的其他答案对你有用。
  • 你和我一样无可奈何……

然后,试试这个:

  • 不工作的时候拔掉手机插头!

我把手机插头拔掉,让它休息一整天。我的电池没电了。在此之后,我重新连接它并再次开始调试。这次一切都很正常!我是说真的真的很好,就像以前一样。

是否可能这个错误可能是由于一些电池相关硬件?这样想仍然感觉很奇怪,但现在我时不时地断开手机连接(甚至是晚上),问题没有复发。

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

以下方法会有所帮助:

  • 打开设备的shell

    adb shell
    
  • Navigate to the temp directory where the incoming APK is first copied

    cd /data/local/tmp
    
  • List the available files and delete as desired

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

This has been reliable for me so far on an actual device.


EDIT: This turned out to be not as reliable a solution as the one above.

I tried a number of the solutions. Nothing really helped. Finally I found an app called SD Maid. That helped.

It says the functionality is limited on unrooted devices. Mine is rooted so it would be good to see hear from people effective it is in those scenarios and if it was just a fluke that it worked for me (it is an unpredictable problem anyway).

NOTE: I have nothing to do with the app. Just found it with a search.

今天,当我用我的手机进行Eclipse测试/调试时,我得到了这个错误。

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

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

回复这个话题的第一篇文章…

症状:某些应用程序不安装,说没有空间 实际上,内部和外部存储都有足够的空闲空间!! 处理步骤:默认关闭外部安装

默认设置外部安装:

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

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

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

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

而不是

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

这招奏效了……安装得很好。

只是觉得这能帮到别人。

我在我的新Nexus 4和用Adobe AIR构建的APK上遇到了这个问题。我已经有android:installLocation="preferExternal"在我的清单。我注意到我还用-s选项调用了adb install(在共享大容量存储上安装包,如sdcard.),这似乎有点多余。

adb install中删除-s标志为我修复了这个问题。

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

这件事发生在我身上后,我对目前的反应不满意,我去工作了 试图从AOSP源代码中找出答案。我已经找到了真正的的解决方案

解释

首先,简单介绍一下安卓安装和更新的背景知识

第一次安装应用程序:

  1. APK文件保存为

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

When the app is to be updated:

  1. The updated APK file is saved as:

    /data/app/<full.package.name>-2.apk (2.apk)
    
  2. The first version (1.apk) gets deleted.

On our next update(s):

  1. The new APK is saved as (1.apk) and (2.apk) is deleted (Repeat forever).

 

The issue that most of us are having happens when the application is updated, but deleting of the old APK fails. Which itself does not yet cause the update to fail, but it does cause there to be two APK files in /data/app.

The next time you try to update the app the system can't move its temporary file because neither (1.apk) nor (2.apk) are empty. Since File#renameTo(File) doesn't throw an exception but instead returns a boolean PackageManager, it doesn't have any way to tell why it returns INSTALL_FAILED_INSUFFICIENT_STORAGE even though the failure had nothing to do with the amount of free space.

Solution

Run:

adb shell "pm uninstall <full.packge.name>"
adb shell "rm -rf /data/app/<full.package.name>-*"

卸载应用程序

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

/数据/应用/ & lt; full.package.name apk > -1.

/数据/应用/ & lt; full.package.name apk > -2.

确保没有其他东西以类似的方式阻碍以后的安装。在我的例子中,我有一个/data/app-lib/<full.package.name>-1目录徘徊!在本例中,安装到SD卡和随后移动到内部内存都是有效的。(创建/data/app-lib/<full.package.name>而没有-1结尾。)

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

  • 安装到外部存储的代码有很大不同,但没有相同的问题

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

  • 当出现此错误时,模拟器中的空闲空间数量并不真正相关

我已经解决了这个问题,包括在AndroidManifest.xml文件中的<manifest>标签内的android:installLocation="auto"

在我的情况下,失败是由com.android.providers.media应用程序引起的。我在x86安卓模拟器上遇到了这个问题。我做了什么:

$ 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
...

磁盘已被清除,应用程序安装成功。