Leia o nome do pacote de um APK Android

200

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

Como posso extrair o nome do pacote do APK?

Dagang
fonte

Respostas:

320
aapt dump badging <path-to-apk> | grep package:\ name
hackbod
fonte
1
Existe uma maneira de chamar isso a partir do código Android? Quero poder lançar um pacote de um apk que faço download através do meu aplicativo.
Matt Wear
7
emblema de despejo de agendamento <path-to-apk> | pacote grep: \ name
herbertD
2
@ Campeador, você pode simplesmente digitar até o tubo |, pressionar enter e, em seguida, basta pesquisar a saída para o parâmetro desejado. Basta lembrar que aaptprecisa estar em seu trajeto
Patrick
Veja minha resposta abaixo se você precisar obtê-lo programaticamente (para um script).
Bruno Bronosky
15
aaptO comando está localizado em Android\SDK\build-tools\version. em janelas de comando pode ser aapt dump badging <path-to-apk> | findstr -i "package: name"ouaapt dump badging <path-to-apk>
equiman
75

Você pode instalar o apk no seu telefone e, em seguida,

conectar usando adb, você pode iniciar o adb shell e executar pm list packages -f, que mostra o nome do pacote para cada apk instalado.

Retirado de Localizar nome do pacote para aplicativos Android usar Intent para iniciar o aplicativo Market da Web

Danail
fonte
1
Além disso, você precisará garantir que esteja executando com privilégios elevados. Basicamente, no terminal, use o sucomando primeiro.
palswim
4
para procurar o nome do pacote específicopm list packages -f | grep term-to-search-for
Patrick Favre
14

Com base na resposta @hackbod ... mas relacionada ao Windows.

aaptcomando está localizado em Android\SDK\build-tools\version. Se precisar de mais informações sobre o que é appt command(Android Asset Packaging Tool), leia este https://stackoverflow.com/a/28234956/812915

O dumpsubcomando de 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: nameinformações, usefindstr

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

Espero que ajude outro usuário do Windows!

equiman
fonte
13

Se você está vendo o google play e quer saber o nome do pacote, pode consultar a barra de URL ou endereço. Você receberá o nome do pacote. Aqui com.landshark.yaumestá o nome do pacote

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

Se você abrir o AndroidManifest.xml usando o MS Notepad, procure por frase packagee encontrará o seguinte:

package manifest $xxx.xxxxxxx.xxxxxxx |

onde xxx.xxxxxxx.xxxxxxx é o nome do seu pacote, apenas escrito com um espaço após cada caractere.

É uma maneira útil quando você não possui nenhuma ferramenta específica instalada.

Wojciech
fonte
Isso é especialmente útil se o código do aplicativo estiver no github! Muito mais fácil do que os outros métodos, obrigado!
sarink
1
Descompactei o APK, mas o AndroidManifest.xml era um arquivo binário. Estranho, mas é verdade.
phatmann 26/01
12

O seguinte script bash exibirá o nome do pacote e o nome da atividade 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"

execute assim:

apk_package.sh /path/to/my.apk
Brad Parks
fonte
Nunca combine grep e sed com awk. Usar o awk é suficiente.
Bruno Bronosky
8

Uma resposta programática

Se você precisar fazer isso programaticamente, é um pouco mais complicado do que apenas colocar a resposta em seu cérebro. Eu tenho um script que eu 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 for necessário.

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

Exigências

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

Solução 1

Usando awkespecificar 'como o separador de campos, procure 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}'

Um ponto fraco 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 em manter esse formato.

Solução 2

Usando awkespecificar "como o separador de campos, procure 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 aapt para produzir package=apenas na Android Manifest:seção da saída. Não temos compromissos dos desenvolvedores em manter esse formato.

Solução 3

Expanda o arquivo apk com apktool de leia o AndroidManifest.xml.

Esse seria o melhor método, mas o AndroidManifest.xml é um arquivo binário e todas as respostas de SO que vejo para convertê-lo em texto não funcionam. (Usar em apktool dvez de um simples unzipdeve fazer isso por você, mas não o faz.) Por favor, comente se você tem uma solução para esse problema

Bruno Bronosky
fonte
1
Obrigado por fornecer mais informações para entender, em vez de apenas fornecer uma única linha de comando para copiar.
Ali Zeynali 18/08/19
4

Uma solução simples seria Abra o Android Studio -> Construir -> Analisar Apk ... navegue e selecione o APK agora, você pode encontrar o nome do pacote e praticamente você pode ler.

Sai
fonte
2

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

Sentou
fonte
2

Outra solução é usar aapt list e use sed para analisar isso:

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

JohnnyLambada
fonte
O nome do grupo de pacotes é coincidentemente igual ao nome do pacote em alguns aplicativos. Você realmente precisa estar usando a A:package="com.example.appname"na Android Manifest:seção se você fazaapt list -a
de Bruno Bronosky
2

Um método muito simples é usar o apkanalyzer.

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

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 sed substituir 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.
m0skit0
fonte
1

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

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

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

Hartmut Schäfer
fonte
1

Se você não tiver o SDK do Android instalado, como em alguns cenários de teste, poderá obter o nome do pacote usando o seguinte 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"
}

Testado em um mac. 'strings' e 'unzip' são padrão na maioria dos Linux, portanto, também devem funcionar no Linux.

mmccabe
fonte
0

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

esideli
fonte
0

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

  1. Baixe e instale o Appium no site do Appium

  2. Abra Appium-> Android setting, 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.

wenwen
fonte
0

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ê pode escrever:

desinstalação adb `./getPackageName.sh file.apk`

Ben Clayton
fonte
0

Para o Windows a seguir 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

Edite os caminhos do adb, aapt, APKPath de acordo com os caminhos do adb, aapt e o local do apk no 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.
  • Isso %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txtbusca o nome do pacote e alguns outros detalhes, como a versão etc. do apk, e é armazenado em um arquivo temp.txt no mesmo local que o apk.
  • FOR / F "tokens = 2 delimitações = '" %% s IN (temp.txt) DO SET pkgName = extracts the package name and assigns tovariável %% s pkgName`
  • Finalmente %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1inicia o aplicativo.

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

Kailas
fonte
0

Como não consegui encontrar o nome do pacote no arquivo .apk com o editor (como sugerido acima), verifiquei as funções no aplicativo "ES Datei Explorer" / "ES File Explorer" (versão gratuita) que eu já havia instalado. Nesta ferramenta, o nome do pacote é mostrado corretamente.
Como acho que um bom explorador de arquivos não deve faltar em um telefone, sugiro usar essa ferramenta (se você já instalou o apk em um celular e precisa saber o nome do pacote).

FredyWenger
fonte
0

Como foi mencionado na documentação do Android que o AAPT foi descontinuado , obter o nome do pacote usando o comando AAPT2 no Linux é o seguinte:

./aapt2 dump packagename <path_to_apk>

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

Faça o download do AAPT2 no Google Maven

Usando as ferramentas de compilação 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 'packagename': Não existe esse arquivo ou diretório. Por isso, fui para as versões mais recentes do AAPT2.

Eu usei 3.3.0-5013011 para linux.

user198530
fonte
0

Você pode usar Analyze APK...no menu Build no Android Studio; ele exibirá o nome do pacote na parte superior da nova janela.

Daniel Zolnai
fonte
-1

lista aapt -a "caminho_para_apk"

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

lista aapt -a "caminho_para_apk"> arquivo.txt

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

Delano
fonte