@port139 Blog

基本的にはデジタル・フォレンジックの技術について取り扱っていますが、記載内容には高確率で誤りが含まれる可能性があります。

adb backup で Android 端末のバックアップを作成する(11)

adb backup で取れないデータについても、Content Provider 経由でデータをバックアップする事ができる場合があります。

Facebook のほうで知ったのですが、adb shell conetnt コマンドというものがあり、このコマンド経由でアクセスする事が出来るようです。

Android:contentコマンドでContentProviderを呼び出す

http://yuki312.blogspot.jp/2013/02/androidcontentcontentproviderdb.html

adb shell content コマンドを使うには、対象としている ContentURI を指定する必要があります。

Content URIs
http://developer.android.com/guide/topics/providers/content-provider-basics.html#ContentURIs

上記のWeb では例として content://user_dictionary/words が書かれていますが、この場合 Words の部分がテーブルになります。対象に複数のテーブルがあるようなケースでは、それぞれ毎に URI が決まってくるという仕組みのようです。

例えば、カレンダーのeventsテーブルに対するクエリは以下の構文になります。

adb shell content query --uri content://com.android.calendar/events

adb backup で取得しているSQLite のデータベースファイルを確認してみると、events テーブルの内容が読み込まれている事が分かります。カレンダーは adb backup 経由でバックアップされ、apps\com.android.providers.calendar\db 配下にファイルがあるのでこの方法を取る必要はないと思いますが、動きを確認するには便利なデータだと思います。上記の URI では com.android.calendar ですが、DB 自体のパスは com.android.providers.calendar と異なる点も興味深いところです。

他にもカレンダー関連のテーブルは複数ありますが、下記もクエリを実行することが出来ます。

adb shell content query --uri content://com.android.calendar/attendees
adb shell content query --uri content://com.android.calendar/calendar_alerts
adb shell content query --uri content://com.android.calendar/event_entities
adb shell content query --uri content://com.android.calendar/reminders

どの様なコンテントプロバイダーがあるか、使えそうかを判断するのに、下記のアプリケーションを使うと便利です。検索機能もあります。

Content Provider Helper
https://play.google.com/store/apps/details?id=com.jensdriller.contentproviderhelper&hl=ja

デフォルトで提供されている URI についても同じく Content Provider Helper のプロジェクトページに記載があります。 

Content Provider Helper
https://github.com/jenzz/ContentProviderHelper
The following content providers are provided by default:

content://browser/bookmarks
content://browser/searches
content://call_log/calls
content://com.android.calendar/attendees
content://com.android.calendar/calendar_alerts
content://com.android.calendar/calendars
content://com.android.calendar/event_entities
content://com.android.calendar/events
content://com.android.calendar/reminders
content://com.android.contacts/aggregation_exceptions
content://com.android.contacts/contacts
content://com.android.contacts/data
content://com.android.contacts/groups
content://com.android.contacts/raw_contact_entities
content://com.android.contacts/raw_contacts
content://com.android.contacts/settings
content://com.android.contacts/status_updates
content://com.android.contacts/syncstate
content://drm/audio
content://drm/images
content://icc/adn
content://icc/fdn
content://icc/sdn
content://media/external/audio/albums
content://media/external/audio/artists
content://media/external/audio/genres
content://media/external/audio/media
content://media/external/audio/playlists
content://media/external/images/media
content://media/external/images/thumbnails
content://media/external/video/media
content://media/external/video/thumbnails
content://media/internal/audio/albums
content://media/internal/audio/artists
content://media/internal/audio/genres
content://media/internal/audio/media
content://media/internal/audio/playlists
content://media/internal/images/media
content://media/internal/images/thumbnails
content://media/internal/video/media
content://media/internal/video/thumbnails
content://mms
content://mms/inbox
content://mms/outbox
content://mms/part
content://mms/sent
content://mms-sms/conversations
content://mms-sms/draft
content://mms-sms/locked
content://mms-sms/search
content://settings/secure
content://settings/system
content://sms/conversations
content://sms/draft
content://sms/inbox
content://sms/outbox
content://sms/sent
content://telephony/carriers
content://user_dictionary/words

これら以外に、アプリケーションが独自に持っているものは個別に調べていく必要がありますが、指定してもエラーになる事が多いので、実際に対象アプリケーションからデータを取り出してバックアップできるかはアプリケーション次第でしょうか。 

 

Get a list of available Content Providers
http://stackoverflow.com/questions/2001590/get-a-list-of-available-content-providers