2012-07-30 63 views
4

Findbugs Android项目是一个伟大的软件和我的团队使用它在我们的Android项目时。在Eclipse中,一切都很好,很有光泽,但是现在我们试图用ant自动化我们的构建,并为每个构建自动生成Findbugs结果。FindBugs的与图书馆Ant构建

这似乎并不困难。我跟着这个教程:
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来扫描它们。为了使问题更复杂,这些库中的一个使用另一个LIB(也是我们自己的,需要扫描),所以它看起来是这样的:
Project A --uses--> Library B --uses--> Library C

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

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

+0

我设法找到'dependency'任务设置'project.library.folder.path'路径样变,但是它拥有路径每个库的根文件夹,无以'bin/classes'文件夹。不幸的是,我不太了解蚂蚁,知道该怎么做。 – 2012-07-30 11:00:33

回答

3

我终于发现SDK构建脚本的一部分,它将所有jar的“classpath”放在一起(所有库的classes.jar -s,包括库C的所有库项目文件夹中的“图表”和罐子以及所有库文件)。

我最后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> 

编辑:我已经升级目标运行的构建目标indepent,即现在你可以只运行ant findbugsant debug findbugs

+0

使用此配置时,我得到了libraryRFilePathOut错误 – yasinkafadar 2014-06-17 07:49:05

+0

是的,我很抱歉,但是此配置在Android SDK更新后打破了一段时间。我修好了,然后再次爆发。所以很不幸,我认为这不是一个好的方法。希望有一个简单的方法可以在Gradle中插入Findbugs。 – 2014-06-18 06:44:47

+0

我添加了一些额外的定义并且工作。谢谢 – yasinkafadar 2014-06-18 13:15:57

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>