Решение для ошибки INSTALL_FAILED_INSUFFICIENT_STORAGE на Android

Ошибка 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"

Это скорее полоса, чем исправление, и это может быть не идеально, если вы хотите, чтобы готовое приложение устанавливалось на внутреннюю память устройства. Но это, по крайней мере, сделает процесс разработки намного менее расстраивающим.

Ответ 1

Это только временное обходное решение, а не реальное исправление.

После того, как это случится со мной и не доволен текущими ответами, я пошел на работу пытаясь понять это из источника 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 не выполняется. Которое само по себе еще не вызвало обновление, но оно вызывает два файла APK в /data/app.

В следующий раз, когда вы попытаетесь обновить приложение, система не сможет переместить свой временный файл, потому что ни (1.apk), ни (2.apk) пусты. Поскольку File # renameTo (File) не генерирует исключение, но вместо этого возвращает логический PackageManager, он не имеет никакого способа сказать, почему он возвращает INSTALL_FAILED_INSUFFICIENT_STORAGE, даже если ошибка не имеет ничего общего с количеством свободного места.

Решение

Run:

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, который задерживался! В этом случае работала установка на

Код для установки на внешнее хранилище существенно отличается, у которого нет одинаковых проблем.

Удаление приложения удаляет только одну версию файла APK в /data/app. Вот почему вы можете переустановить его один раз, но не обновлять его.

Объем свободного места в эмуляторе не имеет особого значения при возникновении этой ошибки.

Ответ 2

Вам нужно увеличить емкость памяти эмулятора Android. Для этого есть два способа:

  • Щелкните правой кнопкой мыши корень вашего проекта Android, перейдите в "Run As", а затем перейдите к "Run Configurations...". Найдите "Android-приложение" node в дереве слева, а затем выберите свой проект и перейдите на вкладку "Цель" в правой части окна, посмотрите вниз в поле "Дополнительные параметры командной строки эмулятора" (иногда вам нужно сделать окно больше) и, наконец, вставить "-разрядный размер 1024". Нажмите "Применить", а затем "Выполнить", чтобы использовать ваш эмулятор.

  • Перейдите в Настройки Eclipse, а затем выберите "Запустить" Добавить "-разрядный размер 1024" в опции "По умолчанию эмулятор" "поле. Нажмите "Применить" и используйте свой эмулятор, как обычно.

Ответ 3

Спасибо за сообщение этого вопроса. У меня есть некоторые дополнительные идеи, которые могут помочь некоторым разработчикам.

Я отлаживаю свое приложение на устройстве (а не в эмуляторе). Устройство имеет 21 MB бесплатно на /data (как показано "df" при выполнении "adb shell" ), а мое приложение - всего 5 Мб. Тем не менее, я обнаружил, что если бы я удалил другие приложения на устройстве (без перезагрузки телефона или перезапуска adbd), INSTALL_FAILED_INSUFFICIENT_STORAGE уйдет некоторое время, а затем вернется.

Итак, кажется, что отладка моего 5-мегабайтного приложения требует больше, чем 20 Мб пространства в /data, и, кроме того, что-то просачивалось каждый раз, когда я отлаживал свое приложение.

Итак, я сделал "adb shell" и перечислил каталог ENTIRE /data с

cd /data
ls -a -l -R

И я посмотрел вывод на 5000 строк, чтобы увидеть, куда все пространство идет.

Я обнаружил огромное количество потерянного пространства на моем устройстве в каталоге /data/klog в виде старых файлов журналов из месячных сеансов отладки.

Это были не мои файлы журналов: они были созданы какой-то частью инфраструктуры Android.

Я удалил их и мгновенно сохранил 58 Мб, которые не были отнесены в приложении "Настройки" к определенному приложению. У меня небольшое устройство, поэтому 58 МБ очень значительны (около 40%).

До сих пор я не получил INSTALL_FAILED_INSUFFICIENT_STORAGE после многих запусков. Пусть надеется, что это была настоящая проблема, хотя OP предполагает, что у его устройства было много места (но он не сказал, сколько).

Надеемся, что некоторые из вас также смогут избежать INSTALL_FAILED_INSUFFICIENT_STORAGE, периодически удаляя /data/klog/*.

Или вы можете, по крайней мере, сделать ls -a -l -R в /data, чтобы увидеть, куда движется все ваше пространство, если действительно есть какая-то (скрытая) проблема пространства.

Ответ 4

Я добавил дополнительную строку в файл манифеста приложения, который равен android:installLocation="preferExternal". используя эту строку, она вынуждает установку приложения к внешнему хранилищу. см. пример ниже,

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

Ответ 5

Ниже приведено следующее.

  • Откройте оболочку на устройстве

    adb shell
    
  • Перейдите в каталог тем, где сначала скопирован входящий APK

    cd /data/local/tmp
    
  • Список доступных файлов и удаление по желанию

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

Это было надежным для меня до настоящего времени на самом устройстве.


EDIT: Это оказалось не таким надежным решением, как выше.

Я попробовал ряд решений. Ничего действительно не помогло. Наконец, я нашел приложение под названием SD Maid. Это помогло.

В нем говорится, что функциональность ограничена на неуправляемых устройствах. Мое укоренено так, что было бы хорошо видеть, как слышат люди, эффективные в этих сценариях, и если бы это была просто случайность, это сработало для меня (это непредсказуемая проблема в любом случае).

ПРИМЕЧАНИЕ.. Я не имею никакого отношения к приложению. Просто нашел его с поиском.

Ответ 6

Я решил это, включив android:installLocation="auto" внутри тега <manifest> в файл AndroidManifest.xml.

Ответ 7

Связанная с этим проблема в эмуляторе - это когда в разделе /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

Ответ 8

Мне кажется, что это немного странно, но я не могу быть на 100% уверен, что он не правда в некоторых случаях (он работал у меня). Если у вас были следующие симптомы:

  • Вы работаете с использованием физического устройства (в моем случае, Samsung Galaxy Ace),
  • Вы разрабатываете пару дней подряд,
  • Ваш телефон был подключен все время днем ​​и ночью.
  • Вы начали получать эту ошибку через пару дней, и она все ухудшалась.
  • Нет других ответов для вас.
  • Ты так же подал в отставку, как и я...

Затем попробуйте следующее:

  • Отключите телефон, если вы не работаете!

Я отсоединил свой телефон и оставил его в ПОЛНОМ ДНЕ. Моя батарея немного разрядилась. После этого я снова подключил его и снова начал отлаживать. На этот раз все отлично работало! И я имею в виду действительно ДЕЙСТВИТЕЛЬНО хорошо, как и раньше.

Возможно ли, что эта ошибка может возникнуть из-за некоторых связанных с батареей аппаратных средств? Это все еще кажется странным, думая таким образом, но теперь я продолжаю отключать свой телефон время от времени (и на ночь), и проблема не вернулась.

Ответ 9

В моем случае отказ был вызван 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
...

Диск был удален и приложение установлено успешно.

Ответ 10

Samsung Galaxy Ace рекламирует 158 внутренних накопителей в своих спецификациях, но основные приложения и сервисы потребляют около 110 МБ (я использовал диспетчер задач на устройстве для проверки этого), Мое приложение было 52 МБ, потому что у него было много активов. Как только я удалил некоторые из них до 45 Мб, приложение удалось установить без проблем. Устройство все еще предупреждало меня, что внутреннее хранилище было почти заполнено, и я должен удалить некоторые приложения, хотя у меня было только одно приложение.

После установки выпускной версии пакета .apk, а затем удаления, мое устройство отображает 99 Мб свободного места, поэтому может быть отладка информации, загромождающей устройство в конце концов. См. ответ Луи Семприни.

Ответ 11

Отвечая на первое сообщение этой темы...

Признак: некоторые приложения не устанавливаются, говоря, что нет места и при повторном использовании на внутреннем и внешнем хранилище достаточно свободного места! Решение: по умолчанию отключить внешнюю установку.

Настройка внешней установки с помощью 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

Ответ 12

В Eclipse

Run -- > Debug Configurations --> Select "target", и выберите предпочтительную цель эмулятора для запуска.

Затем ниже, что "дополнительные параметры командной строки эмулятора", добавьте это:

-разъем размером 1024

Затем ЗАКРЫТЬ эмулятор и щелкните значок отладки, который запустит выбранный вами эмулятор.

enter image description here

Надеюсь, что это поможет...!

Ответ 13

Я столкнулся с этой проблемой с моим новым Nexus 4 и APK, встроенным в Adobe AIR. У меня уже был андроид: installLocation = "preferExternal" в моем манифесте. Я заметил, что я также вызывал adb install с опцией -s (установить пакет в общем хранилище, например sdcard.), Который казался излишним.

Удаление флага -s из adb install устраняет проблему для меня.

Ответ 14

Я столкнулся с этим вопросом, потому что получал эту ошибку с помощью Sideload Wonder Machine для установки приложений на мой реальный телефон. Я обнаружил, что проблема заключалась в том, что у меня было несколько файлов .apk в каталоге/полезной нагрузки. Я думал, что это то, что было поддержано, но когда я удалил все, кроме одного .apk, ошибка исчезла.

Ответ 15

Если вы используете реальное устройство, вы просто исчерпали внутреннюю память. Просто зайдите в настройки Android → Приложения и переместите некоторые приложения на SD-карту или удалите некоторые приложения.

Если вы используете эмулятор, см. ответ RacZo.

Ответ 16

Я столкнулся с той же ошибкой, когда я попытался установить более 50 приложений в SD-карту с помощью ADB после полного обновления ROM:

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

Некоторые из них установлены, но многие с ошибкой установили INSTALL_FAILED_INSUFFICIENT_STORAGE. У всех неудавшихся приложений было место в их имени. Я переименовал их и попробовал снова. На этот раз все работало. Я не перезагружался или ничего. Возможно, это не проблема, с которой вы, ребята, сталкиваетесь, но это может помочь кому-то найти ту же проблему, с которой я столкнулся.

Ответ 17

Просто удалите приложение из эмулятора либо из командной строки, либо перейдите к настройкам и удалите приложение. Это остановит ошибку.

Ответ 18

Я попробовал следующее:

  • Перезагрузили мое устройство
  • Удаленный предыдущий APK
  • Восстановить мой APK
  • Удалить предыдущую копию на устройстве
  • Переустановка

Проверьте, работает ли оно с вами.

Ответ 19

Поскольку этот вопрос все еще существует, я думал, что добавлю что-то в ответ RacZo для целей разработки. Если вы не используете плагин Eclipse или по какой-либо причине у вас нет источника, но только .apk, вы может увеличить размер раздела из командной строки, используя ту же самую настройку при запуске эмулятора:

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

Насколько я знаю, эта опция не документирована на сайте developer.android.com, поэтому я решил опубликовать ее здесь, чтобы люди могли найти это решение.

Ответ 20

Эмуляторное решение

Откройте каталог .Android. Обычно в вашем домашнем каталоге. Затем перейдите к avd, а затем откройте каталог, в котором есть имя avd, которое вы хотели бы изменить.

Теперь отредактируйте файл config.ini и добавьте следующую строку или измените следующую строку:

disk.dataPartition.size=1024

Где 1024 - размер, который вы хотели бы использовать в МБ. Сохраните файл, а затем запустите свой эмулятор с помощью wipe user data. Теперь ваш эмулятор должен иметь новый размер.

Ответ 21

Решение прост.

Откройте AVD Manager. Отредактируйте свой AVD.

В разделе "Аппаратное обеспечение" есть некоторые свойства, перечисленные с "Новые..." и "Удалить" справа от него.

Нажмите "Создать". Выберите размер раздела данных. Установите значение "512 МБ" (требуется MB). И вы сделали. если вы все еще получаете проблемы, также увеличивайте свои системные и кеш-разделы с помощью того же метода.

Все это задокументировано здесь: http://developer.android.com/guide/developing/devices/managing-avds.html

Ответ 22

Убедитесь, что вы не подключаете свое устройство Android к USB при попытке запустить эмулятор

Ответ 23

Если вы запускаете приложение на эмуляторе, и если эта проблема не устранена, проверьте свой менеджер уведомлений. Если он показывает вам значок и уведомление о "Память телефона заполнена", это означает, что на вашем эмуляторе уже установлено столько приложений. Удалите несколько приложений, которые в настоящее время не нужны, из "Настройки → Управление приложением → Выберите приложение → Удалить".
Этот набор.
Теперь запустите программу.

Ответ 24

Я получил эту ошибку сегодня, когда использовал мой телефон для тестирования/отладки с Eclipse.

Моя ошибка заключалась в том, что я использовал норвежский специальный символ ( "æ", "ø", "å" ) в названии приложения. Когда я реорганизовал имя приложения (используя "o" вместо "ø" ), приложение было установлено правильно.

Вероятно, это не ваша проблема, но можно заметить, что другие люди получают ту же ошибку.

Ответ 25

После проверки всего остального в этом потоке я обнаружил, что моя собственная проблема связана с тем, что путь к файлу .apk был слишком длинным. Поэтому я записал каталог, в котором находился .apk:

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

вместо

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

И это сработало... установлено просто отлично.

Просто подумал, что это может помочь кому-то другому.

Ответ 26

Обход проблемы:

Скомпилируйте как 2.1 без android:installLocation="preferExternal".

OK

Скомпилируйте как 2.2, включая android:installLocation="preferExternal".

Это будет по-прежнему устанавливаться в версии SDK менее 8 (тег XML игнорируется).

Ответ 27

Я тоже столкнулся с той же проблемой, и я сделал "Factory data reset", и после этого он работал нормально.

Ответ 28

У меня не было доступа к корню на моем телефоне и я не готов к установке своего приложения на SD-карту. 15 Мб пространства доступно на /data/, а мое приложение меньше 2 Мб.

Некоторое время я проезжал мимо; очистка проекта Eclipse и перезапуск телефона, но в итоге он перестает работать (возможно, после обновления).

Очистка кеша приложений решила проблему для меня и не требует перезагрузки телефона или удаления приложения.

На рынке есть приложения, которые вы можете использовать для очистки кеша сразу нескольких приложений. Найдите "чистый".

Ответ 29

Занимает много времени, но он должен работать в любом случае:

  • Установите диспетчер файлов, например Adao Task Manager на свой телефон.

Подключитесь через USB и включите USB-накопитель. Скопируйте файл APK из локальной сборки на телефон (возможно, вам придется разрешить неизвестные источники в настройках приложения).

Затем просто нажмите APK файл и Android установит его. Как я уже сказал, это требует много времени, но это может быть быстрее, чем перезагрузка. Время от времени.

Ответ 30

В моем случае это было исправлено путем увеличения расширенной памяти затмения, изменив значение -Xmx768m в eclipse.ini