誰かが私に言うことができますか、ADBを使用して、電話でルート権限なしにアプリからデータベースをプルおよびプッシュすることは可能ですか?
たとえば、私の根付いた魔法と夢の場所は次のとおりです。
/data/data/com.xxxx.xxxx/databases/xxxx
ルートなしでADBを使用できることは知っていますが、シェルを使用しようとすると、ルート権限なしではその場所を表示できません。しかし、必要なファイルがわかっている場合は、プッシュアンドプルを使用できると言われました。
基本的に、ルート化されていない電話のMYアプリからデータベースをプルし、それを変更してプッシュバックしたいと思います。
私が抱えている唯一の問題は、私が持っている2つの電話は両方ともルートであり、それを試すために非ルートの電話にアクセスできないことです。
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
簡単な回避策は、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 の場合にのみ使用できることに注意してください。
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
アプリケーションに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をデータベースにコピーします。
アプリ内からすべてのユーザーが読み取り可能なファイルのアクセス許可を設定します。
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がデータを管理する方法に関係している可能性があります。