ser samsung rootear dispositivo desde como celular aplicacion android sqlite adb android-contentprovider android-sqlite

samsung - Cómo verificar la base de datos en un dispositivo Android no rooteado



rootear android desde pc (11)

Estoy desarrollando una aplicación en la que estoy utilizando la base de datos sqllite3 para almacenar valores. Tengo Nexus S y Nexus 7, ambos son dispositivos unrooteados. ¿Cómo puedo obtener la base de datos de mi aplicación para fines de depuración?

He intentado (1) He intentado todos los enfoques mencionados here

adb shell run-as app.package.name / cp /data/data/package.name/databases/application.sqlite /sdcard/ exit adb pull /sdcard/application.sqlite ~/

Esto dice cp no encontrado ..

(2) http://developer.android.com/tools/help/adb.html#sqlite

adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit


Aquí hay una respuesta muy simple y directa: (Probado en Android uno: sin raíz )

adb -d shell $ run-as my.package.name $ cp databases/mydatabase.db /sdcard/mydatabase.db $ exit $ exit

ahora tire de su base de datos a la ruta por defecto de Adb

adb -d pull /sdcard/mydatabase.db

o, a su escritorio por ejemplo

adb -d pull /sdcard/mydatabase.db C:/Users/user/Desktop

es posible que desee eliminar la copia con un comando a continuación:

adb -d shell "rm /sdcard/mydatabase.db"

-d opción -d elige el dispositivo predeterminado si tiene más de un emulador.


Creo que esta es la forma más fácil. Agregue esta dependencia a su archivo gradle: debugImplementation ''com.amitshekhar.android:debug-db:1.0.0''

Después de esto, cuando inicie la aplicación en su consola, podrá ver el mensaje: D / DebugDB: Abra http://192.168.1.114:8080 en su navegador

Y ahí está tu base de datos.



La siguiente solución funciona solo para aplicaciones que se pueden depurar. Puede que no funcione bien en todos los dispositivos, ya que el comando ejecutar-como no funciona en algunos dispositivos, especialmente con Jelly Bean.

  1. Cree un archivo * .bat y copie los siguientes scripts

    adb shell run-as [paquete] chmod 777 / data / data / [package] / database /

    adb shell run-as [paquete] chmod 777 / data / data / [package] / database / [db_file_name]

    adb shell run-as [paquete] cp / data / data / [paquete] / database / [nombre_archivo_bd] / sdcard /

    adb pull / sdcard / [db_file_name]

  2. Cambie [paquete] al paquete de aplicación deseado

  3. Cambie [db_file_name] al nombre de db deseado Ejecute el archivo bat y verá la base de datos copiada en la misma carpeta que el archivo bat

La solución anterior asume:

  • Estas trabajando en windows
  • El dispositivo está conectado y es visible bajo "adb devices"

No es posible desde un teléfono no rooteado. No puede acceder al directorio / data, por lo que no puede copiar la base de datos o usar la aplicación sqlite como en (2). Si necesita depurar, use el simulador o, desde la aplicación, ejecute las consultas para inspeccionar la base de datos.


Puede escribir su base de datos en la memoria externa con lo siguiente:

private void writeToSD() throws IOException { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { String currentDBPath = DB_NAME; String backupDBPath = "backupname.db"; File currentDB = new File(DB_PATH, currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } }

Donde DB_NAME es el nombre de mi base de datos y DB_PATH se define de la siguiente manera:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator; } else { DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/"; }

Y agregue el siguiente permiso (Gracias a @Sathesh por señalarlo):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Llamo a este método cada vez que tengo una base de datos de escritura para que mi archivo de base de datos más actual se encuentre en la memoria externa y pueda verlo y depurar desde allí.

Luego, puede usar la aplicación X-Plore para ver la base de datos desde la memoria externa directamente en el dispositivo Android.


Si despues de correr

adb shell "run-as your.package.name"

recibe "run-as: Package ''your.package.name'' es desconocido", luego intente obtener una base de datos desde el emulador. Consulte aquí: https://.com/a/44089632/2914140

En Android Studio 3.0, haga clic en Ver> Herramientas de Windows> Explorador de archivos de dispositivos. Expanda los nodos / data / data / [nombre-paquete].


Si no conoce la ruta de su aplicación, puede usar esto:

public void copyAppDbToExternalStorage() throws IOException { File sd = Environment.getExternalStorageDirectory(); File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (sd.canWrite()) { File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } }

O si necesita copiar la base de datos a la carpeta pública "Descargar", puede usar esto:

public void copyAppDbToDownloadFolder() throws IOException { File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db" File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } }

Esto funciona perfectamente en mi dispositivo Nexus 4.


Solo tuve que hacer algo como esto y hay una manera de hacerlo, aunque es un dolor. Debe activar el archivo como la cuenta de usuario de la aplicación y luego canalizarlo a una ubicación de escritura. Esto me funcionó en mi Nexus 4 con 4.3.3:

adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file" adb pull /mnt/sdcard/your-file


No puede acceder a la carpeta / data en un dispositivo no rooteado

No hay manera de hacer eso. Android tiene grandes mecanismos de seguridad. Solo tu aplicación puede acceder a sus propios archivos.


adb shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db" adb shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/

En Xamrin.forms tuve que reemplazar bases de datos a archivos