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
,这有一个好处,我只能分析项目所依赖的一些库。 。我仍然希望我最初尝试做的事情是可能的。任何人都可以告诉我如何提取路径元素
答案 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>