我写了一个磁盘上有19 KB大小的小程序。它有三个类。第一个是从Applet扩展而来的,第二个具有静态函数,第三个是我在小程序中从中创建实例的类。
我有三个问题:
- 有没有办法找出我的javacard中的小程序实例占用了多少大小?
- 有没有工具可以减小javacard小程序(.cap文件)的大小?
- 您能解释一下帮助我减小小程序大小的规则吗?
(
- 有没有办法找出我的 javacard 中的小程序实例占用了多少大小?
AFAIK)没有官方的方法可以做到这一点(在GlobalPlatform/Java Card中)。
您可以通过小程序加载前和安装后(很可能在个性化之后)的可用内存差异来估计实际内存使用情况,因为您可能会在个性化过程中创建一些对象)。查找可用内存信息的一些方法是:
使用
JCSystem.getAvailableMemory()
(请参阅此处),它提供所有内存类型(如果已实现)的信息。使用扩展卡资源可通过
GET DATA
检索的信息标记(请参阅 TS 102 226)(如果已实施)。使用专有命令(询问您的供应商)。
您可以查看
.cap
文件内部并查看加载到卡中的部件的大小 - 这个肯定非常不准确,因为卡操作系统可以自行决定自由处理内容。我记得JCOP工具有一些特殊的日食视图,它显示了当前小程序的各种统计数据 - 也可能提供信息。
参考实现提供了一个获取一些资源消耗统计信息的选项 - 可能也很有用(不过我从未使用过这个)。
- 有没有工具可以减小javacard小程序(.cap文件)的大小?
- 我过去使用 ProGuard 来提高小程序的性能(实际上增加了小程序的大小,因为我主要将其用于方法内联)——但它也应该可以减小小程序的大小(例如,消除死代码 - 请参阅收缩选项)。还有许多不同的优化 - 只是看一看,但不要指望奇迹。
- 你能解释一下帮助我减小小程序大小的规则吗?
我会强调好的设计和适当的代码重用,但是肯定有很多关于通用优化技术的资源 - 我不知道任何特定于Java Card的资源 - 在这里无济于事:(
如果将更多小程序加载到单个卡中,则可以将公共代码放入共享库中。
一些额外的(随机)注释:
只获得具有更大内存的卡可能更实用。
卡提供的可用内存信息可能不准确。
我想知道您的小程序大小有问题,因为通常存在瞬态内存大小 (AFAIK) 问题。
您的小程序可能只是泄漏内存,因此使用越来越多的内存。
不要为了较小的小程序大小而牺牲安全性!
祝你好运!
回答你的第三个问题
3.你能解释一下帮助我减小小程序大小的规则吗?
一些基本准则是:
保持最少的方法数量,因为您知道我们的智能卡资源非常有限,方法调用是一种开销,因此使用最少的方法调用,卡的性能将提高。避免使用 get/set 方法。还应避免递归调用,因为大多数卡中的堆栈大小约为 200 字节。
避免对虚拟方法使用 3 个以上的参数,对静态方法使用 4 个以上的参数。这样,编译器将使用数字或字节码快捷方式,从而减小代码大小。
要处理临时数据,可以使用APDU缓冲区或瞬态数组,因为在EEPROM上写入比在RAM上写入慢约1,000倍。
继承也是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;
- 将嵌套的 if-else 语句替换为等效的 switch 语句,因为 switch 执行速度更快,占用的内存更少。