Como obtenho o APK de um aplicativo instalado sem acesso root?


196

Estou tentando extrair o arquivo APK de um aplicativo Android instalado SEM permissões de root.

Eu pensei que isso era impossível, porque todos os arquivos APK para aplicativos que não são do sistema estão localizados em / data / app e o acesso a essa pasta requer permissão de root. Descobri que existem vários aplicativos na loja do Google Play que parecem ter acesso aos arquivos APK, mesmo em dispositivos não-rooteados.

Alguém pode me dizer como isso é possível? Não existem aplicativos de backup que fazem backup dos arquivos APK sem raiz?


2
Eu acho que essa pergunta já está respondida. Por favor, dar uma olhada stackoverflow.com/a/12197924/1016544
Wahib Ul Haq




3
Minha leitura disso é que a @pinas estava perguntando como codificar isso programaticamente - fazendo referência a aplicativos que fazem isso como se dissessem "Esses aplicativos fazem isso, mas como?". A razão "em espera" aqui está errada na minha opinião por causa disso.
Richard Le Mesurier

Respostas:


380

O acesso a / data / app é possível sem permissão de root; as permissões nesse diretório são rwxrwx - x. Executar permissão em um diretório significa que você pode acessá-lo; no entanto, a falta de permissão de leitura significa que você não pode obter uma lista de seu conteúdo - portanto, para acessá-lo, você deve saber o nome do arquivo que estará acessando. O gerenciador de pacotes do Android informará o nome do apk armazenado para um determinado pacote.

Para fazer isso na linha de comando, use adb shell pm list packagespara obter a lista de pacotes instalados e encontrar o pacote desejado.

Com o nome do pacote, podemos obter o nome do arquivo e a localização reais do APK usando adb shell pm path your-package-name.

E, conhecendo o diretório completo, podemos finalmente obter o adb usando adb pull full/directory/of/the.apk

Agradecemos a @tarn por apontar que, em Lollipop, o caminho do apk será /data/app/your-package-name-1/base.apk


33
Para fazer isso na linha de comando, use adb shell pm list packagespara obter a lista de pacotes instalados, escolha o pacote desejado, inclua -1.apk-o e retire-o /data/app. Exemplo: Se o nome do pacote for org.mozilla.firefox, use adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth

11
Para obter o nome do arquivo real do APK, use adb shell pm path your-package-name. Veja esta pergunta para obter uma resposta mais detalhada stackoverflow.com/questions/4032960/…
Yojimbo 10/09/13

2
para pirulito, o caminho do apk será /data/app/your-package-name-1/base.apk
tarn

Isso não funciona para mim. Eu recebo o seguinte erro:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff

1
@ 0xcaff O Android mudou bastante nos 5 anos desde que essa resposta foi fornecida; talvez esse caminho seja uma dessas mudanças. Você deve conseguir efetuar o login e localizar o arquivo manualmente para encontrar o caminho apropriado para sua versão do sistema operacional.
mah

55

O Android anexa um número de sequência ao nome do pacote para produzir o nome do arquivo APK final (é possível que isso varie com a versão do sistema operacional Android). A seguinte sequência de comandos funciona em um dispositivo não raiz :

  1. Obtenha o nome completo do caminho do arquivo APK para o pacote desejado.

    adb shell pm path com.example.someapp

    Isto dá a saída como: package:/data/app/com.example.someapp-2.apk.

  2. Puxe o arquivo APK do dispositivo Android para a caixa de desenvolvimento.

    adb pull /data/app/com.example.someapp-2.apk

A localização do APK após puxar com sucesso será em ../sdk/platform-tools/base.apk no seu PC / laptop.


4
Pode confirmar que esta solução funcionou em um dispositivo não-rooteado, embora exija conhecimento do nome do pacote antes do primeiro comando! Use 'adb shell pacotes pm lista' para obter uma lista de todos os pacotes no telefone no caso de você não tem certeza do nome do pacote do seu aplicativo desejado
AndroidNoob

Em qual pasta da máquina local do extrator entra o apk? EDIT: NVM, qualquer diretório que você estava em ao fazer a atração adb ...
Adam Johns

@IgorGanapolsky tente usar o adb pull /data/app/com.example.someapp-2/base.apk #
Chris #

@zelanix depois de fazer o adb pull, onde posso c o arquivo .apk. Obrigado
Vijaya Varma Lanke

21

Você não precisa de permissões de raiz para obter a lista de aplicativos instalados.

Você pode fazer isso com o PackageManager do Android.

Abaixo está um pequeno trecho de código.

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}

7
  1. verifique a lista de apks instalados (o comando a seguir também lista o caminho em que está instalado e o nome do pacote). pacotes da lista pm do adb shell -f
  2. use adb pull / package_path / nome do pacote / path_in_pc (caminho do pacote e nome do pacote que se pode obter do comando acima 1).

6

Quando você tem o desenvolvimento do Eclipse para Android instalado:

  • Use seu dispositivo como dispositivo de depuração. No telefone: Configurações> Aplicativos> Desenvolvimento e ativar a depuração USB, consulte http://developer.android.com/tools/device.html
  • No Eclipse, abra a janela DDMS: Janela> Abrir Perspectiva> Outro ...> DDMS, consulte http://developer.android.com/tools/debugging/ddms.html
  • Se você não conseguir ver o seu dispositivo, tente (re) instalar o driver USB no seu dispositivo
  • No painel do meio, selecione a guia "File Explorer" e vá para system> app
  • Agora você pode selecionar um ou mais arquivos e clicar no ícone "Puxar um arquivo do dispositivo" na parte superior (à direita das guias)
  • Selecione a pasta de destino - tada!

Existem apenas aplicativos do sistema (também conhecidos como aplicativos pré-instalados) em / system / app.
Arne.jans

6

No Nougat (7.0), a versão Android é executada adb shell pm list packagespara listar os pacotes instalados no dispositivo. Em seguida, corra adb shell pm path your-package-namepara mostrar o caminho do apk. Depois de usar adb para copiar o pacote para downloads adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Em seguida, puxe o apk de Downloads para sua máquina executando adb pull /storage/emulated/0/Download/base.apk.


2

eu tenho um does not exist error

Aqui está como eu faço funcionar:

adb shell pm list packages -f | findstr zalo

package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo

adb shell

mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit


adb pull /sdcard/zalo.apk Desktop

/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)

0

List PackageManager.getInstalledApplications () fornecerá uma lista dos aplicativos instalados, e ApplicationInfo.sourceDir é o caminho para o arquivo .apk.

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

0

Encontrei uma maneira de obter o nome do pacote do APK em um dispositivo não raiz. não é tão elegante, mas funciona o tempo todo.

Etapa 1 : no seu dispositivo, abra o APK de destino

Etapa 2 : na janela cmd do PC, digite estes comandos:

 adb shell dumpsys activity a > dump.txt

Como a saída desse comando é numerosa, é recomendado o redirecionamento para um arquivo.

Etapa 3 : abra este arquivo dump.txt com qualquer editor.

para o dispositivo antes do Android 4.4:
o início do arquivo seria assim:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

o nome do pacote está na terceira linha, com.tencent.mm para este exemplo.

para Android 4.4 e posterior:
a saída do dumpsys mudou um pouco. tente pesquisar "Stack # 1", o nome do pacote estaria muito próximo abaixo dele.

Além disso, procure "baseDir", você encontrará o caminho completo do arquivo apk!


-1

Abra o ES explorer -> pressione o botão Menu no canto superior esquerdo (três faixas horizontais) -> na seção Bibliotecas, escolha APPs.

Assim, você obtém a lista de todos os aplicativos do usuário. Encontre seu aplicativo e selecione-o pressionando-o por muito tempo. Em seguida, pressione "Mais" no canto inferior direito e escolha "Enviar". Então você pode usar opções diferentes, por exemplo, você pode escolher "ES Save To" para salvar o arquivo .apk no diretório inicial ou em qualquer outro lugar.


-2

Ou você pode obter 'Bluetooth File Transfer' no Google Play e definir a pasta pessoal como /system/. Então você pode até ir para /.

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.