Lea el nombre del paquete de un APK de Android

200

Necesito obtener el nombre del paquete de un APK de Android. He intentado descomprimir el APK y leer el contenido AndroidManifest.xml, pero parece que no es un archivo de texto.

¿Cómo puedo extraer el nombre del paquete del APK?

Dagang
fuente

Respuestas:

320
aapt dump badging <path-to-apk> | grep package:\ name
hackbod
fuente
1
¿Hay alguna forma de llamar a esto desde el código de Android? Quiero poder lanzar un paquete de un apk que descargue a través de mi aplicación.
Matt Wear
77
appt dump badging <path-to-apk> | paquete grep: \ name
herbertD
2
@Campiador puede simplemente escribir hasta la tubería |, presionar enter y luego simplemente buscar en la salida el parámetro deseado. Solo recuerda que aaptdebe estar en tu camino
Patrick
Vea mi respuesta a continuación si necesita obtener esto mediante programación (para un script).
Bruno Bronosky
15
aaptEl comando se encuentra debajo Android\SDK\build-tools\version. en el comando de Windows puede ser aapt dump badging <path-to-apk> | findstr -i "package: name"oaapt dump badging <path-to-apk>
equiman
75

Puede instalar el apk en su teléfono, luego

Conéctese usando adb, puede iniciar adb shell y ejecutar pm list packages -f, que muestra el nombre del paquete para cada apk instalado.

Esto se tomó del nombre del paquete Buscar para que las aplicaciones de Android utilicen Intención para iniciar la aplicación Market desde la web

Danail
fuente
1
Además, deberá asegurarse de estar ejecutando con privilegios elevados. Básicamente, en la terminal, use el sucomando primero.
palswim
44
buscar el nombre del paquete específicopm list packages -f | grep term-to-search-for
Patrick Favre
14

Basado en la respuesta @hackbod ... pero relacionado con Windows.

aaptEl comando se encuentra en Android\SDK\build-tools\version. Si necesita más información sobre qué es appt command(Herramienta de empaquetado de activos de Android), lea este https://stackoverflow.com/a/28234956/812915

El dumpsubcomando de aaptse usa para mostrar los valores de elementos individuales o partes de un paquete:

aapt dump badging <path-to-apk>

Si desea ver solo la línea con package: nameinformación, usefindstr

aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"

Espero que ayude a otros usuarios de Windows!

equiman
fuente
13

Si está buscando en Google Play y quiere saber el nombre del paquete, puede consultar la URL o la barra de direcciones. Obtendrá el nombre del paquete. Aquí com.landshark.yaumestá el nombre del paquete

 https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd
Shahzad Imam
fuente
12

Si abre AndroidManifest.xml con MS Notepad, busque la frase packagey encontrará lo siguiente:

package manifest $xxx.xxxxxxx.xxxxxxx |

donde xxx.xxxxxxx.xxxxxxx es el nombre de su paquete, simplemente escrito con un espacio después de cada carácter.

Es útil cuando no tienes ninguna herramienta específica instalada.

Wojciech
fuente
¡Esto es especialmente útil si el código de la aplicación está en github! Mucho más fácil que los otros métodos, ¡gracias!
sarink
1
Descomprimí el APK, pero AndroidManifest.xml era un archivo binario. Extraño pero cierto.
phatmann
12

El siguiente script bash mostrará el nombre del paquete y el nombre de la actividad principal:

apk_package.sh

package=$(aapt dump badging "$*" | awk '/package/{gsub("name=|'"'"'","");  print $2}')
activity=$(aapt dump badging "$*" | awk '/activity/{gsub("name=|'"'"'","");  print $2}')
echo
echo "   file : $1"
echo "package : $package"
echo "activity: $activity"

ejecutarlo así:

apk_package.sh /path/to/my.apk
Brad Parks
fuente
Nunca combine grep y sed con awk. Usar awk es suficiente.
Bruno Bronosky
8

Una respuesta programática

Si necesita hacer esto mediante programación, es un poco más complicado que simplemente obtener la respuesta en su cerebro. Tengo un script que utilizo para firmar todas nuestras aplicaciones, pero cada una usa una clave diferente. Aquí hay 2 formas de obtener solo el nombre del paquete como salida para que pueda ponerlo en una variable o hacer lo que necesite con él.

Salida de ejemplo: com.example.appname (y nada más)

Requisitos

aapt- Android Asset Packaging Tool, parte de la descarga de SDK Tools

Solución 1

Usando awkespecificar 'como el separador de campo, busque una línea con package: name=e imprima solo el segundo "campo" en la línea:

aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'

Una debilidad de este método es que se basa en aapt para generar los campos de información del paquete en el mismo orden:

package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'

No tenemos compromisos de los desarrolladores para mantener este formato.

Solución 2

Usando awkespecificar "como el separador de campo, busque una línea con package=e imprima solo el segundo "campo" en la línea:

aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'

Una debilidad de este método es que se basa en aapt para generar package=solo en la Android Manifest:sección de la salida. No tenemos compromisos de los desarrolladores para mantener este formato.

Solución 3

Expanda el archivo apk con apktool dy lea AndroidManifest.xml.

Este sería el mejor método, pero AndroidManifest.xml es un archivo binario y todas las respuestas SO que veo para convertirlo a texto no funcionan. ( Se supone que usarlo en apktool dlugar de un simple unziplo hace por usted, pero no es así). Por favor comente si tiene una solución a este problema

Bruno Bronosky
fuente
1
Gracias por dar más información para comprender en lugar de simplemente dar una sola línea de comando para copiar.
Ali Zeynali
4

Una solución simple sería Open Android Studio -> Build -> Analyze Apk ... navegue y seleccione el APK ahora puede encontrar el nombre del paquete y prácticamente puede leerlo.

Sai
fuente
2

Si solo desea conocer el nombre del paquete, ejecute adb logcat, inicie la actividad que desee, obtendrá una pista sobre el nombre del paquete.

se sentó
fuente
2

Otra solución es usar una lista de apt y usar sed para analizar eso:

aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"

JohnnyLambada
fuente
El nombre del grupo de paquetes solo coincide casualmente con el nombre del paquete en algunas aplicaciones. Que realmente necesita estar usando el A:package="com.example.appname"de la Android Manifest:sección siaapt list -a
Bruno Bronosky
2

Un método muy simple es usar apkanalyzer.

apkanalyzer manifest application-id "${_path_to_apk}"
William George
fuente
1

Creo que la mejor y más simple forma de extraer solo el nombre del paquete en Linux es

aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"

Explicación:

  1. AAPT extrae la información del APK
  2. Grep "paquete" para mantener solo la línea sobre la información del paquete
  3. Haga que sed reemplace toda la línea con el nombre del paquete solo usando la siguiente expresión regular: package: name='([a-z0-9.]*)'.*y reemplazando con el primer (y único) grupo coincidente.
m0skit0
fuente
1

Puede extraer AndroidManifest.xml del APK, eliminar todos los bytes NULL, omitir todo hasta después del 'manifiesto' de la cadena, y luego está en un byte de longitud seguido del nombre del paquete (y lo que viene después). Para la tarea difícil, uso la gran herramienta GEMA , por lo que el comando se ve así:

7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'

Por supuesto, puede usar cualquier otra herramienta para hacer el filtrado.

Hartmut Schäfer
fuente
1

Si no tiene instalado el SDK de Android, como en algunos escenarios de prueba, puede obtener el nombre del paquete utilizando el siguiente método bash:

getAppIdFromApk() {
  local apk_path="$1"

  # regular expression (required)
  local re="^\"L.*/MainActivity;"
  # sed substitute expression
  local se="s:^\"L\(.*\)/MainActivity;:\1:p"
  # tr expression
  local te=' / .';

  local app_id="$(unzip -p $apk_path classes.dex | strings | grep -Eo $re | sed -n -e $se | tr $te)"

  echo "$app_id"
}

Probado en una mac. 'cadenas' y 'descomprimir' son estándar en la mayoría de los Linux, por lo que también deberían funcionar en Linux.

mmccabe
fuente
0

puede instalar Package_Name_Viewer.apk en su emulador y luego puede ver el nombre del paquete de todas las aplicaciones instaladas en su emulador.

esideli
fuente
0

También probé lo de la compilación, funciona, pero recientemente encontré la forma más fácil:

  1. Descargue e instale Appium desde el sitio web de Appium

  2. Abra Appium-> configuración de Android, elija el archivo apk objetivo. Y luego obtienes todo lo que quieres, la información del paquete, la información de la actividad.

wenwen
fuente
0

Para usar esto en las secuencias de comandos por lotes, es útil que la secuencia de comandos devuelva solo el nombre del paquete (por ejemplo, para desinstalar una aplicación cuando tiene el APK).

Aquí está el script que uso:

# extract the android package id from a built apk file
# usage ./getPackageName.sh <path-to-apk>
line=`aapt dump badging "$1" | grep package:\ name`

# above returns:
# package: name='com.calvium.myapp' versionCode='1' versionName='1.0'
if [[ $line =~ name=\'(.+)\'\ versionCode ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Failed to find package name"
    exit 1
fi

disponible en gist

Entonces podrías escribir:

desinstalar adb `./getPackageName.sh file.apk`

Ben Clayton
fuente
0

Para Windows lo siguiente funcionó para mí:

:: // Initializing variables
SET adb="C:\Users\<User name>\AppData\Local\Android\Sdk\platform-tools\adb"
SET aapt="C:\Users\<User name>\AppData\Local\Android\Sdk\build-tools\22.0.0\aapt"
SET APKPath=C:\Users\<User name>\Desktop\APK\Instant_Instal\

CD %APKPath%

:: // Searching for apk file and storing it
FOR /F "delims=" %%f IN ('dir /S /B *.apk') DO SET "APKFullPath=%%f"
SET apk=%APKFullPath%

:: // Command adb install apk, run apk
%adb% install %apk%

:: // Fetching package name from apk
%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
FOR /F "tokens=2 delims='" %%s IN (temp.txt) DO SET pkgName=%%s
del temp.txt

:: // Launching apk
%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1

pause

Nota

Edite las rutas de adb, aapt, APKPath de acuerdo con las rutas de adb, aapt y la ubicación de apk en su sistema.

Trabajando:

  • Aquí he agregado el apk en una carpeta en el escritorio "\ Desktop \ APK \ Instant_Instal \".
  • El comando %adb% install %apk%instala la aplicación si el dispositivo está conectado.
  • Esto %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txtobtiene el nombre del paquete y algunos otros detalles como la versión, etc. de la apk y se almacena en un archivo temp.txt en la misma ubicación que la de la apk.
  • FOR / F "tokens = 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% s extracts the package name and assigns topkgName` variable
  • Finalmente %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1lanza la aplicación.

En esencia, el código anterior instala la aplicación desde la ubicación dada en el escritorio "Desktop \ APK \ Instant_Instal \" en el dispositivo e inicia la aplicación.

Kailas
fuente
0

Como no pude encontrar el nombre del paquete en el archivo .apk con el editor (como se sugirió anteriormente), he verificado las funciones en la aplicación "ES Datei Explorer" / "ES File Explorer" (versión gratuita) que yo ya lo había instalado. En esta herramienta, el nombre del paquete se muestra correctamente.
Como creo que no debería faltar un buen explorador de archivos en un teléfono, sugiero usar esta herramienta (si ya ha instalado el apk en un dispositivo móvil y tiene que conocer el nombre del paquete).

FredyWenger
fuente
0

Como se menciona en la documentación de Android que AAPT ha quedado en desuso , obtener el nombre del paquete con el comando AAPT2 en Linux es el siguiente:

./aapt2 dump packagename <path_to_apk>

Como estoy usando una versión anterior de Gradle build, tuve que descargar una versión más nueva de AAPT2 como se menciona aquí:

Descargar AAPT2 de Google Maven

Al usar las herramientas de compilación en mi sdk - 25.0.3, 26.0.1 y 27.0.3, la ejecución del comando aapt2 muestra un error: No se puede abrir 'packagename': No existe tal archivo o directorio. Es por eso que elegí las versiones más nuevas de AAPT2.

Usé 3.3.0-5013011 para Linux.

usuario198530
fuente
0

Puede usar Analyze APK...desde el menú Generar en Android Studio, mostrará el nombre del paquete en la parte superior de la nueva ventana.

Daniel Zolnai
fuente
-1

aapt list -a "ruta_a_apk"

Te recomiendo que lo guardes en un archivo .txt, porque puede ser muy largo. Entonces:

aapt list -a "ruta_a_apk"> archivo.txt

Luego vea el archivo.txt en su directorio actual.

Delano
fuente