如何减小javacard小程序的大小



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

我有三个问题:

  1. 有没有办法找出我的javacard中的小程序实例占用了多少大小?
  2. 有没有工具可以减小javacard小程序(.cap文件)的大小?
  3. 您能解释一下帮助我减小小程序大小的规则吗?
  1. 有没有办法找出我的 javacard 中的小程序实例占用了多少大小?
(
  • AFAIK)没有官方的方法可以做到这一点(在GlobalPlatform/Java Card中)。

  • 您可以通过小程序加载前和安装后(很可能在个性化之后)的可用内存差异来估计实际内存使用情况,因为您可能会在个性化过程中创建一些对象)。查找可用内存信息的一些方法是:

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

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

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

  • 您可以查看.cap文件内部并查看加载到卡中的部件的大小 - 这个肯定非常不准确,因为卡操作系统可以自行决定自由处理内容。

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

  • 参考实现提供了一个获取一些资源消耗统计信息的选项 - 可能也很有用(不过我从未使用过这个)。

  1. 有没有工具可以减小javacard小程序(.cap文件)的大小?
  • 我过去使用 ProGuard 来提高小程序的性能(实际上增加了小程序的大小,因为我主要将其用于方法内联)——但它也应该可以减小小程序的大小(例如,消除死代码 - 请参阅收缩选项)。还有许多不同的优化 - 只是看一看,但不要指望奇迹。
  1. 你能解释一下帮助我减小小程序大小的规则吗?
  • 我会强调好的设计和适当的代码重用,但是肯定有很多关于通用优化技术的资源 - 我不知道任何特定于Java Card的资源 - 在这里无济于事:(

  • 如果将更多小程序加载到单个卡中,则可以将公共代码放入共享库中。


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

  • 只获得具有更大内存的卡可能更实用。

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

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

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

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

祝你好运!

回答你的第三个问题

3.你能解释一下帮助我减小小程序大小的规则吗?

一些基本准则是:

  1. 保持最少的方法数量,因为您知道我们的智能卡资源非常有限,方法调用是一种开销,因此使用最少的方法调用,卡的性能将提高。避免使用 get/set 方法。还应避免递归调用,因为大多数卡中的堆栈大小约为 200 字节。

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

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

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

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

而不是这样做:

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. 将嵌套的 if-else 语句替换为等效的 switch 语句,因为 switch 执行速度更快,占用的内存更少。

最新更新