Melhore a qualidade do código Android com análise de código estático e verificação de tempo de execução:
Recomenda-se que você adicione essas verificações ao criar um novo projeto e corrigir os problemas a cada check-in (como parte do seu processo de integração contínua). Caso contrário, precisaria de enorme coragem e paciência quando você enfrentar e corrigir a enorme quantidade de erros.
build.gradle : apply from: '../quality/static_analysis.gradle'
git remote add analysis https://github.com/BrianSpace/Android-Quality-Essentials.gitbuild.gradle : apply from: '../analysis/quality/static_analysis.gradle'
android {
...
lintOptions {
// Turn off analysis progress reporting by lint
quiet true
// Stop the gradle build if errors are found
abortOnError true
// Do not ignore lint warnings
ignoreWarnings false
// Treat warnings as errors
warningsAsErrors true
// Ignore rules list
ignore 'GoogleAppIndexingWarning' // Remove this if the app support App Indexing
}
...
}
build.gradle : dependencies {
.. .
debugCompile ' com.squareup.leakcanary:leakcanary-android:1.5.1 '
releaseCompile ' com.squareup.leakcanary:leakcanary-android-no-op:1.5.1 '
testCompile ' com.squareup.leakcanary:leakcanary-android-no-op:1.5.1 '
.. .
}Application (e não esqueça de adicionar ao manifesto): public class AndroidQualityEssentialsApplication extends Application {
@ Override
public void onCreate () {
super . onCreate ();
if ( BuildConfig . DEBUG ) {
StrictMode . setThreadPolicy ( new StrictMode . ThreadPolicy . Builder ()
. detectAll ()
. penaltyDeath ()
. build ());
StrictMode . setVmPolicy ( new StrictMode . VmPolicy . Builder ()
. detectAll ()
. penaltyDeath () // If violations are in Android itself or 3rd-party libs, use penaltyLog.
. build ());
// Avoid the process dedicated to LeakCanary for heap analysis.
if (! LeakCanary . isInAnalyzerProcess ( this )) {
LeakCanary . install ( this );
}
}
...
}
}gradlew check no console para iniciar a análise estática.build/reports/ do Projeto, no qual você aplica o static_analysis.gradle . A convenção de nomenclatura definida nas regras do estilo não permite prefixo de uma única carta para nomes de campos de membros como "MMember". Mas se você gosta desse estilo, pode alterar a propriedade do format do módulo MemberName para "^[AZ] [a-ZA-Z0-9] $". Ou altere para "^m [az] [a-za-z0-9] $" para forçar o prefixo "m".
Para o PMD Regra UseUtilityClass, ele solicitará criar classe de utilitário se sua classe tiver apenas campos e métodos estáticos. Você só precisa:
public final class FileUtil {
private static Context appContext ;
private FileUtil () throws InstantiationException {
throw new InstantiationException ( "Utility class FileUtil should not be instantiated!" );
}
public static void init ( final Context context ) {
appContext = context . getApplicationContext ();
}
/**
* Get available cache directory. Prefer external over internal.
*/
@ NonNull
public static File getAvailableCacheDir () {
final File externalCacheDir = appContext . getExternalCacheDir ();
return externalCacheDir == null ? appContext . getCacheDir () : externalCacheDir ;
}
}Todas as regras de análise estática são práticas recomendadas da experiência anterior das pessoas, mas nem sempre são a verdade que não podem ser quebradas. Algumas das regras do PMD precisam ser baseadas em suas próprias preferências:
ItemTypeT , para uma melhor legibilidade. Você pode removê -lo da lista "excluir" se você gosta da nomeação de letra única. As convenções de nomenclatura são definidas no arquivo de qualidade/checkstyle/naming_convention.xml. As seguintes regras são definidas:
Você pode modificar as expressões regulares conforme necessário para o seu próprio projeto. Execute gradlew checkFileNames se quiser verificar apenas a convenção de nomenclatura.
Checkstyle é usado para verificar o estilo de código Java. As regras de estilo são baseadas no guia de estilo do Google Java com as seguintes alterações:
Execute gradlew checkCodeStyle se quiser verificar apenas o estilo de código. Se você deseja excluir alguns arquivos, como código de terceiros, poderá adicionar um item exclude na tarefa checkCodeStyle no arquivo static_analysis.gradle.
Findbugs verifica seu código em busca de padrões que podem resultar em bugs. Os arquivos a serem excluídos da análise são definidos aqui. Execute gradlew findBugs se você deseja executar apenas o FindBugs.
O PMD é um analisador de código estático que pode detectar falhas de programação comuns. As regras são definidas em qualidade/pmd/pmd-ruleset.xml. A lista completa das regras pode ser encontrada aqui. Execute gradlew pmdCheck se você deseja executar apenas o PMD.
O Android Lint é uma ferramenta de análise de código estático específico do Android. A lista completa de cheques está aqui. Execute gradlew lint se quiser executar apenas regras de fiapos.
O StrictMode é muito útil para detectar operações lentas no encadeamento da interface do usuário e vazamentos de recursos. Especificamente, o ThreadPolicy detectará a E/S de disco/rede e operações lentas na UI Thead, enquanto o VMPolicy detectará vazamentos de recursos. Para detalhes, consulte os documentos para threadpolicy.builder e vmpolicy.builder
O vazamento de vazamento pode ajudar a detectar vazamentos de memória. Ele tem uma interface do usuário muito agradável para relatar os vazamentos e mostrar toda a cadeia de referência, para que você possa localizar facilmente onde corrigir os vazamentos.
The MIT License
Copyright (c) 2017-2017 AndroidQualityEssentials project contributors
https://github.com/BrianSpace/AndroidQualityEssentials/graphs/contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.