¿Cómo obtengo un archivo apk de un dispositivo Android?

484

¿Cómo obtengo el archivo apk de un dispositivo Android? ¿O cómo transfiero el archivo apk del dispositivo al sistema?

Descubridor
fuente

Respuestas:

119

Use adb . Con adb pull puedes copiar archivos de tu dispositivo a tu sistema, cuando el dispositivo está conectado con USB.

Por supuesto, también necesita los permisos correctos para acceder al directorio en el que se encuentra su archivo. De lo contrario, primero deberá rootear el dispositivo.


Si encuentra que muchos de los APK se llaman "base.apk", también puede usar este comando de una línea para extraer todos los APK de un teléfono al que pueda acceder mientras cambia el nombre de cualquier nombre de "base.apk" por el nombre del paquete. Esto también corrige el problema de directorio no encontrado para las rutas APK con caracteres aparentemente aleatorios después del nombre:

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

Si obtiene "adb: error: error al registrar el objeto remoto", eso indica que no tiene los permisos necesarios. Ejecuté esto en un Moto Z2 NO rooteado y pude descargar TODOS los APK que no desinstalé (ver a continuación) excepto YouTube.

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

(para ver a los usuarios ejecutar adb shell pm list users) Esta es una forma de eliminar / desinstalar (no desde el teléfono, ya que vuelve con el restablecimiento de fábrica) casi CUALQUIER aplicación SIN root incluyendo las aplicaciones del sistema (insinúa la molesta aplicación de actualización que actualiza tu teléfono alinearlo o no se puede encontrar grepping para "ccc")

Maurits Rijk
fuente
1
Gracias Maurits Rijk. Por favor ayúdame. Quiero copiar el archivo iTwips.apk del dispositivo al sistema. Estoy usando el siguiente comando. es correcto ? Recibí el error "Android2.2Froyo / sdcard / iTwips.apk" no sale ... / Users / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Users / bbb Gracias es avance .......
Finder
En mi dispositivo (Android 2.1), el comando sería "adb pull /sdcard/test.jpg" para copiar test.jpg de mi tarjeta SD al directorio actual. Localice primero su archivo iTwips.apk usando "adb shell". Esto inicia un shell en su dispositivo y puede usar los comandos estándar de Unix como ls y cd para explorar sus directorios.
Maurits Rijk
Hola, en realidad, iTwips.apk está almacenado en la memoria interna del dispositivo. ¿Cómo puedo usar el shell para este? Estoy usando el siguiente comando adp -d <devicenumber> shell ... Pero no funciona ... por favor, ayúdenme ... Gracias de antemano.
Finder
Hola muchas gracias Puedo obtener las imágenes de sdcard ahora. pero quiero extraer el archivo apk del dispositivo (carpeta de la aplicación de administración). El apk iTwips se almacena en la carpeta Aplicación. Por favor ayúdame.
Finder
16
@Finder @Maurits Rijk En realidad, no tienes que rootear el dispositivo solo para extraer el apk. Siempre que conozca el camino completo de esa apk. Si el apk está instalado, encuentre la ruta completa mirando primero el nombre del paquete adb shell pm list packagesy, adb shell pm path your.package.nameluego, la ruta completa desde su PC, puede simplementeadb pull /full/path/to/your.apk
Isa A
1550

Ninguna de estas sugerencias funcionó para mí, porque Android estaba agregando un número de secuencia al nombre del paquete para producir el nombre del archivo APK final. En versiones más recientes de Android (Oreo y Pie), se agrega una cadena aleatoria impredecible. La siguiente secuencia de comandos es lo que funcionó para mí en un dispositivo no rooteado :

1) Determine el nombre del paquete de la aplicación, por ejemplo, "com.example.someapp". Omita este paso si ya conoce el nombre del paquete.

adb shell pm list packages

Mire la lista de nombres de paquetes e intente encontrar una coincidencia entre la aplicación en cuestión y el nombre del paquete. Esto suele ser fácil, pero tenga en cuenta que el nombre del paquete puede no estar relacionado con el nombre de la aplicación. Si no puede reconocer la aplicación de la lista de nombres de paquetes, intente encontrar la aplicación en Google Play usando un navegador. La URL de una aplicación en Google Play contiene el nombre del paquete.

2) Obtenga el nombre completo de la ruta del archivo APK para el paquete deseado.

adb shell pm path com.example.someapp

La salida se verá como un
paquete: /data/app/com.example.someapp-2.apk
o
paquete: /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk

3) Utilizando el nombre completo de la ruta del Paso 2, extraiga el archivo APK del dispositivo Android al cuadro de desarrollo.

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
Yojimbo
fuente
65
¡Esta es la mejor respuesta, no es necesario girar el dispositivo! muchas gracias
Muhannad A.Alhariri
14
Esto funcionó en todos mis dispositivos Android, y debería ser la respuesta aceptada.
b.mcewan
8
pm list packagesadmite la -fbandera, que enumera la ubicación del .apk para usted, como package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps. La ayuda incorporada de pm es inútil, pero pm también puede filtrar tipos de paquetes, consulte developer.android.com/studio/command-line/adb.html#pm para obtener más información. EDITAR: acabo de notar que la respuesta a continuación dice esto, pero esa respuesta no es tan votada como esta.
Hitechcomputergeek
99
No funciona para mi Me sale el siguiente error: adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist. Si examino estas carpetas con un explorador de archivos, las carpetas están vacías.
Bevor
8
Tuve un problema similar a @Bevor, al tirar recibí el error de que el apk "no existe". Me fijo utilizando adb shelly luego cp PathToApk /sdcard/y luego se copia de la tarjeta sd.
Colin
124

No se requiere root:

Este código obtendrá la ruta de los paquetes de terceros con el nombre para que pueda identificar fácilmente su APK

adb shell pm list packages -f -3

la salida será

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

ahora extraiga ese paquete usando el siguiente código:

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

si ejecutó por encima de cmd C:>\, entonces encontrará ese paquete allí.

Faris Al-Abed
fuente
1
¡Esta es una respuesta increíble! Muchas gracias :)
Drag0
1
Por alguna razón, no puedo encontrar APK en mi directorio / data / app / . Siempre hay un subdirectorio allí.
IgorGanapolsky
para el uso de aplicaciones del sistema en -f -slugar de-f -3
palindrom
57

He visto muchas soluciones a este problema, ya sea que tienes que rootear tu teléfono o tienes que instalar una aplicación. Luego, después de mucho googlear, obtuve esta solución para teléfonos no rooteados / rooteados.

Para enumerar qué aplicaciones tienes hasta ahora.

adb shell pm list packages

Luego puede seleccionar una aplicación, por ejemplo twitter

adb backup -apk com.twitter.android

Una cosa importante aquí es no configurar una contraseña para cifrar su copia de seguridad

Esto va a crear un archivo llamado backup.ap, pero aún no puede abrirlo. Para esto, debes extraerlo nuevamente pero usando el comando dd.

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

Después de esto, todo lo que tiene que hacer es extraer el contenido de alquitrán y listo.

Espero que funcione para ustedes

Paulo Miguel Almeida
fuente
77
Desde blog.shvetsov.com/2013/02/… , si su openssl no tiene zlib, esto podría 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
Esto es lo que funcionó para mí, no el procedimiento en la respuesta aceptada. Y realmente me ayudó hoy cuando necesitaba el APK de una de mis viejas aplicaciones, pero no estaba disponible para mí, excepto desde mi teléfono.
zeeshan
1
Aquí hay más información si su openssl carece de soporte zlib: stackoverflow.com/questions/29830981/…
Nico Wiedemann
19

Pasos para descargar APK del dispositivo al escritorio

A) Asegúrese de que su funcionamiento (emulador / dispositivo real). Para verificar use este comando

adb devices

B) Seleccione toda la lista de paquetes disponibles instalada en su dispositivo. Puede usar el comando grep para seleccionar el paquete específico que desea descargar.

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

Salida (Lista de paquetes disponibles)

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 el paquete (que desea descargar) del enlace anterior. Formule nuestro caso Elijo este paquete (com.example.myapplication)

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

Salida

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

D) Finalmente, para descargar APK desde su (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

Ejemplo: Intentar extraer este archivo CertInstaller.apk en su máquina local (Mac)

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

E) Confirme en su directorio local

ls -la /Users/$(whoami)/Documents/
Farid Haq
fuente
El objetivo es extraer un solo apk, sin embargo, en el paso 4, extrae dos archivos adicionales sin explicación o referencia previa.
Carles Alcolea
Modifiqué esta publicación aclarando cada paso. Espero que esta modificación sea útil y 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
fuente
Esta es la forma más directa en mi opinión. ¡Gracias!
8bitcartridge
1
los chicos que usan Linux o Mac en lugar de FindStr usan grep
Jeeva
10

One liner que funciona para todas las versiones de Android:

adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
Vitaly Dyatlov
fuente
1
@AlexP. ¿Qué querías decir por el enlace de arriba?
Vitaly Dyatlov
7

Completando la respuesta de @Yojimbo, esto es lo que hice (solo Linux / Mac, no funcionará de fábrica en Windows ... tal vez en el shell bash de git):

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

Esto es feo, pero funciona :)

EDITAR: ya no funciona en AndroidM: todos los archivos se denominan "base.apk" en otro directorio. Debe ser "trivial" para arreglar.

elcuco
fuente
7

En sistemas unix, puede probar esta función:

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\""
}
  • Ejemplo :android_pull_apk com.android.contacts
  • Nota : para identificar el paquete:adb shell pm list packages
Pedro Rodrigues
fuente
6

Como se dijo anteriormente, puede obtener el apk utilizando el comando pull en adb.

Ya que está hablando de sus aplicaciones instaladas, continúe y busque en el directorio / data / app de su sistema de archivos Android. Encontrarás los APK allí.

Luego use el comando adb - adb pull /data/data/appname.apk

aditya.gupta
fuente
6

Pruebe este comando one liner bash para hacer una copia de seguridad de todas sus aplicaciones:

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 se deriva de la secuencia de comandos de Firelord . Acabo de cambiar el nombre de todas las aplicaciones a sus nombres de paquete para resolver el problema con el script de elcuco , es decir, el mismo base.apkarchivo se sobrescribe en Android 6.0 "Marshmallow" y superior.

Tenga en cuenta que este comando solo hace una copia de seguridad de aplicaciones de terceros, porque no veo el punto de hacer una copia de seguridad de las aplicaciones integradas. Pero si también desea hacer una copia de seguridad de las aplicaciones del sistema, simplemente omita la -3opción.

HEXcube
fuente
5

Si conoce (o si puede "adivinar") la ruta de acceso .apk( parece ser que tiene el formato /data/app/com.example.someapp-{1,2,..}.apk, entonces también puede copiarla /data/apptambién. Esto funcionó incluso en mi teléfono Android no rooteado y almacenado).

Simplemente use una aplicación Terminal Emulator (como esta ) y ejecute:

# 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/

Luego puede moverlo desde la tarjeta SD a donde desee (o adjuntarlo a un correo electrónico, etc.). El último bit puede ser técnicamente opcional, pero hace que su vida sea mucho más fácil cuando intenta hacer algo con el .apkarchivo.

m01
fuente
5

Los procedimientos descritos aquí no funcionan para Android 7 (Nougat) [y posiblemente Android 6, pero no puedo verificarlo]. No puede extraer los archivos .apk directamente bajo Nougat (a menos que esté en modo raíz, pero eso requiere un teléfono rooteado). Pero, puede copiar el .apk a una ruta alternativa (digamos / sdcard / Download) en el teléfono usando adb shell, luego puede hacer una extracción de adb desde la ruta alternativa.

SamG
fuente
3
La respuesta aceptada (incluidos los adb shellcomandos del comentario de @Isa A) funcionó bien para mí en Android 7.1.1, no rooteado.
Jonathan Cottrill
4
  1. Abra la aplicación de la que desea extraer el apk de su teléfono.
  2. Obtenga la aplicación actualmente abierta con:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. Obtenga la ruta al nombre del paquete

    adb shell pm path <packagename.apk>

4.Copie la ruta que obtuvo al directorio sdcard

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

5. Tire del apk

    adb pull /sdcard/base.apk

Editar

Si el paso no 2 no funciona, use esto:

adb shell dumpsys window windows | grep mCurrentFocus
Oush
fuente
3

Así es como lo haces:

Descargue e instale APK Extractor en su dispositivo. Es gratis y es compatible en casi todos los dispositivos Android. Otro punto a favor es que ni siquiera requiere root ni nada para funcionar. Después de que lo tenga instalado, ejecútelo. Allí verá una lista de aplicaciones que están en su dispositivo, que incluyen las aplicaciones que instaló más adelante, junto con las aplicaciones del sistema. Mantenga presionada cualquier aplicación que desee extraer (puede seleccionar varias o todas las aplicaciones a la vez) y haga clic en la opción de extracción que ve en la parte superior. También tendrá la opción de compartir a través de Bluetooth o mensajes. Ya ha terminado, verá las aplicaciones extraídas como AppName_AppPackage_AppVersionName_AppVersionCode.apk, que se guardarán en la ruta / sdcard / ExtractedApks / de forma predeterminada.

Para obtener una descripción detallada de cómo extraer archivos apk en Android , visite: http://appslova.com/how-to-extract-apk-files-in-android/

Pramod Mahato
fuente
3

Todas estas respuestas requieren múltiples pasos para cada archivo apk recuperado del dispositivo. 1. determine el nombre del paquete, 2. encuentre el archivo y 3. descárguelo. Creé un apk_grabberscript de Python simple para hacer esto para cualquier aplicación que coincida con una expresión regular dada, y luego descompila esas aplicaciones en archivos jar.

Jeff Brateman
fuente
1

No he usado el código para extraer el archivo .apk desde el dispositivo móvil, pero he estado usando un software para extraer el archivo .apk desde el dispositivo móvil y el software que he utilizado se encuentra a continuación con el enlace de Google Play:

  1. ES File Explorer File Manager
  2. ASTRO Cloud & File Manager 3. Cable de datos de software

Espero que te ayude.

surhidamatya
fuente
2
Usé ES File Explorer. No estoy enraizado. Simplemente fui a Herramientas -> Administrador de aplicaciones y presioné durante mucho tiempo la aplicación para la que quería el APK. Esto seleccionó la aplicación (y me permitió seleccionar otras). Creo que presioné el botón Compartir y pude enviarme el APK (usando Push Bullet, pero lo que sea que funcione para usted).
schultzter
Si no está podrido, puede probar la copia de seguridad de la aplicación y restaurar play.google.com/store/apps/details?id=mobi.infolife.appbackup
surhidamatya
1

No se requiere ningún método Root ni herramientas ADB. Instala la aplicación MyAppSharer desde Play Store.

moberme
fuente
1

Recibí una does not exist error

Así es como lo hago 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
fuente
0

Otra secuencia de comandos bash (es decir, funcionará para la mayoría de los sistemas basados ​​en Unix). Basado en la respuesta de Pedro Rodrigues , pero es un poco más fácil de usar.

Mejoras sobre la versión de Pedro:

  1. El enfoque original no funcionó para mí en Android 7: adb pullseguía quejándome no such file or directorymientras adb shellpodía acceder al archivo. Por lo tanto, utilicé un enfoque diferente, con un archivo temporal.
  2. Cuando se inicia sin argumentos, mi script solo enumerará todos los paquetes disponibles. Cuando se proporciona el nombre parcial del paquete, intentará adivinar el nombre completo del paquete. Se quejará si hay varias expansiones posibles.
  3. No codifico la ruta de destino; en su lugar, los APK se guardan en el directorio de trabajo actual.

Guarde esto en un archivo ejecutable:

#!/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
fuente
0

La más simple es: Instalar la aplicación "ShareIt" en el teléfono. Ahora instale la aplicación shareIt en la PC u otro teléfono. Ahora desde el teléfono, donde está instalada la aplicación, abra ShareIt y envíe. En otro teléfono o PC, abra ShareIt y reciba.

Sirsendu
fuente
0

Realmente me gustaron todas estas respuestas. La mayoría de los scripts para exportar y renombrarlos se escribieron en Bash. Hice un pequeño script de Perl que hace lo mismo (que debería funcionar tanto en Perl para Windows como para Linux, solo probado en 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. Asegúrese de que adb (.exe) esté en su ruta o en el mismo directorio
  2. Conecta tu teléfono
  3. Ejecute download-apk.pl

El resultado es algo similar 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
fuente
-1

Esto ayudará a alguien que esté buscando una respuesta no técnica.

Este es un simple truco

Descargue la aplicación App Share/Send Prodesde Google Play Store. Seleccione la aplicación que desea enviar y la aplicación de envío de método.

Usualmente uso Bluetooth para enviar aplicaciones a mi PC u otro teléfono.

Saahithyan Vigneswaran
fuente
No es fácil de usar
APEXBoi