Como acessar a pasta de dados / dados no dispositivo Android?


316

Estou desenvolvendo um aplicativo e sei que meu banco de dados *.dbaparecerá emdata/data/com.****.***

Eu posso acessar esse arquivo do AVD no Eclipse com a ajuda do sqlite manager

Mas não consigo acessar esse arquivo no meu telefone Android.
Eu o pesquiso no Google e diz que preciso fazer root no meu telefone para fazer isso, mas não quero fazer isso. (Novo telefone, problemas de garantia e problemas de segurança)

Então, aqui está a minha pergunta: como posso acessar meu data/data/.....diretório no meu telefone Android " sem fazer root "?

Posso alterar as permissões de usuário para o diretório data/data.....sem fazer o root?


1
você tem arquivo database.db .. ???
Amit Prajapati

si estou usando o banco de dados - "openOrCreateDatabase (....)"
Naveen Prince P

5
Definitivamente, você precisará primeiro torcer o telefone. Então você precisará de um aplicativo gerenciador de arquivos competente que possa usar. O gerenciador de arquivos ASTRO é popular, mas não possui suporte para acesso root, por isso é inútil para usuários avançados. Você deve poder usar o ES File Explorer ou o File Expert. Recentemente, tive problemas para visualizar / dados / dados ou outras pastas protegidas com o ES File Explorer e praticamente o abandonei, e agora estou usando o File Expert. Ambos exigem que você entre nas configurações e ative a opção do explorador raiz (e às vezes também monte o sistema de arquivos como gravável). Então você precisa fazer isso primeiro.
Samir

Isso não é perguntas nem respostas relacionadas à programação.
SkyWalker

Respostas:


375

É difícil acessar os arquivos diretamente no telefone, mas você pode copiá-los para o seu computador, onde pode fazer o que quiser com ele. Sem fazer o root, você tem 2 opções:

  1. Se o aplicativo for depurável, você pode usar o run-ascomando no shell adb

    adb shell
    run-as com.your.packagename 
    cp /data/data/com.your.packagename/
  2. Como alternativa, você pode usar a função de backup do Android.

    adb backup -noapk com.your.packagename

    Você será solicitado a 'desbloquear o dispositivo e confirmar a operação de backup'. É melhor NÃO fornecer uma senha, caso contrário, fica mais difícil ler os dados. Basta clicar em 'fazer backup dos meus dados'. O arquivo 'backup.ab' resultante no seu computador contém todos os dados do aplicativo no formato de backup do Android. Basicamente, é um arquivo tar compactado. Esta página explica como você pode usar o comando zlib do OpenSSL para descompactá-lo. Você pode usar o adb restore backup.dbcomando para restaurar o backup.


15
adb backup -f \location\on\local\drive -noapk app.package.nametrabalhou para mim sem raiz
theblang

24
Use este comando para descompactar seu arquivo de backup:dd if=backup.ab bs=24 skip=1|openssl zlib -d > backup.tar
Hooman

11
Na opção 1, como digo ao comando cp para salvá-los no meu laptop (Mac)? Se você der um exemplo do Win, eu também gostaria de saber e o traduzirá. Obrigado.
Gerard

10
Importante: Correndo adb backup -noapk com.your.packagenamevai salvar o arquivo ab no diretório atual , por isso certifique-se de ter navegado no diretório correto (ex cd Desktop..)
Menelau Kotsollaris

6
Observe que a abordagem de backup produzirá um backup vazio se o seu aplicativo desativou os backups android:allowBackup="false"no manifesto.
Tom

130

Se você estiver usando o Android Studio 3.0 ou versão posterior, siga estas etapas.

  1. Clique em Exibir > Janelas de Ferramentas > Explorador de Arquivos do Dispositivo .
  2. Expanda os nós / data / data / [nome do pacote] .

Você só pode expandir pacotes que são executados no modo de depuração no dispositivo não-rooteado.

Etapas seguidas no Android Studio 3.0


1
Eu não consigo ver nada nesta doca. e me diga nada mostra. você sabe qual é o problema?
Mahdi Azadbar

1
Isto funciona apenas em modo de depuração, não para a liberação-constrói
itinance

Obrigado por mostrar a maneira fácil de examinar o sistema de arquivos!
Lensflare

Parece que não tenho a opção na versão 3.0.1, ela mudou?
Codingale 21/03

1
isso é incrível. Gostaria de saber isso há um tempo atrás.
checkmate711

59

Você também pode tentar buscar o banco de dados usando o aplicativo root explorer. E se isso não funcionar, você pode tentar o seguinte:

  1. Cmd aberto
  2. Mude o seu diretório e entre em 'Ferramentas da plataforma'
  3. Digite ' adb shell'
  4. su
  5. Pressione 'Permitir' no dispositivo
  6. chmod 777 /data /data/data /data/data/com.application.package /data/data/com.application.package/*
  7. Abra a visualização DDMS no Eclipse e, a partir daí, abra 'FileExplorer' para obter o arquivo desejado

Depois disso, você poderá procurar os arquivos no dispositivo raiz.


2
Eu acho que o Root Explore App funciona apenas para telefones com root. Vou tentar o método 2
Naveen Prince P

5
Incapaz de chmod / dados: Operação não permitida
bofredo

@bofredo Eu acho que é porque o seu telefone não está enraizado. você deve raiz de seu telefone e, em seguida, tentar fazer isso
Sheraz Ahmad Khilji

1
@mahemadhi sim, você provavelmente teria que executar este comando manualmente para todos os diretórios, pois todos os diretórios têm permissões privadas.
Sheraz Ahmad Khilji

1
@VivekChavda YUP eles exigem telefone enraizada
Sheraz Ahmad Khilji

21

Para executar qualquer uma das opções acima (por exemplo, acessar pastas protegidas no próprio telefone), você ainda precisa de raiz. (Isso inclui alterar as permissões de montagem na pasta / data e acessá-la)

Sem raiz, não é possível acessar o /datadiretamente para ler, exceto de dentro do seu aplicativo via código. Portanto, você pode tentar copiar esse arquivo para sdcard ou em algum lugar acessível e, em seguida, conseguir acessá-lo normalmente.

O enraizamento não anulará sua garantia se você tiver um dispositivo de desenvolvedor. Sinto muito, não há outra maneira AFAIK.


Eu não estou usando um dispositivo de desenvolvedores. O meu é o Xperia U
Naveen Prince P

posso editar a permissão do usuário da pasta de dados com os comandos chmode?
Naveen Prince P

A partição inteira é montada como somente leitura. Eu diria que sua melhor aposta seria a adb pullmencionada na resposta abaixo.
Anirudh Ramanathan

Eu é possível se o aplicativo permitir. Todos os diretórios têm permissão x para todos (mas não há r para todos, então você precisa conhecer o caminho). Depende se o aplicativo tornou o mundo dos arquivos acessível ou não. Alguns arquivos são, a maioria não é.
Jan Hudec 04/10/2013

Primeiro você diz que é impossível ler, depois sugere copiar o arquivo em outro lugar. Mas, como copiar um arquivo sem lê-lo em primeiro lugar? Eu acho que essa resposta é incorreta.
até

13

A maneira mais fácil (apenas uma etapa simples) de extrair um arquivo da pasta do aplicativo depurável (digamos /data/data/package.name/databases/file) em um dispositivo Android 5.0+ não raiz, é usando este comando:

adb exec-out run-as package.name cat databases/file > file

12
  1. Abra seu prompt de comando
  2. Altere o diretório para E: \ Android \ adt-bundle-windows-x86_64-20140702 \ adt-bundle-windows-x86_64-20140702 \ sdk \ platform-tools
  3. Digite os comandos abaixo
  4. adb -d shell
  5. run-as com.your.packagename cat databases/database.db > /sdcard/database.db
  6. Mude o diretório para cd /sdcardcertificar- database.dbse de que existe.
  7. adb pull /sdcard/database.db ou simplesmente você pode copiar database.db do dispositivo.

Funciona perfeito para mim. Obrigado! Mas, no meu caso, o nome do arquivo do banco de dados não tem extensão .db.
21817 Technic #

10

Use o File Explorer no eclipse. Selecione Windows => Mostrar Visualização => Outro ... => Explorador de Arquivos.

Uma outra maneira é puxar o arquivo via adb:

adb pull /system/data/data/<yourpackagename>/databases/<databasename> /sdcard

5

Eu também tive o mesmo problema uma vez. Não há como acessar diretamente o arquivo nos dispositivos Android, exceto no shell adb ou no dispositivo de root.

Ao lado, aqui estão 02 alternativas:

1)

 public void exportDatabse(String databaseName)
   {
     try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//"+getPackageName()+"//databases//"+databaseName+"";
            String backupDBPath = "backupname.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {

    }
}

2) Tente o seguinte: https://github.com/sanathp/DatabaseManager_For_Android


5

Para fazer backup do Android para o Desktop

Abra o cmd da linha de comando e execute: adb backup -f C: \ Intel \ xxx.ab -noapk your.app.package . Não digite a senha e clique em Fazer backup dos meus dados. Certifique-se de não salvar na raiz da unidade C. Você pode ser negado. É por isso que salvei em C: \ Intel.

Para extrair o arquivo * .ab

  1. Vá aqui e faça o download: https://sourceforge.net/projects/adbextractor/
  2. Extraia o arquivo baixado e navegue para a pasta onde você extraiu.
  3. execute isso com seus próprios nomes de arquivo: java -jar abe.jar descompacte c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar

1
Esta é uma ótima resposta, obrigado. Trabalhei para extrair um backup de aplicativo único criado em um dispositivo Xiaomi (com extensão .bak). Não é necessário fazer root
russo

4

Em um dispositivo raiz , a solução correta é esta:

Open cmd
Change your directory and go into 'Platform tools'
Type 'adb shell'
su
Press 'Allow' on device
chmod 777 /data /data/data /data/data/*
Open DDMS view in Eclipse/IntelliJ and from there open 'FileExplorer' to get your desired file

A solução original funcionou, mas o chmod retornaria um diretório desconhecido. Alterar o comando chmod para / data / data / * deu acesso a todas as subpastas no diretório de dados a partir do DDMS no Intellij. Presumo que a mesma solução seja verdadeira para o Eclipse DDMS.

ATUALIZAÇÃO Então, o que eu achei é estranho. Estou executando um Nexus 6 usando DDMS no IntelliJ (Android Device Monitor). Eu criei um pequeno aplicativo inicial. Esse aplicativo salva os dados em um arquivo .csv em data / data / com.example.myapp / files

Quando comecei a tentar acessar esse arquivo no meu Nexus 6, descobri que era necessário fazer root no dispositivo. Pude ver a pasta de dados, mas tentar abri-la não funcionaria. Como mencionado on-line em outros lugares, o expand + desapareceria e reapareceria logo em seguida (observe que existem soluções na Web que alegam permitir o acesso a essas pastas sem fazer o root, não as encontrei até muito tarde e estou não tenho certeza se prefiro não fazer root de qualquer maneira ((prefiro fazê-lo manualmente do que confiar em um aplicativo ou prompt de comando para me fornecer minhas soluções))). Enraizei meus 6 e tentei DDMS novamente.

Nesse momento, ele me mostrava a pasta de dados e eu podia expandir a pasta e ver a com. diretórios, mas não consegui abrir nenhum deles. Foi quando eu descobri a solução acima. As instruções iniciais não funcionariam nesta parte:

chmod 777 /data /data/data /data/data/com.application.pacakage /data/data/com.application.pacakage/*

Foi quando tentei a solução que publiquei:

chmod 777 /data /data/data /data/data/*

Essa solução parecia funcionar, mas apenas em determinadas pastas. Agora eu podia expandir minha pasta myapp, mas não conseguia expandir o diretório de arquivos nela.

Nesse ponto, eu brinquei por um tempo e então imaginei por que não apenas tentar no diretório que eu precisava, em vez de tentar essas entradas curinga.

chmod 777 /data /data/data /data/data/com.example.myapp/*

Seguido por:

chmod 777 /data /data/data /data/data/com.example.myapp/files

Esses comandos me permitiram expandir e exibir os arquivos no diretório do meu aplicativo para confirmar que o arquivo .csv estava sendo salvo corretamente.

Espero que isso ajude alguém. Eu lutei com isso por horas!

(para compor isso um pouco mais, por incrível que pareça, as permissões não foram passadas para o arquivo .csv que passou para o diretório de arquivos. minhas permissões de diretório de arquivos leem drwxrwxrwx e minhas permissões de arquivo log.csv leem -rw-rw --- - .. apenas fyi)


2

Você pode baixar um arquivo sigle assim:

adb exec-out run-as debuggable.app.package.name cat files/file.mp4 > file.mp4

Antes de fazer o download, você pode não querer dar uma olhada na estrutura do arquivo no seu App-Directory. Para isso, execute as seguintes etapas THelperobservadas acima:

adb shell
run-as com.your.packagename 
cd files
ls -als .

O Android-Studio forma Shahidulmencionado ( https://stackoverflow.com/a/44089388/1256697 trabalho) também. Para quem não vê a DeviceFile Exploreropção no menu: Certifique-se de abrir o diretório / android no Android Studio. Por exemplo, usuários nativos do react têm isso dentro da pasta do projeto, exatamente no mesmo nível do diretório / ios.


1

Uma maneira simples é criar seu banco de dados no cartão SD. Porque você não pode acessar a pasta de dados do telefone na memória interna, a menos que faça root no telefone. Então, por que não simplesmente criar seu banco de dados no cartão SD?

Além disso, se desejar, você pode escrever um código de cópia de arquivo para copiar o arquivo de banco de dados existente (da memória interna) para a memória externa sem exigir raiz.


como fazer isso? Como posso criar um db em sdcard
Naveen Príncipe P

Este método irá ajudá-lo a criar banco de dados no cartão SD. Basta fornecer um caminho de Fileapontando para SD-Card e você é bom para ir
waqaslam

1

Para acessar esta pasta, você precisa de direitos administrativos.

então você tem duas opções: -

  1. faça root no seu dispositivo e tente acessar esta pasta
  2. use emulador

ps: se você estiver usando alguma das duas opções acima, poderá acessar esta pasta seguindo estas etapas

abra a perspectiva DDMS -> seu dispositivo -> (selecione Gerenciador de arquivos nas opções da janela direita) selecione pacote -> dados -> dados -> nome do pacote -> arquivos

e a partir daí você pode abrir seu arquivo


1

adb backupnão funcionou para mim, então aqui está o que eu fiz (Xiaomi Redmi Note 4X, Android 6.0):
1. Vá para Configurações> Configurações adicionais> Backup e redefinição> Backups locais .
2. Toque em 'Backup' na parte inferior da tela.
3. Desmarque as marcas de seleção 'Sistema' e 'Aplicativos'.
4. Toque no botão de divulgação detalhada à direita da célula 'Aplicativos' para navegar para a tela de seleção de aplicativos.
5. Selecione o aplicativo desejado e toque em OK.
6. Após a conclusão do backup, o arquivo real precisa ser localizado de alguma forma. O meu pode ser encontrado em / MIUI / backup / AllBackup / _FOLDER_NAMED_AFTER_BACKUP_CREATION_DATE_ .
7. Segui os passos desta resposta de RonTLVpara converter o arquivo de backup (.bak no meu caso) para tar (duplicando da resposta original):
"
a) Acesse aqui e faça o download: https://sourceforge.net/projects/adbextractor/
b) Extraia o arquivo baixado e navegue até a pasta onde você extraiu
c) execute isso com seus próprios nomes de arquivo: java -jar abe.jar descompacte c: \ Intel \ xxx.ab c: \ Intel \ xxx.tar
"


0

você pode copiar esse arquivo db para algum lugar no eclipse explorer (por exemplo: sdcard ou PC) e pode usar o sqlite para acessar e atualizar esse arquivo db.



0

Você também pode tentar copiar o arquivo para a pasta SD Card, que é uma pasta pública, e copiar o arquivo para o seu PC, onde poderá usar o sqlite para acessá-lo.

Aqui está um código que você pode usar para copiar o arquivo de dados / dados para uma pasta de armazenamento público:

private void copyFile(final Context context) {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    context.getDatabasePath(DATABASE_NAME).getAbsolutePath();

            String backupDBPath = "data.db";

            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Manifesto:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

Toda a ação para o arquivo de cópia não é acessível se o arquivo não compartilhar permissão de leitura para Outros
Steve Sorte

0

O banco de dados SQLlite é armazenado no telefone do usuário e está oculto no caminho:

/Data/Data/com.companyname.AppName/File/

você tem 2 opções aqui:

  1. você pode fazer root no telefone para obter acesso ao arquivo db3 oculto
  2. isso não é uma solução, mas uma solução alternativa. Por que não criar apenas uma página de teste que exiba sua tabela de banco de dados usando a instrução 'select'.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.