studio Leia o nome do pacote de um APK Android




register google play account (16)

Preciso obter o nome do pacote de um APK Android. Eu tentei descompactar o APK e ler o conteúdo do AndroidManifest.xml , mas parece que não é um arquivo de texto.

Como posso extrair o nome do pacote do APK?


Para usar isso em scripts em lote, é conveniente que o script retorne apenas o nome do pacote (por exemplo, para desinstalar um aplicativo quando você tiver o APK).

Aqui está o script que eu 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

disponível na essência

Então você poderia escrever:

Desinstalar o adb `./getPackageName.sh file.apk`


você pode instalar o Package_Name_Viewer.apk no seu emulador e em seguida você pode ver o nome do pacote de todos os aplicativos instalados no seu emulador.


Outra solução é usar a lista do aapt e usar o sed para analisar isso:

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


Você pode extrair o AndroidManifest.xml do APK, remover todos os bytes NULL, pular tudo até depois da string 'manifest', e então você está em um byte de comprimento seguido pelo nome do pacote (e o que vem depois dele). Para a tarefa difícil, eu uso a ótima ferramenta GEMA , então o comando se parece com isso:

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

Claro, você pode usar qualquer outra ferramenta para fazer a filtragem.


Se você quer apenas saber o nome do pacote, execute adb logcat, inicie a atividade desejada, você receberá uma dica sobre o nome do pacote.


Uma resposta programática

Se você precisa fazer isso de forma programática, é um pouco mais complicado do que apenas obter a resposta em seu cérebro. Eu tenho um script que uso para assinar todos os nossos aplicativos, mas cada um usa uma chave diferente. Aqui estão duas maneiras de obter apenas o nome do pacote como saída, para que você possa colocá-lo em uma variável ou fazer o que precisar com ele.

Exemplo de saída: com.example.appname (e nada mais)

Requisitos

aapt - Ferramenta de empacotamento de ativos do Android, parte do download das Ferramentas do SDK

Solução 1

Usando awk especifique ' como o Separador de Campos, procure por uma linha com package: name= e imprima apenas o segundo "campo" na linha:

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

Uma fraqueza desse método é que ele depende do aapt para gerar os campos de informações do pacote na mesma ordem:

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

Não temos compromissos dos desenvolvedores para manter este formato.

Solução 2

Usando awk especifique " como separador de campo, procure por uma linha com package= e imprima apenas o segundo" campo "na linha:

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

Uma fraqueza desse método é que ele depende do package= aapt to output package= apenas na seção Android Manifest: da saída. Não temos compromissos dos desenvolvedores para manter este formato.

Solução 3

Expanda o arquivo apk com apktool d e leia o AndroidManifest.xml.

Esse seria o melhor método, mas o AndroidManifest.xml é um arquivo binário e todas as respostas SO que eu vejo para convertê-lo em texto não funcionam. (Usando apktool d vez de um simples unzip é suposto fazer isso por você, mas isso não acontece.) Por favor, comente se você tiver uma solução para este problema


Desde a mencionada na documentação do Android que o AAPT foi preterido , obter o nome do pacote usando o comando AAPT2 no Linux é o seguinte:

./aapt2 dump packagename <path_to_apk>

Desde que eu estou usando uma versão mais antiga do Gradle build, eu tive que baixar uma versão mais recente do AAPT2 como mencionado aqui:

Baixe o AAPT2 do Google Maven

Usando o build-tools no meu sdk - 25.0.3, 26.0.1 e 27.0.3, a execução do comando aapt2 mostra um erro: Não é possível abrir 'nome do pacote': Nenhum arquivo ou diretório. É por isso que eu fui para as versões mais recentes do AAPT2.

Eu usei o 3.3.0-5013011 para o linux.


Eu também tentei a descompilação, funciona, mas recentemente eu encontrei a maneira mais fácil:

  1. Baixe e instale o Appium no site da Appium

  2. Abra a configuração Appium-> Android, escolha o arquivo apk de destino. E então você obtém tudo o que deseja, as informações do pacote, as informações da atividade.


Para o Windows seguinte funcionou para mim:

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

Por favor, edite os caminhos de adb, aapt, APKPath de acordo com os caminhos de adb, aapt e a localização do apk em seu sistema.

Trabalhando:

  • Aqui eu adicionei o apk em uma pasta na área de trabalho "\ Desktop \ APK \ Instant_Instal \".
  • O comando %adb% install %apk% instala o aplicativo se o dispositivo estiver conectado.
  • Este %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt busca o nome do pacote e alguns outros detalhes como a versão etc. do apk e armazena em um arquivo temp.txt no mesmo local que o do apk.
  • FOR / F "tokens = 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% s extracts the package name and assigns to variável pkgName`
  • Finalmente %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1 inicia o aplicativo.

Em essência, o código acima instala o apk de determinado local na área de trabalho "Desktop \ APK \ Instant_Instal \" para o dispositivo e inicia o aplicativo.


aapt dump badging <path-to-apk> | grep package:\ name

Se você está olhando para o google play e quer saber o nome do seu pacote, então você pode olhar para url ou barra de endereços. Você receberá o nome do pacote. Aqui com.landshark.yaum é o nome do pacote

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


Eu acho que a melhor e mais simples maneira de extrair apenas o nome do pacote no Linux é

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

Explicação:

  1. AAPT extrai as informações do APK
  2. Grep "pacote" para manter apenas a linha sobre as informações do pacote
  3. Faça com que o sed substitua a linha inteira pelo nome do pacote usando apenas o seguinte regex: package: name='([a-z0-9.]*)'.* E substituindo pelo primeiro (e único) grupo correspondente.

lista de aapt -a "path_to_apk"

Eu recomendo que você salve em um arquivo .txt, porque pode ser muito longo. Assim:

aapt list -a "path_to_apk"> arquivo.txt

Então veja o arquivo.txt em seu diretório atual.


Baseado na resposta @hackbod ... mas relacionada ao windows.

aapt comando aapt está localizado em Android\SDK\build-tools\version . Se você precisar de mais informações sobre o que é o appt command (Ferramenta de empacotamento de material Android), leia este https://.com/a/28234956/812915

O subcomando dump do aapt é usado para exibir os valores de elementos individuais ou partes de um pacote:

aapt dump badging <path-to-apk>

Se você quiser ver apenas a linha com package: name info, use findstr

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

Espero que ajude o outro usuário do Windows!






apk