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

181

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 como esta?

¿Cómo obtengo acceso de root en mi teléfono?

Gregm
fuente
Simple ... asegúrese de que la pantalla de su teléfono esté encendida. Haga clic en "Permitir" cuando le pregunte si desea que Desconocido tenga acceso a la raíz. Hecho.
decidió crear un avd simple para tener acceso a la base de datos. ¿Alguien tiene enlaces a guías, sin destellos y gráficos "personalizados" para desarrolladores? Justo cómo obtener Android simple de vainilla en un dispositivo comprado.
bgs
No se produce dicho aviso en mi dispositivo Android 7.1.1. Pero adb sigue adelante y enumera los contenidos del directorio. El problema es que los contenidos en realidad no existen. Estoy usando adb-sync para agregar contenidos. Es muy raro
Tom Russell

Respuestas:

139

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

  1. Debe tener un teléfono con acceso de root para explorar la carpeta de datos en un teléfono Android. Eso significa que tiene un dispositivo de desarrollador ( ADP1 o un ION de Google I / O) o ha encontrado una manera de 'rootear' su teléfono de otra manera.
  2. Necesita ejecutar ADB en modo raíz, haga esto ejecutando: adb root
Reto Meier
fuente
77
Y "adb root" requiere una compilación personalizada de adb, de lo contrario "adbd no puede ejecutarse como root en las compilaciones de producción"
bortzmeyer
16
compilación personalizada de adb? de donde puedo conseguirlo?
Gopinath
9
alguna respuesta a la pregunta de @Gopinath?
Ewoks
2
@Gopinath: Creo que debe construirlo desde la fuente para el dispositivo de destino, configurado para permitir la raíz utilizando el ndk y luego flashearlo en el dispositivo junto con una imagen de los archivos binarios.
Ben Jaguar Marshall el
44
AFAIK, no es necesario tener una compilación personalizada de adb. ES necesario tener soporte de adbd ejecutándose como root, pero este adbd está en el dispositivo, por lo que cualquier modificación que se haya hecho para que el dispositivo tenga acceso de root es suficiente.
nitzanms
222

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

Listar el contenido del directorio de yourapp:

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

Cambie al UID de com.yourapp y ejecute todos los comandos adicionales usando ese uid (hasta que llame 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 /data/datadirectorio, el run-ascomando no se ejecuta en esos teléfonos.

Nota 2 : Como se señaló en los comentarios de @Avio: run-astiene problemas también con los teléfonos Samsung Galaxy S que ejecutan Cyanogenmod en cualquier versión (de 7 a 10.1) porque en esta plataforma /data/dataes 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 de root).

Ídolo
fuente
2
Esto funciona como explicaste dónde estás run-as com.mypackage. El problema con el que me encontré es sqlite3 /data/data/com.mypackage/databases/mydb"sqlite3: permiso denegado". ¿Sqlite3 solo puede ejecutarse por root?
Styfle
55
Funciona a la perfección cuando se trata de enumerar archivos almacenados en el almacenamiento interno.
zaplec
55
Tuve que cambiar los permisos en el archivo para poder moverlo a mi tarjeta SD, porque no podía ejecutarlo como mi aplicación. Entonces, 1) run-as com.package.example, chmod 777 databasefile.db. 2) salga, vaya a sdcard, cp /data/data/com.package.example/databases/databasefile.db. Y el paso 3 debería revertir los permisos 777
Maragues
3
Mi paquete es desconocido, no importa cuán correctamente lo deletreo en mi terminal: (
Costa
3
Esta debería ser la respuesta marcada correcta ya que este es el método correcto para usar en teléfonos no rooteados.
LNI
49

antes de comenzar, ¿tienes un teléfono rooteado ? si no, sugiero que es hora de que hagas el salto. El 99% de los tutoriales que lo ayudan a hacer esto requieren que tenga un teléfono rooteado (sé que b / c pasé aproximadamente una hora buscando una manera de hacerlo sin tener un teléfono rooteado ... no pude encontrar ninguno ... ) también si lo piensa, su iPhone también debe estar rooteado para hacer esta misma tarea. Entonces es totalmente razonable. Más sobre el enraizamiento al final de la respuesta.

desde su tipo de línea de comando:

adb shell

esto lo lleva a su línea de comando de shell de Android (debería ver algo como esto: shell@android:/ $ahora escriba:

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 es así (es decir, si obtiene un error), entonces probablemente no tenga un teléfono rooteado o no haya utilizado sus privilegios de usuario root. Para usar sus privilegios de usuario root, escriba suen la línea de comando adb y vea qué sucede, si obtiene un error, entonces su teléfono no está rooteado. Si no es así, rootearlo primero y luego continuar con estas instrucciones.

desde allí puede escribir lsy verá todos los directorios, incluido el dbs:

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

cache
databases
lib
shared_prefs   

después de eso, puede usar sqlite3 para navegar por la base de datos ... si no lo tiene instalado (puede averiguarlo escribiendo sqlite3, si lo tiene command not found, tendrá que instalarlo. Para instalar sqlite, siga las instrucciones aquí .

sobre el enraizamiento: si nunca ha rooteado su teléfono antes, y le preocupa que lo arruine, puedo decirle con plena confianza que no hay nada de qué preocuparse. Hay toneladas de tutoriales rápidos y fáciles de enrutamiento de teléfonos para casi todos los modelos nuevos y antiguos, y puedes rootear tu teléfono incluso si tienes una Mac (rooteé mi s3 con mi Mac).

abbood
fuente
8
No necesita un teléfono rooteado para run-astrabajar. Acabo de probarlo en un Galaxy Nexus S. de producción
Ted Hopp
@TedHopp y, por lo tanto, b / c funciona bien en su Galaxy Nexus S de generación de producción ... funcionará bien en todos los teléfonos Android, ¿verdad?
abbood
Primero, mi teléfono es un contraejemplo que muestra que no se requiere un teléfono rooteado . En segundo lugar, sí, debería funcionar en todos los dispositivos no rooteados que son al menos Android 2.2 (no porque funcione en mi teléfono, sino porque así es como se supone que debe funcionar; vea la respuesta de Idolon ).
Ted Hopp
@TedHopp personalmente no soy un gran desarrollador de Android ... y entonces las instrucciones como build the application as debuggable (either by building it with the Eclipse, or ant debug command)pueden sonar triviales para ti, pero me intimidan un poco. Supongo que mi respuesta es más para las personas que se sienten cómodas rooteando sus teléfonos Android, pero que no conocen bien el mundo de desarrollo de Android. Pero me alegro de que tengamos esta discusión. Quiero que los lectores de mi respuesta estén al tanto de las otras alternativas que no son de enraizamiento
Abbood
1
Gran respuesta hombre. Estoy usando algunos teléfonos diferentes aquí (MotoX, nexus4, LG G3, SGIII) y esto es bastante bueno para todos.
Chad Bingham
45

$ adb shell

$ cd / datos

$ 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

¡OKAY!

Hola Mundo
fuente
¡Esto funciona! Un par de cosas por hacer antes de ejecutar cualquier comando. Una vez que las opciones de desarrollador estén habilitadas en el teléfono, también deberíamos habilitar la depuración de USB . También habilité algo en mi teléfono (HTC M8) llamado Seleccionar aplicación de depuración y elegí mi aplicación. Podría ser estándar en todos los teléfonos ... debería serlo.
srinij
30

Tuve un problema similar al intentar operar en 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 root en las compilaciones de producción". Aquí hay un método simple que permite convertirse en root.

En lugar del anterior, emita los siguientes dos comandos uno tras otro

> adb shell
$ su

Después del primer comando, si la solicitud ha cambiado de '>' a '$' como se muestra arriba, significa que ha ingresado al entorno adb shell. Si posteriormente la solicitud ha cambiado a '#' después de emitir el segundo comando, eso significa que ahora es root. Ahora, como root, puedes hacer lo que quieras con tu dispositivo.

Para volver al shell 'seguro', emita

# exit

Verá que vuelve a aparecer el mensaje '$', lo que significa que está en el shell adb como usuario y no como root.

rytis
fuente
13
su: permiso denegado
petrnohejl
3
¡Genial gracias! Por cierto, necesitas tener un teléfono rooteado para hacer esto. ¿También puede necesitar SuperSU o algo similar? Al menos cuando intenté usar "su" SuperSU me dio un diálogo en mi teléfono.
Richard Fung
16
/ system / bin / sh: su: not found
matt lohkamp
1
Gracias :) adb shell + suresolvieron el molesto permiso para siempre. Tuve un problema su: not foundcon Android 4.3 pero desde que actualicé a 4.4.2 el problema desapareció. 4.3 parece tener problemas.
3
su no está disponible para mí, Nexus 5 / Android 5.1: ¿hay alguna solución?
CodeManX
19

Tuve muchos problemas con esto también. 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 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 copiar el archivo db (aunque podría navegar al directorio), ni 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 un archivo db con SQLite Database Browser. :)

MSquare
fuente
Intenté -> run-as <app_package_name> Pero el adb no reconoció mi app_package_name. Usé el nombre_paquete que especifiqué en mi AndroidManifest.xml. ¿Hay algo que este olvidando?
ARCA
3

Los siguientes son los dos pasos para obtener acceso de root:

  1. Sus dispositivos Android deben estar rooteados.
  2. En el shell ADB, escriba su y el dispositivo Android le preguntará y / n. Tú eliges permitir.
VietHuong
fuente
escriba su .. dará pronta en el dispositivo móvil .. pidiendo permiso súper través de superusuario ..es trabajaron
Mahajan344
2

las compilaciones 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.

keith
fuente
2

El problema podría ser que necesitamos dar acceso a la raíz 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 * * el demonio se inició con éxito * el 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.. 
ashishsony
fuente
1

Si conoce el paquete de la aplicación, puede cdacceder directamente a esa carpeta.

p.ej cd data/data/com.yourapp

esto lo colocará en un directorio read/writablepara que pueda cambiar los archivos según sea necesario. Como la carpeta es la misma en emulator, puede usarla para obtener la ruta de la carpeta.

marca
fuente
2
Puedo cd a la carpeta directamente, pero sigo recibiendo el error "error de opendir, permiso denegado".
Tyler Collier el
Esto se debe a que el usuario "shell" de adb tiene permiso de ejecución en los directorios, pero no tiene permiso de lectura.
Chris Stratton
0

Si solo quiere ver sus DB & Tables, entonces la forma más sencilla es usarlo Stetho. Muy buena herramienta para todos los desarrolladores de Android que usan SQLitebuit by Facobook developed.

Steps to use the tool

  1. Agregue la siguiente dependencia en el archivo gradle de su aplicación (Módulo: aplicación)

'compilar' com.facebook.stetho: stetho: 1.4.2 '

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

Ahora, cree su aplicación y cuando la aplicación se esté ejecutando, puede explorar su base de datos de aplicaciones abriendo Chrome en la URL:

chrome://inspect/#devices

Las capturas de pantalla de la misma son las siguientes:

ChromeInspact

ChromeInspact

Su DB

Su DB

Espero que esto ayude a todos! :)

Rupesh Yadav
fuente
0

Esto funciona si su dispositivo Android está rooteado por algún medio (no estoy seguro si funciona para no rooteado).

  1. adb shell - acceder al shell
  2. su - Conviértete en el superusuario.

Ahora puede leer todos los archivos en todos los directorios.

roshnet
fuente
-3

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

  1. inicie el adb usando cmd desde la carpeta de herramientas de plataforma de acuerdo con su 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

    por ejemplo, la respuesta del comando es

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

        adb -s 0123456789ABCDEF shell "su"

    se abrirá en

        root@theDeviceName:/ #

4.Acceso a los archivos, enumere todos los archivos

ls

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

cd data/data
Mahmoud Ashraf
fuente
1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell "su" / system / bin / sh: su: no encontrado
Solo
en mi caso era Android 5.0.2, no sé si difiere de una versión a otra @Koen
Mahmoud Ashraf
la ruta depende de dónde instaló Android Studio y son SDKs @Solo
Mahmoud Ashraf
1
El problema no es encontrar dónde está adb. Está en mi camino. Obtener la lista de archivos (o incluso ejecutar su) no funciona / no está permitido. Pruebas con Android 4.3.
Koen
no se encuentra su
Brill Pappin
-5

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

su - root

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

Petsome
fuente