Como obtenho um arquivo apk de um dispositivo Android?

484

Como obtenho o arquivo apk de um dispositivo Android? Ou como transfiro o arquivo apk do dispositivo para o sistema?

Localizador
fonte

Respostas:

119

Use adb . Com o adb pull, você pode copiar arquivos do seu dispositivo para o seu sistema, quando o dispositivo estiver conectado com USB.

É claro que você também precisa das permissões corretas para acessar o diretório em que seu arquivo está. Caso contrário, será necessário fazer o root no dispositivo.


Se você achar que muitos dos APKs são chamados "base.apk", também pode usar este comando de uma linha para obter todos os APKs de um telefone que você pode acessar enquanto renomeia qualquer nome "base.apk" para o nome do pacote. Isso também corrige o problema de diretório não encontrado dos caminhos do APK com caracteres aparentemente aleatórios após o nome:

for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done

Se você receber "adb: error: failed to stat remote object", indica que você não tem as permissões necessárias. Eu executei isso em um Moto Z2 sem raiz e consegui baixar TODOS os APKs que não desinstalei (veja abaixo), exceto o youtube.

adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver   <--- kills presidential alert app!

(para exibir os usuários que executam adb shell pm list users) Esta é uma maneira de remover / desinstalar (não do telefone, pois volta com redefinição de fábrica) quase QUALQUER aplicativo SEM root INCLUINDO aplicativos do sistema (dica do aplicativo de atualização irritante que atualiza o telefone) alinhar ou não pode ser encontrado, grepping para "ccc")

Maurits Rijk
fonte
1
Obrigado Maurits Rijk. Por favor me ajude. Quero copiar o arquivo iTwips.apk do dispositivo para o sistema. Estou usando o seguinte comando. está correto ? Eu recebi o erro "Android2.2Froyo / sdcard / iTwips.apk" não sai ... / Usuários / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Usuários / bbb Obrigado antecipadamente .......
Finder
No meu dispositivo (Android 2.1), o comando seria "adb pull /sdcard/test.jpg" para copiar test.jpg do meu cartão sd para o diretório atual. Por favor, localize seu arquivo iTwips.apk primeiro usando "adb shell". Isso inicia um shell no seu dispositivo e você pode usar os comandos padrão do Unix, como ls e cd, para navegar em seus diretórios.
Maurits Rijk
Olá, Na verdade, o iTwips.apk armazenado na memória interna do dispositivo. como posso usar o shell para este? Estou usando o seguinte comando adp -d <devicenumber> shell .. Mas não funciona .. por favor me ajude .. Agradecemos antecipadamente.
Finder
Oi, muito obrigado. Eu posso obter as imagens do sdcard agora. mas quero extrair o arquivo apk do dispositivo (pasta managementApplication). O apk iTwips é armazenado na pasta Aplicativo. Por favor me ajude.
Finder
16
@Finder @Maurits Rijk Na verdade, você não precisa fazer root no dispositivo apenas para obter o apk. Contanto que você conheça o caminho completo desse apk. Se o apk está instalado, encontrar o caminho completo pela primeira olhar para o nome do pacote com adb shell pm list packages, e seu caminho completo adb shell pm path your.package.name, em seguida, a partir do seu PC, você pode simplesmenteadb pull /full/path/to/your.apk
Isa A
1550

Nenhuma dessas sugestões funcionou para mim, porque o Android anexava um número de sequência ao nome do pacote para produzir o nome do arquivo APK final. Nas versões mais recentes do Android (Oreo e Pie), uma sequência aleatória imprevisível é anexada. A seguinte sequência de comandos é o que funcionou para mim em um dispositivo não-enraizado :

1) Determine o nome do pacote do aplicativo, por exemplo, "com.example.someapp". Pule esta etapa se você já souber o nome do pacote.

adb shell pm list packages

Examine a lista de nomes de pacotes e tente encontrar uma correspondência entre o aplicativo em questão e o nome do pacote. Isso geralmente é fácil, mas observe que o nome do pacote pode não ter relação com o nome do aplicativo. Se você não conseguir reconhecer o aplicativo na lista de nomes de pacotes, tente encontrá-lo no Google Play usando um navegador. O URL de um aplicativo no Google Play contém o nome do pacote.

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

adb shell pm path com.example.someapp

A saída será semelhante ao
pacote: /data/app/com.example.someapp-2.apk
ou
package: /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk

3) Usando o nome do caminho completo da Etapa 2, puxe o arquivo APK do dispositivo Android para a caixa de desenvolvimento.

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
Yojimbo
fonte
65
Esta é a melhor resposta, não há necessidade de rodar o dispositivo !! muito obrigado #
Muhannad A.Alhariri
14
Isso funcionou em todos os meus dispositivos Android e deve ser a resposta aceita.
precisa saber é o seguinte
8
pm list packagessuporta a -fbandeira, que lista a localização do .apk para você, como package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps. A ajuda interna do pm é inútil, mas o pm também pode filtrar tipos de pacotes também, consulte developer.android.com/studio/command-line/adb.html#pm para obter mais informações. EDIT: apenas notei que a resposta abaixo diz isso, mas essa resposta não é tão votada como esta.
Hitechcomputergeek
9
Não funciona para mim. Eu recebo o seguinte erro: adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist. Se eu procurar essas pastas com um navegador de arquivos, elas estarão vazias.
Bevor
8
Eu tive um problema semelhante ao @Bevor, ao puxar, recebi o erro de que o apk "não existe". Corrigi-o usando adb shelle, em cp PathToApk /sdcard/seguida, copiando do sdcard.
Colin #
124

Nenhuma raiz é necessária:

Esse código obterá o caminho de pacotes de terceiros com o nome para que você possa identificar facilmente seu APK

adb shell pm list packages -f -3

a saída será

pacote: /data/app/XX.XX.XX.apk=YY.YY.YY

Agora puxe esse pacote usando o código abaixo:

adb pull /data/app/XX.XX.XX.apk

se você executou acima do cmd in C:>\, encontrará esse pacote lá.

Faris Al-Abed
fonte
1
Esta é uma resposta incrível! Muito obrigado :)
Drag0
1
Por alguma razão, não consigo encontrar APKs no meu diretório / data / app / . Sempre há um subdiretório lá.
IgorGanapolsky
para aplicativos do sistema usar -f -sem vez de-f -3
Palindrom
57

Eu já vi muitas soluções para esse problema: você precisa fazer o root no telefone ou instalar um aplicativo. Depois de pesquisar bastante, obtive esta solução para telefones não enraizados / enraizados.

Para listar quais aplicativos você obteve até o momento.

adb shell pm list packages

Então você pode selecionar um aplicativo, por exemplo, twitter

adb backup -apk com.twitter.android

Uma coisa importante aqui é não configurar uma senha para criptografar seu backup

Isso criará um arquivo chamado backup.ap, mas você ainda não pode abri-lo. Para isso, você precisa extraí-lo novamente, mas usando o comando dd.

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

Depois disso, tudo o que você precisa fazer é extrair o conteúdo do alcatrão e pronto.

Espero que funcione para vocês

Paulo Miguel Almeida
fonte
7
No blog.shvetsov.com/2013/02/… , se o seu openssl não tiver zlib, isso poderá funcionar: dd if = backup.ab bs = 1 skip = 24 | python -c "import zlib, sys; sys.stdout.write (zlib.decompress (sys.stdin.read ()))" | tar -xvf -
kodi
1
Foi isso que funcionou para mim, não o procedimento na resposta aceita. E isso realmente me ajudou hoje quando eu precisava do APK de um dos meus aplicativos antigos, mas ele não estava disponível para mim além do meu telefone.
zeeshan
1
Aqui estão mais informações se o seu openssl não possui suporte ao zlib: stackoverflow.com/questions/29830981/…
Nico Wiedemann
19

Etapas para baixar o APK do dispositivo para a área de trabalho

A) Verifique se está executando (emulador / dispositivo real). Para verificar, use este comando

adb devices

B) Selecione toda a lista de pacotes disponíveis instalada no seu dispositivo. Você pode usar o comando grep para selecionar o pacote específico que deseja baixar.

adb shell pm list packages
adb shell pm list packages -f -3

Saída (lista de pacotes disponíveis)

package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication

C) Copie o pacote (do qual você deseja baixar) do link acima. Do nosso caso, escolho este pacote (com.example.myapplication)

Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication

Resultado

package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk

D) Finalmente, para baixar o APK do seu (emulador / dispositivo real)

Syntax : adb pull /data/app/[your_package_name]-1/base.apk  [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk

Exemplo: tentando puxar esse arquivo CertInstaller.apk na sua máquina local (Mac)

adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/

E) Confirme no seu diretório local

ls -la /Users/$(whoami)/Documents/
Farid Haq
fonte
O objetivo é extrair um único apk, mas na etapa 4 você extrai dois arquivos adicionais sem explicação ou referência anterior.
Carles Alcolea
Eu modifiquei este post esclarecendo todas as etapas. Espero que essa modificação seja útil e fácil de entender.
Farid Haq
18
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp

C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in 
2.269s)
RVR
fonte
Este é o caminho mais direto na minha opinião. Obrigado!
8bitcartridge
1
caras usando Linux ou Mac, em vez de grep uso findstr
Jeeva
10

Um revestimento que funciona para todas as versões do Android:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Vitaly Dyatlov
fonte
1
@AlexP. o que você queria dizer pelo link acima?
Vitaly Dyatlov
7

Completando a resposta do @Yojimbo, foi o que eu fiz (apenas Linux / Mac, não funcionará imediatamente no Windows ... talvez no shell do bash do git):

for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done

Isso é feio festança, mas funciona :)

EDIT: não funciona mais no AndroidM: todos os arquivos são nomeados "base.apk" em outro diretório. Deve ser "trivial" para corrigir.

elcuco
fonte
7

Em sistemas unix, você pode tentar esta função:

function android_pull_apk() {
    if [ -z "$1" ]; then
        echo "You must pass a package to this function!"
        echo "Ex.: android_pull_apk \"com.android.contacts\""
        return 1
    fi

    if [ -z "$(adb shell pm list packages | grep $1)" ]; then
        echo "You are typed a invalid package!"
        return 1
    fi

    apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
    apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

    destination="$HOME/Documents/Android/APKs"
    mkdir -p "$destination"

    adb pull ${apk_path} ${destination}
    echo -e "\nAPK saved in \"$destination/$apk_name\""
}
  • Exemplo :android_pull_apk com.android.contacts
  • Nota : Para identificar o pacote:adb shell pm list packages
Pedro Rodrigues
fonte
6

Como dito acima, você pode obter o apk usando o comando pull no adb.

Como você está falando dos aplicativos instalados, vá em frente e consulte o diretório / data / app do seu sistema de arquivos Android. Você encontrará os APKs lá.

Em seguida, use o comando adb - adb pull /data/data/appname.apk

aditya.gupta
fonte
6

Experimente este comando one liner bash para fazer backup de todos os seus aplicativos:

for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done

Este comando é derivado do script do Firelord . Acabei de renomear todos os apks para seus nomes de pacotes por resolver o problema com o script de elcuco , ou seja, o mesmobase.apk arquivo foi substituído no Android 6.0 "Marshmallow" e acima.

Observe que este comando faz backup apenas de aplicativos de terceiros, pois não vejo o objetivo de fazer backup de aplicativos internos. Mas se você quiser fazer backup de aplicativos do sistema, apenas omita a -3opção.

HEXcube
fonte
5

Se você conhece (ou pode "adivinhar") o caminho para o .apk( parece ser o formato /data/app/com.example.someapp-{1,2,..}.apkpara), também pode copiá-lo /data/apptambém. Isso funcionou mesmo no meu telefone Android sem raiz e estoque.

Basta usar um aplicativo Emulador de Terminal (como este ) e execute:

# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/

Depois, você pode movê-lo do cartão SD para onde quiser (ou anexá-lo a um e-mail etc.). O último bit pode ser tecnicamente opcional, mas facilita muito sua vida ao tentar fazer algo com o .apkarquivo.

m01
fonte
5

Os procedimentos descritos aqui não funcionam no Android 7 (Nougat) [e possivelmente no Android 6, mas não consigo verificar]. Você não pode extrair os arquivos .apk diretamente no Nougat (a menos que esteja no modo raiz, mas isso exija um telefone root). Mas, você pode copiar o .apk para um caminho alternativo (digamos / sdcard / Download) no telefone usando o shell adb e, em seguida, você pode fazer um pull adb no caminho alternativo.

SamG
fonte
3
A resposta aceita (incluindo os adb shellcomandos do comentário de @Isa A) funcionou bem para mim no Android 7.1.1, não enraizada.
Jonathan Cottrill
4
  1. Abra o aplicativo do qual deseja extrair o apk do seu telefone.
  2. Obtenha o aplicativo aberto no momento com:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. Obter o caminho para o nome do pacote

    adb shell pm path <packagename.apk>

4.Copie o caminho que você encontrou no diretório sdcard

    adb shell cp /data/app/<packagename.apk> /sdcard

5.Puxe o apk

    adb pull /sdcard/base.apk

Editar

Se a etapa 2 não funcionar, use isto:

adb shell dumpsys window windows | grep mCurrentFocus
Oush
fonte
3

Aqui está como você faz isso:

Baixe e instale o APK Extractor no seu dispositivo. É gratuito e é compatível com quase todos os dispositivos Android. Outro ponto positivo é que nem sequer requer raiz ou qualquer coisa para funcionar. Depois de instalá-lo, inicie-o. Lá, você verá uma lista de aplicativos que estão no seu dispositivo, incluindo os aplicativos que você instalou mais tarde, juntamente com os aplicativos do sistema. Pressione e segure qualquer aplicativo que você deseja extrair (você pode selecionar vários ou todos os aplicativos ao mesmo tempo) e clique na opção de extração que vê no topo. Você também terá a opção de compartilhar via Bluetooth ou mensagem. Pronto, você verá os aplicativos extraídos como AppName_AppPackage_AppVersionName_AppVersionCode.apk, que serão salvos no caminho / sdcard / ExtractedApks / por padrão.

Para obter uma descrição detalhada de como extrair arquivos apk no android , visite: http://appslova.com/how-to-extract-apk-files-in-android/

Pramod Mahato
fonte
3

Todas essas respostas requerem várias etapas para cada arquivo apk recuperado do dispositivo. 1. determine o nome do pacote, 2. encontre o arquivo e 3. faça o download. Criei um apk_grabberscript python simples para fazer isso em qualquer aplicativo que corresponda a um determinado regex e depois descompila esses apks em arquivos jar.

Jeff Brateman
fonte
1

Eu não usei o código para puxar o arquivo .apk do celular, mas eu tenho usado o software para extrair o arquivo .apk do celular e o software que usei estão abaixo com o link do Google Play:

  1. Gerenciador de Arquivos do ES File Explorer
  2. ASTRO Cloud & File Manager 3. Cabo de dados de software

Espero que ajude você.

surhidamatya
fonte
2
Eu usei o ES File Explorer. Eu não estou enraizado. Acabei de acessar Ferramentas -> App Manager e pressionei por muito tempo o aplicativo para o qual queria o APK. Isso selecionou o aplicativo (e me permitiu selecionar outros). Acho que pressionei o botão Compartilhar e fui capaz de enviar o APK para mim mesmo (usando Push Bullet, mas o que funciona para você).
schultzter
Se você não estiver apodrecido, poderá tentar o backup do aplicativo e restaurar o play.google.com/store/apps/details?id=mobi.infolife.appbackup
surhidamatya
1

quer muito, muito confortável solução de 1 minuto?

só você este aplicativo https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (gerenciador de arquivos inteligente do Google Play).

toque em "aplicativos", escolha um e toque em "backup". ele terminará no seu sistema de arquivos na app_backuppasta;)

user3350906
fonte
1

Não é necessário usar nenhuma ferramenta Raiz e nenhuma ferramenta ADB. Instale o aplicativo MyAppSharer da loja de jogos.

moberme
fonte
1

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)
vanduc1102
fonte
0

Ainda outro script bash (ou seja, funcionará para a maioria dos sistemas baseados em unix). Com base na resposta de Pedro Rodrigues , mas é um pouco mais fácil de usar.

Melhorias na versão de Pedro:

  1. A abordagem original não funcionou para mim no Android 7: adb pullcontinuou reclamando no such file or directoryenquantoadb shell podia acessar o arquivo. Por isso, usei uma abordagem diferente, com arquivo temporário.
  2. Quando iniciado sem argumentos, meu script lista apenas todos os pacotes disponíveis. Quando o nome parcial do pacote é fornecido, ele tenta adivinhar o nome completo do pacote. Ele reclamará se houver várias expansões possíveis.
  3. Não codifico o caminho de destino; em vez disso, os APKs são salvos no diretório de trabalho atual.

Salve isso em um arquivo executável:

#!/bin/bash
# Obtain APK file for given package from the device connected over ADB

if [ -z "$1" ]; then
    echo "Available packages: "
    adb shell pm list packages | sed 's/^package://'
    echo "You must pass a package to this function!"
    echo "Ex.: android_pull_apk \"com.android.contacts\""
    exit 1
fi

fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
    echo "Could not find package matching $1"
    exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
    echo "Too many packages matched:"
    echo "$fullname"
    exit 1
fi
echo "Will fetch APK for package $fullname"

apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

destination="${fullname}.apk"

tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"

[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
MarSoft
fonte
0

O mais simples é: Instale o aplicativo "ShareIt" no telefone. Agora instale o aplicativo shareIt no PC ou outro telefone. Agora, pelo telefone, onde o aplicativo está instalado, abra o ShareIt e envie. Em outro telefone ou PC, abra o ShareIt e receba.

Sirsendu
fonte
0

Eu realmente gostei de todas essas respostas. A maioria dos scripts para exportar e renomear todos eles foram escritos no Bash. Eu fiz um pequeno script Perl que faz o mesmo (que deve funcionar tanto no Perl para Windows quanto no Linux, testado apenas no Ubuntu).

download-apk.pl

#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my @list = split(/\s*/, `adb shell pm list packages -f`);
my $count = 0;
while(my $line = <$OUT>) {
        $line =~ s/^\s*|\s*$//g;
        my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
        my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
        my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
        my $targetFile = "$category-$package.apk";
        print "$type $category $path $package $baseFile >> $targetFile\n";
        system("adb", "pull", $path);
        rename $baseFile, $targetFile;
}
  1. Verifique se adb (.exe) está no seu caminho ou no mesmo diretório
  2. Conecte seu telefone
  3. Execute o download-apk.pl

A saída é algo semelhante a:

# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
Gerben Versluis
fonte
-1

Isso ajudará quem procura uma resposta não técnica

Isso é simples hack

Baixe o aplicativo App Share/Send Proda google play store. Selecione o aplicativo que você deseja enviar e o método de envio do aplicativo.

Eu costumo usar o Bluetooth para enviar aplicativos para o meu PC ou outro telefone.

Saahithyan Vigneswaran
fonte
Não é fácil de usar
APEXBoi