Améliorer la qualité du code Android avec l'analyse du code statique et la vérification d'exécution:
Il est recommandé d'ajouter ces vérifications lorsque vous créez un nouveau projet et de résoudre les problèmes avec chaque enregistrement (dans le cadre de votre processus d'intégration continue). Sinon, il aurait besoin d'un énorme courage et d'une patience lorsque vous affrontez et réparez l'énorme quantité d'erreurs.
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 (et n'oubliez pas d'ajouter au manifeste): 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 la console pour démarrer l'analyse statique.build/reports/ répertoire du projet dans lequel vous appliquez le static_analysis.gradle . La convention de dénomination définie dans les règles de style ne permet pas le préfixe de lettres unique pour les noms de champs membres comme "MMember". Mais si vous aimez ce style, vous pouvez modifier la propriété du format du module MemberName en "^ [az] [a-za-z0-9] $". Ou passer à "^ m [az] [a-za-z0-9] $" pour forcer le préfixe "m".
Pour la règle PMD UseUtilityClass, il invitera à créer une classe d'utilité si votre classe n'a que des champs et méthodes statiques. Vous avez juste besoin de:
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 ;
}
}Toutes les règles d'analyse statique sont les meilleures pratiques de l'expérience passée des gens, mais ce ne sont pas toujours la vérité qui ne peut pas être brisée. Certaines des règles PMD doivent être basées sur vos propres préférences:
ItemTypeT , pour une meilleure lisibilité. Vous pouvez le supprimer de la liste "Exclure" si vous aimez la dénomination unique. Les conventions de dénomination sont définies dans le fichier de qualité / checkstyle / naming_convention.xml. Les règles suivantes sont définies:
Vous pouvez modifier les expressions régulières dont vous avez besoin pour votre propre projet. Exécutez gradlew checkFileNames si vous souhaitez vérifier uniquement la convention de dénomination.
CheckStyle est utilisé pour vérifier le style de code Java. Les règles de style sont basées sur le guide de style Google Java avec les modifications suivantes:
Exécutez gradlew checkCodeStyle si vous souhaitez vérifier uniquement le style de code. Si vous souhaitez exclure certains fichiers comme le code tiers, vous pouvez ajouter un élément exclude dans la tâche de checkCodeStyle dans le fichier static_analysis.gradle.
FindBugs Analyse votre code pour des modèles qui peuvent entraîner des bogues. Les fichiers à exclure de l'analyse sont définis ici. Exécutez gradlew findBugs si vous souhaitez exécuter FindBugs uniquement.
PMD est un analyseur de code statique qui peut détecter les défauts de programmation courants. Les règles sont définies dans Quality / PMD / PMD-RuleSet.xml. La liste complète des règles peut être trouvée ici. Exécutez gradlew pmdCheck si vous souhaitez exécuter PMD uniquement.
Android Lint est un outil d'analyse de code statique spécifique à Android. La liste complète des chèques est ici. Exécutez gradlew lint si vous souhaitez exécuter des règles de peluche uniquement.
STRICTMODE est très utile pour détecter les opérations lentes dans les fuites de threads et de ressources d'interface utilisateur. Plus précisément, ThreadPolicy détectera les E / S de disque / réseau et les opérations lents dans l'interface utilisateur, tandis que Vmpolicy détectera les fuites de ressources. Pour plus de détails, consultez les documents pour ThreadPolicy.Builder et Vmpolicy.Builder
Lecanarary peut aider à détecter les fuites de mémoire. Il a une très belle interface utilisateur pour signaler les fuites et afficher toute la chaîne de référence afin que vous puissiez facilement localiser où réparer les fuites.
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.