Por que eu tenha acesso negado a pasta de dados ao usar adb?
Pergunta
Liguei para 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 eu tenho acesso negado. Como é que eu não consigo navegar em torno dos diretórios usando o comando como este?
Como faço para obter acesso root no meu telefone?
Solução
Há duas coisas para se lembrar se você quiser navegar tudo no seu dispositivo.
- Você precisa ter um telefone com acesso root, a fim de procurar a pasta de dados em um telefone Android. Isso significa que ou você tem um dispositivo de desenvolvedor ( ADP1 ou um ION do Google I / O) ou você encontrou um maneira de 'root' o telefone de alguma outra forma.
- Você precisa estar executando ADB em modo root, faça isso executando:
adb root
Outras dicas
A partir do nível API 8 (Android 2.2), para a aplicação debuggable (aquele construído por Android Estúdio todas as vezes a menos que o compilação de lançamento foi solicitado), você pode usar o comando shell run-as
para executar um comando ou executável como um usuário / aplicação ou apenas específico mudar para o UID do seu aplicativo para que você possa acessar sua dados diretório.
Lista o conteúdo do diretório de yourapp:
run-as com.yourapp ls -l /data/data/com.yourapp
Mudar para UID de br.com.suaaplicacao e executar todos os outros comandos que usam esse uid (até que você chamar exit
):
run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit
Nota 1 : há um problema com alguns telefones HTC desejo. Por causa de um proprietário não-padrão / permissões do diretório /data/data
, comando run-as
falhar para executar nesses telefones.
Nota 2 : Como apontado nos comentários por @Avio:
run-as
tem problemas também com telefones Samsung Galaxy S rodando Cyanogenmod em qualquer versão (7-10,1) porque neste /data/data
plataforma é um link simbólico para /datadata
. Uma maneira de resolver o problema é substituir o link simbólico com o diretório real (infelizmente isso geralmente requer acesso root).
antes de começarmos, você tem um enraizada telefone? Se não, eu sugiro fortemente que é hora de fazer o salto. 99% dos tutoriais que ajuda você a fazer isso exigem que você tenha um telefone enraizada (eu sei b / c Passei cerca de uma busca hora para uma maneira de fazer isso sem ter um telefone enraizada .. não poderia encontrar qualquer .. ) também se você pensar sobre isso, o iPhone também tem de ser enraizada para fazer essa mesma tarefa. Portanto, é totalmente razoável. Mais sobre enraizamento no final da resposta.
a partir de seu tipo de linha de comando:
adb shell
Isso leva você para a sua linha de shell comand android (você deve ver algo como isto: shell@android:/ $
agora digite:
shell@android:/ $run-as com.domain.yourapp
isso deve levá-lo diretamente para o diretório de dados de com.domain.yourapp
:
shell@android:/data/data/com.domain.yourapp $
se isso não acontecer (ou seja, se você receber um erro), então você provavelmente não tem um telefone enraizada, ou você não usou seus privilégios de usuário root. Para utilizar o seu privilégios de usuário root, digite su
na linha de comando adb e ver o que acontece, se você receber um erro, então você é telefone não está enraizada. Se não for, raiz-lo primeiro e depois continuar estas instruções.
De lá você pode digitar ls
e você verá todos os diretórios incluindo os dbs:
shell@android:/data/data/com.domain.yourapp $ ls
cache
databases
lib
shared_prefs
depois que você pode usar sqlite3 para navegar na dbase .. se você não tê-lo instalado (você pode encontrá-lo fora por sqlite3
digitação, se você receber command not found
então você vai ter que instalá-lo. Para instalar SQLite, siga as instruções aqui .
sobre enraizamento: se você nunca enraizada seu telefone antes, e você está preocupado com isso estragar seu telefone, eu posso dizer com plena confiança de que não há nada para se preocupar. existem toneladas de tutoriais telefone enraizamento rápidas e fáceis para praticamente todos os novos e antigos modelos lá fora, e você pode raiz seu telefone, mesmo se você tem um Mac (I enraizada meu s3 com o meu mac) .
$ adb shell
$ cd / dados
$ 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
OK!
Eu tive um problema semelhante ao tentar operar em uma enraizada Samsung Galaxy S. A emissão de um comando do shell computador
> adb root
falha com uma mensagem "não pode ser executado como root na produção constrói". Aqui é um método simples que permite que para se tornar root.
Em vez do anterior, emitir os seguintes comandos um após o outro
> adb shell
$ su
Após o primeiro comando, se o prompt mudou de '>' para '$', como mostrado acima, isso significa que você digitou o ambiente adb shell. Se posteriormente o prompt mudou para '#' após a emissão do segundo comando, o que significa que agora você está raiz. Agora, como root, você pode fazer o que quiser com o seu dispositivo.
Para voltar ao shell 'seguro', assuntos
# exit
Você verá que as reaparece rápidas '$', o que significa que você está no adb shell como usuário e não como root.
Eu tinha um monte de problemas com isso também. Eu ainda não entendo completamente a permissão e raiz prazo, mas isso funcionou para mim (uma das respostas anteriores em parte) para copiar o arquivo de banco de dados / data / data / [nome do pacote] /databases/my_db.db. Correndo root shell , ou su no escudo por algum motivo não funcionou, nem copiar o arquivo db (eu poderia navegue até o diretório embora), nem sqlite3 .
Então, isso funcionou! No DOS prompt de comando:
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 obter o seu db_copy.db arquivo. Mesmo que estava escondido, mas eu consegui enviar e-mail. Voltar no Windows, eu era capaz de arquivo db aberto com SQLite Database Browser. :)
A seguir estão os dois passos para obter acesso root:
- seus dispositivos Android deve ser enraizado.
- Em ADB shell, digite su e o dispositivo android solicitará y / n? Você escolhe permitir.
produção constrói não pode 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
necessidade pode ser alterado para proprietário direito de operá-lo.
O problema pode ser que precisamos dar especificamente adb acesso root nas opções developnent nas últimas CMs .. Aqui está o que eu fiz.
abc @ abc-L655: ~ $ sudo adb kill-servidor
abc @ abc-L655: ~ root $ sudo adb start-servidor * não corra, Daemon. iniciando-se agora na porta 5037 * * Daemon iniciado com êxito * acesso root está desativado por configuração do sistema - permitirá em 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..
Se você sabe que o pacote de aplicativos que você pode cd
diretamente para essa pasta ..
por exemplo cd data/data/com.yourapp
isso vai deixá-lo em um diretório que é read/writable
para que você possa alterar os arquivos conforme necessário. Desde a pasta é o mesmo no emulator
, você pode usar isso para obter o caminho da pasta.
Se você só quer ver o seu DB & Tabelas , em seguida, a maneira esiest é usar Stetho
. ferramenta fresca bonita para todos os desenvolvedores Android que usa SQLite
buit por Facobook developed
.
Steps to use the tool
- Adicionar abaixo dependeccy em seus application`s arquivo Gradle (Módulo: app)
'compilação 'com.facebook.stetho: stetho: 1.4.2'
- Adicionar abaixo linhas de código em seu método de Atividade onCreate ()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Stetho.initializeWithDefaults(this); setContentView(R.layout.activity_main); }
Agora, construir a sua aplicação e Quando o aplicativo está sendo executado, você pode procurar seu banco de dados de aplicativos, pelo Chrome abertura na url:
chrome://inspect/#devices
Imagens do mesmo são os seguintes _
ChromeInspact
Seu DB
Esperamos que isso ajude a todos! :)
sem enraizamento o dispositivo que você pode acessar os arquivos pela seguinte A imagem cmd:
-
iniciar o adb usando cmd a partir da plataforma de ferramentas de pasta de acordo com o usuário
cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools
pode ser em outra pasta depende de onde você instalou-lo.
-
exibir os dispositivos de trabalho.
adb devices
para dizer a responder OS o comando é
List of devices attached 0123456789ABCDEF device
-
escrever o comando
adb -s 0123456789ABCDEF shell "su"
ele será aberto no
root@theDeviceName:/ #
arquivos 4.Accessing, lista todos os arquivos
ls
e assim-on diretório chang para qualquer outro lugar, como os dados de pasta ??p>
cd data/data
Quando você está no diretório de shell para o dispositivo. Basta executar
su - root
Em seguida, você deve ser capaz de acessar os dados / pasta.