安卓设备上出现“INSTALL_FAILED_INSUFFICIENT_STORAGE”错误的解决方案

630
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"

这更像是一种权宜之计而不是一个解决方案,如果你希望你的应用程序最终安装在设备的内部存储上,这可能不是理想的选择。但至少它会使开发过程更加顺畅。


3
@AndrewSmith:您能回答一下您的问题吗?我在进行审核时偶然发现了这个问题,因为它被标记为“不是一个真正的问题”。尽管该标记基本上是正确的,但如果解决方案丢失将是一件遗憾的事情。 - eckes
首先要做的是:找出问题是否实际上与空间有关!请参阅我的答案中的详细信息。 - Robert Siemer
对我来说,我不得不重新启动我的电脑 - Mac OS X Mavericks - 然后错误消失了。重启eclipse是不够的。与此相关的是,我注意到我的VirtualBox/Genymotion也失败了,直到我重新启动了电脑。 - Gene Bo
没有任何建议适用于我的设备。看起来像Android也像任何文件系统一样保留了固定百分比的可用空间。我猜大约是10%,但我无法确认。我已经快速搜索了一些配置项的源代码,但没有成功。有人知道吗? - ForeverLearning
3
我在安卓模拟器上遇到了这个错误。在安卓工作室的AVD管理器中,有一个选项可以清除特定设备上的数据。这解决了我的问题。 - Aseem
显示剩余13条评论
30个回答

231
这只是一个临时解决方案,而不是真正的修复。
在我遇到这个问题并对当前的答复不满意后,我开始从AOSP源代码中尝试找出解决方法。我已经找到了一个真正的解决方案。
解释:
首先,简单介绍一下Android如何安装和更新。

The first time an app is installed:

  1. The APK file is saved as

    /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).

 

大多数人遇到的问题是应用程序更新后,无法删除旧的APK文件。这本身不会导致更新失败,但会导致在 /data/app 中存在两个APK文件。

下次尝试更新应用程序时,系统无法移动其临时文件,因为 (1.apk) 和 (2.apk) 都不为空。由于 File#renameTo(File) 不会抛出异常,而是返回一个 boolean 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卡是有效的,而且移动到内部存储器也是如此。(创建/data/app-lib/<full.package.name>,不包含-1结尾。)

为什么其他“解决方案”会起作用

  • 安装到外部存储的代码与内部存储的代码显著不同,因此不存在相同的问题。

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

  • 模拟器中的可用空间大小并不真正相关,当出现此错误时。


11
@Msmit1993,如果您的设备没有root权限,则无法访问数据目录。拥有SDK和ADB也没有用。 - Stan
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将以上内容翻译为中文:函数 fix_app 可以卸载并删除 Android 设备中指定应用程序的所有数据和库文件。使用时需要传入待卸载应用程序的包名参数。具体操作包括三个步骤:首先通过 ADB shell 指令卸载应用程序,然后删除 /data/app/ 目录下所有以包名开头的应用程序数据文件,最后以超级用户权限删除 /data/app-lib/ 目录下所有以包名开头的库文件。例如,执行 $ fix_app com.facebook.katana 将卸载并删除 Facebook 应用程序及其数据和库文件。 - gnmerritt
3
我需要清理/data/local/tmp - 18446744073709551615
1
在我的情况下,我必须使用以下命令安装应用程序:adb install -f ...否则它会拒绝安装,即使我在内部存储器中有1.7GB的可用空间;可能是因为我没有SD卡。 但是使用-f选项,至少它可以工作,我不知道为什么... - xtof54
11
现在,Android Studio的AVD管理器有一个“擦除数据”的选项,当你点击“操作”下拉菜单时,它似乎也可以解决这个问题。 - Renato
显示剩余16条评论

123
您需要增加Android模拟器的内存容量。有两种方法可以实现:
  1. 右键单击Android项目的根目录,选择“运行为”,然后选择“运行配置...”。在左侧的树形结构中找到“Android应用程序”节点,然后选择您的项目并转到右侧窗口的“目标”选项卡,在下方查找“其他模拟器命令行选项”字段(有时您需要扩大窗口),最后在那里粘贴“-partition-size 1024”。单击“应用”然后运行您的模拟器。

  2. 前往Eclipse首选项,然后选择“启动”,将“-partition-size 1024”添加到“默认模拟器选项”字段中。单击“应用”并像往常一样使用您的模拟器。


114
奥斯卡,你假设这是在模拟器上发生的。而在我的情况下,这是在实际设备上发生的,这个答案没有解决这个问题。 - Jeff Axelrod
1
在选项1上迷失了 - 我在这个位置的eclipse中没有“目标”选项卡。 - Ted Betz
第二个选项对我有用,感谢@RacZo的好帖子。 - DD.
@JeffAxelrod 尝试这个解决方案。我不知道它是否有效,因为我通过删除应用程序的旧版本来解决了我的问题,但这是一个建议。 https://dev59.com/nmw05IYBdhLWcg3wnjEk#7133508 - arniotaki
1
如何在Android Studio 4.2.1中设置? - Venus
显示剩余2条评论

30

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

我正在调试我的应用程序(不是模拟器)在一个设备上。设备在/data上有21MB可用空间(在执行"adb shell"时通过"df"命令显示),而我的应用程序只有5MB。但是,我发现如果我删除设备上的其他应用程序(而不重新启动手机或adbd),"INSTALL_FAILED_INSUFFICIENT_STORAGE"错误就会消失,但过一段时间后又会出现。

因此,似乎调试我的5MB应用程序需要大约20MB的/data空间,并且每次调试应用程序时都会出现泄漏。

所以我使用了"adb shell"并列出了整个/data目录:

cd /data
ls -a -l -R

我查看了5000行输出,查明了设备上大量浪费空间的原因在于/data/klog目录下的旧日志文件,这些文件是几个月前调试会话留下的,不是我的日志文件。我删除了它们,立即腾出了58 MB的空间,在设置应用程序中没有归属到任何特定应用程序。由于我的设备很小,所以58 MB非常重要(约40%)。迄今为止,我已经多次运行后没有再次收到INSTALL_FAILED_INSUFFICIENT_STORAGE错误消息。希望那是真正的问题,尽管OP表示他的设备有足够的空间(但没有说有多少空间)。

希望您也可以通过定期删除/data/klog/*来避免INSTALL_FAILED_INSUFFICIENT_STORAGE错误发生。

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


26
非root手机该怎么做?我无法访问数据目录。顺便说一下,很棒的文章,加1。 - Rich
1
谢谢提供信息。顺便说一下,在Unix中,您可以合并标志,使ls命令变为ls -alR - mharper
1
使用 root 权限执行以下操作: #su #du /data | sort -g以大小顺序获取文件夹/文件列表 - JuanMa Cuevas
@JuanMaCuevas du仅列出文件夹。 - naXa stands with Ukraine
@Rich,尝试下载第三方应用程序Astro文件管理器。它非常受欢迎,并可让您访问手机上的文件。https://play.google.com/store/apps/details?id=com.metago.astro&hl=en - Azurespot
@rich 我的设备没有被root,但我成功删除了/data/log中的大部分日志(klog并不存在)。 - Fafaman

29
以下内容有助于:
  • 打开设备的shell

adb shell
  • 导航至临时目录,该目录是最初复制传入APK的位置

  • cd /data/local/tmp
    
    列出可用文件并根据需要进行删除。
    rm * // use at your own risk, good practice to list files first
    

    这对我在实际设备上一直很可靠。


    编辑:结果这个解决方案并不像上面那个那么可靠。

    我尝试了几个解决方案,但都没什么帮助。最后我找到了一个叫做SD Maid的应用程序。它很有用。

    它说未经root处理的设备功能有限。我的设备已root,因此希望能听听其他人在这些情况下有效的使用方法以及它是否只是偶然运行成功(毕竟这是一个不可预测的问题)。

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


    它帮助了我。我的一些旧应用程序存储在tmp文件夹中。在我移除它们之后,它运行良好。 - Mahendran Sakkarai

    29
    我已经解决了这个问题,方法是在AndroidManifest.xml文件的标签中包含android:installLocation="auto"

    确实有效。谢谢。 - Teddy
    这是唯一在真实设备上对我有效的修复方法。谢谢。 - Shah Abaz Khan
    简单而有效的工作。谢谢。 - brahmy adigopula
    我添加了这些代码,但仍然出现以下错误:Error: ADB exited with exit code 1 adb: failed to install build\app\outputs\apk\app.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] Error launching application on Android SDK built for x86. - Husna
    2
    谢谢,它有效了!但是你能解释一下为什么我们需要这样做吗?感谢帮助! - thechargedneutron
    显示剩余2条评论

    16

    我向应用程序的清单文件中添加了一行代码,即android:installLocation="preferExternal"。使用此代码可以强制安装应用程序到外部存储器中。请参见以下示例:

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

    12
    我尝试了以下操作:
    • 重启设备
    • 删除之前的 APK
    • 重新构建我的 APK
    • 卸载设备中的旧版本
    • 重新安装
    请确认是否对您有效。

    5
    是的,在尝试了此页面上的几种解决方案后,重新启动设备是唯一有效的方法。 - Sulea Cosmin
    重启设备可以解决问题 :) - cinobili19

    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
    

    2
    1. 运行 "adb shell"
    2. 进入data目录中的每个子目录,并找到那些有大型无用文件的目录。
    3. 使用 "rm (filename)" 命令删除它们。
    4. 我经常遇到的问题是类似于 "ApiDemos" 和 "dalvik-cache" 的垃圾文件(直接删除该目录下的所有内容)。
    - Adam

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

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


    这是唯一对我起作用的解决方案。花了2个小时! :) - Ruchir Baronia
    对我来说,这个解决方案有效:https://youtu.be/6k0edzApQXU - Zalek Bloom

    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
    

    我开始认为这部手机的内部存储已经坏了,但将安装位置设置为1解决了“空间不足”的问题。谢谢! - Wodin

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接