Este arquivo parece estar em um formato XML binário. Qual é esse formato e como ele pode ser analisado programaticamente (em vez de usar a ferramenta aapt dump no SDK)?
Este formato binário não é discutido na documentação aqui .
Nota : desejo acessar essas informações de fora do ambiente Android, preferencialmente de Java.
android
android-manifest
jnorris
fonte
fonte
android.content.pm.PackageManager.queryXX
métodos (docs: developer.android.com/reference/android/content/pm/… ).Respostas:
Use android-apktool
Existe um aplicativo que lê arquivos apk e decodifica XMLs para a forma quase original.
Uso:
Verifique android-apktool para mais informações
fonte
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
e outros parâmetros de versão também podem ser encontrados emGmail/apktool.yml
Esse método Java, executado em um Android, documenta (sobre o que eu pude interpretar) o formato binário do arquivo AndroidManifest.xml no pacote .apk. A segunda caixa de código mostra como chamar decompressXML e como carregar o byte [] do arquivo do pacote de aplicativos no dispositivo. (Existem campos cujo objetivo eu não entendo, se você souber o que eles significam, diga-me, eu atualizarei as informações.)
Este método lê o AndroidManifest em um byte [] para processamento:
A maioria dos aplicativos é armazenada em / system / app, que pode ser lida sem root no meu Evo, outros aplicativos estão em / data / app, que eu precisava ver como root. O argumento 'path' acima seria algo como: "/system/app/Weather.apk"
fonte
Que tal usar a Ferramenta de empacotamento de ativos Android (aapt), do SDK do Android, em um script Python (ou qualquer outro)?
Através do aapt ( http://elinux.org/Android_aapt ), você pode recuperar informações sobre o pacote .apk e sobre o arquivo AndroidManifest.xml . Em particular, você pode extrair os valores de elementos individuais de um pacote .apk através do subcomando 'dump' . Por exemplo, você pode extrair as permissões de usuário no arquivo AndroidManifest.xml dentro de um pacote .apk desta maneira:
Onde package.apk é o seu .apk pacote .
Além disso, você pode usar o comando de canal Unix para limpar a saída. Por exemplo:
Aqui está um script Python que para isso programaticamente:
De maneira semelhante, você pode extrair outras informações (por exemplo , pacote , nome do aplicativo etc.) do AndroidManifest.xml :
Se, em vez disso, você deseja analisar toda a árvore XML do AndroidManifest, faça isso de maneira semelhante usando o comando xmltree :
Usando Python como antes:
fonte
Você pode usar a ferramenta axml2xml.pl desenvolvida há um tempo no projeto android-random . Ele irá gerar o arquivo de manifesto textual (AndroidManifest.xml) a partir do arquivo binário.
Estou dizendo " textual " e não " original " porque, como muitas ferramentas de engenharia reversa, essa não é perfeita e o resultado não será completo . Presumo que ele nunca foi um recurso completo ou simplesmente incompatível com o encaminhamento (com o esquema de codificação binária mais recente). Seja qual for o motivo, axml2xml.pl ferramenta não poderá extrair todos os valores de atributo corretamente. Esses atributos são minSdkVersion, targetSdkVersion e basicamente todos os atributos que fazem referência a recursos (como cadeias de caracteres, ícones, etc.), ou seja, apenas nomes de classes (de atividades, serviços etc.) são extraídos corretamente.
No entanto, você ainda pode encontrar essas informações ausentes executando a ferramenta aapt no arquivo original do aplicativo Android ( .apk ):
fonte
Com as SDK-Tools mais recentes, agora você pode usar uma ferramenta chamada apkanalyzer para imprimir o AndroidManifest.xml de um APK (além de outras partes, como recursos).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
fonte
Verifique este projeto WPF a seguir , que decodifica as propriedades corretamente.
fonte
O apk-parser, https://github.com/caoqianli/apk-parser , um implemento leve para java, sem dependência do aapt ou de outros binários, é bom para analisar arquivos xml binários e outras informações do apk.
fonte
Se você gosta de Python ou usa Androguard , o recurso Androguard Androaxml fará essa conversão para você. O recurso é detalhado nesta postagem do blog , com documentação adicional aqui e fonte aqui .
Uso:
fonte
Caso seja útil, aqui está uma versão em C ++ do trecho de Java publicada por Ribo:
fonte
chars
é alocado pelo novo char [], mas é liberado em vez do corretodelete[] chars;
. No final da ctor decompressXML ele deve serprt(" end at offset "+toIntString(off));
, de outra forma aritmética do apontador são utilizados ...para referência, aqui está minha versão do código do Ribo. A principal diferença é que o decompressXML () retorna diretamente uma String, que para meus propósitos era um uso mais apropriado.
OBSERVAÇÃO: meu único objetivo ao usar a solução da Ribo era buscar a versão publicada de um arquivo .APK do arquivo XML de manifesto, e confirmo que, para esse fim, funciona lindamente.
EDIT [2013-03-16]: Funciona perfeitamente se a versão estiver definida como texto sem formatação, mas se estiver definida para se referir a um XML de recurso, será exibida como 'Recurso 0x1', por exemplo. Nesse caso em particular, você provavelmente terá que acoplar essa solução a outra solução que buscará a referência de recurso de string adequada.
Espero que possa ajudar outras pessoas também.
fonte
No Android studio 2.2, você pode analisar diretamente o apk. Ir para construir - analisar apk. Selecione o apk, navegue para androidmanifest.xml. Você pode ver os detalhes do androidmanifest.
fonte
A versão @Mathieu Kotlin segue:
Esta é uma versão kotlin da resposta acima.
fonte
Eu achei o AXMLPrinter2, um aplicativo Java no projeto Android4Me, para funcionar bem no AndroidManifest.xml que eu tinha (e imprime o XML de uma maneira bem formatada). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Uma observação .. ele (e o código nesta resposta da Ribo) não parece lidar com todos os arquivos XML compilados que eu já encontrei. Encontrei um em que as strings eram armazenadas com um byte por caractere, em vez do formato de byte duplo que ele assume.
fonte
pode ser útil
G é minha classe de aplicativo:
fonte
Estou em execução com o código Ribo postado acima há mais de um ano, e ele nos serviu bem. Porém, com as atualizações recentes (Gradle 3.x), não era mais possível analisar o AndroidManifest.xml, estava obtendo erros de índice fora dos limites e, em geral, não era mais capaz de analisar o arquivo.
Atualização: agora acredito que nossos problemas foram com a atualização para o Gradle 3.x. Este artigo descreve como o AirWatch teve problemas e pode ser corrigido usando uma configuração Gradle para usar aapt em vez de aapt2 O AirWatch parece ser incompatível com o Android Plugin for Gradle 3.0.0-beta1
Ao pesquisar ao redor, deparei-me com esse projeto de código aberto, e ele está sendo mantido, e eu pude ir direto ao ponto e ler meus APKs antigos que eu podia analisar anteriormente e os novos APKs que a lógica de Ribo lançou exceções
https://github.com/xgouchet/AXML
Do exemplo dele, é isso que estou fazendo
fonte
apkanalyzer será útil
postagem original https://stackoverflow.com/a/51905063/1383521
fonte