Obtenha o nome do pacote E o nome comum dos aplicativos via ADB

14

Eu estou procurando uma possibilidade para recuperar tanto , os nomes dos pacotes e os nomes comuns de aplicativos instalados em um dispositivo Android via ADB - ou, pelo menos, para recuperar o nome comum, se o nome do pacote é conhecido. Uma pesquisa rápida em nosso site levantou duas questões relacionadas, mas elas não resolvem o meu problema:

Estou procurando uma maneira de recuperar as informações diretamente do dispositivo, se possível - não de maneira alguma (incluindo "pesquisas na web" ou "através de um aplicativo"), conforme essas duas perguntas.

Eu sei que existem várias ferramentas disponíveis para obter detalhes do pacote:

  • adb dumpsys package: Enquanto isso lista todos os pacotes com vários detalhes, o "nome comum" não é mostrado
  • adb shell pm list: fornece apenas os nomes dos pacotes
  • aaptconseguiria obter o nome comum, mas exigiria primeiro extrair o .apkarquivo do dispositivo, o que não é realmente conveniente (e obviamente será muito lento com muitos e / ou aplicativos grandes instalados)

Perdi algo? Sei que as informações devem estar no dispositivo (de que outra forma poderia mostrar os nomes dos aplicativos na GUI? Duvido que o Android analise o .apkarquivo toda vez que a GUI precisar do "nome comum"). Então, existe uma maneira de contatá-lo, usando o ADB diretamente?


TL; DR

Histórico (se alguém estiver curioso): desejo obter rapidamente uma lista de aplicativos do usuário em qualquer um dos meus dispositivos, sem precisar reverter para acrobacias. Uma lista dos nomes de pacotes que posso recuperar usando adb shell pm list -3, mas como esses são apenas nomes de pacotes, reconhecer aplicativos é uma suposição. Portanto, se houvesse algum comando do ADB para recuperar o nome comum de um determinado nome de pacote, eu poderia simplesmente usar um loop como for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- e obter uma lista de todos os aplicativos de usuário instalados em um "formato legível por humanos", juntamente com os nomes dos pacotes.

Casos de uso:

  • Veja quais aplicativos "supérfluos" estão instalados (que eu poderia remover)
  • Listas de verificação cruzada de vários dispositivos
  • Documentação;)
  • e provavelmente mais (mas os 3 acima são para o que eu preciso)
Izzy
fonte
Apenas uma idéia (acho que você já tentou?). Por que você simplesmente não compila o aapt para android e executa o shell? : D
user3344236
1
@ user3344236 Estou ciente dessa possibilidade; mas nem sempre é uma opção instalar algo no dispositivo em questão, especialmente não um binário auto-compilado (às vezes, recebo dispositivos entregues que não estão enraizados e preciso manter "condições forenses" - ou seja, não altere o dispositivo, apenas explore-o ").
Izzy
Portanto, a segunda idéia é escrever uma ferramenta que seja executada via shell adb ... sem usar o adbd modificado no dispositivo e sem enviar alguns arquivos para lá. Eu acho que você levará algum tempo para fazer isso (se você tiver sucesso): D
user3344236
@ user3344236 muito preocupante, principalmente porque eu não sou desenvolvedor de Android. Atualmente, uso uma "solução baseada na Web" (semelhante à "pesquisa do Google Play"), pois ainda não parece haver uma solução nativa aqui (ainda?).
Izzy
Oi Izzy! Considerando os comentários (acima), isso significa que você precisa de uma solução considerando um dispositivo não enraizado em mente?
Firelord

Respostas:

8

Esta não é uma resposta final, pois não é genérica (funciona apenas em alguns dispositivos) - mas é pelo menos um começo:

Como descobrimos , pelo menos as ROMs baseadas em CM com Kitkat (Android 4.4) e acima são fornecidas com o aaptbinário disponível em /system/bin1 . Se a sua ROM não possui, e instalar o binário no dispositivo é uma opção, você pode encontrá-lo aqui .

Usando aapt, é possível recuperar o nome do aplicativo com

aapt d badging <path to apk> | grep "application: label" |awk '{print $2}'

A saída será algo como label='Funny App', que você poderá analisar facilmente o nome do aplicativo, por exemplo

aapt d badging <path to apk> | grep 'application: label' | sed -n \"s/.*label\='\([^']*\)'.*/\1/p\"

(não é bom se o nome do aplicativo contiver aspas simples, mas isso pode ser considerado cosmético - ou você imagina como melhorar a parte sed para lidar com isso).


1: não encontramos isso nas ROMs de estoque Kitkat e acima que verificamos, portanto, podem ser apenas ROMs baseadas em CM

Izzy
fonte
3
Nota para os leitores: Você não precisa ter um dispositivo raiz para usar esse aaptbinário. Você pode muito bem fazer o download e renomear o binário para aaptno PC, definir a permissão executável compatível com Linux no binário e pressioná-la para /data/local/tmp, em seguida, usar o caminho absoluto /data/local/tmp/aaptpara usar o binário nesses comandos.
Firelord
Então, para o nome do pacote (primeira parte da pergunta original), você fariaaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22
7

Aqui está a minha solução para um telefone não enraizado que precisava de algumas pequenas alterações acima das que eu executei em um Moto G 2ª geração com o Android 5.0.2.

Eu não tinha o aapt binário em / system / bin, então tentei fazer o download em: https://android.izzysoft.de/downloads

mas quando tentei executá-lo, recebi um erro dizendo:

erro: apenas executáveis ​​independentes de posição (PIE) são suportados.

Então, procurei uma versão do PIE e encontrei: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

e isso funcionou copiando o binário para / data / local / tmp:

adb push aapt-arm-pie /data/local/tmp
adb shell chmod 0755 /data/local/tmp/aapt-arm-pie

Então:

adb shell pm list packages -3 -f

obtém a lista de aplicativos de terceiros (aplicativos que você instalou, não aplicativos do sistema) e, em seguida, você pode usar o pacote do comando acima no aapt para obter informações sobre o pacote - exemplo:

adb shell /data/local/tmp/aapt-arm-pie d badging /data/app/com.facebook.katana-3/base.apk

Então, abaixo, está o script (para um cliente Linux) para obter apenas o nome "comum" para aplicativos de terceiros: ``

for pkg in `adb shell pm list packages -3 -f | awk -F= '{sub("package:","");print $1}'`
do
  adb shell /data/local/tmp/aapt-arm-pie d badging $pkg | awk -F: '
      $1 == "application-label" {print $2}'
done

Se você também deseja pacote e versão, altere a última, mas uma linha, de:

$1 == "application-label" {print $2}'

para:

$1 == "package" { split($2,space," ")
name=space[1];version=space[3]}
$1 == "application-label" {print name, version, $2 }'

Exemplo de saída:

name='com.ultimarom.launchnavigation' versionName='1.28' 'Navigation' name='com.enhanced.skineditorstudio' versionName='3.3' 'Custom Skin Creator' name='com.mojang.minecraftpe' versionName='1.2.6.60' 'Minecraft' name='org.videolan.vlc' versionName='2.5.13' 'VLC' name='com.jrustonapps.myauroraforecast' versionName='1.7.2' 'My Aurora Forecast' name='de.j4velin.wifiAutoOff' versionName='1.7.6' 'WiFi Automatic' name='com.facebook.katana' versionName='153.0.0.54.88' 'Facebook' name='com.metago.astro' versionName='6.0.5' 'ASTRO File Manager' name='za.co.hardrive.smartinfo.parkrun' versionName='2.0.2' 'My 5krun' name='com.PYOPYO.StarTrackerVR' versionName='1.0.1' 'StarTracker VR' name='cz.aponia.bor3.offlinemaps' versionName='1.1.19' 'Offline Maps' name='com.groupon' versionName='16.11.63973' 'Groupon' name='com.ebay.mobile' versionName='5.16.1.2' 'eBay' name='com.runtastic.android' versionName='8.1.1' 'Runtastic' name='com.google.android.diskusage' versionName='3.8.3' 'DiskUsage'

Mike

Mike Bounds
fonte
Muito obrigado e duas vezes, Mike: uma vez para o script de shell e segundo para o ponteiro da variante ARM de aapt! Irá verificar isso assim que o tempo permitir (estou com pressa atualmente). Upvoted por agora, talvez aceite depois de ter verificado :)
Izzy
PS: Minha página de download agora também possui links para a fonte que você especificou - apenas "um nível acima", para que as pessoas possam escolher entre as versões ARM e x86.
Izzy