¿Por qué obtengo acceso denegado a la carpeta de datos cuando uso adb?

Me conecté a mi dispositivo en vivo usando el adb y los siguientes comandos:

C:\>adb -s HT829GZ52000 shell $ ls ls sqlite_stmt_journals cache sdcard etc system sys sbin proc logo.rle init.trout.rc init.rc init.goldfish.rc init default.prop data root dev $ cd data cd data $ ls ls opendir failed, Permission denied 

Me sorprendió ver que tengo acceso denegado. ¿Cómo es que no puedo navegar por los directorios usando la línea de comandos de esta manera?

¿Cómo obtengo el acceso raíz en mi teléfono?

Hay dos cosas que debe recordar si desea explorar todo en su dispositivo.

  1. Necesita tener un teléfono con acceso de administrador para navegar por la carpeta de datos en un teléfono con Android. Eso significa que o tiene un dispositivo desarrollador ( ADP1 o ION de Google I / O) o ha encontrado la forma de “rootear” su teléfono de otra forma.
  2. Necesita ejecutar ADB en modo raíz, haga esto ejecutando: adb root

A partir del API nivel 8 (Android 2.2), para la aplicación depurable (la que construye Android Studio todo el tiempo a menos que se solicite la versión de lanzamiento), puede usar el comando shell run-as para ejecutar un comando o ejecutable como un específico usuario / aplicación o simplemente cambie al UID de su aplicación para que pueda acceder a su directorio de datos .

Lista el contenido del directorio de yourapp:

 run-as com.yourapp ls -l /data/data/com.yourapp 

Cambie a UID de com.yourapp y ejecute todos los comandos adicionales usando ese uid (hasta que llame a exit ):

 run-as com.yourapp cd /data/data/com.yourapp ls -l exit 

Nota 1 : hay un problema conocido con algunos teléfonos HTC Desire. Debido a un propietario / permisos no estándar del directorio /data/data , el comando run-as no se ejecuta en esos teléfonos.

Nota 2 : Como se indicó en los comentarios de @Avio: run-as también tiene problemas con los teléfonos Samsung Galaxy S con Cyanogenmod en cualquier versión (del 7 al 10.1) porque en esta plataforma /data/data hay un enlace simbólico a /datadata . Una forma de resolver el problema es reemplazar el enlace simbólico con el directorio real (desafortunadamente esto generalmente requiere acceso raíz).

antes de comenzar, ¿tienes un teléfono rooteado ? si no, le sugiero encarecidamente que es hora de que haga el salto. El 99% de los tutoriales que te ayudan a hacer esto requieren que tengas un teléfono rooteado (sé b / c Pasé aproximadamente una hora buscando una forma de hacerlo sin tener un teléfono rooteado … no pude encontrar ninguno … ) también, si lo piensas, tu iPhone también tiene que estar rooteado para hacer esta misma tarea. Entonces es totalmente razonable. Más sobre rooting al final de la respuesta.

desde tu línea de comando escribe:

 adb shell 

esto te lleva a la línea de comandos del shell de Android (deberías ver algo como esto: shell@android:/ $ ahora escribe:

 shell@android:/ $run-as com.domain.yourapp 

esto debería llevarlo directamente al directorio de datos de com.domain.yourapp :

 shell@android:/data/data/com.domain.yourapp $ 

si no lo hace (es decir, si obtiene un error), entonces probablemente no tenga un teléfono rooteado o no haya utilizado sus privilegios de usuario raíz. Para usar sus privilegios de usuario raíz, escriba su en la línea de comando de adb y vea qué sucede, si obtiene un error, entonces su teléfono no está rooteado. Si no es así, enraícelo primero y luego continúe con estas instrucciones.

a partir de ahí, puede escribir ls y verá todos los directorios, incluidos los dbs:

 shell@android:/data/data/com.domain.yourapp $ ls cache databases lib shared_prefs 

luego puede usar sqlite3 para explorar dbase … si no lo tiene instalado (puede encontrarlo escribiendo sqlite3 , si obtiene el command not found entonces tendrá que instalarlo. Para instalar sqlite, siga instrucciones aquí .

acerca del enraizamiento: si nunca has rooteado tu teléfono con anterioridad y te preocupa que pueda enloquecer tu teléfono, puedo decirte con plena confianza que no hay nada de qué preocuparse. hay toneladas de tutoriales de rooteo telefónicos rápidos y fáciles para casi todos los modelos nuevos y antiguos, y puedes rootear tu teléfono incluso si tienes un mac (he rooteado mi s3 con mi mac).

$ adb shell

$ cd / data

$ ls

opendir falló, Permiso denegado


Usted debe hacer esto:

 $ adb shell $ cd /data shell@android:/data $ run-as com.your.package shell@android:/data/data/com.your.package $ ls 

¡DE ACUERDO!

Tuve un problema similar al intentar operar con un Samsung Galaxy S rooteado. Emitir un comando desde el shell de la computadora

 > adb root 

falla con un mensaje “no se puede ejecutar como raíz en comstackciones de producción”. Aquí hay un método simple que permite convertirse en root.

En lugar de lo anterior, emita los siguientes dos comandos uno después del otro

 > adb shell $ su 

Después del primer comando, si el mensaje ha cambiado de ‘>’ a ‘$’ como se muestra arriba, significa que ha ingresado al entorno del shell adb. Si posteriormente el aviso ha cambiado a ‘#’ después de emitir el segundo comando, eso significa que ahora eres root. Ahora, como root, puede hacer lo que quiera con su dispositivo.

Para volver al shell ‘seguro’, emita

 # exit 

Verás que reaparece el mensaje ‘$’, lo que significa que estás en el shell adb como usuario y no como raíz.

También tuve muchos problemas con esto. Todavía no entiendo completamente el permiso y la ejecución de la raíz, pero esto funcionó para mí (una de las respuestas anteriores en parte) para copiar el archivo de la base de datos de / data / data / [nombre del paquete] /databases/my_db.db. Ejecutar shell root , o su in shell por alguna razón no funcionó, ni copió el archivo db (aunque pude navegar hasta el directorio), ni lo hizo sqlite3 .

Entonces, esto funcionó! En el símbolo del sistema de DOS:

 C:\Program Files\Android\android-sdk\platform-tools>adb shell 1|shell@android:/ $ run-as de.vogella.android.locationapi.maps run-as de.vogella.android.locationapi.maps 1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data cd /data shell@android:/data $ cd data cd data shell@android:/data/data $ cd de.vogella.android.locationapi.maps cd de.vogella.android.locationapi.maps shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases cd databases shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls ls bus_timetable_lines.db bus_timetable_lines.db-journal shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus _timetable_lines.db > /sdcard/db_copy.db bus_timetable_lines.db > /sdcard/db_copy.db < shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit ^ exit shell@android:/ $ exit exit C:\Program Files\Android\android-sdk\platform-tools> 

Ahora vaya al directorio SDCARD y obtenga su archivo db_copy.db. Incluso eso estaba oculto, pero logré enviarlo por correo electrónico. De vuelta en Windows, pude abrir el archivo db con el navegador de la base de datos SQLite. 🙂

Los siguientes son los dos pasos para obtener acceso a la raíz:

  1. Sus dispositivos Android deben estar rooteados.
  2. En shell ADB, escriba su y el dispositivo Android mostrará y / n? Tú eliges permitir.

El problema podría ser que tenemos que otorgar acceso root a adb específicamente en las opciones de desarrollo en los últimos CM. Esto es lo que hice.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * daemon no se está ejecutando. comenzando ahora en el puerto 5037 * * daemon started successfully * acceso a la raíz está deshabilitado por la configuración del sistema – habilitar en la configuración -> opciones de desarrollo

después de alterar las opciones de desarrollo …

 abc@abc-L655:~$ sudo adb kill-server abc@abc-L655:~$ sudo adb root start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * restarting adbd as root abc@abc-L655:~$ adb shell root@android:/ # ls /data/ .... good to go.. 

las comstackciones de producción no pueden ingresar / data / app

 drwxrwx--- system cache 1970-01-01 08:00 cache drwxrwxr-x root system 1970-01-01 08:00 mnt drwxrwx--x system system 1970-01-01 08:15 data 

podría necesitar cambiar al propietario correcto para operarlo.

si conoce el paquete de la aplicación, puede cd directamente a esa carpeta.

por ejemplo, cd data/data/com.yourapp

esto lo llevará a un directorio que es de read/writable para que pueda cambiar los archivos según sea necesario. Dado que la carpeta es la misma en el emulator , puede usar eso para obtener la ruta de la carpeta.

Si solo quieres ver tus Tablas y DB, entonces la mejor manera es usar Stetho . Se desarrolló una herramienta genial para todos los desarrolladores de Android que utilizan SQLite buit de Facobook developed .

Steps to use the tool

  1. Añádalo a continuación en el archivo gradle de su aplicación (Módulo: aplicación)

‘comstackr’ com.facebook.stetho: stetho: 1.4.2 ‘

  1. Agregue líneas de código debajo en su método Activity onCreate ()
 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Stetho.initializeWithDefaults(this); setContentView(R.layout.activity_main); } 

Ahora, crea tu aplicación. Cuando la aplicación se está ejecutando, puedes navegar por la base de datos de tu aplicación abriendo Chrome en la url:

 chrome://inspect/#devices 

Las capturas de pantalla de los mismos son las siguientes_

ChromeInspact

ChromeInspact

Tu DB

Tu DB

Espero que esto ayude a todos! 🙂

sin rootear el dispositivo, puede acceder a los archivos con la siguiente captura de pantalla de cmd:

  1. inicia el adb usando cmd desde la carpeta platform-tools según tu usuario

     cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools 

    puede estar en otra carpeta depende de dónde lo instaló.

  2. mostrar los dispositivos de trabajo.

     adb devices 

    para decir que responde el comando es

     List of devices attached 0123456789ABCDEF device 
  3. escribe el comando

      adb -s 0123456789ABCDEF shell "su" 

    se abrirá en

      root@theDeviceName:/ # 

4. Acceder a los archivos, enumerar todos los archivos

 ls 

y así sucesivamente chang directorio a cualquier otro lugar como la carpeta de datos

 cd data/data 

Cuando estás en el directorio de shell para el dispositivo. Solo corre

 su - root 

Entonces deberías poder acceder a la carpeta / datos.