解决Android上的INSTALL_FAILED_INSUFFICIENT_STORAGE错误

INSTALL_FAILED_INSUFFICIENT_STORAGE错误是每个Android开发者生活的祸根。 无论应用程序大小,还是有多less存储空间,都会发生这种情况。 重新启动目标设备可以简化问题,但很快就会恢复。 有几百(如果不是数千)留言板的post被问到为什么会出现这个问题,但是Google的人却对这个问题感到沮丧。

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

这更像是一个创可贴,而不是一个修补程序,如果您想要将完成的应用程序安装到设备的内存中,这可能不是理想之选。 但至less会使开发过程不那么令人沮丧。

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

在发生这种事情之后,我并不满意目前的反应,于是我试着从AOSP源头中找出答案。 我find了一个真正的解决scheme。

说明

首先,介绍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失败。 这本身并不会导致更新失败,但确实会导致/data/app有两个APK文件。

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

跑:

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

要么

卸载应用程序

使用你最喜欢的方法删除两个

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

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

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

为什么其他“解决scheme”工作

  • 安装到外部存储器的代码显着不同,这并不存在相同的问题

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

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

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

  1. 右键单击Android项目的根目录,进入“运行方式”,然后进入“运行configuration…”。 在左边的树中find“Android Application”节点,然后select你的项目,并进入窗口右侧的“目标”标签,查看“Additional Emulator Command Line Options”字段将需要使窗口更大),最后粘贴“分区大小1024”在那里。 单击应用,然后运行以使用您的模拟器。

  2. 转到Eclipse的首选项,然后select“启动”在“默认模拟器选项”字段中添加“-partition-size 1024”。 点击“应用”,像往常一样使用你的模拟器。

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

我正在设备上debugging我的应用程序(而不是仿真器)。 该设备有21 MB的免费/data (由“df”做“adbshell”时显示),我的应用程序只有5 MB。 但是,我发现如果我删除了设备上的其他应用程序(无需重新启动手机或重新启动adbd),INSTALL_FAILED_INSUFFICIENT_STORAGE将消失一段时间,然后再回来。

因此,debugging我的5 MB应用程序似乎需要更多像/data 20 MB空间,此外,每次debugging我的应用程序时都会有漏洞。

所以我做了“adbshell”,并列出了整个/data目录

 cd /data ls -a -l -R 

我看着5000线的输出,看看所有的空间在哪里。

在设备的/data/klog目录中以几个月前的debugging会话的旧日志文件的forms发现了大量的浪费空间

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

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

到目前为止,我还没有得到INSTALL_FAILED_INSUFFICIENT_STORAGE多次运行后。 让我们希望这是真正的问题,虽然OP表示他的设备有足够的空间(但没有说多less)。

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

或者,你至less可以做ls -a -l -R in /data来查看你的空间在哪里,如果确实存在一些(隐藏的)空间问题。

我已经添加了一行到应用程序的清单文件,这是android:installLocation="preferExternal" 。 通过使用这条线强制安装应用程序到外部存储。 看下面的例子,

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

以下内容有助于:

  • 打开设备的shell

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

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

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

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


编辑:这原来是不是像上面的一个可靠的解决scheme。

我尝试了一些解决scheme。 没有什么帮助。 最后,我find了一个名为SD女佣的应用程序。 这有帮助。

它说这个function在无根设备上是有限的。 我的根源是好的,所以从这些情况下看到有效的信息是很好的,如果它只是一种偶然的事情(无论如何这是一个不可预知的问题)。

注:我没有任何关系的应用程序。 刚刚find它与search。

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

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

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

  • 你一直在使用物理设备(在我的情况下,三星Galaxy Ace),
  • 你已经连续发展了几天,
  • 你的手机一直昼夜连接着
  • 几天之后,你开始出现这个错误,而且情况越来越糟糕。
  • 没有其他答案为你工作。
  • 你和我一样辞职

然后,试试这个:

  • 当你不工作的时候拔掉你的电话!

我拔掉了手机,让它rest了整整一天。 我的电池有点损坏。 之后,我重新连接并重新开始debugging。 一切都很好,这次! 我的意思是非常好,就像以前一样。

有可能这个错误可能是由于一些电池相关的硬件的东西 ? 这种方式仍然感到奇怪,但现在我一直不停地断开我的手机(和整夜),问题没有回来。

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

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

/data上的可用空间太less

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

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

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

症状:有些应用程序不安装,说没有空间,真正的内部和外部存储空间有足够的空间! 解决scheme:默认禁用外部安装。

通过以下方式设置外部安装:

 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 

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

在安装.apk软件包的发布版本并卸载后,我的设备显示99 MB的可用空间,因此它可能是debugging信息使设备混乱。 见路易斯·塞普里尼的答案 。

在Eclipse中,

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

然后在下面的“附加的模拟器命令行选项”中join:

分区大小1024

然后closures模拟器并点击debugging图标,它将启动您select的首选模拟器。

在这里输入图像描述

希望它有助于…!

我用新的Nexus 4和用Adobe AIR构build的APK遇到了这个问题。 我已经在我的清单中有android:installLocation =“preferExternal”。 我注意到我还打电话adb install-s选项(安装软件包在共享海量存储,如SD卡。)这似乎是矫枉过正。

adb install删除-s标志为我解决了这个问题。

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

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

如果你使用的是真实的设备,那么你只是用尽了内存。 只需进入Android设置 – > 应用程序 ,并将一些应用程序移动到SD卡或卸载一些应用程序。

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

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

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

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

仿真器解决scheme

打开你的.Android目录。 通常在您的主目录。 然后去avd ,然后打开你想改变的avd名称的目录。

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

disk.dataPartition.size=1024

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

解决scheme很简单。

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

在硬件部分,有些属性在其右侧列出了“新build…”和“删除”。

按新build。 select数据分区大小。 设置为“512MB”(MB是必需的)。 你完成了。 如果仍然遇到问题,请使用相同的方法增加您的系统和caching分区。

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

确保在尝试运行模拟器时不要将您的android设备与usb连接

如果您正在模拟器上运行应用程序,并且如果问题仍然存在,请检查您的通知pipe理器。 如果显示“手机内存已满”的图标和通知,则表示您已经在模拟器上安装了如此多的应用程序。 从“设置>>pipe理应用程序>>select应用程序>>卸载”卸载当前不需要的多个应用程序。
该集。
现在重新运行该程序。

我今天在使用手机进行Eclipsetesting/debugging时遇到了这个错误。

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

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

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

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

代替

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

它的工作…安装得很好。

只是认为这可能会帮助别人。

我尝试了以下内容:

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

检查它是否与你一样。

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

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

据我所知,这个选项没有logging在developer.android.com,所以我想我会在这里发布,所以人们可能会find这个解决scheme。

在我的情况下,通过增加eclipse的扩展内存,通过改变eclipse.ini中-Xmx768m的值来修复

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

解决方法:

编译为2.1没有android:installLocation="preferExternal"

好?

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

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

我也面临同样的问题,我做了一个“工厂数据重置”,并在那之后正常工作。

我的手机没有root用户权限,因此我的应用程序无法安装到SD卡上。 /data/上有15 MB空间可用,我的应用程序在2 MB以下。

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

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

市场上有一些应用程序可以用来一次清除多个应用程序的caching。 search“干净”。