モバイルデバイスのファイルシステムとは、フラッシュメモリ上のデータを整理、保存、命名する方法です。Android Developers, 2026によると、モバイルOSは階層的なディレクトリ構造を採用しており、各アプリケーションは分離されたサンドボックス内で動作します。このアーキテクチャにより、データへの不正アクセスが防止され、複数のアプリケーションが同時に実行されている場合でもシステムの安定した動作が保証されます。
重要ポイント
ファイルシステムは、物理メディア上のデータの書き込み、読み取り、整理方法を管理するオペレーティングシステムのソフトウェアコンポーネントです。モバイルデバイスでは、ファイルシステムは重要な機能を実行します:フラッシュメモリ領域の管理、権限に基づくファイルアクセス制御、クラッシュ後の復旧のための変更ジャーナリング、NANDフラッシュメモリの特性を考慮した書き込み最適化です。
デスクトップOSとは異なり、モバイルファイルシステムはフラッシュメモリの限られた書き換えサイクルを考慮して設計されています。NANDセルは限られた回数の消去操作に耐えられます—TLCおよびMLCメモリでそれぞれ3,000〜10,000サイクルです。ストレージの寿命を延ばすために、ファイルシステムはウェアレベリングメカニズムとTRIMコマンドを採用しています。Samsungがフラッシュメモリ専用に開発したF2FSは、NANDアレイのジオメトリを考慮し、フラグメンテーションとブロック消去操作の数を最小限に抑えるようにデータを配置します。
最新のモバイルデバイスは複数のファイルシステムの組み合わせを使用しています。内部メモリ(/dataパーティション)はAndroidではEXT4またはF2FS、iOSではAPFSとしてフォーマットされます。SDカードは従来、4GBを超えるファイルにはexFAT、最大の互換性にはFAT32を使用します。Androidの/systemパーティションは多くの場合読み取り専用でマウントされ、EXT4またはEROFS(Enhanced Read-Only File System)—Huaweiがシステムパーティションのサイズを削減するために開発した圧縮ファイルシステム—を使用します。
Androidのディレクトリ階層は/をルートとするLinux構造に基づいています。各パーティションには独自のファイルシステム、アクセス権限、目的があります。アプリケーションは限られたディレクトリセットにのみアクセスでき、残りはroot権限で保護されています。
| パス | パーティション | ファイルシステム | アプリのアクセス |
|---|---|---|---|
| /data | ユーザーデータ | F2FS / EXT4 | 自身のサンドボックスのみ |
| /system | システム | EROFS / EXT4 | 読み取り専用(root) |
| /sdcard | 外部 | exFAT / FAT32 | 許可が必要 |
| /cache | キャッシュ | EXT4 | rootのみ |
| /vendor | ベンダー | EROFS / EXT4 | 読み取り専用(root) |
/dataパーティションは、ユーザーデータ、インストールされたアプリケーション、およびその設定を保存するための主要パーティションです。各アプリケーションは/data/data/<package_name>/に自身のディレクトリを取得します。このディレクトリ内で、システムは自動的にサブディレクトリを作成します:アプリケーションファイル用のfiles/、一時ファイル用のcache/、SQLiteデータベース用のdatabases/、SharedPreferences用のshared_prefs/です。このディレクトリへのアクセス権限はアプリケーションのインストール時に設定され、rootアクセスなしでは変更できません。最新のデバイスの大半では/dataパーティションはF2FSとしてフォーマットされ、EXT4と比較して最大40%高いランダム書き込み速度を提供します。
/systemパーティションにはオペレーティングシステム、システムアプリケーション、ライブラリが含まれています。このパーティションは、システムファイルの誤った変更や悪意のある変更を防ぐために読み取り専用でマウントされます。Android 10+とProject Trebleを搭載したデバイスでは、/systemパーティションは動的であり、完全な再フラッシュなしでOTAパッケージを介して更新できます。アプリケーションにとって、/systemパーティションはアクセス不可です—書き込みを試みるとSecurityExceptionがスローされます。ただし、アプリケーションは適切な権限があれば、システムフォントや設定ファイルなど/systemから一部のファイルを読み取ることができます。
/sdcardマウントポイントは、エミュレートまたは物理的な外部ストレージパーティションへのシンボリックリンクです。SDカードのないデバイスでは、/sdcardは共有アクセス用に指定された/data内のサブパーティションを指します。このパーティションは、デバイスがMTPプロトコルを介してコンピュータに接続されているときにユーザーに表示されます。アプリケーションはREAD_EXTERNAL_STORAGEおよびWRITE_EXTERNAL_STORAGE権限を介して/sdcardにアクセスし、Android 10以降はMediaStore APIを使用したスコープドストレージを介してアクセスします。/sdcardのサイズは通常フラッシュメモリ全体の60〜80%で、残りは/dataパーティション用に予約されています。
iOSでは、ファイルシステムはアプリケーションのサンドボックスコンテナを介して編成されています。各アプリケーションは、XNUカーネルレベルでアクセスが制限された分離ディレクトリを取得します。ユーザーパーティションはiOS 10.3で導入されたAPFS(Apple File System)を使用します。APFSはスナップショット、ファイルクローン、ファイルレベルの暗号化をサポートし、モバイルデバイスに最適です。
iOSのサンドボックスコンテナには、Documents、Library、tmp、SystemDataの4つの主要ディレクトリが含まれます。各ディレクトリには独自のバックアップポリシー、データ保持期間、アクセスレベルがあります。Documentsは自動的にiCloudおよびiTunesバックアップに含まれます。LibraryにはサブディレクトリCaches(バックアップなし)、Preferences(バックアップあり)、Application Support(バックアップあり)が含まれます。tmpディレクトリはストレージが不足したときにiOSが削除する可能性のある一時ファイル用で、バックアップには含まれません。SystemDataはシステム自体によって使用され、標準APIを介してアプリケーションがアクセスすることはできません。
let fm = FileManager.default
let documents = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let caches = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
let appSupport = fm.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first!
各サンドボックスコンテナディレクトリには独自の保護クラスがあります。iOSは4つのクラスをサポートしています:完全保護(デバイスロック時にファイルにアクセス不可)、ロック時以外保護(既に開かれているファイルはロック時もアクセス可能)、初回ユーザー認証まで保護(最初のロック解除後にファイルにアクセス可能)、保護なし(デバイス起動後は常にファイルにアクセス可能)。デフォルトでは、DocumentsとLibraryのすべてのファイルは完全保護クラスを受け取り、ユーザーデータの最大限の保護を保証します。ファイル作成時に、バックグラウンドアプリケーションがデバイスロック中にデータにアクセスする必要がある場合は、別の保護クラスを明示的に指定できます。
モバイルデバイスでのファイルへのアクセス制御はAndroidとiOSの重要な違いです。Androidはアプリケーション分離のための拡張機能を備えた古典的なLinux権限モデル(読み取り、書き込み、実行)を使用します。iOSはより厳格なサンドボックスモデルを使用し、各アプリケーションは分離されたコンテナで実行され、特別なメカニズムなしに他のアプリケーションのファイルにアクセスできません。
Androidでは、各アプリケーションは個別のUID(ユーザーID)で実行されます。アプリケーションがそのサンドボックス内で作成したすべてのファイルはこのUIDに属し、他のアプリケーションからは見えません。共有ディレクトリ(外部ストレージ)にアクセスするには、アプリケーションはREAD_EXTERNAL_STORAGEおよびWRITE_EXTERNAL_STORAGE権限を要求する必要があります。Android 11以降、権限は実行時に要求する必要があり、targetSdkVersion 30+のアプリケーションは他のアプリケーションのファイルにアクセスするためにSAFを使用する必要があります。権限モデルに違反するとSecurityExceptionが発生し、標準のtry-catchブロックで処理されます。Google Playは公開前にアプリケーションの権限ポリシーへの準拠を自動的にチェックします。
if (ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
REQUEST_CODE
)
}
iOSサンドボックスはXNUカーネルレベルで実装されており、アプリケーションがそのコンテナを離れることを許可しません。アプリケーションがDocument Pickerを介して外部ファイルURIにアクセスできたとしても、オペレーティングシステムはオリジナルへの直接アクセスを提供する代わりに、アプリケーションのコンテナ内に一時的なコピーを作成します。アプリケーション間でファイルを共有するために、iOSはShare SheetとUIActivityViewControllerメカニズムを使用し、あるアプリケーションのコンテナから別のアプリケーションのコンテナにファイルをコピーします。認証情報(トークン、パスワード、キー)の安全な保存のために、iOSはキーチェーンを提供します—カーネルレベルでシステムがアクセス可能な暗号化ストレージです。キーチェーンはサンドボックスコンテナの一部ではなく、独立したsecuritydデーモンによって管理され、アプリケーションが侵害された場合でも追加の保護層を提供します。
ファイルシステムの選択はストレージのパフォーマンスと信頼性に直接影響します。各ファイルシステムには独自のアーキテクチャ、最適化、制限があります。開発者がこれらの違いを理解することは、異なるデバイスでのアプリケーションの動作を予測するのに役立ちます。
アプリケーションを開発する際、異なるファイルシステムには異なるファイル名長制限(EXT4とF2FSでは255バイト、APFSでは255 Unicode文字)、最大ファイルサイズ、特殊文字サポートがあることに注意してください。たとえば、APFSは絵文字を含むUnicode文字をファイル名に許可しますが、EXT4はASCIIに制限されています。アプリケーションが異なる言語の名前でファイルを作成する場合は、すべてのターゲットデバイスでテストしてください—APFSで正しく作成されたファイル名がEXT4で切り詰められる可能性があります。
モバイルデバイスのファイルシステムでの信頼性の高い操作には、いくつかの重要なルールに従う必要があります。これらは開発者の典型的なミスの分析と公式ドキュメントの推奨事項に基づいています。
context.filesDir、iOSではNSSearchPathForDirectoriesInDomains。ハードコードされたパスはOSのバージョンやデバイス間で変更されますFile.getUsableSpace()、iOSではURLResourceValues.volumeAvailableCapacityKeyを使用してください。空き容量が不足している場合はユーザーに警告してくださいisExcludedFromBackupを使用してキャッシュをバックアップから除外してください。Androidでは一時ファイルにcacheDirを優先してくださいクロスプラットフォームの違いに特に注意してください。Androidのファイルパスはフォワードスラッシュ(/data/data/.../files/)を使用し、iOSはURLスキーム(file:///var/mobile/.../Documents/)を使用します。アプリケーションがクロスプラットフォームフレームワーク(Flutter、React Native、Kotlin Multiplatform)を使用する場合は、プラットフォームアダプターを介してファイル操作を統一してください。たとえば、Flutterはpath_providerパッケージを提供し、プラットフォーム固有のコードを記述せずに両方のプラットフォームでDocumentsまたはfilesDirへの正しいパスを返します。文字列操作でパスを連結しないでください—異なるプラットフォームで区切り文字を正しく処理するFile.join()またはURL.appendingPathComponent()を使用してください。
よくある質問
最新のAndroidデバイス(11+)では/dataパーティションにF2FSが使用されています。古いデバイスではEXT4です。/systemパーティションはEROFSまたはEXT4を使用します。SDカードは容量に応じてexFATまたはFAT32でフォーマットされます。
APFSはスナップショット、ファイルクローン、ファイルレベルの暗号化、チェックサムをサポートしています。EXT4はジャーナリングとより広い互換性を持ちます。APFSはSSD用に最適化されており、EXT4は汎用ファイルシステムです。
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)を使用します。このメソッドはURLの配列を返し、最初の要素がアプリケーションのサンドボックスコンテナのメインDocumentsディレクトリです。
スコープドストレージはAndroid 10で導入されたアクセスモデルで、直接的なファイルシステムアクセスを制限します。アプリケーションは許可なしに自身のファイルのみを読み取ることができます。共有メディアファイルへのアクセスにはMediaStore APIが使用されます。
exFATは32GBを超えるSDカードに適しています。4GBを超えるファイルをサポートしているためです。FAT32は古いデバイスとの最大互換性を提供しますが、ファイルサイズが4GBに制限されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。