[Windows Phone 7] Comment marche le capability detection tool?

Le capability detection tool est un petit utilitaire en ligne de commande qui va permettre de scanner votre application afin de détecter automatiquement, en fonction des API utilisées, quelles sont les “capabilities” à indiquer dans le manifest de votre application. Il est critique d’indiquer les bonnes capabilities dès le début car par défaut, elles sont toutes activées: ces capabilties sont d’ailleurs indiquées sur la page de votre application sur Marketplace et pourrait donc induire l’utilisateur en erreur sur ce que fait votre application réellement…

Le capabiltiy detection tool se trouve dans le dossier C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Tools\CapDetect. il faut ouvrir un command prompt et appeler la ligne de commande suivante:

CapabiltiyDetection.exe Rules.xml “CheminVersLeDossierDeVotreApplication”

L’outil vous retournera alors directement dans la fenêtre de commande les capabilities à inclure dans votre manifest dans la section <capabilities> (le fichier WMAppManifest.xml se trouve en dépliant les Properties de votre application)

WMAppManifest

Comment marche cet outil? Il scanne en fait le code de votre application à la recherche des API qui nécessite certaines capabilities. Et les règles qui régissent cette détection sont justement indiquées dans le fichier Rules.xml qu’on spécifie dans la ligne de commande Smile Ce fichier est plutôt simple à comprendre: pour chaque capability, l’outil va chercher des namespaces, des classes ou des méthodes qui requièrent celle-ci.

Par exemple:

 <Capability ID="ID_CAP_MICROPHONE" Type="Security">
        <Assembly Name="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553">
            <Namespace Name="Microsoft.Xna.Framework.Audio">
                <Class Name="Microphone" />
            </Namespace>
        </Assembly>

indique qu’on incluera la capability “ID_CAP_MICROPHONE” si on trouve une référence à l’assembly Microsoft.Xna.Framework, et qu’on utilise la classe Microphone définie dans le namespace “Microsoft.Xna.Framework.Audio”.

Du coup si vous vous demandez pourquoi l’outil retourne une capability que vous ne croyez pas avoir besoin de spécifier: un petit coup d’oeil dans ce fichier Rules.xml pourra surement éclairer votre lanterne.

Il arrive souvent par exemple que l’outil indique ID_CAP_NETWORKING alors que l’application ne fait pas forcément directement appel au réseau: mais le simple fait de spécifier une Uri locale dans du XAML (pour une image par exemple) peut faire que l’utilitaire détecte le besoin du réseau.. à tort. Laisser la clause using System.Net alors qu’on en a pas besoin provoque la même réaction… et cette clause est automatiquement ajoutée dans le template par défaut, il faut donc penser à bien nettoyer ses usings! Dans ce cas, vous pouvez enlever cette capability de votre manifest, mais attention tout de même à bien retester complètement votre application sans cette capability pour être sur que tout fonctionne quand même!!