4

Findbugsは素晴らしいソフトウェアであり、私のチームはAndroidプロジェクトで作業しているときにそれを使用しています。Eclipseではすべてが素晴らしくて光沢がありますが、現在はビルドを自動化し、ビルドantごとにFindbugsの結果を自動的に生成しようとしています。

それほど難しいことではないようです。私はこのチュートリアルに従いました:
https
://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project#BuildinganAndroidappandtestproject-FindBugs 1つの小さな問題は、に変更${android.jar}する必要があること${project.target.android.jar}です。

最悪の部分はThe following classes needed for analysis were missing:、私たちが使用するライブラリプロジェクトから来るクラスに対する警告です。それらのいくつかは私たち自身のものであり、Findbugsでもそれらをスキャンしたいと思います。さらに複雑なことに、これらのライブラリの1つは別のライブラリ(これも独自のライブラリであり、スキャンが必要)を使用しているため、次のようになります。
Project A --uses--> Library B --uses--> Library C

ここで、Android SDKはこれらすべての依存関係を処理できるので(プロジェクトAで発行するとライブラリCがコンパイルされant debugます)、どういうわけかそれを利用して、プロジェクトが依存するライブラリのリストを取得し、findbugsタスクに提供できると思いました。残念ながら、私はそれを行うことができませんでした。

今のところ、すべてのライブラリを手動で入力することに決めました。一部classはfindbugsタスクのプロパティに、一部はに入力しますauxClasspath。これには、プロジェクトが依存するライブラリの一部しか分析できないという利点があります。それでも、私が最初にやろうとしたことが可能であることを願っています。パス要素を抽出する方法を教えてもらえますか

4

2 に答える 2

3

最終的に、すべての jar の「クラスパス」をまとめる SDK ビルド スクリプトの一部を見つけました ( classes.jar「図」のライブラリ C とlibs/プロジェクトのフォルダーとすべてのライブラリのjar を含むすべてのライブラリの -s )。

私の最後custom-rules.xmlの findbugs ターゲットは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Project_custom" default="findbugs">

    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/>

    <target name="findbugs">
        <gettarget
                androidJarFileOut="project.target.android.jar"
                androidAidlFileOut="project.target.framework.aidl"
                bootClassPathOut="project.target.class.path"
                targetApiOut="project.target.apilevel"
                minSdkVersionOut="project.minSdkVersion" />
        <dependency
                libraryFolderPathOut="project.library.folder.path"
                libraryPackagesOut="project.library.packages"
                libraryManifestFilePathOut="project.library.manifest.file.path"
                libraryResFolderPathOut="project.library.res.folder.path"
                libraryBinAidlFolderPathOut="project.library.bin.aidl.folder.path"
                libraryNativeFolderPathOut="project.library.native.folder.path"
                jarLibraryPathOut="project.all.jars.path"
                targetApi="${project.target.apilevel}"
                verbose="${verbose}" />

        <findbugs home="${findbugs.home}" output="xml" outputFile="findbugs-results.xml">
            <auxClasspath>
                <pathelement location="${project.target.android.jar}" />
                <path refid="project.all.jars.path" />
            </auxClasspath>
            <class location="${out.dir}" />

        </findbugs>
    </target>

</project>

編集:ビルドターゲットとは独立して実行するようにターゲットをアップグレードしました。つまり、実行できant findbugsないだけで実行できるようになりましたant debug findbugs

于 2012-08-01T10:45:55.160 に答える
1

追加の定義を追加して作業しました。ありがとうございました

<target name="findbugs">
    <mkdir dir="reports" />
    <gettarget
            androidJarFileOut="project.target.android.jar"
            androidAidlFileOut="project.target.framework.aidl"
            bootClassPathOut="project.target.class.path"
            targetApiOut="project.target.apilevel"
            minSdkVersionOut="project.minSdkVersion" />
    <dependency
            libraryFolderPathOut="project.library.folder.path"
            libraryPackagesOut="project.library.packages"
            libraryManifestFilePathOut="project.library.manifest.file.path"
            libraryResFolderPathOut="project.library.res.folder.path"
            libraryBinAidlFolderPathOut="project.library.bin.aidl.folder.path"
            libraryNativeFolderPathOut="project.library.native.folder.path"
            jarLibraryPathOut="project.all.jars.path"
            libraryRFilePathOut="project.library.rfile.path"
            buildToolsFolder="${sdk.dir}/build-tools"
            renderscriptSupportLibsOut="project.rs.support.libs.path"
            renderscriptSupportMode="${renderscript.support.mode}"
            targetApi="${project.target.apilevel}"
            verbose="${verbose}" />
    <findbugs home="${findbugs.home}" output="xml:withMessages" outputFile="reports/findbugs.xml" excludeFilter="findbugs-exclude.xml" maxRank="9">
        <!-- auxClasspath path="${project.target.android.jar}" / -->
        <auxClasspath>
            <pathelement location="${project.target.android.jar}" />
            <path refid="project.all.jars.path" />
        </auxClasspath>
        <sourcePath path="${basedir}/src/" />
        <class location="${basedir}/bin/classes/" />
    </findbugs>
</target>
于 2014-06-18T13:16:47.653 に答える