ちょっと話題の記事

[Android]実機のSQLiteへアクセスできないときの暫定回避策

2013.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

実機のSQLiteにアクセス

先日、Androidアプリの動作確認を実機(Galaxy Nexus)で行いました。
昔は問題なくadb shellで中にはいってsqlite3コマンドで確認できた気がしてたんですが、
DBファイルがある場所へ移動してファイルを確認しようとしたらpermission deniedだし、
そもそもsqlite3コマンド自体が使えないという状況でした。
rootとってsqliteを移植してる人もいましたが、今回はデータベースファイルの中身を確認するのが目的だったので、
データベースをPCにもってくる方法についての備忘録的tipsです。
もっとちゃんとした回避策があるような気がしなくもないですが。誰か知ってたら教えてください。

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • 実機 : Galaxy Nexus
  • Android OS : 4.1.1

Android SDKの設定をして、adbコマンドは使える状況にしておきましょう。

アプリを実行してadbを実行

まずはEclipseでAndroidアプリを作成し、実機上で実行します。
SQLiteの内容を取得したい時に、adb shellでシェルを起動します。
この状態では、DBファイルは権限がないのでアクセスすることができません。

%adb shell
shell@android:/ $ ls /data/data/<アプリのパッケージ>/databases
opendir failed, Permission denied

run-asコマンドで、パッケージ名を指定し、そのアプリのユーザーに切り替えます。
こうすることで、アプリのDBファイルにアクセスできます。
※AndroidManifest.xmlでapplicationタグ内で「android:debuggable="true"」となっていること

shell@android:/ $ run-as <アプリのパッケージ>

あとは/data/data/<パッケージ名>/databases/にアクセスできるようになるので、
そのdbファイルの権限をchmodで変更するか、外部からアクセスできる場所へコピーすればOKです。
とりあえずsdcardへコピーしてみました。

shell@android:/ $ cat /data/data/<パッケージ名>/databases/<dbファイル名> > /sdcard/my.db

最後にPCからadb pullコマンドを使用してファイルを取得しましょう。
取得したファイルは、PCのsqliteやSQLite-Managerとかのツールで確認することができます。

% adb pull /sdcard/my.db /path/my/pc/my.db

これでとりあえずDBの中身は見れました。でも、もっと簡単な方法があるような気がする。。