最近、私は、ファイルを削除した場合のことを考え出した/sdcard/Download
、それはからファイルを削除します/storage/emulated/0/Download
。ファイルを追加すると、ファイルが/sdcard/Download
複製されます/storage/emulated/0/Download
ます。
それで何/storage/emulated/0/
ですか?Androidファイルシステムにはどのような目的で使用されていますか?
最近、私は、ファイルを削除した場合のことを考え出した/sdcard/Download
、それはからファイルを削除します/storage/emulated/0/Download
。ファイルを追加すると、ファイルが/sdcard/Download
複製されます/storage/emulated/0/Download
ます。
それで何/storage/emulated/0/
ですか?Androidファイルシステムにはどのような目的で使用されていますか?
回答:
/storage/emulated/0/Download
ファイルへの実際のパスです。
/sdcard/Download
の実際のパスへのシンボリックリンクです /storage/emulated/0/Download
ただし、実際のファイルはのファイルシステムにあり/data/media
、次にファイルシステムにマウントされます/storage/emulated/0
(多くの場合、他のマウントポイントも)
A シンボリックリンクコンピューティングでは、シンボリックリンクの絶対または相対パスとそのパス名の分解能に影響する形で他のファイルまたはディレクトリへの参照を含む任意のファイルのための用語です。シンボリックリンクは、1978年までにDECおよびData GeneralのRDOSのミニコンピューターオペレーティングシステムにすでに存在していました。
/storage/emulated/0/
実際に /data/media/0/
エミュレートされた/仮想ファイルシステムではなく、実際公開されます。
これは、ここでの以前の回答を参照していますが、より関連性のある詳細があります。
上のアンドロイド5:
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media
# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media
* >S>
シンボリックリンクのために、>E>
エミュレートおよび>B>
マウントバインドのため
* USER-ID
の場合には、現在のユーザのをMultiple Users
、またはWork Profile
、通常、0
デバイスの所有者のもの、即ち
* VIEW
の一つであるread
、または(permission.READ_EXTERNAL_STORAGEとアプリ用)write
(permission.WRITE_EXTERNAL_STORAGE)またはdefault
ルートで実行中のプロセスのために( / global mount namespaceすなわちzygoteの外)
*以前のAndroidバージョンにはわずかな違いがありましたが、エミュレーションの概念は実装以来同じでした。
* Androidのマウント名前空間の実装の詳細については、この回答を参照してください。
要するに、/sdcard
および/storage/emulated/0
-FAT / vFAT / FAT32ファイルシステムを表す-を介して/data/media/0
(またはAdoptable Storageの/mnt/expand/[UUID]/media/0
場合)エミュレーションまたはエミュレーションを指します。 FUSE
sdcardfs
Android固有ではなく、一般的にLinux関連であるため、シンボリックリンクとバインドマウント(「バインドマウントの作成」を参照)は、主にエミュレーション部分に関する質問なので、この質問の範囲外です。
エミュレーションがここにあるのはなぜですか?エミュレートされたファイルシステムは、実際のファイルシステム(ext4
またはf2fs
)上の抽象化レイヤーであり、基本的に2つの目的を果たします。
読むAndroidのストレージジャーニー詳細については、概要は次のとおりです。
初期のAndroidデバイスは内部ストレージが不足しており、従来のFATファミリのファイルシステムを使用してほとんどのPCとの互換性を確保する(物理的に)外部SDカードに依存していました(PCの世界でのMicrosoftの優位性を参照)。
内部ストレージのサイズが大きくなると、同じファイルシステムが内部(まだ「外部」と呼ばれる)SDカードにシフトされました。
しかし、FAT / vFATの実装には2つの大きな問題があり、Googleによって徐々に対処されました。
ioctls
などFS_IOC_FIEMAP
)。そのため、SDカード上のすべてのデータはすべてのアプリで利用でき(すべてのAndroidアプリはUNIX / Linuxユーザーであり、uidを持っているため)、制限がなく、したがって深刻なプライバシーとセキュリティの懸念が生じます。これらの問題は両方とも、エミュレーションによって対処されました。
/data
を保持するパーティション(または以前は一部のデバイスの独立した/ sdcardパーティション)に移動されext4
(徐々に置き換えられますf2fs
)、UNIXのアクセス許可を完全に実装しました。 /data
パーティション全体をPCに公開できなかったため、UMSを使用できませんでした。さらに2つの理由(1)
があります。多くの設定とアプリのデータが含まれ、他のアプリや人間のユーザーから保護されます。(2)
LinuxファイルシステムはWindowsではサポートされていません。android.process.media
、Androidフレームワークで完全にサンドボックス化されたアプリとしてAndroid上で実行され、エスカレーションされたタスクを実行できません。現在、アプリ(およびアプリでもあるMTP)は/data/media
、の代わりにエミュレートされたストレージと対話します。両方の目的を同時に達成します。つまり、権限チェックを下に強制し、上面でFATファイルシステムのように見えます。
Googleは現在、sdcardfsを介してエミュレーションを実装し、FUSEの欠点を克服しています。主要なものの1つは、入出力のオーバーヘッド、つまり読み取り/書き込み速度を改善することです。
外部ストレージの許可:外部ストレージ上のパブリックファイルとプライベートファイルの
概念は、例:
Termuxアプリのインストールを使用して説明できます。
ディレクトリとを作成します。
ファイルとを作成します。
次のコマンドを実行します。/sdcard/Android/data/com.termux/test_dir
/sdcard/test_dir
/sdcard/Android/data/com.termux/test_file
/sdcard/Android/data/com.termux/test_file
* WhatsAppをインストールするか、他のアプリのプライベートフォルダーを選択する必要があります。
Termuxアプリを強制的に停止し、ストレージのアクセス許可を付与します。コマンドを再度実行します。
同じファイルとディレクトリのパーミッションの違いをご覧ください。数百のアプリ(ユーザー)が同時に処理される場合、これはネイティブLinuxファイルシステムでのエミュレーションなしでは単純に可能ではないようです。これは、実際のファイルシステムの元のアクセス権とは無関係に、同じファイルを3つの異なるアクセス権セットで同時に公開できるファイルシステムエミュレーションです。
# touch /data/media/0/test_file
# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file
# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file
「u#_everybody」UIDとは何ですか?も参照してください。
関連:
FAT-like permission-less filesystem
下位互換性を確保し、Androidの外部ストレージコンセプトの設計を満たすために、Androidの初期に使用されていたものが必要です。私は自分の主張を詳しく説明するために編集を行いました。