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"
これは修正よりもバンドエイドであり、完成したアプリをデバイスの内部メモリにインストールしたい場合は理想的ではないかもしれません。しかし、それは少なくとも開発プロセスをずっとイライラさせるものではありません。
これは 一時的な回避策 に過ぎず、実際の修正ではありません。
これが私に起こり、現在の回答に満足していなかった後、私は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
に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つのバージョンのみが削除されます。そのため、再インストールはできますが更新はできません。
このバグが発生したとき、エミュレータの空き容量は実際には関係ありません。
Androidエミュレータのメモリ容量を増やす必要があります。その方法は2つあります。
Androidプロジェクトのルートを右クリックし、[別のユーザーとして実行]をクリックして、[実行構成...]に移動します。左側のツリーで「Android Application」ノードを見つけてからプロジェクトを選択し、ウィンドウの右側にある「Target」タブに移動して「Additional Emulator Command Line Options」フィールドを探します(場合によってはウィンドウを大きくして、最後に "-partition-size 1024"を貼り付ける必要があります。 [適用]、[実行]の順にクリックして、エミュレータを使用します。
Eclipseの Preferencesに移動して、「Launch」を選択し、「Default emulator option」フィールドに「-partition-size 1024」を追加します。 「適用」をクリックして通常通りエミュレータを使用してください。
この質問を投稿していただきありがとうございます。私は何人かの開発者を助けるかもしれないいくつかのさらなる洞察を持っています。
私は自分のアプリケーションを(エミュレータではなく)デバイス上でデバッグしています。デバイスは/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
を実行して、すべてのスペースの行き先を確認することができます。
以下が役立ちます。
デバイスへのシェルを開く
adb Shell
着信APKが最初にコピーされた一時ディレクトリに移動します。
cd /data/local/tmp
利用可能なファイルを一覧表示し、必要に応じて削除します
rm * // use at your own risk, good practice to list files first
これは私のこれまでのところ実際のデバイスでは信頼できます。
EDIT: これは上記の解決策ほど信頼性の低い解決策ではないことがわかった。
私はいくつかの解決策を試しました。本当に役に立ちませんでした。ようやく SD Maid というアプリが見つかりました。それは助けました。
機能がルートになっていないデバイスに制限されているということです。私のものは根付いているので、そのようなシナリオの中でそれが効果的であることを人々から聞くのを見るのは良いことです。
注: アプリとは関係ありません。ただ検索でそれを見つけた。
AndroidManifest.xmlファイルのAndroid:installLocation="auto"
タグ内に<manifest>
を含めることで解決しました。
アプリケーションのマニフェストファイルにAndroid:installLocation="preferExternal"
という行を追加しました。この行を使用することで、アプリを外部ストレージにインストールすることを強制します。以下の例を見てください。
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.nasir.phonegap"
Android:installLocation="preferExternal" >
エミュレータの関連問題は、/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
私の場合、失敗は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
...
ディスクがクリアされ、アプリが正常にインストールされました。
私はこれを書いて少し奇妙な気がしますが、私はそれが ではないことを100%確信することはできません in 場合によっては (私にとってはうまくいきました)以下の症状がある場合
それなら、これを試してください。
私は自分の電話を抜いて、それを1日中休ませた。私のバッテリーは少し切れました。その後、再接続して、デバッグを再開しました。今回はすべてうまくいった!そして、私は前と同じように、本当に本当に大丈夫です。
このエラーの原因としては、 バッテリー関連のハードウェアがある可能性があります ?それはまだこのように考えるのが変だと感じますが、今、私は時々(そして夜間)私の電話を切断し続け、問題は戻りませんでした。
Samsung Galaxy Ace はその仕様で158 MBの内部ストレージを宣伝していますが、コアアプリケーションとサービスはその約110 MBを消費します(私はこれを調べるためにデバイスのタスクマネージャを使用しました)。私のアプリは52 MBでした。なぜならそれはたくさんの資産を持っていたからです。私が45 MBまでそれらのいくつかを削除すると、アプリは問題なくインストールすることができました。デバイスはまだ内部ストレージがほぼいっぱいであることを私に警告していた、そして私は私が1つのアプリしかインストールしていなかったとしても、私はいくつかのアプリをアンインストールするべきである。
リリースバージョンの.apkバンドルをインストールしてからアンインストールした後、私のデバイスには99 MBの空き容量が表示されるため、結局デバイスを煩雑にするデバッグ情報が表示される可能性があります。 Louis Sempriniの答え を参照してください。
このトピックの最初の投稿への回答.
症状:一部のアプリがインストールされず、空き容量がなく、実際には内蔵ストレージと外付けストレージの両方に十分な空き容量があると言われる!解決策:デフォルトで外部インストールを無効にします。
これでデフォルトで外部インストールを設定します。
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
Eclipseでは、
Run -- > Debug Configurations --> Select "target",
をクリックして起動するエミュレータターゲットを選択します。
それから、その「追加のエミュレータコマンドラインオプション」の下に、これを追加してください:
-partition-size 1024
次にエミュレータを閉じてデバッグアイコンをクリックすると、選択した優先エミュレータが起動します。
それが役に立てば幸い...!
私は新しいNexus 4とAdobe AIRで構築されたAPKでこの問題に遭遇しました。私のマニフェストにはAndroid:installLocation = "preferExternal"が既にあります。私はまた、adb install
オプション(sdcardなどの共有大容量記憶装置にパッケージをインストールします)で-s
を呼び出していたことに気付きました。
-s
からadb install
フラグを削除することで問題は解決しました。
実際のデバイスを使用している場合は、単に内部メモリが不足しています。 Androidの設定 - > アプリケーション に移動して、一部のアプリをSDカードに移動するか、一部のアプリをアンインストールします。
エミュレータを使用している場合は、 RacZoの回答 を参照してください。
完全なROM更新後に _ adb _ / Shellを使用して SDカード ディレクトリに約50のアプリを一括インストールしようとしたときにも同じエラーが発生しました。
for x in *.apk; do pm install -r $x; done
そのうちのいくつかはインストールされましたが、多くはエラーINSTALL_FAILED_INSUFFICIENT_STORAGEで失敗しました。失敗したアプリはすべて名前にスペースがありました。私はバッチでそれらの名前を変更してもう一度試しました。今回はすべてうまくいった。再起動などしませんでした。これはあなたが直面している問題ではないかもしれませんが、これは私が直面したのと同じ問題で検索している誰かに役立つかもしれません。
コマンドラインからエミュレータからアプリケーションをアンインストールするか、設定に移動してアプリケーションをアンインストールするだけです。これにより、エラーが発生しなくなります。
私は以下を試しました:
それがあなたと同じように働くかどうか確認してください。
Sideload Wonder Machineを使って実際の電話にアプリをインストールするとこのエラーが発生するので、この質問に遭遇しました。問題は、/ payloadディレクトリに複数の.apkファイルがあることです。これはサポートされているものだと思いましたが、1つの.apkを除いてすべて削除すると、エラーはなくなりました。
解決策は簡単です。
AVDマネージャを開きます。 AVDを編集してください。
ハードウェアのセクションの下には、その右側に「新規...」および「削除」と表示されているプロパティがいくつかあります。
Newを押します。データパーティションサイズを選択します。 "512MB"に設定してください(MBが必要です)。そして、これで終わりです。それでも問題が解決しない場合は、同じ方法でシステムとキャッシュのパーティションを増やしてください。
それはすべてここに文書化されています: http://developer.Android.com/guide/developing/devices/managing-avds.html
このスレッドで他のすべてを試した後、私は自分自身の問題を発見しました。それは、.apkファイルへのパスが長すぎるためです。それで、私は.apkがあったディレクトリにcdして、しました:
cd /Very/Long/Path/To/Package/
adb install mypackage.apk
の代わりに
adb install /Very/Long/Path/To/Package/mypackage.apk
そしてそれはうまくいきました...うまくインストールされました。
これが他の誰かに役立つかもしれないと思ったばかりです。
エミュレータソリューション
.Android
ディレクトリを開きます。通常はあなたのホームディレクトリにあります。それからavd
に行き、変更したいavdの名前があるディレクトリを開きます。
config.ini
ファイルを編集して次の行を追加するか、次の行を変更します。
disk.dataPartition.size=1024
1024
は、MB単位で使用したいサイズです。ファイルを保存してからwipe user data
をチェックしてエミュレータを起動します。エミュレータは新しいサイズになります。
Eclipseでテスト/デバッグするために私の電話を使っているとき、私は今日このエラーを受けました。
私の間違いは、アプリケーション名にノルウェー語の特殊文字( "æ"、 "ø"、 "å")を使用していたことです。アプリ名をリファクタリングすると( "ø"の代わりに "o"を使用)、アプリは正しくインストールされました。
おそらくあなたの問題ではありませんが、他の人が同じエラーを受け取ることには注意が必要です。
アプリケーションをエミュレータで実行していて、この問題が解決しない場合は、通知マネージャを確認してください。 「電話のメモリがいっぱいです」というアイコンと通知が表示された場合は、エミュレータにすでに多数のアプリケーションがインストールされています。 「設定」>>「アプリケーションの管理」>>「アプリケーションの選択」>>「アンインストール」から、現在必要のないアプリケーションをいくつかアンインストールします。
そのセット。
今すぐプログラムを再実行してください。
エミュレータを実行しようとしている間あなたがあなたのAndroidデバイスをUSBに接続していないことを確認してください
回避策:
Android:installLocation="preferExternal"
なしで2.1としてコンパイルします。
OK?
Android:installLocation="preferExternal"
を含めて2.2としてコンパイルします。
これはまだバージョン8未満のSDKにインストールされます(XMLタグは無視されます)。
私も同じ問題に直面しました、そして、私は「工場データリセット」をしました、そしてそれはその後うまく働きました。
私は自分の携帯電話にrootアクセス権がなく、自分のアプリがSDカードにインストールされるのには不向きです。 15 MBのスペースが/data/
で使用可能で、私のアプリケーションは2 MB未満です。
しばらくの間私は行きました。 Eclipse プロジェクトを掃除して電話を再起動したが、最終的には動作しなくなった(おそらくアップデート後)。
アプリケーションキャッシュをきれいにしても問題は解決したため、電話を再起動したりアプリをアンインストールしたりする必要はありません。
あなたが一度に複数のアプリケーションのキャッシュをクリアするために使用できる市場にあるアプリケーションがあります。 "clean"を検索してください。
私の場合は、 -Xmx768m in - Eclipse.ini の値を変更して、Eclipseの拡張メモリを増やすことで修正しました
少し時間がかかりますが、どのような場合でも機能するはずです。
USB経由で接続してUSBストレージを有効にします。ローカルビルドから _ apk _ ファイルを電話にコピーします(アプリケーション設定の下で未知のソースを許可する必要があるかもしれません)。
次にAPKファイルをタップするだけで Android がインストールされます。私が言ったように、それは時間がかかります、しかしそれは時々リブートするより速いかもしれません。
私は端末からアプリをアンインストールしてからEclipseに再インストールしました。これは私のデバイスで通常の使用から常に得られる問題ですが、今日私は開発からそのメッセージを得ました。