我写了一个在磁盘上有19 KB大小的applet。它有三个类。第一个是从Applet扩展的,第二个是静态函数,第三个是我在applet中创建实例的类。
我有三个问题:
答案 0 :(得分:6)
- 有没有办法找出我的javacard中的applet实例占用了多少大小?
醇>
(AFAIK)没有正式的方法(在GlobalPlatform / Java Card中)。
您可以根据applet加载前和安装后的可用内存差异估算实际内存使用量(最有可能在个性化后 - 因为您可能会在个性化过程中创建一些对象)。找到免费记忆信息的一些方法是:
使用JCSystem.getAvailableMemory()
(请参阅here),其中提供了所有内存类型的信息(如果已实施)。
使用可通过GET DATA
检索的扩展卡资源信息标记(请参阅TS 102 226)(如果已实施)。
使用专有命令(询问供应商)。
您可以查看.cap
文件中的内容并查看加载到卡中的部件的大小 - 这个肯定非常不准确,因为卡操作系统可以自由处理内容由...自行决定。
我记得 JCOP工具有一些特殊的eclipse视图,它显示了当前applet的各种统计信息 - 也可以提供信息。
参考实现提供了获取一些resource consumption statistics的选项 - 也可能有用(我从未使用过这个)。
- 是否有任何工具可以减小javacard小程序(.cap文件)的大小?
醇>
- 您能解释一下帮助我减少applet大小的规则吗?
醇>
我会强调良好的设计和正确的代码重用,但是关于通用优化技术肯定有很多资源 - 我不知道任何特定于Java Card的资源 - 无法帮助在这里:(
如果您将更多applet加载到一张卡中,您可以将公共代码放入共享库中。
一些额外的(随机)笔记:
获得一张内存更大的卡片可能更实际。
信用卡提供的免费内存信息可能不准确。
我想知道您的applet大小有问题,因为通常存在瞬态内存大小(AFAIK)的问题。
您的小程序可能只是泄漏内存,因此会占用越来越多的内存。
不要因为applet尺寸较小而牺牲安全性!
答案 1 :(得分:4)
回答你的第3个问题
3.您能解释一下帮助我减少applet大小的规则吗?
一些基本指南是:
保持方法的数量最小,因为你知道我们的智能卡资源非常有限,方法调用是一个开销,所以只需最少的方法调用,卡的性能就会提高。避免使用get / set方法。递归还应避免调用,因为大多数卡中的堆栈大小约为200字节。
避免对虚拟方法使用3个以上的参数,对静态方法使用4个参数。这样,编译器将使用数字或字节码快捷方式,这将减少代码大小。
要处理临时数据,可以使用APDU缓冲区或瞬态数组,因为在EEPROM上写入比在RAM上写入慢1000倍。
继承也是javacard的开销,特别是当层次结构很复杂时。
访问数组元素也是卡的开销。因此,在重复访问数组元素的情况下,尝试将元素存储在局部变量中并使用它。
而不是这样做:
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;