首页 文章

Android上的INSTALL_FAILED_INSUFFICIENT_STORAGE错误解决方案[关闭]

提问于
浏览
459

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

有一个简单的解决方法 . 如果您的测试设备运行的是Android 2.2或更高版本,则将 android:installLocation 属性添加到应用程序的清单文件中,其值为 "preferExternal" . 这将强制将应用程序安装在设备's external storage, such as a phone'的SD卡上 .

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.andrewsmith.android.darkness"
          android:installLocation="preferExternal"

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

30 回答

  • 14

    这只是 temporary workaround 而不是真正的修复 .

    在我遇到这种情况并且对目前的反应不满意之后,我开始尝试从AOSP来源解决这个问题 . 我找到了 REAL 解决方案 .

    解释

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

    第一次安装应用程序:APK文件保存为/data/app/-1.apk(1.apk)当要更新应用程序时:更新的APK文件保存为:/ data / app / -2.apk(2.apk)第一个版本(1.apk)被删除 . 在我们的下一次更新中:新APK保存为(1.apk),(2.apk)被删除(永远重复) .

    当应用程序更新时,我们大多数人都会遇到这个问题,但删除旧的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>-*"
    

    OR

    卸载应用程序

    使用您喜欢的方法删除 BOTH

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

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

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

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

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

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

  • 1

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

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

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

  • 1

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

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

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

    所以我做了"adb shell"并列出了ENTIRE /data 目录

    cd /data
    ls -a -l -R
    

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

    我从几个月的调试会话中以旧日志文件的形式发现了 vast quantities of wasted space on my device in the /data/klog directory .

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

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

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

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

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

  • 6

    以下有助于:

    • 打开设备的shell
    adb shell
    
    • 导航到首次复制传入APK的临时目录
    cd /data/local/tmp
    
    • 列出可用文件并根据需要删除
    rm * // use at your own risk, good practice to list files first
    

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


    EDIT: 事实证明,这不像上面那样可靠 .

    我尝试了很多解决方案 . 什么都没有帮助 . 最后我找到了一个名为SD Maid的应用程序 . 这有帮助 .

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

    NOTE: 我与该应用程序无关 . 只是通过搜索找到它 .

  • 4

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

  • 2

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

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

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

    在我的情况下,失败是由 com.android.providers.media app引起的 . 我在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
    ...
    

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

  • 5

    我觉得写这个有点奇怪,但我可以 some cases some cases (它对我有用) . 如果您有以下症状:

    • 你一直在使用物理设备(在我的情况下,三星Galaxy Ace),

    • 你连续几天都在发展,

    • Your phone was connected all the time ,白天黑夜 .

    • 几天后你开始收到这个错误,而且情况一直在恶化 .

    • None 其他答案适合您 .

    • 你像我一样辞职......

    然后,试试这个:

    • 不工作时拔下手机!

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

    这个错误是否可能是由某些 battery-related hardware stuff 引起的?这种方式仍然让人觉得奇怪,但是现在我时不时地断开手机(以及夜晚)并且问题没有恢复 .

  • 0

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

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

    通过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
    
  • 1

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

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

  • 3

    在Eclipse中,

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

    然后在“额外的模拟器命令行选项”下面添加:

    • 分区大小1024

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

    enter image description here

    希望能帮助到你...!

  • 146

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

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

  • 16

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

  • 7

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

  • 0

    如果你're using a real device, you'已经耗尽了内存 . 只需转到Android设置 - >应用程序,将一些应用程序移动到SD卡或卸载一些应用程序 .

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

  • 99

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

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

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

  • 2

    Emulator solution

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

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

    disk.dataPartition.size=1024

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

  • 0

    The solution is simple.

    打开AVD Manager . 编辑你的AVD .

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

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

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

  • 2

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

  • 8

    如果您在模拟器上运行应用程序,并且此问题仍然存在,请检查通知管理器 . 如果它显示有关"Phone memory is full"的图标和通知,则表示您已在模拟器上安装了这么多应用程序 . 从"Settings >> Manage Application >> Select Application >> Uninstall"卸载当前不需要的多个应用程序 .
    该集 .
    现在重新运行该程序 .

  • 26

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

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

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

  • 0

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

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

    代替

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

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

    只是觉得这可能会帮助别人 .

  • 5

    我尝试了以下方法:

    • 重新启动了我的设备

    • 已删除之前的APK

    • 重建我的APK

    • 在设备中卸载我以前的副本

    • 重新安装

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

  • 2

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

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

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

  • 1

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

  • 1

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

  • 1

    解决方法:

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

    好?

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

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

  • 0

    我也面临同样的问题,我做了“工厂数据重置”,之后它运行良好 .

  • 1

    我的手机上没有root访问权限,并且我没有准备好将我的应用程序安装在SD卡上 . /data/ 提供15 MB的空间我的申请不到2 MB .

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

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

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

相关问题