用于Android项目的Findbugs与ant build中的库

时间:2012-07-30 10:58:36

标签: android ant findbugs

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可以处理所有这些依赖项(当我为项目A发出ant debug时编译库C),我可以以某种方式利用它,获取我的项目所依赖的库列表并将其提供给findbugs任务。不幸的是,我没有设法做到这一点。

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

2 个答案:

答案 0 :(得分:3)

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

我与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 findbugs而不是ant debug findbugs

答案 1 :(得分: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>