Encontrando NullPointers no Android

Uma das partes mais incomodas do desenvolvimento Android é a ocorrência de NullPointers não previstos na execução de seu código, com isso o Facebook criou uma ferramenta open source chamada Infer que análisa seu código e aponta trechos de código que podem ocorrer um NullPointer, um Context_LeakResource_Leak e entre outros. Ela análisa código em Android/Java, C, C++ e iOS/Objective-C.

Instalação

Instale as dependências necessárias

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y autoconf automake build-essential git libgmp-dev libmpc-dev libmpfr-dev m4 openjdk-7-jdk pkg-config python-software-properties unzip zlib1g-dev

Instale o OPAM

sudo apt-get install opam

Após instalação para configurar o OPAM execute o comando abaixo.

opam config env

Copie o resultado do comando acima e cole no seu arquivo de profile na última linha. Salve o arquivo. (No meu exemplo uso o .zshrc mas você pode incluir o seu .bash_profile)

vim ~/.zshrc


CAML_LD_LIBRARY_PATH="/home/candidosg/.opam/infer-4.04.0/lib/stublibs"; export CAML_LD_LIBRARY_PATH;
MANPATH="/home/candidosg/.opam/infer-4.04.0/man:"; export MANPATH;
PERL5LIB="/home/candidosg/.opam/infer-4.04.0/lib/perl5"; export PERL5LIB;
OCAML_TOPLEVEL_PATH="/home/candidosg/.opam/infer-4.04.0/lib/toplevel"; export OCAML_TOPLEVEL_PATH;
PATH="/home/candidosg/.opam/infer-4.04.0/bin:/home/candidosg/Downloads/infer/infer/bin:/home/candidosg/.rbenv/plugins/ruby-build/bin:/home/candidosg/.rbenv/shims:/home/candidosg/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin"; export PATH;

Em seguida copie mais essa linha no final do profile. (Substitua o candidosg por seu path)

. /home/candidosg/.opam/opam-init/init.zsh > /dev/null 2> /dev/null || true

Atualize seu perfil e verifique se o opam está executando corretamente.

source ~/.zshrc

opam --version

Se apresentar a versão, continue.

Faça o clone do repositório e siga os passos abaixo.

# Checkout Infer
git clone https://github.com/facebook/infer.git
cd infer
# Compile Infer
./build-infer.sh java
# Install Infer into your PATH
export PATH=`pwd`/infer/bin:$PATH

A instalação demora, em seguida verifique se está OK

infer -v

Execução

Entre na pasta do seu projeto Android e execute:

infer -- ./gradlew build

A execução demora e gerará um relatório com todas as possíveis ocorrências num arquivo txt.

Na primeira vez que executei obtive esse resumo (bastante correções a serem feitas):

Summary of the reports

 NULL_DEREFERENCE: 166
 CONTEXT_LEAK: 63
 RESOURCE_LEAK: 3

Dicas

Executando sem o lint e excluindo a verificação das pastas databinding geradas pelo Android Studio.

infer --infer-blacklist-files-containing '**/databinding/**' -- ./gradlew build -x lint

Extras

O Uber possui um plugin que facilita a utilização e configuração do Infer em seu projeto (eu não consegui usá-lo)

https://github.com/uber-common/infer-plugin

Além do Infer há outras ferramentas de análise que podem identificar erros que podem ser melhorados. Cada uma possui propósitos específicos e recomendo usar todas em seus projetos.

O Vincent criou um repositório no Git com taks do Gradle personalizadas para cada ferramenta acima facilitando sua utilização.

Para incluir em seu projeto copie a pasta config do repositório em seu projeto e inclua no seu app/build.gradle:

apply from: '../config/quality.gradle'

Agora você já pode usar com as tasks do Gradle.

Qualquer dúvida ou sugestão, comente 🙂

Recomendo a leitura: “Make or break… with Gradle” @smarkovik https://medium.com/contentsquare-engineering-blog/make-or-break-with-gradle-dac2e858868d

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