web-dev-qa-db-ja.com

AndroidルートなしのアプリケーションデータベースへのADBアクセス

誰かが私に言うことができますか、ADBを使用して、電話でルート権限なしにアプリからデータベースをプルおよびプッシュすることは可能ですか?

たとえば、私の根付いた魔法と夢の場所は次のとおりです。

/data/data/com.xxxx.xxxx/databases/xxxx

ルートなしでADBを使用できることは知っていますが、シェルを使用しようとすると、ルート権限なしではその場所を表示できません。しかし、必要なファイルがわかっている場合は、プッシュアンドプルを使用できると言われました。

基本的に、ルート化されていない電話のMYアプリからデータベースをプルし、それを変更してプッシュバックしたいと思います。

私が抱えている唯一の問題は、私が持っている2つの電話は両方ともルートであり、それを試すために非ルートの電話にアクセスできないことです。

34
Scoobler

Nilhcemの答えは私にとってはうまくいきませんでしたが、それは私を正しい方向に導き(そのため私は賛成しました)、今、私は有効な解決策を持っています。

Androidの新しいバージョンでは動作しない可能性がある古い回答:

#Transfer file from app databases directory to PC
adb Shell
$ run-as package.name
$ cd ./databases/
$ ls -l #Find the current permissions - r=4, w=2, x=1
$ chmod 666 ./dbname.db
$ exit
$ exit
adb pull /data/data/package.name/databases/dbname.db ~/Desktop/

#Transfer file from PC to app databases directory (requires the above permission change)
adb Push ~/Desktop/dbname.db /data/data/package.name/databases/dbname.db
adb Shell
$ run-as package.name
$ chmod 660 ./databases/dbname.db #Restore original permissions
$ exit
$ exit

外部ストレージを使用した代替方法(6.0.1で動作することが確認されています):

#Transfer file from app databases directory to external storage
adb Shell
$ run-as package.name
$ cp ./databases/dbname.db /sdcard/
$ exit
$ exit

#Transfer file from external storage to app databases directory
adb Shell
$ run-as package.name
$ cp /sdcard/dbname.db ./databases/
$ exit
$ exit
79
Pilot_51

簡単な回避策は、run-asコマンドを使用して、/sdcardなどのアクセス権を持つフォルダーにデータベースをコピーし、通常のadb pullを実行することです。

adb Shell
$ run-as package.name cp /data/data/package.name/dbname.db /sdcard/
$ exit
adb pull /sdcard/dbname.db

Run-asコマンドの詳細 here

run-asコマンドはAPIレベル8(Android 2.2)以降で使用でき、アプリケーションが debbugable の場合にのみ使用できることに注意してください。

13
Nilhcem

OxygenOSについて(Android 5.2に基づく)Pilot_51が提供する2つのソリューションを混同しています。

最初に、ここからrun-asを使用して/data/data/package.name/databasesにアクセスしましたが、/sdcard/に直接コピーできなかったため、ファイルの権限を変更しました。その後、run-asモードを終了し、cpを使用して/sdcard/ストレージにファイルをコピーしました。最終的にはadb pullを使用することができました

$ adb -s <DEVICE_ID> Shell
$ run-as package.name
$ chmod 666 databases/dbname.db
$ exit
$ cp /data/data/package.name/databases/dbname.db /sdcard/dbname.db
$ exit
$ adb pull /sdcard/dbname.db ./dbname.db
1
FredMaggiowski

アプリケーションにdbファイルをプッシュする場合

まず、権限の問題のため、「/ storage/emulated/0 /」の下に「file.db」を配置します。次に、データフォルダーにアクセスするアプリケーションのふりをする必要があります。

  adb Shell
  $ run-as com.package.name
  :/data/data/com.package.name $ cp /storage/emulated/0/file.db /data/data/com.package.name/databases/

メインフォルダーにあるfile.dbをデータベースにコピーします。

0
AhuraMazda

アプリ内からすべてのユーザーが読み取り可能なファイルのアクセス許可を設定します。

if (BuildConfig.DEBUG)
{
    new File(mDB.getPath()).setReadable(true, false);
}

次に、通常どおりadbで.dbを削除します。

adb -d pull //data/data/xxxxx/databases/xxxxx.db .

注:これは、データベースファイルが開かれるたびに実行する必要があることを発見しました。たとえば、onCreateやSQLiteOpenHelperラッパーのコンストラクター(データベースがnullでない場合)またはおそらくonOpen。 onCreateのみの場合は、次にアプリを実行したときに.dbがすでに存在しているため、何らかの理由で権限が変更されています。これは、Androidがデータを管理する方法に関係している可能性があります。

0
delrocco