Android OSは基本的にLinuxですが、ファイル構造はどうなっているのでしょうか
端末にによって実装が違うために特にアプリ開発ではExternal Storageの場所が違うことが多々有ります。
Device File Explorer と adbコマンドで入って中を(上っ面だけですが)覗いてみたいと思います。
Android ファイル構造
Androidの場合はRoot権限を持つ事が基本できないのですが、アプリ開発に関連する部分についてはある程度見えるようになっています。
Device File Explorer
以前はAndroid Device Monitor その前は DDMS と呼ばれていたものに近いものです。
View On-Device Files with Device File Explorer … – Android Developersに紹介ページがあります。ウィンドウ右下のボタンか、検索から探すと出てきます。
下はSharedPreferencesで書き込んだ文字列を確認した例です。
run-asを使う
Device File Explorerもウィンドウズ世代にはいいのですが、コマンドで探るともっと色々見えてくることもあります。ファイルシステムの構造は端末によって異なるところもありますが、Linuxベースなので共通部分も多くある程度分かっていると便利な時があります。
例として、最初にAndroid Studioのemulatorです。
Nexus 6P
adbでシェルに入りリスト一覧を出す
1 |
ls -l |
でリストの詳細を表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
C:\>adb shell 1|generic_x86_64:/ $ ls -l ls: ./ueventd.rc: Permission denied ls: ./ueventd.ranchu.rc: Permission denied ls: ./ueventd.goldfish.rc: Permission denied ls: ./service_contexts: Permission denied ls: ./sepolicy: Permission denied ls: ./selinux_version: Permission denied ls: ./seapp_contexts: Permission denied ls: ./init.zygote64_32.rc: Permission denied ls: ./init.zygote32.rc: Permission denied ls: ./init.usb.rc: Permission denied ls: ./init.usb.configfs.rc: Permission denied ls: ./init.rc: Permission denied ls: ./init.ranchu.rc: Permission denied ls: ./init.goldfish.rc: Permission denied ls: ./init.environ.rc: Permission denied ls: ./init: Permission denied ls: ./fstab.ranchu: Permission denied ls: ./fstab.goldfish: Permission denied ls: ./file_contexts.bin: Permission denied ls: ./default.prop: Permission denied total 56 drwxr-xr-x 15 root root 0 2016-12-25 13:49 . drwxr-xr-x 15 root root 0 2016-12-25 13:49 .. drwxr-xr-x 29 root root 0 2016-12-25 13:49 acct drwxrwx--- 6 system cache 4096 2016-12-21 12:21 cache lrwxrwxrwx 1 root root 13 1970-01-01 00:00 charger -> /sbin/healthd drwxr-xr-x 3 root root 0 2016-12-25 13:49 config lrwxrwxrwx 1 root root 17 1970-01-01 00:00 d -> /sys/kernel/debug drwxrwx--x 38 system system 4096 2016-12-25 13:49 data drwxr-xr-x 14 root root 2520 2016-12-25 13:49 dev lrwxrwxrwx 1 root root 11 1970-01-01 00:00 etc -> /system/etc drwxr-xr-x 10 root system 220 2016-12-25 13:49 mnt drwxr-xr-x 2 root root 0 1970-01-01 00:00 oem dr-xr-xr-x 133 root root 0 2016-12-25 13:49 proc -rw-r--r-- 1 root root 4763 1970-01-01 00:00 property_contexts drwx------ 2 root root 0 2016-10-04 14:46 root drwxr-x--- 2 root root 0 1970-01-01 00:00 sbin lrwxrwxrwx 1 root root 21 1970-01-01 00:00 sdcard -> /storage/self/primary drwxr-xr-x 5 root root 100 2016-12-25 13:49 storage dr-xr-xr-x 12 root root 0 2016-12-25 13:49 sys drwxr-xr-x 18 root root 4096 1970-01-01 00:00 system lrwxrwxrwx 1 root root 14 1970-01-01 00:00 vendor -> /system/vendor 1|generic_x86_64:/ $ |
drwxr-xr–x
- d: ディレクトリー
- r: 読み取り
- w:書き込み
- x:実行
を表しており、所有者・グループ・他ユーザーの権限が、設定されています
例)
drwxr-xr-x
d:directoryのことでwindowsでいうところのフォルダー
rwx:これはroot権限では読み書き実行可能
r-x:グループ権限では読出しと実行が可能だが書き込み不可
r-x:他ユーザーでも読出しと実行のみ
ということです
root権限がない状態なので、読んだり、書いたりできるディレクトリーは限られています。
Top下のファイルはほとんどPermission deniedとなっています
それ以外のディレクトリーについて見てみます。
- acct
- CPU Accounting Controller:cgroup を使ったタスクのグループ化と,これらのタスクの CPU 使用率のアカウンティングを行う
- cache
- キャッシュ
- charger -> /sbin/healthd
- /sbin/healthd へのシンボリックリンク
- config
- d -> /sys/kernel/debug
- /sys/kernel/debug へのシンボリックリンク
- data
- /data/app/ 以下にアプリのパッケージがある
- /data/data/[package name]/以下にアプリの内部メモリ領域
- dev
- デバイスファイル
- etc -> /system/etc
- 設定ファイル
- /system/etc へのシンボリックリンク
- mnt
- 一時的なマウントポイント
- oem
- proc
- プロセスやメモリーのリソース情報など
- property_contexts
- セキュリティコンテキストの設定
- root
- root用ホームディレクトリ
- sbin
- システム管理用コマンド、デーモンプログラムなど
- sdcard -> /storage/self/primary
- /storage/self/primary へのシンボリックリンク
- storage
- ストレージ関連のマウントポイント
- sys
- system
- vendor -> /system/vendor
- /system/vendor へのシンボリックリンク
dataディレクトリ
dataディレクトリのpermissionは「drwxrwx–x」なのでroot権限がないとアクセスできませんが、覗き見たり、場合によっては書き込みも可能です。
/data/app/
以下は各アプリのapkが存在します。以下のように呼び出すとパッケージリストが表示されます
1 2 3 4 5 6 |
$ adb shell pm list packages package:com.android.smoketest package:com.android.cts.priv.ctsshim package:com.example.android.livecubes ... $ |
/data/data/[package name]/以下にそのアプリの内部メモリ領域がありrun-asコマンドを使ってアクセスすることができます
ただしできないものもあります、signed apkなど。
Device File Explorerで試したSharedPreferencesのテストアプリをNexus 5Xにインストールしてrun-asで中をのぞいてみた動画です。
関連:run-as
Reference:
View On-Device Files with Device File Explorer … – Android Developers