如何减小javacard applet的大小

时间:2017-05-09 11:29:28

标签: applet smartcard javacard globalplatform

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

我有三个问题:

  1. 有没有办法找出我的javacard中的applet实例占用了多少大小?
  2. 是否有任何工具可以减小javacard小程序(.cap文件)的大小?
  3. 您能解释一下帮助我减少applet大小的规则吗?

2 个答案:

答案 0 :(得分:6)

  
      
  1. 有没有办法找出我的javacard中的applet实例占用了多少大小?
  2.   
  • (AFAIK)没有正式的方法(在GlobalPlatform / Java Card中)。

  • 您可以根据applet加载前和安装后的可用内存差异估算实际内存使用量(最有可能在个性化后 - 因为您可能会在个性化过程中创建一些对象)。找到免费记忆信息的一些方法是:

    • 使用JCSystem.getAvailableMemory()(请参阅here),其中提供了所有内存类型的信息(如果已实施)。

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

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

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

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

  • 参考实现提供了获取一些resource consumption statistics的选项 - 也可能有用(我从未使用过这个)。

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

  • 如果您将更多applet加载到一张卡中,您可以将公共代码放入共享库中。

一些额外的(随机)笔记:

  • 获得一张内存更大的卡片可能更实际。

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

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

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

  • 不要因为applet尺寸较小而牺牲安全性!

祝你好运!

答案 1 :(得分:4)

回答你的第3个问题

  

3.您能解释一下帮助我减少applet大小的规则吗?

一些基本指南是:

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

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

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

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

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

  6. 而不是这样做:

    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执行速度更快,占用的内存更少。