575

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"

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

4

31 回答 31

208

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

在我遇到这种情况并且对当前的响应不满意后,我开始努力从 AOSP 源中找出答案。我找到了一个真正的解决方案。

解释

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

首次安装应用程序时:

  1. APK文件保存为

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

当应用程序要更新时:

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

    /data/app/<full.package.name>-2.apk (2.apk)
    
  2. 第一个版本 (1.apk) 被删除。

在我们的下一次更新中:

  1. 新的 APK 保存为 (1.apk) 并且 (2.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>-*"

或者

卸载应用程序

使用您最喜欢的方法删除BOTH

/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。这就是为什么您可以重新安装一次,但不能更新它。

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

于 2013-08-12T06:23:04.880 回答
112

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

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

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

于 2011-04-11T04:24:54.513 回答
30

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

我正在设备(不是模拟器)上调试我的应用程序。该设备有 21 MB 可用空间/data(在执行“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 建议他的设备有足够的空间(但没有说多少)。

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

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

于 2011-11-14T18:51:59.837 回答
29

以下有帮助:

  • 打开设备的外壳

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

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

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

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


编辑:事实证明,这不像上述解决方案那样可靠。

我尝试了许多解决方案。没有任何帮助。最后我找到了一个名为SD Maid的应用程序。这有帮助。

它说该功能仅限于无根设备。我的是根深蒂固的,所以很高兴看到人们在这些情况下有效,如果它只是一个侥幸对我有用(无论如何这是一个不可预测的问题)。

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

于 2013-01-04T15:28:35.117 回答
22

我已经通过在 AndroidManifest.xml 文件中包含android:installLocation="auto"内部<manifest>标记来解决它。

于 2014-02-27T11:44:49.683 回答
16

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nasir.phonegap"
    android:installLocation="preferExternal" >
于 2012-04-06T10:31:22.993 回答
11

模拟器上的一个相关问题是分区中没有剩余空间/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
于 2011-11-12T15:47:53.017 回答
10

在我的情况下,失败是由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
...

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

于 2014-06-16T14:21:54.487 回答
8

回答这个主题的第一个帖子......

症状:有些应用程序没有安装,说没有空间,实际上内部和外部存储都有足够的可用空间!!!解决方法:默认禁用外部安装。

默认设置外部安装:

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
于 2013-03-23T11:20:05.333 回答
7

我尝试了以下方法:

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

检查它是否与您一样。

于 2012-01-03T07:22:36.113 回答
7

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

  • 你一直在使用物理设备(在我的例子中是三星 Galaxy Ace),
  • 你已经连续开发了几天,
  • 您的手机一直处于连接状态,无论白天还是黑夜。
  • 几天后您开始收到此错误,并且情况越来越糟。
  • 其他答案都不适合您。
  • 你和我一样辞职了...

然后,试试这个:

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

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

此错误是否可能是由于某些与电池相关的硬件问题?以这种方式思考仍然感觉很奇怪,但现在我时不时地(以及整晚)断开我的手机并且问题没有再次出现。

于 2012-06-09T18:16:39.783 回答
6

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

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

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

于 2012-01-20T17:58:32.430 回答
5

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

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

于 2011-12-01T15:30:44.843 回答
4

在日食中,

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

然后在“其他模拟器命令行选项”下方添加以下内容:

-分区大小 1024

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

在此处输入图像描述

希望能帮助到你...!

于 2012-07-17T07:29:24.473 回答
3

我在使用新的 Nexus 4 和使用 Adob​​e AIR 构建的 APK 时遇到了这个问题。我的清单中已经有了 android:installLocation="preferExternal" 。我注意到我也在调用选项(在共享大容量存储adb install-s安装包,例如 sdcard。)这似乎有点过分了。

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

于 2013-08-09T18:15:12.497 回答
3

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

于 2012-09-12T10:49:33.307 回答
2

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

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

其中一些已安装,但许多失败并出现错误 INSTALL_FAILED_INSUFFICIENT_STORAGE。所有失败的应用程序的名称中都有空格。我批量重命名它们并再次尝试。这次一切都奏效了。我没有做重启或任何事情。可能这不是你们面临的问题,但这可能有助于搜索与我遇到的相同问题的人。

于 2011-12-29T01:49:01.450 回答
2

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

于 2011-04-14T16:57:52.443 回答
2

如果您使用的是真实设备,那么您只是用完了内部存储器。只需转到 Android 设置 ->应用程序,然后将一些应用程序移动到 SD 卡或卸载一些应用程序。

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

于 2011-10-05T14:41:15.813 回答
2

解决方法:

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

好的?

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

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

于 2011-02-14T00:36:22.077 回答
2

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

于 2012-04-20T12:03:18.800 回答
2

模拟器解决方案

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

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

disk.dataPartition.size=1024

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

于 2012-02-09T20:02:17.793 回答
1

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

于 2012-04-23T12:19:21.317 回答
1

解决方案很简单。

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

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

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

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

于 2012-03-16T07:47:46.353 回答
1

我今天在使用手机进行 Eclipse 测试/调试时遇到了这个错误。

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

可能不是您的问题,但可能会引起其他人遇到相同错误的注意。

于 2013-02-16T20:44:56.457 回答
1

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

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

代替

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

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

只是认为这可能对其他人有帮助。

于 2013-06-08T00:46:50.567 回答
0

我的手机没有 root 访问权限,也没有准备好将我的应用程序安装在 SD 卡上。可用空间为 15 MB,/data/我的应用程序小于 2 MB。

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

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

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

于 2011-11-25T11:04:39.410 回答
0

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

于 2013-05-14T05:07:34.010 回答
0

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

于 2011-05-18T10:24:20.350 回答
0

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

于 2012-02-11T15:43:09.367 回答
-1

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

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

然后只需点击 APK 文件,Android就会安装它。就像我说的,这很耗时,但它可能比不时重启更快。

于 2012-02-04T18:51:43.910 回答