Por que obtenho acesso negado à pasta de dados ao usar adb?

181

Conectei o meu dispositivo ao vivo usando o adb e os seguintes 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

Fiquei surpreso ao ver que tenho acesso negado. Como é que não consigo navegar pelos diretórios usando a linha de comando como esta?

Como obtenho acesso root no meu telefone?

gregm
fonte
Simples ... verifique se a tela do telefone está ligada. Clique em "Permitir" quando perguntar se você deseja que o Unknown tenha acesso à raiz. Feito.
decidiu criar um avd simples para ter acesso ao banco de dados. Alguém tem algum link para guias, sem reflexos e gráficos "personalizados" para desenvolvedores? Apenas como obter o Android vanilla simples em um dispositivo comprado.
bgs
Esse prompt não ocorre no meu dispositivo Android 7.1.1. Mas o adb segue em frente e lista o conteúdo do diretório. O problema é que o conteúdo não existe realmente. Estou usando o adb-sync para adicionar conteúdo. É bem estranho.
Tom Russell

Respostas:

139

Há duas coisas a serem lembradas se você deseja navegar por tudo no seu dispositivo.

  1. Você precisa de um telefone com acesso root para navegar na pasta de dados em um telefone Android. Isso significa que você possui um dispositivo de desenvolvedor ( ADP1 ou um ION do Google I / O) ou encontrou uma maneira de fazer o root do seu telefone de outra maneira.
  2. Você precisa estar executando o ADB no modo raiz, faça isso executando: adb root
Reto Meier
fonte
77
E "adb root" exige uma compilação personalizada de adb, caso contrário, "adbd não pode ser executado como root na produção de builds"
Bortzmeyer
16
compilação personalizada do adb? de onde posso obtê-lo?
Gopinath
9
alguma resposta para a pergunta @Gopinath?
Ewoks
2
@ Gopinath: Eu acredito que você deve construí-lo a partir da fonte para o dispositivo de destino, configurado para permitir root usando o ndk e depois atualizá-lo no dispositivo, juntamente com uma imagem dos arquivos binários.
Ben Jaguar Marshall
4
AFAIK, não é necessário ter uma compilação personalizada do adb. É necessário ter suporte ao adbd executando como root, mas esse adbd está no dispositivo - portanto, qualquer modificação feita para tornar o dispositivo com acesso root é suficiente.
Nitzanms
222

A partir do nível 8 da API (Android 2.2), para o aplicativo depurável (aquele criado pelo Android Studio o tempo todo, a menos que a compilação do release tenha sido solicitada), você pode usar o run-ascomando shell para executar um comando ou executável como um usuário / aplicativo específico ou simplesmente mude para o UID do seu aplicativo para poder acessar o diretório de dados .

Listar o conteúdo do diretório yourapp:

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

Alterne para o UID do com.yourapp e execute todos os comandos adicionais usando esse uid (até você chamar exit):

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

 
Nota 1 : existe um problema conhecido em alguns telefones HTC Desire. Devido a um proprietário / permissões não padrão do /data/datadiretório, o run-ascomando falha ao executar nesses telefones.

Nota 2 : Conforme apontado nos comentários de @Avio: run-astambém há problemas com os telefones Samsung Galaxy S executando o Cyanogenmod em qualquer versão (de 7 a 10.1), pois nesta plataforma /data/datahá um link simbólico para /datadata. Uma maneira de resolver o problema é substituir o link simbólico pelo diretório real (infelizmente isso geralmente requer acesso root).

Idolon
fonte
2
Isso funciona como você explicou onde está run-as com.mypackage. O problema que encontrei é sqlite3 /data/data/com.mypackage/databases/mydb"sqlite3: permissão negada". O sqlite3 pode ser executado apenas pela raiz?
Styfle
5
Funciona como charme quando se trata de listar arquivos armazenados no armazenamento interno.
21412 zaplec
5
Eu tive que alterar as permissões no arquivo para poder movê-lo para o meu sdcard, porque não podia executá-lo como meu aplicativo. Portanto, 1) execute como com.package.example, chmod 777 databasefile.db. 2) saia, vá para sdcard, cp /data/data/com.package.example/databases/databasefile.db. E passo 3 deve ser reverter as 777 permissões
Maragues
3
Meu pacote é desconhecido, não importa quão corretamente eu o soletrei no meu terminal: (
Costa
3
Essa deve ser a resposta marcada como correta, pois é o método certo a ser usado em telefones não-rooteados.
LNI 27/04
49

Antes de começarmos, você tem um telefone enraizado ? caso contrário, sugiro fortemente que é hora de você pular. 99% dos tutoriais que ajudam você a fazer isso exigem que você tenha um telefone root (sei que b / c eu gastei cerca de uma hora procurando uma maneira de fazer isso sem ter um telefone root .. não consegui encontrar .. ) também, se você pensar bem, seu iPhone também precisa estar enraizado para realizar a mesma tarefa. Portanto, é totalmente razoável. Mais sobre o enraizamento no final da resposta.

do seu tipo de linha de comando:

adb shell

isso leva você à sua linha de comando do shell do Android (você deve ver algo assim: shell@android:/ $agora digite:

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

isso deve levá-lo diretamente ao diretório de dados de com.domain.yourapp:

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

se não tiver (ou seja, se você receber um erro), provavelmente não possui um telefone root ou não usou seus privilégios de usuário root. Para usar seus privilégios de usuário root, digite suna linha de comando adb e veja o que acontece. Se você receber um erro, seu telefone não estará enraizado. Se não estiver, faça o root primeiro e continue com estas instruções.

a partir daí, você pode digitar lse verá todos os diretórios, incluindo o dbs:

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

cache
databases
lib
shared_prefs   

depois disso, você pode usar o sqlite3 para navegar no dbase .. se você não o tiver instalado (você pode descobrir digitando sqlite3, se você conseguir command not found, precisará instalá-lo. Para instalar o sqlite, siga as instruções aqui .

sobre o enraizamento: se você nunca enraizou seu telefone antes e está preocupado com isso, ele pode lhe dizer com total confiança que não há com o que se preocupar. existem toneladas de tutoriais rápidos e fáceis para fazer root no telefone, para praticamente todos os modelos novos e antigos, e você pode fazer root no seu telefone mesmo se você tiver um mac (eu enraíquei meu s3 no meu mac).

abbood
fonte
8
Você não precisa de um telefone raiz para run-asfuncionar. Eu apenas tentei em uma produção-build Galaxy Nexus S.
Ted Hopp
@ TedHopp e, portanto, b / c funciona muito bem no seu Galaxy Nexus S de produção-compilação .. funcionará bem em todos os telefones Android, certo?
abbood
Primeiro, meu telefone é um contra-exemplo que mostra que um telefone raiz não é necessário . Segundo, sim, ele deve funcionar em todos os dispositivos não-rooteados que tenham pelo menos o Android 2.2 (não porque funcione no meu telefone, mas porque é assim que deve funcionar; veja a resposta de Idolon ).
quer
@TedHopp, pessoalmente, eu não sou muito desenvolvedor de Android ... e instruções como build the application as debuggable (either by building it with the Eclipse, or ant debug command)podem parecer triviais para você, mas elas meio que me intimidam. Acho que minha resposta é mais para pessoas que se sentem confortáveis ​​em fazer root em seus telefones Android, mas não são bem versadas no mundo dos desenvolvedores Android. Mas estou feliz que estamos tendo essa discussão .. Eu quero que os leitores da minha resposta para estar ciente das outras alternativas não enraizamento
abbood
1
Ótima resposta, cara. Estou usando alguns telefones diferentes aqui (MotoX, nexus4, LG G3, SGIII) e isso é muito bom para todos.
Chad Bingham
45

$ adb shell

$ cd / data

$ ls

opendir falhou, permissão negada


Você deve fazer isso:

$ adb shell

$ cd /data

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

shell@android:/data/data/com.your.package $ ls

ESTÁ BEM!

Olá Mundo
fonte
Isso funciona! Algumas coisas a serem feitas antes de executar qualquer comando. Assim que as opções do desenvolvedor estiverem ativadas no telefone, também precisaremos habilitar a depuração USB . Também habilitei algo no meu telefone (HTC M8) chamado Selecionar aplicativo de depuração e escolhi meu aplicativo. Poderia ser padrão em todos os telefones ... deveria ser.
srinij 19/05/19
30

Tive um problema semelhante ao tentar operar em um Samsung Galaxy S. com root. Emitir um comando do shell do computador

> adb root

falha com uma mensagem "não pode ser executado como raiz nas construções de produção". Aqui está um método simples que permite se tornar root.

Em vez do anterior, emita os dois comandos a seguir, um após o outro

> adb shell
$ su

Após o primeiro comando, se o prompt mudou de '>' para '$', como mostrado acima, significa que você entrou no ambiente de shell adb. Se subseqüentemente o prompt for alterado para '#' após a emissão do segundo comando, isso significa que agora você é o root. Agora, como root, você pode fazer o que quiser com o seu dispositivo.

Para voltar ao shell 'seguro', emita

# exit

Você verá que o prompt '$' reaparece, o que significa que você está no shell adb como usuário e não como root.

Rytis
fonte
13
su: permissão negada
petrnohejl 28/05
3
Awesome thanks! Btw você precisa ter um telefone enraizado para fazer isso. Você também pode precisar de SuperSU ou algo semelhante? Pelo menos quando tentei usar o "su" SuperSU, dei-me uma caixa de diálogo no meu telefone.
Richard Fung
16
/ system / bin / sh: su: not found
matt lohkamp
1
Obrigado :) o adb shell + suresolveu a coisa de permissão irritante para sempre. Eu tive um problema sobre su: not foundno Android 4.3, mas desde que atualizei para o 4.4.2, o problema desapareceu. 4.3 parece ter problemas.
3
su não está disponível para mim, Nexus 5 / Android 5.1 - existe uma solução alternativa?
CodeManX
19

Eu também tive muitos problemas com isso. Ainda não entendo completamente a permissão e a execução raiz, mas isso funcionou para mim (uma das respostas anteriores em parte) para copiar o arquivo de banco de dados de / data / data / [nome do pacote] /databases/my_db.db. A execução do shell root ou su no shell por algum motivo não funcionou, nem a cópia do arquivo db (embora eu pudesse navegar para o diretório), nem o sqlite3 .

Então, isso funcionou! No prompt de comando do 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>

Agora vá para o diretório SDCARD e obtenha seu arquivo db_copy.db. Até isso estava oculto, mas consegui enviá-lo por e-mail. De volta ao Windows, consegui abrir o arquivo db com o SQLite Database Browser. :)

MSquare
fonte
Tentei -> executar como <app_package_name> Mas o adb não reconheceu meu app_package_name. Eu usei o package_name que eu especifiquei no meu AndroidManifest.xml. Está faltando algo?
ARK
3

A seguir, estão as duas etapas para obter acesso root:

  1. Seus dispositivos Android devem estar enraizados.
  2. No shell do ADB, digite su e o dispositivo Android solicitará y / n? Você escolhe permitir.
VietHuong
fonte
digite su .. dará alerta no dispositivo móvel .. pedindo permissão de super através Superuser .it trabalhou
Mahajan344
2

as compilações de produção não podem entrar / 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

pode ser necessário alterar o proprietário certo para operá-lo.

keith
fonte
2

O problema pode ser que precisamos fornecer especificamente acesso à raiz adb nas opções de desenvolvimento nos CMs mais recentes. Aqui está o que eu fiz.

abc @ abc-L655: ~ $ sudo adb kill-server
abc @ abc-L655: ~ $ sudo adb root start-server * daemon não executando. iniciando-o agora na porta 5037 * * daemon iniciado com êxito * o acesso root é desabilitado pela configuração do sistema - habilite nas configurações -> opções de desenvolvimento

depois de alterar as opções de desenvolvimento ...

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
fonte
1

se você conhece o pacote de aplicativos, pode cddiretamente para essa pasta.

por exemplo cd data/data/com.yourapp

isso o levará a um diretório que read/writablepermite alterar os arquivos conforme necessário. Como a pasta é a mesma na emulator, você pode usá-la para obter o caminho da pasta.

Marca
fonte
2
Posso fazer o cd na pasta diretamente, mas ainda recebo o erro "opendir falhou, permissão negada".
Tyler Collier
Isso ocorre porque o usuário "shell" do adb possui permissão de execução nos diretórios, mas não a permissão de leitura.
31514 Chris Stratton
0

Se você apenas deseja ver seu banco de dados e tabelas , a maneira mais fácil é usar Stetho. Ferramenta bastante legal para todos os desenvolvedores Android que usam o SQLitebuit by Facobook developed.

Steps to use the tool

  1. Adicione abaixo a dependência no arquivo gradle do seu aplicativo (Módulo: app)

'compile' com.facebook.stetho: stetho: 1.4.2 '

  1. Adicione abaixo as linhas de código no seu método Activity onCreate ()
@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 }

Agora, crie seu aplicativo e, quando o aplicativo estiver em execução, você poderá navegar no banco de dados do aplicativo, abrindo o chrome no URL:

chrome://inspect/#devices

Capturas de tela do mesmo são as abaixo_

ChromeInspact

ChromeInspact

Seu banco de dados

Seu banco de dados

Espero que isso ajude a todos! :)

Rupesh Yadav
fonte
0

Isso funciona se o seu dispositivo Android estiver enraizado por qualquer meio (não tenho certeza se funciona para não enraizado).

  1. adb shell - acessar o shell
  2. su - se tornar o superusuário.

Agora você pode ler todos os arquivos em todos os diretórios.

Roshnet
fonte
-3

sem fazer o root do dispositivo, você pode acessar os arquivos da seguinte maneira: A captura de tela do cmd:

  1. inicie o adb usando cmd na pasta platform-tools de acordo com seu usuário

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

    ele pode estar em outra pasta depende de onde você o instalou.

  2. exibir os dispositivos de trabalho.

    adb devices

    para dizer a resposta do comando é

    List of devices attached
    0123456789ABCDEF     device
  3. escreva o comando

        adb -s 0123456789ABCDEF shell "su"

    vai abrir em

        root@theDeviceName:/ #

4. Acessando arquivos, liste todos os arquivos

ls

e assim por diante, diretório chang para qualquer outro lugar, como a pasta de dados

cd data/data
Mahmoud Ashraf
fonte
1
C: \ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> shell adb -s emulator-5554 "su" / system / bin / sh: su: not found
Solo
no meu caso era android 5.0.2 eu não sei se diferem de versão para outra @Koen
Mahmoud Ashraf
o caminho depende de onde você instalou o estúdio android e é SDKs @Solo
Mahmoud Ashraf
1
O problema não é encontrar onde está o adb. Está no meu caminho. Obter a lista de arquivos (ou mesmo executar su) não funciona / não é permitido. Testando com Android 4.3.
Koen
su não foi encontrado
Brill Pappin
-5

Quando você está no diretório shell do dispositivo. Apenas corra

su - root

Então você poderá acessar os dados / pasta.

Petsome
fonte