4

Findbugs是一款很棒的软件,我的团队在处理我们的 Android 项目时使用它。在 Eclipse 中,一切都很好而且很闪亮,但是现在我们正在尝试自动化我们的构建,ant并为每个构建自动生成 Findbugs 结果。

好像没那么难。我遵循了本教程:
https
://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project#BuildinganAndroidappandtestproject-FindBugs 一个小问题是我必须更改${android.jar}${project.target.android.jar}.

更糟糕的部分是The following classes needed for analysis were missing:来自我们使用的库项目的类的警告。其中一些是我们自己的,我们也想用 Findbugs 扫描它们。更复杂的是,其中一个库使用了另一个库(也是我们自己的,需要扫描),所以它看起来像这样:
Project A --uses--> Library B --uses--> Library C

在这里,我认为由于 Android SDK 可以处理所有这些依赖项(当我ant debug为项目 A 发布库 C 时已编译),我可以以某种方式利用它,获取我的项目所依赖的库列表并将其提供给 findbugs 任务。不幸的是,我没有做到这一点。

现在我手动输入所有库,一些进入classfindbugs 任务的属性,一些进入auxClasspath,这有一个好处,我只能分析项目所依赖的一些库。我仍然希望我最初尝试做的事情是可能的。谁能告诉我如何提取路径元素

4

2 回答 2

3

我终于找到了 SDK 构建脚本的一部分,它将所有 jar 的“类路径”(classes.jar所有库的 -s,包括“图表”中的库 C 和libs/项目文件夹中的 jar 和所有库)放在一起)。

我的 findbugs 目标的最终custom-rules.xml结果如下所示:

<?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 findbugsnot 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 回答