web-dev-qa-db-ja.com

AndroidでのINSTALL_FAILED_INSUFFICIENT_STORAGEエラーの解決方法

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"

これは修正よりもバンドエイドであり、完成したアプリをデバイスの内部メモリにインストールしたい場合は理想的ではないかもしれません。しかし、それは少なくとも開発プロセスをずっとイライラさせるものではありません。

477
Andrew Smith

これは 一時的な回避策 に過ぎず、実際の修正ではありません。

これが私に起こり、現在の回答に満足していなかった後、私はAOSPソースからそれを理解しようとして仕事に行きました。 _ real _ という解決策が見つかりました。

説明

まず最初に、 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に2つの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>-*"

_または_

アプリをアンインストールする

お気に入りの方法で _ 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を作成する。)

他の「ソリューション」が機能した理由

  • 外部記憶装置にインストールするためのコードはかなり異なりますが、同じ問題はありません。

  • アプリをアンインストールしても/data/appにあるAPKファイルの1つのバージョンのみが削除されます。そのため、再インストールはできますが更新はできません。

  • このバグが発生したとき、エミュレータの空き容量は実際には関係ありません。

154
gabcas

Androidエミュレータのメモリ容量を増やす必要があります。その方法は2つあります。

  1. Androidプロジェクトのルートを右クリックし、[別のユーザーとして実行]をクリックして、[実行構成...]に移動します。左側のツリーで「Android Application」ノードを見つけてからプロジェクトを選択し、ウィンドウの右側にある「Target」タブに移動して「Additional Emulator Command Line Options」フィールドを探します(場合によってはウィンドウを大きくして、最後に "-partition-size 1024"を貼り付ける必要があります。 [適用]、[実行]の順にクリックして、エミュレータを使用します。

  2. Eclipseの Preferencesに移動して、「Launch」を選択し、「Default emulator option」フィールドに「-partition-size 1024」を追加します。 「適用」をクリックして通常通りエミュレータを使用してください。

106
Oscar S.

この質問を投稿していただきありがとうございます。私は何人かの開発者を助けるかもしれないいくつかのさらなる洞察を持っています。

私は自分のアプリケーションを(エミュレータではなく)デバイス上でデバッグしています。デバイスは/dataに21 MBの空き容量(「adb Shell」を実行すると「df」で表示される)を持ち、私のアプリは5 MBしかありません。しかし、私は(電話を再起動またはadbdを再起動せずに)デバイス上の他のアプリを削除した場合、INSTALL_FAILED_INSUFFICIENT_STORAGEはしばらくの間消えてから戻ってくることを発見しました。

そのため、5 MBのアプリをデバッグするには/dataに20 MBほどのスペースが必要になり、さらにアプリをデバッグするたびに何かがリークしていたようです。

だから私は "adb Shell"をしてENTIRE /dataディレクトリを

cd /data
ls -a -l -R

そして、5000行の出力を調べて、すべてのスペースがどこに向かっているのかを調べました。

私は/data/klogディレクトリで私のデバイスの膨大な量の無駄なスペースを 数ヶ月前のデバッグセッションからの古いログファイルの形で - 発見しました。

これらは私のログファイルではありませんでした。これらはAndroidインフラストラクチャの一部によって作成されたものです。

私はそれらを削除して即座に58 MBを節約したが、これはSettingsアプリでは特定のアプリに帰属していなかった。私は小さなデバイスを持っているので58 MBが非常に重要です(約40%)。

これまでのところ、何度も実行した後にINSTALL_FAILED_INSUFFICIENT_STORAGEを再び取得することはありません。それが本当の問題であることを望みましょう、OPは彼の装置が十分なスペースを持っていることを示唆しています(しかし、どれくらいを言わなかった)。

/data/klog/*を定期的に削除することで、INSTALL_FAILED_INSUFFICIENT_STORAGEをエスケープできることを願っています。

あるいは、実際に(隠れた)スペースの問題がある場合は、少なくともls -a -l -R/dataを実行して、すべてのスペースの行き先を確認することができます。

28
Louis Semprini

以下が役立ちます。

  • デバイスへのシェルを開く

    adb Shell
    
  • 着信APKが最初にコピーされた一時ディレクトリに移動します。

    cd /data/local/tmp
    
  • 利用可能なファイルを一覧表示し、必要に応じて削除します

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

これは私のこれまでのところ実際のデバイスでは信頼できます。


EDIT: これは上記の解決策ほど信頼性の低い解決策ではないことがわかった。

私はいくつかの解決策を試しました。本当に役に立ちませんでした。ようやく SD Maid というアプリが見つかりました。それは助けました。

機能がルートになっていないデバイスに制限されているということです。私のものは根付いているので、そのようなシナリオの中でそれが効果的であることを人々から聞くのを見るのは良いことです。

注: アプリとは関係ありません。ただ検索でそれを見つけた。

19
Saad Farooq

AndroidManifest.xmlファイルのAndroid:installLocation="auto"タグ内に<manifest>を含めることで解決しました。

15
user3278416

アプリケーションのマニフェストファイルにAndroid:installLocation="preferExternal"という行を追加しました。この行を使用することで、アプリを外部ストレージにインストールすることを強制します。以下の例を見てください。

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

エミュレータの関連問題は、/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
9
Ralph Yozzo

私の場合、失敗は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
...

ディスクがクリアされ、アプリが正常にインストールされました。

8
Sergey Fedorov

私はこれを書いて少し奇妙な気がしますが、私はそれが ではないことを100%確信することはできません in 場合によっては (私にとってはうまくいきました)以下の症状がある場合

  • 物理的なデバイス(私の場合はSamsung Galaxy Ace)を使って作業しています。
  • あなたは数日間ずっと開発を続けてきました、
  • あなたの電話はずっと接続されていました 、昼と夜。
  • あなたは2、3日後にこのエラーを始めました、そしてそれは悪化し続けました。
  • なし 他の答えのうちの1つはあなたのために働きました。
  • あなたは私と同じように辞任しています...

それなら、これを試してください。

  • あなたが働いていないときあなたの電話を抜いてください!

私は自分の電話を抜いて、それを1日中休ませた。私のバッテリーは少し切れました。その後、再接続して、デバッグを再開しました。今回はすべてうまくいった!そして、私は前と同じように、本当に本当に大丈夫です。

このエラーの原因としては、 バッテリー関連のハードウェアがある可能性があります ?それはまだこのように考えるのが変だと感じますが、今、私は時々(そして夜間)私の電話を切断し続け、問題は戻りませんでした。

6
wrygiel

Samsung Galaxy Ace はその仕様で158 MBの内部ストレージを宣伝していますが、コアアプリケーションとサービスはその約110 MBを消費します(私はこれを調べるためにデバイスのタスクマネージャを使用しました)。私のアプリは52 MBでした。なぜならそれはたくさんの資産を持っていたからです。私が45 MBまでそれらのいくつかを削除すると、アプリは問題なくインストールすることができました。デバイスはまだ内部ストレージがほぼいっぱいであることを私に警告していた、そして私は私が1つのアプリしかインストールしていなかったとしても、私はいくつかのアプリをアンインストールするべきである。

リリースバージョンの.apkバンドルをインストールしてからアンインストールした後、私のデバイスには99 MBの空き容量が表示されるため、結局デバイスを煩雑にするデバッグ情報が表示される可能性があります。 Louis Sempriniの答え を参照してください。

5
snez

このトピックの最初の投稿への回答.

症状:一部のアプリがインストールされず、空き容量がなく、実際には内蔵ストレージと外付けストレージの両方に十分な空き容量があると言われる!解決策:デフォルトで外部インストールを無効にします。

これでデフォルトで外部インストールを設定します。

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
5
dan

Eclipseでは、

Run -- > Debug Configurations --> Select "target",をクリックして起動するエミュレータターゲットを選択します。

それから、その「追加のエミュレータコマンドラインオプション」の下に、これを追加してください:

-partition-size 1024

次にエミュレータを閉じてデバッグアイコンをクリックすると、選択した優先エミュレータが起動します。

enter image description here

それが役に立てば幸い...!

4
Mehul Patel

この問題はまだ存在しているので、私は開発目的で RacZoの答え に何か追加したいと思いました。 Eclipse プラグインを使用していない場合、または何らかの理由でソースがなく、.apkだけの場合は、エミュレータを起動するときに同じオプションを使用してコマンドラインからパーティションサイズを増やすことができます。 :

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

私の知る限りでは、このオプションはdeveloper.Android.comには文書化されていないので、ここで投稿してこの解決策が見つかると思いました。

3
DrBwaa

私は新しいNexus 4とAdobe AIRで構築されたAPKでこの問題に遭遇しました。私のマニフェストにはAndroid:installLocation = "preferExternal"が既にあります。私はまた、adb installオプション(sdcardなどの共有大容量記憶装置にパッケージをインストールします)で-sを呼び出していたことに気付きました。

-sからadb installフラグを削除することで問題は解決しました。

3
Sarah Northway

実際のデバイスを使用している場合は、単に内部メモリが不足しています。 Androidの設定 - > アプリケーション に移動して、一部のアプリをSDカードに移動するか、一部のアプリをアンインストールします。

エミュレータを使用している場合は、 RacZoの回答 を参照してください。

2
marmor

完全なROM更新後に _ adb _ / Shellを使用して SDカード ディレクトリに約50のアプリを一括インストールしようとしたときにも同じエラーが発生しました。

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

そのうちのいくつかはインストールされましたが、多くはエラーINSTALL_FAILED_INSUFFICIENT_STORAGEで失敗しました。失敗したアプリはすべて名前にスペースがありました。私はバッチでそれらの名前を変更してもう一度試しました。今回はすべてうまくいった。再起動などしませんでした。これはあなたが直面している問題ではないかもしれませんが、これは私が直面したのと同じ問題で検索している誰かに役立つかもしれません。

2
Insilico

コマンドラインからエミュレータからアプリケーションをアンインストールするか、設定に移動してアプリケーションをアンインストールするだけです。これにより、エラーが発生しなくなります。

2
Nagendra

私は以下を試しました:

  • 端末を再起動しました
  • 以前のAPKを削除しました
  • APKを再構築
  • 以前のコピーを端末からアンインストールする
  • 再インストール

それがあなたと同じように働くかどうか確認してください。

2
CoolRunning

Sideload Wonder Machineを使って実際の電話にアプリをインストールするとこのエラーが発生するので、この質問に遭遇しました。問題は、/ payloadディレクトリに複数の.apkファイルがあることです。これはサポートされているものだと思いましたが、1つの.apkを除いてすべて削除すると、エラーはなくなりました。

2
KC Baltz

解決策は簡単です。

AVDマネージャを開きます。 AVDを編集してください。

ハードウェアのセクションの下には、その右側に「新規...」および「削除」と表示されているプロパティがいくつかあります。

Newを押します。データパーティションサイズを選択します。 "512MB"に設定してください(MBが必要です)。そして、これで終わりです。それでも問題が解決しない場合は、同じ方法でシステムとキャッシュのパーティションを増やしてください。

それはすべてここに文書化されています: http://developer.Android.com/guide/developing/devices/managing-avds.html

1
Zaid Daghestani

このスレッドで他のすべてを試した後、私は自分自身の問題を発見しました。それは、.apkファイルへのパスが長すぎるためです。それで、私は.apkがあったディレクトリにcdして、しました:

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

の代わりに

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

そしてそれはうまくいきました...うまくインストールされました。

これが他の誰かに役立つかもしれないと思ったばかりです。

1
Alma

エミュレータソリューション

.Androidディレクトリを開きます。通常はあなたのホームディレクトリにあります。それからavdに行き、変更したいavdの名前があるディレクトリを開きます。

config.iniファイルを編集して次の行を追加するか、次の行を変更します。

disk.dataPartition.size=1024

1024は、MB単位で使用したいサイズです。ファイルを保存してからwipe user dataをチェックしてエミュレータを起動します。エミュレータは新しいサイズになります。

1
prolink007

Eclipseでテスト/デバッグするために私の電話を使っているとき、私は今日このエラーを受けました。

私の間違いは、アプリケーション名にノルウェー語の特殊文字( "æ"、 "ø"、 "å")を使用していたことです。アプリ名をリファクタリングすると( "ø"の代わりに "o"を使用)、アプリは正しくインストールされました。

おそらくあなたの問題ではありませんが、他の人が同じエラーを受け取ることには注意が必要です。

1
EirikO

アプリケーションをエミュレータで実行していて、この問題が解決しない場合は、通知マネージャを確認してください。 「電話のメモリがいっぱいです」というアイコンと通知が表示された場合は、エミュレータにすでに多数のアプリケーションがインストールされています。 「設定」>>「アプリケーションの管理」>>「アプリケーションの選択」>>「アンインストール」から、現在必要のないアプリケーションをいくつかアンインストールします。
そのセット。
今すぐプログラムを再実行してください。

1
Rax

エミュレータを実行しようとしている間あなたがあなたのAndroidデバイスをUSBに接続していないことを確認してください

1
Sharpless512

回避策:

Android:installLocation="preferExternal"なしで2.1としてコンパイルします。

OK?

Android:installLocation="preferExternal"を含めて2.2としてコンパイルします。

これはまだバージョン8未満のSDKにインストールされます(XMLタグは無視されます)。

0
Team Pannous

私も同じ問題に直面しました、そして、私は「工場データリセット」をしました、そしてそれはその後うまく働きました。

0
Monish

私は自分の携帯電話にrootアクセス権がなく、自分のアプリがSDカードにインストールされるのには不向きです。 15 MBのスペースが/data/で使用可能で、私のアプリケーションは2 MB未満です。

しばらくの間私は行きました。 Eclipse プロジェクトを掃除して電話を再起動したが、最終的には動作しなくなった(おそらくアップデート後)。

アプリケーションキャッシュをきれいにしても問題は解決したため、電話を再起動したりアプリをアンインストールしたりする必要はありません。

あなたが一度に複数のアプリケーションのキャッシュをクリアするために使用できる市場にあるアプリケーションがあります。 "clean"を検索してください。

0
J0hnG4lt

私の場合は、 -Xmx768m in - Eclipse.ini の値を変更して、Eclipseの拡張メモリを増やすことで修正しました

0
santhosh

少し時間がかかりますが、どのような場合でも機能するはずです。

  • Adao Task Manager のようなファイルマネージャを携帯電話にインストールします。

USB経由で接続してUSBストレージを有効にします。ローカルビルドから _ apk _ ファイルを電話にコピーします(アプリケーション設定の下で未知のソースを許可する必要があるかもしれません)。

次にAPKファイルをタップするだけで Android がインストールされます。私が言ったように、それは時間がかかります、しかしそれは時々リブートするより速いかもしれません。

0
jcfrei

私は端末からアプリをアンインストールしてからEclipseに再インストールしました。これは私のデバイスで通常の使用から常に得られる問題ですが、今日私は開発からそのメッセージを得ました。

0
Roberto