Autocompletar

Como navegar pelo código-fonte do Android

Não é possível abrir projetos grandes como o kernel do Linux e o Android em ferramentas de programação como o Eclipse. O indexador da ferramenta vai ficar tentando fazer todas as referências cruzadas do código por um bom tempo. Durante um dos cursos do Sergio Prado, vi como funcionava o ctags, mas eu ainda não o tinha configurado e usado por conta própria até alguns dias atrás. Pensei que apenas o ctags daria conta do recado, mas quando usei

$ ctags -R *

e tentei navegar pelo código do Android, alguma tag inválida gerada não me permitia saltar entre as referências. Então, descobri como fazer a lista de arquivos a serem indexadas pelo ctags, além de outra ferramenta interessante: o cscope. A seguir, explico como usar a primeira delas, assumindo que você já tenha baixado o código-fonte do Android. Primeiro, para instalá-los no Ubuntu, junto com o editor vim, use

$ sudo apt-get install exuberant-ctags cscope vim

Depois, salve o script a seguir (adaptado da resposta de richq no stackoverflow), como cscope_gen.sh, no diretório raíz do projeto do Android

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp' \
-o -name '*.aidl' \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

altere a permissão do script para torná-lo executável com

$ chmod +x cscope_gen.sh

e execute-o com

$ ./cscope_gen.sh

para gerar o arquivo cscope.files, contendo a lista de todos os arquivos de extensão c, h, cpp, hpp, java, cc e aidl, onde residem os códigos do Android. Depois, use

$ ctags -L cscope.files

para gerar o arquivo tags, contendo os símbolos para serem usados durante a navegação.

Pronto. Seu ambiente está preparado para navegar pelos símbolos do código através das tags geradas. É importante lembrar que, como o arquivo tags foi gerado na raíz do projeto Android, você deverá sempre abrir o código a partir desse diretório.

Vejamos um exemplo. Do diretório-raíz do projeto Android, digite

$ vim frameworks/base/wifi/com/net/android/WifiManager.java

Na janela do vim, digite

/init()

e tecle ENTER, para procurar a primeira ocorrência de init() no código.

Você deverá ver este trecho do código (mas sem o comando Log.i() que eu inseri)

WifiManager.java
Chamada a init() no WifiManager.java

Agora, com o cursor sobre init(), pressione CTRL+] para ir para a definição da função, como mostrado na figura a seguir.

init() do WifiManager
Definição da função init() em WifiManager.java

Para voltar para a posição anterior ao salto no código, pressione CTRL+T, e vá para a definição, novamente, com CTRL+].

Bom, até agora, nada que a busca do vim não resolvesse sem o ctags. Então, vamos testar algo mais interessante: mova o cursor até a palavra HandlerThread, como destacado na última figura, e pressione CTRL+].

Você deve estar vendo o seguinte:

HandlerThread.java
Construtor da classe HandlerThread

Conforme a última linha mostrada na figura, você foi levado até o construtor da class HandlerThread, que está em frameworks/base/core/java/android/os/HandlerThread.java. Isso quer dizer que você está em outro arquivo, em outro diretório, o que a busca do vim não é capaz de fazer.

Finalmente, quero mostrar um último recurso. Mova o cursor até o ‘;’, depois de super(name), como mostrado na última figura. Então, pressione a para acrescentar conteúdo após o cursor e inclua uma linha e uma tabulação. Então, digite Process.THREAD e pressione CTRL+N, para ver o seguinte

Autocompletar
Exemplo do uso do recurso autocompletar

Assim, você pode escolher um item da lista para completar o comando.

Para não estragarmos o código, pressione ESC e digite :q! para sair sem salvar.

Espero que essas dicas sejam úteis para navegação e edição do código. Em um próximo post, falo da ferramenta cscope e, se tiver alguma sugestão, deixe um comentário!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s