我寫了一個在磁盤上有19 KB大小的小程序。它有三個類。第一個是從Applet擴展的,第二個是靜態函數,第三個是我從applet創建實例的類。如何減小javacard applet的大小
我有三個問題:
- 有什麼辦法來找出多少大小在我的Java卡採取的是我的applet實例?
- 是否有任何工具可以減小javacard applet(.cap文件)的大小?
- 你能解釋一些規則來幫助我減少applet的大小嗎?
我寫了一個在磁盤上有19 KB大小的小程序。它有三個類。第一個是從Applet擴展的,第二個是靜態函數,第三個是我從applet創建實例的類。如何減小javacard applet的大小
我有三個問題:
- 有什麼辦法來找出多少大小在我的Java卡採取的是我的applet實例?
(據我所知)沒有做到這一點(在全球平臺/ Java卡)沒有正式的辦法。
您可以根據applet加載前和安裝後的空閒內存差異(最有可能在個性化之後 - 因爲您可能會在個性化過程中創建一些對象)來估計真實內存使用情況。一些方法來找出可用內存信息是:
使用JCSystem.getAvailableMemory()
(見here),這也是信息的所有存儲器類型(如果實現的話)。
使用擴展卡資源信息標籤檢索與GET DATA
(見TS 102 226)(如果實現的話)。
使用專有命令(詢問供應商)。
你可以看看你的.cap
文件中,並查看加載到卡各部分的尺寸 - 這一個肯定是非常不準確的卡OS是免費的處理在內容的自行決定。
我記得JCOP工具有一些特殊的eclipse視圖,它顯示當前applet的各種統計信息 - 也可能是信息性的。
參考實現提供了一個選項來獲得一些resource consumption statistics - 也許是有用的(雖然我從來沒有使用過這個)。
- 是否有降低的Java卡小應用程序(的.cap文件)的大小的任何工具?
- 你能解釋一下幫我減輕我的小應用程序的大小規則?
我想強調良好的設計和正確的代碼複用,但也有關於通用的優化技術,肯定很多資源 - 我不知道任何Java卡特定的 - 不能在這裏幫助:(
如果您有加載到一張卡更小程序,你可以放置普通代碼共享庫。
一些額外的(隨機)注:
這可能是更實際的是拿到卡提供更大的存儲器。
由卡片給出的可用內存信息可能不準確。
我想知道您的applet大小有問題,因爲通常存在瞬態內存大小(AFAIK)問題。
您的小應用程序可能只是簡單地泄漏內存,從而使用越來越多的內存。
不要爲較小的applet大小犧牲安全性!
祝你好運!
要回答你的問題3
3,可你解釋一下,幫我減輕我的小應用程序的大小規則?
一些基本的準則是:
保存方法的最低數量,你知道我們有智能卡和方法調用的資源非常有限的開銷,從而以最小的方法調用,性能卡將增加。避免使用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;
謝謝Anmol。 –
非常感謝你,這是一個很好的答案。 –