コードの品質向上-ツール編

10134 ワード


これは翻訳文です。How to improve qualityとsyntax of your Android codeは一貫性を理解するために、翻訳過程で論理と順序を述べて、自分の補充も加えました。
この文章では、ツールの使用角度からAndroidコードの品質を向上させる方法を説明します。これらの自動化ツールはChecksystle、Findbugs、PMDとAndroid Listを含みます。チームの中でコードの意識が一致していません。この時にはツールの力を借りて、ツールを使って自動的にコードを検査してくれます。
0.1 Forkのこの例の工事
このプロジェクトの例を強く提案します。すべての使用事項はこのデモに表示されます。同時にあなたが自分で書いたルールをテストすることができます。
0.2 Gradeに関するTask
GraadleのTaskを理解することはこの文章の基礎を理解することであり、Grade Taskに関する文章(例えばこれもこの本があります)を多く見ることを強く勧めます。もちろん、本論文もいっぱいの例です。だから、あなたは分かりやすいです。これも私のコード倉庫の原由です。プロジェクトをAndroid studioに導入します。そしておなじみのGraadle Task脚本をご覧ください。まだよく理解していないなら、心配しなくても大丈夫です。最善を尽くしてコメントを書きます。
0.3このデモに関する階層構造
Graadleスクリプトは異なるファイルに分散できます。プロジェクトに三つのgradleファイルを書きました。
  • 本のディレクトリの下のgradleファイルは、プロジェクトに関する情報、例えば倉庫依存、コンパイルツールバージョンなどを構成するために使用される。
  • appディレクトリのgradleファイルは、Javaクラスを検証するために使用されます。
  • configディレクトリの下のgradleファイルは、前述のいくつかのツールを構成するために使用される。
  • 1 Checkstyle
    Check styleは、開発者がコード基準を維持するためのツールであり、Javaコードを自動的に検出して、人工的な検出コードのコストを減らすことができる。Checkstyleを有効にすると、コードを解析してコードの中のエラーや定義された仕様に合わないところを教えてくれます。
    1.1 Android Studioプラグイン
    Checkstyleは様々なIDEのプラグインサポートを提供しています。Android Studioも例外ではありません。Android Studio設定ページに進み、プラグインバーにCheckstyleを入力します。
    Checkstyleプラグイン
    もしまだCheckstyleのプラグインをインストールしていないならば、ダウンロードページに入ってダウンロードして、Android Studioを再開します。Android studioを起動したらCheckstyleの設定ページに入ります。
    Checkstyle設定
    ここではCheckstyleプラグインのスキャン範囲、プロファイルなどの情報を設定できますが、デフォルトで使用されているプロファイルは公式で提供されているファイルです。checks.xmlは、自分のプロジェクトの必要に応じて自分の設定ファイルを定義することもできます。配置規則は公式文書を参照することができます。設定が完了したら「Apple」または「ok」ボタンをクリックしてコードに戻ります。Checkstyleからのヒントが見えます。
    Checksylteハイライトのヒント
    1.2 Grade方式でCheckstyleを使用する
    もし私たちがCheckstyleを自動コンパイルサーバに継承したいなら、例えば、jeckins、私たちはGrade Taskを利用してCheckstyleを実行したいです。このシナリオはGrade taskにおけるCheckstyleの基本構成を示します。
    task checkstyle(type: Checkstyle) {
        configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml") // Where my    checkstyle config is...
        configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath // Where is my suppressions file for checkstyle is...
        source 'src'
        include '**/*.java'
        exclude '**/gen/**'
        classpath = files()
    }
    このtaskはあなたが指定したcheckstyle.xmlとsuppresions.xmlファイルからあなたのコードを分析します。このタスクはAndroid Studioで実行できます。
    実行が完了したら、checkstyleツールは各不正な問題をコンソールに表示します。
    2 FindBugs
    FindBugsという名前自体は、その役割を明らかにしました。「FindBugs static anlysis to inspect Java bytecode for occurrences of bug patterns」FindBugsは、Javaバイトコードを静的に分析することによってスキャンすることができます。例えば、いくつかの誤った論理操作は、いくつかの比較的にあいまいな誤りを発見することもできる。たとえば:
       Person person = (Person) map.get("bob");
        if (person != null) {
            person.updateAccessTime();
        }
        String name = person.getName();
    最後の行のコードは、空のポインタエラーが発生する可能性があります。また、
        b.replace('b', 'p');
        if(b.equals("pop")) {
            Log.d("","");
        }
    b.replace('b'、'p')このコードはbに影響がないので、無効です。
    2.1 Android Studioプラグイン
    同様に、FIndbugsはAndroid Studioのプラグインサポートも提供しています。プラグインの取得プロセスはCheckstyleと同じで、インストール後にAndroid studioを再開します。注意すべきなのはFindbugs分析のはJavaバイトコードです。だからFindbugsを有効にする前に、あなたのプロジェクトがコンパイルされたことを保証します。FIndbugsスキャンの後、問題が発見されたら、対応するコードにヒントを与えます。
    findbugsヒント
    2.2 Graadleスクリプトの使用
    Graadleでは非常に簡単に使えます。次のシナリオはFindBugsを示しています。
    task findbugs(type: FindBugs) {
        ignoreFailures = false
        effort = "max"
        reportLevel = "high"
        excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")
        classes = files("${project.rootDir}/app/build/classes")
        source 'src'
        include '**/*.java'
       exclude '**/gen/**'
    
        reports {
           xml.enabled = false
            html.enabled = true
            xml {
           destination "$project.buildDir/reports/findbugs/findbugs.xml"
       }
        html {
            destination "$project.buildDir/reports/findbugs/findbugs.html"
        }
    }
    
        classpath = files()
    }
    スクリプトタスクはCheckstyleと似ています。FindBugsは私たちが指定した範囲でスキャンできます。この範囲はフィルタルールファイルを通してスキャン結果報告書を作成してHTMLとXMLの両方のフォーマットをサポートします。exclude Filterはフィルタ構成ファイルを指定し、レポートのファイルフォーマットとファイルアドレスをレポートに指定しました。Findbugsを実行するtaskはとても簡単で、Checkstyleと同じです。
    2.3 Findbugs使用テクニック
    私はFindbugsのためにフィルタリングファイルを配置することを強く提案します。AndroidプロジェクトとJavaプロジェクトは少し違っています。Androidプロジェクトが自動的に生成したRファイルはFindbugsの規格に合わないので、フィルタリングが必要です。また注意したいのは、Findbugsの分析はバイトコードで、先にコンパイルしてからFindbugsの分析を行う必要があります。
    3 PMD
    このツールは面白いです。実はPMDの本当の名前はPMDではありません。公式サイトで2つの非常に面白い名前が見つかります。
  • Pretty Mush Dune
  • Project Meets Deadline
  • PMDは非常に強力なツールであり、その役割はFindbugsに似ていますが、その検出スキャンはソースに基づいています。PMDはJava言語だけでなく、他の言語も検出できます。PMDの目標はFindbugsdと非常に似ています。全部定義された規則静的分析コードに発生する可能性のあるエラーです。なぜPMDとFindbugsを同時に使うのですか?FindbugsとPMDのスキャン方式が違っていますので、PMDが発見できるFindbugsでは発見できない問題もあります。
    3.1 Androidプラグインで使用する
    プラグインのダウンロードプロセスは、再起動が完了したら、トップメニューTools欄にQipugオプションを見つけて、コード分析を実行できます。
    PMDコード分析
    実行が完了したら、コンソールで結果を出力します。
    PMD実行結果
    3.2 Graadleスクリプトで使用する
    以下のスクリプトコードはPMDの使い方を示しています。
    task pmd(type: Pmd) {
        ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")
        ignoreFailures = false
        ruleSets = []
    
       source 'src'
       include '**/*.java'
       exclude '**/gen/**'
    
        reports {
            xml.enabled = false
            html.enabled = true
        xml {
            destination "$project.buildDir/reports/pmd/pmd.xml"
        }
       html {
            destination "$project.buildDir/reports/pmd/pmd.html"
           }
        }
    }
    設定はFindbusと同じです。PMDもHTMLとXMLレポートを出力できます。例ではHTML形式が選択されています。私はあなたが自分のrulesetsファイルを定義することを強く提案します。rulesetsの構成については、公式文書を参照してもいいです。PMDの論争ルールはFindbugsより多いです。例えば、入れ子の「if statement」についてはいつも「The ness ted if stants could be combined」を注意します。「Avoid empty if statements」ですが、ネストされた「if statement」を一つの「if statement」に統合する必要があるかどうかは、あなたやあなたのチームによって定義されます。「if statement」を統合することは、コードの可読性を低下させるとはあまり提案していません。PMDのtaskは非常に簡単です。Checkstyleと同じです。
    4 Android Lint
    「The Android lint tool is a static code anlysis tool that checks your Android project source files for potenttial bugs and optimization improvents for corectnes、security、performance、usability、accelight.nation」公式サイトによると、Android Lintは別の静的コード分析ツールであり、Androidプロジェクトに特化しています。Android Lintはコードスキャンに加えて、潜在的な問題を分析するほか、Androidの資源を検出したり、無駄な資源、間違ったdipリソースなどもあります。
    4.1 Graadleスクリプトの使用
    android {
        lintOptions {
        abortOnError true
         lintConfig file("${project.rootDir}/config/quality/lint/lint.xml")
        // if true, generate an HTML report (with issue explanations, sourcecode, etc)
        htmlReport true
        // optional path to report (default will be lint-results.html in the builddir)
        htmlOutput file("$project.buildDir/reports/lint/lint.html")
    }
    ここを参照してください。「severity」構成を「ignore」として使用して、指定されたルールをフィルタリングします。Lintを実行して、Checkstyleを実行するtaskと同じです。実行が完了したら、結果出力ディレクトリに報告書を確認します。例えば、以下は私です。自分のプロジェクトのアウトプットを実行する部分のスクリーンショット:
    5つのタスクで上記のツールを統一的に使う
    以上で4つのツールを紹介しました。今回はどうやって4つのツールを同時に実行しますか?gradle task間の依存関係を管理できます。taskタスクを実行しながら他のtaskも実行できます。Gradeで提供した方法を使って、4つのツールの実行タスクをcheck taskの依存関係に追加できます。
    check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint'
    今は「check」というtaskだけを考えています。Checkstyle、Windbags、PMD、Android Lintは自動的に実行します。comit/push/merge requestの前にcheckタスクを実行してください。私たちのコード品質の向上は素晴らしい方法です。このタスクを実行するのは簡単です。コマンドラインで実行できます。
        gradlew check
    6まとめ
    前述のように、Gradeではこれらのツールを使用するのは非常に簡単です。これらのツールは現地で使用できるだけでなく、Jenkins/Hudsonなどの自動的なコンパイルサーバにも配備されています。