4 votes

Comment réduire la taille de l'applet javacard ?

J'ai écrit une applet qui a une taille de 19 KB sur le disque. Elle comporte trois classes. La première est étendue à partir de l'applet, la deuxième a des fonctions statiques et la troisième est une classe dont je crée une instance dans mon applet.

J'ai trois questions :

  1. Existe-t-il un moyen de savoir quelle est la taille occupée par mon instance d'applet dans ma javacarte ?
  2. Existe-t-il un outil permettant de réduire la taille d'une applet javacard (fichier .cap) ?
  3. Pouvez-vous m'expliquer les règles qui me permettent de réduire la taille de mon applet ?

6voto

vlp Points 3766
  1. Existe-t-il un moyen de savoir quelle est la taille occupée par mon instance d'applet dans ma javacarte ?
  • (AFAIK) Il n'existe aucun moyen officiel de le faire (dans GlobalPlatform / Java Card).

  • Vous pouvez estimer l'utilisation réelle de la mémoire à partir de la différence de mémoire libre avant le chargement de l'applet et après l'installation (et très probablement après la personnalisation - car vous allez probablement créer certains objets pendant la personnalisation). Voici quelques moyens de trouver des informations sur la mémoire libre :

    • Utilisation de JCSystem.getAvailableMemory() (voir aquí ) qui donne des informations pour tous les types de mémoire (s'ils sont implémentés).

    • Utilisation de Informations sur les ressources des cartes étendues récupérable avec GET DATA (voir TS 102 226 ) (si elle est mise en œuvre).

    • Utilisation d'une commande propriétaire (demandez à votre fournisseur).

  • Vous pouvez jeter un coup d'œil dans votre .cap et voir les tailles des pièces qui sont chargées dans la carte -- celle-ci est sûrement TRES INACCRUE car le système d'exploitation de la carte est libre de traiter le contenu à sa propre discrétion.

  • Je me souviens Outils JCOP ont une vue spéciale d'Eclipse qui montre diverses statistiques pour l'applet en cours - cela pourrait aussi être instructif.

  • L'implémentation de référence offre une option pour obtenir des statistiques sur la consommation des ressources -- pourrait également être utile (je ne l'ai jamais utilisé, cependant).

  1. Existe-t-il un outil permettant de réduire la taille d'une applet javacard (fichier .cap) ?
  • J'ai utilisé ProGuard dans le passé pour améliorer les performances de l'applet (ce qui a en fait augmenté la taille de l'applet car je l'utilisais principalement pour l'inlining de méthodes) -- mais il devrait également fonctionner pour réduire la taille de l'applet (par exemple en éliminant le code mort -- cf. options de réduction ). Il existe de nombreux optimisations aussi bien - jetez-y un coup d'œil, mais ne vous attendez pas à des miracles.
  1. Pouvez-vous m'expliquer les règles qui me permettent de réduire la taille de mon applet ?
  • Je mettrais l'accent sur une bonne conception et une bonne réutilisation du code, mais il existe certainement de nombreuses ressources concernant les techniques d'optimisation génériques - je n'en connais aucune spécifique à Java Card - je ne peux pas vous aider ici :(

  • Si plusieurs applets sont chargés sur une seule carte, vous pouvez placer le code commun dans une bibliothèque partagée.


Quelques notes supplémentaires (aléatoires) :

  • Il serait peut-être plus pratique de se procurer une carte dotée d'une plus grande mémoire.

  • Les informations sur la mémoire libre fournies par la carte peuvent être inexactes.

  • Je me demande si vous avez des problèmes avec la taille de votre applet, car habituellement il y a des problèmes avec la taille de la mémoire transitoire (AFAIK).

  • Votre applet peut tout simplement perdre de la mémoire et utiliser de plus en plus de mémoire.

  • Ne sacrifiez pas la sécurité pour réduire la taille de l'applet !

Bonne chance !

4voto

Anon Points 68

Pour répondre à votre troisième question

Pouvez-vous expliquer les règles qui m'aident à réduire la taille de mon applet ?

Quelques lignes directrices de base sont :

  1. Gardez le nombre de méthodes au minimum, car vous savez que nous avons des ressources très limitées pour les cartes à puce et que l'appel de méthodes est une surcharge, donc avec un minimum d'appels de méthodes, les performances de la carte augmenteront. Évitez d'utiliser les méthodes get/set. Les appels récursifs doivent également être évités car la taille de la pile dans la plupart des cartes est d'environ 200 octets.

  2. Évitez d'utiliser plus de 3 paramètres pour les méthodes virtuelles et 4 pour les méthodes statiques. De cette façon, le compilateur utilisera un certain nombre de raccourcis de bytecode, ce qui réduit la taille du code.

  3. Pour travailler sur des données temporaires, on peut utiliser un tampon APDU ou des tableaux transitoires car l'écriture sur EEPROM est environ 1 000 fois plus lente que l'écriture sur RAM.

  4. L'héritage est également une surcharge dans javacard, en particulier lorsque la hiérarchie est complexe.

  5. L'accès aux éléments d'un tableau est également une surcharge pour la carte. Ainsi, dans les situations où l'accès à un élément de tableau est répété, essayez de stocker l'élément dans une variable locale et de l'utiliser.

Au lieu de faire ça :

if (arr[index1] == 1) do this;
OR
if (arr[index1] == 2) do this;
OR
if (arr[index1] == 3) do this;

Faites-le :

temp = arr[index1];
if (temp == 1) do this;
OR
if (temp == 2) do this;
OR
if (temp == 3) do this;
  1. Remplacez les instructions if-else imbriquées par des instructions switch équivalentes, car les switch s'exécutent plus rapidement et prennent moins de mémoire.

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