Androidでデータベースの中身を見たい
Android開発をする上で、データベースの中に何が入っているかを、mockを使ってテストもできますが、個人的にはどういう風に値が入っているかとかを見たかったりするときがあるのです。
基本的には、きちんと表示やデータの取得ができていなかったときに、データベースの中身がどうなっているかを確認するっていうのが主ですが。
最近仕事でデータベース周りの実装をしているのでわかったことですが、Android7.0以前ではrun-asコマンドで/data/data
にアクセスしてデータベースの取得をすることが可能ですが、Android8.0からは、セキュリティの強化のためか、run-asコマンドでのアクセスは可能ですが、データベースをコピーするなどはできなくなっています。
とりあえず、run-asでの確認方法と、Android8.0以降でのデータベースの確認の仕方を書きたいと思います。
データベースを抜き出す方法を解説します。
run-asコマンドでまずは/data/data/パッケージ名/databases
配下にあるデータベースを、外部からアクセスできるフォルダに移動させます。
以下では/sdcard
に移動させていますが、外部からアクセスできるならここではなくてもいいです。
権限の変更
まずはchmodコマンドで権限を変更します。
変更しない場合、Permission deniedになってしまうからです。
adb shell "run-as パッケージ名 chmod 666 /data/data/パッケージ名/databases/test.db"
これで権限が変更されたはずです。
僕のプロジェクトのtest.dbのパーミッションを見てみましょう。
test.dbの権限が-rw-rw-rw-となっていて、上のsample.dbの権限とは違う権限に変更されていることがわかります。
データベースをコピーして移動
次に、/data/data/パッケージ名/databases配下のデータベースを、pullできる場所にコピーしてあげましょう。
実はここで、各OSによってコピーができるかできないかの振る舞いが違っているんじゃないかという説が仕事中に発生しました。
まずは、7系以下で実行可能なコマンドを説明します。
Android7.0以前の方法
以下のコマンドで移動ができます。
adb shell "run-as パッケージ名 cat databases/test.db > /sdcard/test.db"
この方法は万能で、Android7.0であれば大体データベースをコピーできます。
実はcpコマンドでもコピーができます。
adb shell "run-as パッケージ名 cp data/data/パッケージ名/databases/test.db /sdcard
これで/sdcard配下にtest.dbが移動されているはずです。
無事に移動ができました!
Android8.0の方法
色々なQiitaの投稿にも書いてある↑の方法。
この方法が通用しないのがAndroid Oreoです。曲者。
ただ、上の方法は、catができてれば複製ができるということ。
そのため、run-asコマンドなしで直接/data/data/パッケージ名/databases
にアクセスしたら取得できました。
コマンドは以下で行けました。
adb shell "cat data/data/パッケージ名/databases/test.db > /sdcard/test.db"
ローカル環境にデータベースを移動させる
sdcard配下にコピーができたら、あとはローカル環境に移動させるだけです。
今回はデスクトップに配置します。
adb pull /sdcard/test.db ./Desktop/
これでデータベースをアプリから抜き出すことができました!
取得したデータベースをGUI上で見たい!
取得したデータベースをGUI上で確認したいです。
私は仕事でDB Browser for SQLiteを使って確認していますので、これをおすすめしておきます。
それ以外の方法
それ以外のDBの確認方法としては、stethoを導入しての確認方法があります。
@Yuki_312 さんが書いてくれてます。
http://yuki312.blogspot.jp/2015/03/android-stethosqlite-preference.html
この方法でも簡単にDBアクセスできます。
ただし、注意点としてSQLCipherでデータベースの暗号化をしている場合は、アクセスした瞬間アプリがクラッシュしますので、くれぐれもご注意ください。
# 追記(2018/01/20)
上記方法は、現場で実行した方法で、データベースもきちんと取れて確認済みでした・・・・が、
家で試しにやってみると、catはできるものの/sdcard配下に複製するとファイルサイズが0になっていて確認できませんでした。。。
何が原因か今のところわかっていないので、分かり次第追記します。