¿Alguien puede decirme, ¿es posible utilizar el ADB pull y push con una base de datos de una aplicación, sin privilegios de root en el teléfono?

Por ejemplo, sé que la ubicación en mi arraigada la magia y el sueño es:

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

Yo sé que usted puede utilizar ADB sin root, pero cuando intento usar el shell – usted no puede ver que la ubicación sin root privaliges. Pero me han dicho que usted puede usar push y pull si sabe que el archivo que usted desea?

Básicamente quiero tirar de una base de datos de MI aplicación en un teléfono rooteado no se modifica y empujar de nuevo.

Único problema que tengo es, los dos teléfonos que tengo son la raíz y no tengo acceso a un no-root uno para probarlo.

InformationsquelleAutor Scoobler | 2010-01-16

5 Comentarios

  1. 78

    Mientras Nilhcem la respuesta no trabajo para mí, que me llevan en la dirección correcta (para que me upvoted) y ahora tengo una solución de trabajo.

    Respuesta anterior que no puede funcionar con las versiones más recientes de 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

    Método alternativo para el uso de almacenamiento externo (confirmado para trabajar con 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
    • Esta es una respuesta correcta para la pregunta, donde la persona que quiera hacer esto es el desarrollador de la aplicación y se puede instalar una versión de depuración de la misma (versión de depuración de ser un pre-requisito para ejecutar). Otras opciones incluyen tener la misma aplicación, cambiar el permiso o copiar el archivo a/desde el almacenamiento externo.
    • bad volver con el mensaje de ejecución como: el Paquete ‘com.instagram.android’ es desconocido ¿qué debo hacer? Yo también intente utilizar su y luego adb pull /data/data/paquete.nombre/bases de datos/dbname.db ~/Desktop/ pero devuelve el error: no se encontró el dispositivo?
    • Hay un problema en 4.3 que rompe ejecutar y debe ser reparado en 4.4. Ver: code.google.com/p/android/issues/detail?id=58373 Si usted tiene raíz, se puede solucionar mediante la habilitación de la Set UID permiso de /system/bin/run-como, pero ese tipo de derrotas el propósito.
    • Gracias por su respuesta
    • Que podría significar que su aplicación no es una versión de depuración (teniendo el mismo problema en 2.3).
    • Aunque el archivo claramente existe y tiene el chmod 666 aplicada, adb pull dice que el objeto remoto no existe. Parece que usted todavía necesita un poco de permisos adicionales para hacer esto?
    • He estado tratando de hacer algo como esto, pero no es un archivo de una aplicación específica. Estoy específicamente tratando de acceder al gesto.archivo de la clave en mi teléfono y no me deja tirar de él o chmod. ¿Hay algo que pueda poner en después de la run-as que me concedería acceso de lectura al archivo?
    • Esta solución no funciona, al menos en Android 5.1+. Extrae el archivo dice «el objeto remoto nombre de archivo no existe». La respuesta debe reflejar esto.
    • Finalmente tuve una necesidad para transferir un archivo a mi de datos de la aplicación en 6.0.1 (stock del Nexus 5) y vino para arriba con una manera de hacerlo a través de almacenamiento externo, muy similar a la Nilhcem la respuesta. Añadido a la respuesta.
    • No funciona en los dispositivos SAMSUNG. stackoverflow.com/questions/37413667/…
    • La segunda parte de su respuesta me salvó el día. Comprueba también en Android 6.0.1 y funciona a la perfección.

  2. 13

    Una rápida solución es utilizar el run-as comando para copiar la base de datos en una carpeta donde se puede tener acceso, como /sdcard y, a continuación, hacer un normal adb pull

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

    Más información sobre la ejecución del comando aquí

    Tenga en cuenta que el run-as comando está disponible desde el nivel de la API 8 (Android 2.2) y sólo puede ser utilizado si la aplicación es debbugable.

    • en mi versión (tal vez algo que ver con 4.4, o alguna actualización en el último año?) Yo no puedo cp a /sdcard cuando se utiliza run-as. Necesito usar el chmod solución de @Pilot_51
    • Esto es cierto – la tarjeta sd ya no es de escritura al utilizar adb shell
  3. 1

    Sobre OxygenOS (basado en Android 5.2) he mezclado las dos soluciones proporcionadas por Pilot_51.

    Primero he utilizado run-as para obtener acceso en /data/data/package.name/databases a partir de aquí yo no era capaz de copiar directamente en /sdcard/ por lo tanto he cambiado los permisos del archivo. Después de que he salido de run-as modo y utiliza cp a copiar el archivo en /sdcard/ el almacenamiento. Finalmente fui capaz de usar 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
  4. 0

    Hemos establecido los permisos de archivo legible para todos los usuarios dentro de la aplicación.

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

    A continuación, sólo tiene que tirar de el .db off con el adb normalmente.

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

    NOTA: he descubierto que esto debe hacerse cada vez que el archivo de base de datos se abre, por ejemplo, en el onCreate así como el constructor de su SQLiteOpenHelper contenedor (cuando la base de datos no es nula) o tal vez onOpen. Si sólo en el onCreate, entonces la próxima vez que ejecute la aplicación y el .db ya existe, por alguna razón, han cambiado los permisos de la espalda. Esto podría tener algo que ver con la forma en que Android gestiona sus datos.

  5. 0

    si usted quiere empujar archivo de base de datos en la aplicación

    primero de todos, el lugar de archivo».db» bajo «/storage/emulado/0/» debido a problema de permisos. entonces usted debe hacer como una aplicación para acceder a la carpeta de datos.

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

    copia el archivo.db que en la carpeta principal de las bases de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here