如何减小javacard小程序的大小

How to reduce the size of javacard applet

我写了一个磁盘大小为 19 KB 的小程序。它有三个 classes。第一个是从 Applet 扩展的,第二个是静态函数,第三个是 class,我在我的 applet 中从它创建了一个实例。

我有三个问题:

  1. 有什么方法可以找出我的 javacard 中的小程序实例占用了多少大小?
  2. 是否有任何工具可以减小 javacard 小程序(.cap 文件)的大小?
  3. 你能解释一下帮助我减小小程序大小的规则吗?
  1. Is there any way to find out how much size is taken by my applet instance in my javacard?
  • (AFAIK) 没有官方方法可以做到这一点(在 GlobalPlatform / Java Card 中)。

  • 您可以根据小程序加载前和安装后可用内存的差异来估计实际内存使用量(很可能是在个性化之后——因为您可能会在个性化期间创建一些对象)。找出空闲内存信息的一些方法是:

    • 使用 JCSystem.getAvailableMemory()(参见 here),它提供所有内存类型的信息(如果已实现)。

    • 使用 扩展卡资源信息 标签可通过 GET DATA 检索(参见 TS 102 226)(如果实施)。

    • 使用专有命令(询问供应商)。

  • 你可以看看你的 .cap 文件,看看加载到卡中的部件的大小——这个肯定非常不准确,因为卡 OS可自行酌情处理内容

  • 我记得 JCOP 工具 有一些特殊的 eclipse 视图,它显示当前小程序的各种统计信息 -- 也可能提供信息。

  • Reference Implementation 提供了一个选项来获得一些 resource consumption statistics -- 可能也很有用(不过我从来没有用过这个)。

  1. Is there any tool to reduce the size of a javacard applet (.cap file)?
  • 我也用过ProGuard in the past to improve applet performance (which in fact increased applet size as I used it mostly for method inlining) -- but it should work to reduce the applet size as well (e.g. eliminate dead code -- see shrinking options). There are many different optimizations——看看就好,别指望奇迹。
  1. Can you explain rules that help me to reduce my applet size?
  • 我会强调良好的设计和适当的代码重用,但是肯定有很多关于通用优化技术的资源——我不知道任何 Java 卡片特定的——帮不上忙:(

  • 如果您有更多小程序加载到一张卡中,您可以将通用代码放入共享库中。


一些额外的(随机)注释:

  • 买个内存大点的卡可能更实用

  • 网卡提供的可用内存信息可能不准确。

  • 我想知道你的小程序大小有问题,因为通常瞬态内存大小 (AFAIK) 有问题。

  • 您的小程序可能只是在泄漏内存,因此使用了越来越多的内存。

  • 不要为了较小的小程序大小而牺牲安全性!

祝你好运!

回答你的第三个问题

3.Can you explain rules that help me to reduce my applet size?

一些基本准则是:

  1. 保持方法的数量最少,因为你知道我们用于智能卡的资源非常有限,方法调用是一种开销,因此通过最少的方法调用,卡的性能将 increase.Avoid 使用get/set methods.Recursive 调用也应避免,因为大多数卡片的堆栈大小约为 200 字节。

  2. 避免为虚拟方法使用超过 3 个参数,为静态方法使用 4 个以上参数。这样,编译器将使用数字或字节码快捷方式,从而减少代码大小。

  3. 要处理临时数据,可以使用 APDU 缓冲区或瞬态数组,因为写入 EEPROM 比写入 RAM 慢 1,000 倍。

  4. 继承也是 javacard 中的开销,尤其是当层次结构复杂时。

  5. 访问数组元素也是card.So的开销,在重复访问数组元素的情况下,尝试将元素存储在局部变量中并使用它。

而不是这样做:

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

这样做:

temp = arr[index1];
if (temp == 1) do this;
OR
if (temp == 2) do this;
OR
if (temp == 3) do this;
  1. 用等效的 switch 语句替换嵌套的 if-else 语句,因为 switch 执行速度更快,占用的内存更少。