Android Studioから実機やAndroid Emulatorへアプリをインストールしようとした際に、「INSTALL_FAILED_MISSING_SHARED_LIBRARY」というエラーが表示されることがあります。
Installation failed with message INSTALL_FAILED_MISSING_SHARED_LIBRARY
このエラーは、基本的にアプリが必要としているAndroidの共有ライブラリやシステム機能が、インストール先の端末またはEmulatorに存在しない場合に発生します。
代表的なのは、AndroidManifest.xmlで<uses-library>として必須指定されているライブラリを、対象端末が搭載していないケースです。
この記事では、「INSTALL_FAILED_MISSING_SHARED_LIBRARY」が表示される主な原因と、AndroidManifest.xml、実機、Android Emulatorなどで確認したい解決方法を解説します。
- INSTALL_FAILED_MISSING_SHARED_LIBRARYとは
- 主な原因
- 解決方法1:エラーの詳細メッセージを確認する
- 解決方法2:AndroidManifest.xmlのuses-libraryを確認する
- 解決方法3:required=falseにできるか確認する
- 解決方法4:Merged Manifestを確認する
- 解決方法5:依存SDKのドキュメントを確認する
- 解決方法6:端末の共有ライブラリ一覧を確認する
- 解決方法7:適切なAndroid EmulatorのSystem Imageを選ぶ
- 解決方法8:別の実機で確認する
- 解決方法9:古いuses-library設定を削除する
- 解決方法10:APKのManifestを確認する
- AndroidManifest.xmlにuses-libraryを書いていないのに発生する場合
- uses-featureとの違い
- ライブラリファイルをAPKに入れれば解決する?
- それでも解決しない場合
- まとめ
INSTALL_FAILED_MISSING_SHARED_LIBRARYとは
Androidアプリは、端末側にあらかじめ用意されている共有ライブラリを利用することがあります。
AndroidManifest.xmlでは、必要な共有ライブラリを次のように指定できます。
<application ... >
<uses-library
android:name="com.example.library"
android:required="true" />
android:required="true"になっているライブラリが端末に存在しなければ、Androidはそのアプリを正常に実行できないと判断し、インストールを拒否することがあります。
ADBでは次のようなエラーが表示される場合があります。
adb: failed to install app-debug.apk: Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY]
環境によっては、不足しているライブラリ名が詳細メッセージとして表示される場合もあります。
主な原因
1.AndroidManifest.xmlで必須ライブラリを指定している
最も直接的な原因です。
たとえば次のような指定がある場合、
<uses-library android:name="com.example.library" android:required="true" />
対象端末にcom.example.libraryが存在しなければインストールできません。
2.端末メーカー固有の共有ライブラリに依存している
特定メーカーの端末や業務端末向けSDKでは、そのメーカー独自のシステムライブラリを利用する場合があります。
そのアプリを一般的なAndroid端末や別メーカーの端末へインストールすると、必要な共有ライブラリが存在せずエラーになることがあります。
3.Google APIやGoogle Play関連環境を前提にしている
Android Emulatorでは、選択したSystem ImageによってGoogle APIやGoogle Play関連コンポーネントの有無が異なります。
アプリやSDKが特定のシステム環境を必要としている場合、AOSP系System Imageでは不足することがあります。
4.古いサンプルコードや古いSDK設定が残っている
以前のAndroid向けサンプルや特定デバイス向けプロジェクトを流用すると、現在は不要な<uses-library>がManifestに残っていることがあります。
5.依存ライブラリのManifestからuses-libraryが追加されている
自分でAndroidManifest.xmlに記述していなくても、AARなどの依存ライブラリがManifest情報を持っている場合があります。
Manifest mergerによって最終的なManifestへ<uses-library>が追加され、想定していなかった共有ライブラリ依存が生まれる場合があります。
6.テスト先のEmulatorが必要なシステム構成を持っていない
実機ではインストールできるのに特定のEmulatorだけ失敗する場合は、AVDで使用しているSystem Imageの違いを確認します。
解決方法1:エラーの詳細メッセージを確認する
まず、Android StudioのRunウィンドウやADBの出力を確認し、不足している共有ライブラリ名が表示されていないか探します。
たとえば次のような情報が表示される場合があります。
INSTALL_FAILED_MISSING_SHARED_LIBRARY: Package com.example.myapp requires unavailable shared library com.example.library
この場合、確認すべき対象はcom.example.libraryです。
ポイント:「MISSING_SHARED_LIBRARY」というエラー名だけでなく、その前後に表示されるライブラリ名を確認すると原因を特定しやすくなります。
解決方法2:AndroidManifest.xmlのuses-libraryを確認する
プロジェクト内のAndroidManifest.xmlを検索し、uses-libraryが記述されていないか確認します。
<uses-library android:name="com.example.library" android:required="true" />
そのライブラリが本当に必須なのか確認してください。
現在のアプリで使用していない古い設定であれば、削除できる場合があります。
注意:実際にアプリがその共有ライブラリへ依存している場合、単純にManifestから削除すると、インストール後にアプリが正常動作しなくなる可能性があります。
解決方法3:required=falseにできるか確認する
共有ライブラリがなくてもアプリの基本機能を実行できる設計なら、必須ではないライブラリとして指定できる場合があります。
<uses-library android:name="com.example.library" android:required="false" />
ただし、ライブラリを使用する処理を実行するときには、そのライブラリが存在するかを適切に判定する必要があります。
required="false"へ変更するだけで、存在しないクラスやAPIを無条件に呼び出せば実行時エラーになる可能性があります。
解決方法4:Merged Manifestを確認する
自分のAndroidManifest.xmlにuses-libraryが見つからない場合は、依存ライブラリから追加されている可能性があります。
Android Studioで対象のAndroidManifest.xmlを開き、Merged Manifestを確認してください。
最終的なManifestに次のような記述がないか調べます。
<uses-library android:name="..." android:required="true" />
どのManifestや依存ライブラリから追加されたかを確認すると、原因となるSDKを特定しやすくなります。
解決方法5:依存SDKのドキュメントを確認する
外部SDKを追加した直後にエラーが発生した場合は、そのSDKが特定の共有ライブラリや端末環境を必要としていないか確認します。
特に次のようなSDKでは端末依存の機能を使用することがあります。
- 業務用端末SDK
- バーコードリーダーSDK
- POS端末SDK
- メーカー独自ハードウェアSDK
- 車載・組み込みAndroid向けSDK
- 特殊なカメラ・センサーSDK
SDK自体が特定機種専用なら、一般端末へインストールすることはできない場合があります。
解決方法6:端末の共有ライブラリ一覧を確認する
ADBから、端末で利用可能な共有ライブラリを確認できます。
adb shell pm list libraries
出力例:
library:android.ext.shared library:android.test.base library:android.test.mock library:android.test.runner
エラーで要求されているライブラリ名が一覧に存在するか確認してください。
存在しなければ、その端末では要求された共有ライブラリを利用できません。
解決方法7:適切なAndroid EmulatorのSystem Imageを選ぶ
Emulatorでのみエラーになる場合は、Device Managerで使用しているSystem Imageを確認してください。
Android Emulatorでは、大きく次のようなSystem Imageがあります。
- AOSP系
- Google APIsを含むもの
- Google Playを含むもの
アプリやSDKが特定のGoogle関連環境を必要とする場合、必要なサービスを含むSystem Imageを選ぶことで解決する場合があります。
注意:Google Playを含むSystem Imageへ変更すれば、すべてのMISSING_SHARED_LIBRARYが解決するわけではありません。メーカー独自ライブラリなどは通常のGoogle Play対応Emulatorにも存在しません。
解決方法8:別の実機で確認する
特定メーカーや特定デバイス専用の共有ライブラリを要求している場合は、そのライブラリを搭載した対応実機でテストする必要があります。
たとえばメーカー独自SDKを使用するアプリを一般的なPixel系Emulatorへインストールしても、必要なシステムライブラリが存在しない場合があります。
解決方法9:古いuses-library設定を削除する
過去のプロジェクトやサンプルコードからManifestを流用している場合は、現在使用していない共有ライブラリ指定が残っていないか確認します。
使用していないことを確認できた場合は、その<uses-library>を削除します。
変更後、プロジェクトをクリーンして再ビルドします。
./gradlew clean ./gradlew assembleDebug
Windowsでは次のように実行できます。
gradlew clean gradlew assembleDebug
解決方法10:APKのManifestを確認する
プロジェクト側の設定ではなく、最終的に生成されたAPKのManifestを確認する方法もあります。
Android SDK Build Toolsのaaptを使用すると、APKの情報を確認できます。
aapt dump xmltree app-debug.apk AndroidManifest.xml
出力からuses-libraryを確認し、想定外のライブラリ依存が含まれていないか調べます。
APK Analyzerを利用してManifestを確認する方法もあります。
AndroidManifest.xmlにuses-libraryを書いていないのに発生する場合
自分で<uses-library>を記述していなくても、依存しているAARのManifestがマージされている可能性があります。
この場合は、次の順番で確認すると原因を探しやすくなります。
- Merged Manifestを開く
- uses-libraryを検索する
- 追加元のライブラリを確認する
- そのSDKが本当に必要か確認する
- SDKの対応端末や導入方法を確認する
uses-featureとの違い
<uses-library>と似たものに<uses-feature>がありますが、役割は異なります。
uses-libraryは共有Javaライブラリなどへの依存を宣言するために使用されます。
一方、uses-featureはカメラ、Bluetooth、GPSなど、端末が必要なハードウェアまたはソフトウェア機能を持つかを宣言するために使用します。
<uses-feature android:name="android.hardware.camera" android:required="true" />
INSTALL_FAILED_MISSING_SHARED_LIBRARYでは、まずuses-libraryおよび端末側の共有ライブラリを確認するのが基本です。
ライブラリファイルをAPKに入れれば解決する?
必ずしも解決しません。
このエラーでいう「shared library」は、単純なGradle依存ライブラリやAPK内の.jarファイルとは異なり、Androidシステム側に提供される共有ライブラリを指している場合があります。
そのため、エラーに表示された名前のファイルをAPKへ追加すれば解決するという問題ではありません。
アプリが要求するライブラリの種類と、そのライブラリがどこから提供されるのかを確認してください。
それでも解決しない場合
「INSTALL_FAILED_MISSING_SHARED_LIBRARY」が続く場合は、次の項目を順番に確認してください。
- エラーに不足ライブラリ名が表示されていないか
- AndroidManifest.xmlに
uses-libraryがないか android:required="true"が必要か- Merged Manifestに依存ライブラリ由来の設定がないか
adb shell pm list librariesで端末側のライブラリを確認したか- 利用している外部SDKが特定端末専用ではないか
- EmulatorのSystem Imageが適切か
- 対応する実機でテストする必要がないか
- 古いManifest設定が残っていないか
まとめ
Android Studioの「INSTALL_FAILED_MISSING_SHARED_LIBRARY」は、主にアプリが必須としている共有ライブラリを、インストール先のAndroid端末が提供していない場合に発生します。
まず次の2点を確認してください。
アプリ側: AndroidManifest.xml の <uses-library>
端末側:
adb shell pm list libraries
そのうえで、次の順番で切り分けると効率的です。
- エラーに表示された不足ライブラリ名を確認する
- AndroidManifest.xmlとMerged Manifestを確認する
- 不要なuses-libraryなら削除する
- 任意の機能ならrequired=falseにできるか検討する
- 端末が対象ライブラリを持っているか確認する
- 適切なEmulatorや対応実機へ変更する
- 外部SDKの対応端末・必要環境を確認する
特に「実機では動くのにEmulatorではインストールできない」「特定メーカー端末では動くのに他の端末では失敗する」という場合は、アプリが端末固有の共有ライブラリへ依存していないか確認すると原因を見つけやすくなります。
