Como obtenho o arquivo apk de um dispositivo Android? Ou como transfiro o arquivo apk do dispositivo para o sistema?
Como obtenho o arquivo apk de um dispositivo Android? Ou como transfiro o arquivo apk do dispositivo para o sistema?
Respostas:
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")
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
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
pm list packages
suporta a -f
bandeira, 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.
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.
adb shell
e, em cp PathToApk /sdcard/
seguida, copiando do sdcard.
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á.
-f -s
em vez de-f -3
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
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/
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)
Um revestimento que funciona para todas as versões do Android:
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
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.
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\""
}
android_pull_apk com.android.contacts
adb shell pm list packages
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
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 -3
opção.
Se você conhece (ou pode "adivinhar") o caminho para o .apk
( parece ser o formato /data/app/com.example.someapp-{1,2,..}.apk
para), também pode copiá-lo /data/app
també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 .apk
arquivo.
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.
adb shell
comandos do comentário de @Isa A) funcionou bem para mim no Android 7.1.1, não enraizada.
Obtenha o aplicativo aberto no momento com:
adb shell dumpsys activity activities | grep mFocusedActivity
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
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/
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_grabber
script python simples para fazer isso em qualquer aplicativo que corresponda a um determinado regex e depois descompila esses apks em arquivos jar.
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:
Espero que ajude você.
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_backup
pasta;)
Não é necessário usar nenhuma ferramenta Raiz e nenhuma ferramenta ADB. Instale o aplicativo MyAppSharer da loja de jogos.
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)
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:
adb pull
continuou reclamando no such file or directory
enquantoadb shell
podia acessar o arquivo. Por isso, usei uma abordagem diferente, com arquivo temporário.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\""
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;
}
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.
Isso ajudará quem procura uma resposta não técnica
Isso é simples hack
Baixe o aplicativo App Share/Send Pro
da 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.