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.
Intente usar la biblioteca stetho desarrollada por facebook, le permite ver la base de datos a través del navegador web https://facebook.github.io/stetho/
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.
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]
Cambie [paquete] al paquete de aplicación deseado
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