4 votes

Findbugs pour un projet Android avec des bibliothèques dans ant build

Findbugs est un excellent logiciel et mon équipe l'utilise pour travailler sur notre projet Android. Dans Eclipse tout est beau et brillant, mais maintenant nous essayons d'automatiser nos constructions avec ant et générer automatiquement les résultats de Findbugs pour chaque build.

Ça n'a pas l'air si difficile. J'ai suivi ce tutoriel :
https://wiki.jenkins-ci.org/display/JENKINS/Building+une+application+et+un+projet+de+test+droid#Construire+une+application+et+un+projet+de+test+droid-FindBugs
Un petit problème est que j'ai dû changer ${android.jar} a ${project.target.android.jar} .

Le pire, c'est que The following classes needed for analysis were missing: des avertissements pour les classes qui proviennent de projets de bibliothèque que nous utilisons. Certains d'entre eux sont les nôtres et nous aimerions également les scanner avec Findbugs. Pour compliquer les choses, l'une de ces librairies utilise une autre librairie (également la nôtre et qui doit être analysée), de sorte que cela ressemble à ceci :
Project A --uses--> Library B --uses--> Library C

J'ai pensé que puisque le SDK d'Android peut gérer toutes ces dépendances (la bibliothèque C est compilée lorsque je lance l'application ant debug pour le projet A), je peux en quelque sorte l'utiliser, obtenir la liste des librairies dont dépend mon projet et la fournir à la tâche findbugs. Malheureusement, je n'ai pas réussi à le faire.

Pour l'instant, je me suis contenté d'entrer manuellement toutes les librairies, certaines dans le dossier class propriété de la tâche de findbugs, certains en auxClasspath L'avantage est que je ne peux analyser que certaines des bibliothèques dont dépend le projet. J'espère quand même que ce que j'ai essayé de faire à l'origine est possible. Quelqu'un peut-il me montrer comment extraire un élément de chemin d'accès

3voto

Marcin Koziński Points 5845

J'ai finalement trouvé cette partie du SDK build script qui met en place un "classpath" de tous les jars ( classes.jar -s de toutes les bibliothèques, y compris la bibliothèque C du "diagramme" et les jars du libs/ du projet et de toutes les librairies).

Mon dernier custom-rules.xml avec la cible de findbugs ressemble à ça :

<?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>

Edit : J'ai mis à jour la cible pour qu'elle fonctionne indépendamment des cibles de construction, c'est à dire que maintenant vous pouvez lancer juste ant findbugs no ant debug findbugs .

1voto

yasinkafadar Points 100

J'ai ajouté un peu de définition supplémentaire et ça a marché. Je vous remercie.

<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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X