mucchinのAndroid戦記

ローカルファイルの保存先について

PCのエミュレータ上で動かしているAndroidアプリで、ローカルファイルを保存したとき、何処に保存されているの?

Androidアプリでは、ローカルファイルへ、文字列や画像などを保存する事ができます。
ContextクラスのopenFileOutput()とかを使用して行います。
この記事では、ローカルファイルの保存方法等の細かい事は説明しませんので、その処理内容を調べたい方は、下記の記事を参照してください。
Androidアプリのデータ保存方法の一つ「ローカルファイル」の使い方

ファイルを保存するディレクトリというのは、アプリから指定する事は出来ません。
保存先は、OSが決定します。


それは決まりごととしていいのですが、自分でテスト用アプリを動かしていて疑問に思いました。
エミュレータで動かした場合、一体PCのどこに保存されたんだろう?
ちゃんとデータが保存されてるのかどうか、確かめてみたかったので、探しましたが、Androidアプリのプロジェクト内には無いし、一体どこ!?
一応、実体は以下にあるようです。
例えば、Windows XPの場合ですと、
C:\Documents and Settings\PCユーザ名\.android\avd\xxxx.avd
xxxx.avdの「xxxx」は、作成したAVDの名前です。

そして、この中の以下のファイルが、ローカルファイルらしいです。
userdata-qemu.img

ネットで調べていたら同じような質問があったのでわかったんですが、この方は、なぜこのファイルだとわかったんでしょう・・・。


しかし、このファイルは、色んなデータを一つにしているのか、バイナリデータのようで、中身を見ても全くわかりません。
なんとかして、ちゃんとローカルファイルの中身を見る事が出来ないか?という事で調べました。
ちょっとめんどくさいですが、ローカルファイルを見る事も、ローカルファイルを書き換えて保存する事もできます。
使用するのは、Android SDK付属のAndroid Debug Bridge(adb)というツールです。
では、このadbというツールの使い方を簡単に説明します。
SDKのディレクトリにtoolsというフォルダがありますよね。
ここに、adb.exeというexeがありますが、これが今回使用するツールです。

コマンドプロンプトを起動して、SDKのtoolsのディレクトリへ移動してください。

それとローカルファイルを調べたいエミュレータを起動しておいてください。
説明の手順を簡略化するため、エミュレータは他には起動していない事とします。
エミュレータを複数起動していると、adbツールでコマンドを実行するエミュレータを指定しないとダメなので。

これで準備はOKです。


スポンサーリンク




Androidアプリのローカルファイルを見る方法

Androidアプリのローカルファイルの保存先は、アプリからは指定できず、OSによって決められると冒頭で述べました。
Android端末でのパスは、以下のようなディレクトリに保存されます。
/data/data/(パッケージ名)/files/(ファイル名)

ちなみに、当然ですが、「ファイル名」はアプリから指定できます。

例えば、作成したAndroidアプリが、以下のようになっているとします。
・パッケージ名 jp.mucchin.localfile
・保存したローカルファイル名 log.txt

コマンドプロンプトで、以下のように実行します。
adb pull Android端末上のローカルファイル(フルパス) ファイルをコピーするPC環境のパス

ですので、上の例で、PCへの保存先が、C:\android\debugとしますと、
adb pull /data/data/jp.mucchin.localfile/files/log.txt C:\android\debug

上記のようなコマンドを実行してください。
すると、指定した先にlog.txtがコピーされます。
中身を見ると、Androidアプリケーションから書き込んだ文字列が、ちゃんと見る事ができます。

「見る」というよりは、どちらかというと「抜き出す」というような感じになりますかね。


Androidアプリのローカルファイルを書き換える方法

先ほどは、adb pullコマンドを使いましたが、今度はその逆で、pushコマンドになります。
adb push 書き込みたいファイル名(PC環境のフルパス) Android端末上のフルパス

例えば、先ほど抜き出したlog.txtの中身を書き換えて、Android端末上に保存されているファイルを、そのファイルに置き換えたい場合は、以下のようにします。
adb push C:\android\debug\log.txt /data/data/jp.mucchin.localfile/files

書き換えた後、エミュレータ上のAndroidアプリから、そのローカルファイルを見てみると、ちゃんと書き換えたファイルの内容が表示されます。

なお、書き換える場合は、ファイルのエンコードに注意してください。
UTF-8で保存しなければならないのに、Shift-JISで保存してしまうと、当たり前ですが文字化けします。


以上です。
画像を使うまでもないかと思いましたので、文字ばっかりの説明になりましたが、わかりにくかったらすみません。

上記で説明したように、ローカルファイルを見たり書き換えたりする為には、少々手間が掛かります。
直接ローカルファイルを見たり、編集したりできればいいんですけどね。

ちなみに、ローカルファイルの中身を直接見たり、編集したり出来ないのか?と思って調べましたが、それはどうも無理っぽいです。


Android端末には、あらかじめインストールされているLinux Shellコマンドがあります。
ですが、何故か、ファイルの閲覧や編集用のコマンド(more、less、vi等)は、全く無いんですよね。
ただし、このLinux Shellコマンドも、色々あって、デバッグなどにとても便利そうです。
adb shellコマンドを使うんですが、、、
話がそれてきたので、この話はまた別の機会にします・・・。