Verbesserung der Qualität der Android -Code mit statischer Codeanalyse und Laufzeitprüfung:
Es wird empfohlen, diese Überprüfungen hinzuzufügen, wenn Sie ein neues Projekt erstellen und die Probleme mit jedem Check-in beheben (als Teil Ihres kontinuierlichen Integrationsprozesses). Andernfalls würde es enormen Mut und Geduld benötigen, wenn Sie die große Menge an Fehlern gegenüberstehen und beheben.
build.gradle hinzu. 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 hinzu. 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 (und nicht vergessen, das Manifest hinzuzufügen): 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 in die Konsole aus, um die statische Analyse zu starten.build/reports/ -verzeichnis des Projekts, in dem Sie die static_analysis.gradle anwenden. Die in den Stilregeln definierte Namenskonvention erlaubt nicht das Präfix eines Buchstabens für Mitgliedsfeldnamen wie "Mmember". Wenn Sie diesen Stil jedoch mögen, können Sie die format des MemberName -Moduls in "^[Az] [A-Za-Z0-9] $" ändern. Oder wechseln Sie zu "^m [az] [a-za-z0-9] $", um das "M" -Präfix zu erzwingen.
Für die Anwendungsfähigkeit von PMD -Regels wird die Erstellung von Versorgungsklassen aufgefordert, wenn Ihre Klasse nur statische Felder und Methoden verfügt. Sie müssen nur:
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 ;
}
}Alle statischen Analyseregeln sind Best Practices aus der vergangenen Erfahrung der Menschen, aber sie sind nicht immer die Wahrheit, die nicht gebrochen werden kann. Einige der PMD -Regeln müssen auf Ihren eigenen Vorlieben basieren:
ItemTypeT , um eine bessere Lesbarkeit zu erhalten. Sie können es aus der Liste "ausschließen" entfernen, wenn Ihnen die Benennung des einzelnen Buchstabens gefällt. Benennungskonventionen sind in der Datei zur Qualität/Checkstyle/naming_convention.xml definiert. Die folgenden Regeln sind definiert:
Sie können die regulären Ausdrücke so ändern, wie Sie Ihr eigenes Projekt benötigen. Führen Sie gradlew checkFileNames aus, wenn Sie nur die Namenskonvention überprüfen möchten.
CheckStyle wird verwendet, um den Java -Code -Stil zu überprüfen. Die Stilregeln basieren auf dem Google Java Style Guide mit den folgenden Änderungen:
Führen Sie gradlew checkCodeStyle aus, wenn Sie nur den Codestil überprüfen möchten. Wenn Sie einige Dateien wie den Code von Drittanbietern ausschließen möchten, können Sie in der Datei static_analysis.gradle ein exclude Element in der checkCodeStyle -Aufgabe hinzufügen.
FindBugs scannen Sie Ihren Code nach Mustern, die zu Fehler führen können. Die von der Analyse ausgeschlossenen Dateien sind hier definiert. Führen Sie gradlew findBugs aus, wenn Sie nur Findbugs ausführen möchten.
PMD ist ein statischer Codeanalysator, der gemeinsame Programmierfehler erkennen kann. Regeln sind in Qualität/PMD/PMD-RULESET.xml definiert. Die vollständige Liste der Regeln finden Sie hier. Führen Sie gradlew pmdCheck aus, wenn Sie nur PMD ausführen möchten.
Android Lint ist ein Android -spezifisches statisches Code -Analyse -Tool. Die vollständige Liste der Schecks ist hier. Führen Sie gradlew lint aus, wenn Sie nur Lint -Regeln ausführen möchten.
StrictMode ist sehr nützlich, um langsame Operationen in UI -Thread und Ressourcenlecks zu erkennen. Insbesondere erfasst ThreadPolicy die Scheiben-/Netzwerk -E/A und langsame Vorgänge in UI thead, während VMPolicy Ressourcenlecks erkennt. Weitere Informationen finden Sie in den Dokumenten für ThreadPolicy.builder und vmpolicy.builder
Leakcanary kann dazu beitragen, Speicherlecks zu erkennen. Es gibt eine sehr schöne Benutzeroberfläche, um die Lecks zu melden und die gesamte Referenzkette anzuzeigen, damit Sie leicht finden können, wo die Lecks behoben werden sollen.
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.