DeviceにAppがインストールされると、Appごとに使用できるストレージスペースがあります。 各アプリが使用できるdirectoryに違いがあって、多くのかすん部分なので、一度にまとめてみました。
この記事は、Android Qが公開される前に書かれました。
アンドロイドQで外部ストレージの新しいポリシーであるScoped Storageが紹介されました。 そのため、この記事の内容は、Android P以下のデバイスのみです。 Scoped storageの詳細については、アンドロイドQの新しいストレージポリシー、Scoped Storageこちらを参照してください。
Code(Apk)の位置
いくつかのAppがインストールされると、device内部の特定のdirにapk、libs、oatファイルなどが保存されます。 Oreoからフォルダ名packageの名前でrandom hashcodeの組み合わせで生成されます。
- /data/app/[package name]-[hashcode]/ フォルダ生成される
$ /data/app/com.codechacha.storages-v0U9I2KC_tE0MS5CN8NoTw== # ls
base.apk oat lib
Internal storage(内部ストレージ)
内部ストレージにも、特定のdirにfile、cacheなどのスペースが作成されます。 cacheの場合、Device内部に収納スペースが不足している場合、同意を得ずに削除できるフォルダです。削除してはならないファイルであれば、cacheフォルダに保存しないでください。
いくつかのAppのInternal storageは、そのアプリ自体のみ使用が可能で、他のアプリでは、アクセスすることができません。また、fileをwrite / readにどのPermissionは必要ありません。
- /data/user/[User number]/[package name]/ フォルダ生成される
adb shellで確認してみる複数のフォルダがあります。
$ /data/user/0/com.codechacha.storages # ls
cache code_cache files
Appこのようなpathは容易に知ることができるようContextオブジェクトで複数のmethodを提供しています。
// Internal storage
Log.d(TAG, "Internal private data dir: "
+ getDataDir().getAbsolutePath());
Log.d(TAG, "Internal private file dir: "
+ getFilesDir().getAbsolutePath());
Log.d(TAG, "Internal private cache dir: "
+ getCacheDir().getAbsolutePath());
03-10 22:25:18.979 6931 6931 D MainActivity: Internal private data dir: /data/user/0/com.codechacha.storages
03-10 22:25:18.979 6931 6931 D MainActivity: Internal private file dir: /data/user/0/com.codechacha.storages/files
03-10 22:25:18.979 6931 6931 D MainActivity: Internal private cache dir: /data/user/0/com.codechacha.storages/cache
External storage(外部ストレージ)
外部ストレージにも内部ストレージと似ています。しかし、外部ストレージはwrite/read時permissionが必要です。そして、すべてのアプリからアクセスが可能なので、privateを保証しません。また、PC上ではStorageへのアクセスが可能なため、一時的にwrite/readができないことがあります。
App専用のフォルダ
App向けに作成されたstorageがあります。 Externalであるため、他のアプリでもアクセスが可能ですが、重要なことは、このAppを削除場合は、このスペースも削除されるということです。したがって、他のAppで共有なりたいdataはこの場所に保存されてはいけません。
- /storage/emulated/0/Android/data/[package name]/ フォルダ生成される
Javaでpath求めるコードと実行Logです。
// External app's storage
Log.d(TAG, "External app's cache dir: "
+ getExternalCacheDir().getAbsolutePath());
Log.d(TAG, "External app's file dir: "
+ getExternalFilesDir(Environment.DIRECTORY_PICTURES));
03-10 22:52:49.350 7302 7302 D MainActivity: External app's cache dir: /storage/emulated/0/Android/data/com.codechacha.storages/cache
03-10 22:52:49.350 7302 7302 D MainActivity: External app's file dir: /storage/emulated/0/Android/data/com.codechacha.storages/files/Pictures
パブリックフォルダ
パブリックフォルダは、アプリが削除されるといっても保存されたdataが削除されません。
- /storage/emulated/0/[コンテンツの種類]
Javaでpath求めるコードと実行Logです。 getExternalStoragePublicDirectory()
はargumentで Environment.DIRECTORY_PICTURES
ようContent種類を渡します。
// External public storage
Log.d(TAG, "External public root dir: "
+ Environment.getExternalStorageDirectory());
Log.d(TAG, "External public file dir: "
+ Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES));
03-10 22:52:49.351 7302 7302 D MainActivity: External public root dir: /storage/emulated/0
03-10 22:52:49.352 7302 7302 D MainActivity: External public file dir: /storage/emulated/0/Pictures
Permissions
read / writeをするには、AndroidManifest.xmlに以下の権限を宣言する必要があります。 Runtime permissionであるため、ユーザーの許可が必要です。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
External storage使用可能チェック
PC上でmountする場合write/readにならない可能性があるため、使用する前に、使用可能であることを確認する必要があります。
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
まとめ
今まで、Androidの内部/外部ストレージについて調べてみました。
この記事は、Android Qが公開される前に書かれました。 アンドロイドQで外部ストレージの新しいポリシーであるScoped Storageが紹介されました。 そのため、この記事の内容は、Android P以下のデバイスのみです。
Scoped storageの詳細については、アンドロイドQの新しいストレージポリシー、Scoped Storageこちらを参照してください。
参考
Related Posts
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)