[Android]実機のSQLiteへアクセスできないときの暫定回避策
実機の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/
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の中身は見れました。でも、もっと簡単な方法があるような気がする。。