Search

◆ Welcome to Laird Studio! 歡迎蒞臨萊爾德工作室 (੭ु´ ᐜ `)੭ु

2016年4月12日 星期二

[ Eclipse ] [ Android ] 解決 Java.lang.OutOfMemoryError 錯誤訊息經驗分享


有在 Follow 我們粉絲團的朋友應該已經知道,這陣子 Laird Studio 與 Caliburn Studio 聯合企劃開發了一支名為《 Lucky X 》的 Android 抽獎 App 。

App 開發日誌的部分,會放在 Caliburn Studio 供大家「考古」...... 呃不是啦!是讓大家見證一款使用 Java 原生語言製作而成的 Android App 從無到有,甚至上架到通路商店的過程!

針對《 Lucky X 》在開發過程中碰到的一些技術問題以及解決方法,我們會發佈在 Laird Studio 網站供讀者們學習,而這篇文章正是我們分享的第三篇,並且是有關於 Java.lang.OutOfMemoryError 錯誤訊息的解決經驗,還請大家多多指教~


使用的作業系統版本為: Mac OS X El Capitan 10.11.4
使用的 IDE 版本為: Eclipse Mars.1


本文開始~



《 Lucky X 》的抽選功能中,有一項是幸運轉盤 ( Lucky Wheel ) ,而這個功能的一個位元數字抽選正是讓整支 App 出現 Java.lang.OutOfMemoryError 的主因。



Java.lang.OutOfMemoryError 錯誤訊息是出現在 Set the range ,也就是讓使用者輸入 0~9 的數值範圍後,程式會判斷顯示哪個轉盤圖片,換句話說,這個功能是依照排列組合,將 0~9 所有的數值範圍組合繪製成 45 張轉盤圖片,再利用程式碼去判斷使用者輸入的數值範圍以抓取該轉盤圖片而成的。



在我們發現這個 bug 時, App 已經更新不少次了,在這期間,我們也不斷的優化程式效能,例如切換畫面後就釋放上一個動作所使用的記憶體空間等等,但無論怎麼優化,這 bug 依舊存在,直到被我們用其他機型運行《 Lucky X 》才發現。

雖然說這個 bug 隱藏在 App 有一段時間了,但影響到的使用者人數應該還不會太多,因為我們所發現的 Java.lang.OutOfMemoryError 錯誤訊息其實只會在某些機型出現,例如上圖就是使用 HTC Desire 816 運行《 Lucky X 》的畫面。

而下圖則是使用 HTC Desire 816 設定為偵錯模式,所截取到的錯誤訊息,很明顯跟記憶體溢位有關。





我們開發《 Lucky X 》所使用的主要測試機為 Asus ZenFone C ,在開發期間完全都沒有遇過 Java.lang.OutOfMemoryError 這類關於記憶體溢位的錯誤訊息,所以程式在其他機器不能運作,剛開始真的有點納悶,因為反覆檢查專案裡面 Java Class 以及 Android xml 檔,都沒有發現異常。

最後,在網路上瀏覽到了這篇文章:

Android 踏雷日記(1)String Out Of Memory


才學習到原來各手機廠商在手機出廠的時候,會設定這支手機「執行每個 App 所佔用的記憶體空間上限」,意思就是說,當 App 需要佔用較大的記憶體空間才能夠順利執行時,如果手機被設定執行每個 App 所佔用的記憶體空間上限比 App 的需求還低, App 就會執行錯誤,因為手機系統沒有給予 App 足夠份量的記憶體空間。

雖然每支手機執行每個 App 所佔用的記憶體空間上限都不盡相同,但只要了解到這點,那我們就只需要一個小動作就能輕鬆解決這個 bug 囉!


既然手機有設定上限,自然可以透過程式的指令來放寬這個限制,解決方法就是在 AndroidManifest.xml <application> 標籤內加入以下指令:

android:largeHeap="true"




如此一來,當手機系統執行《 Lucky X 》時, App 就會告訴系統說我需要較大的記憶體空間來確保程式正確運行,系統就會放寬《 Lucky X 》可以使用的記憶體上限囉!



這邊還是順帶提一下,上述的指令雖然可以被稱為解決 Java.lang.OutOfMemoryError 的萬靈丹,但還是建議開發者顧慮到程式效能的優化問題,畢竟普遍使用者還是比較偏向輕巧便利的應用程式~

而《 Lucky X 》也會持續優化介面與程式效能,帶給使用者更好的使用體驗,有需要的朋友歡迎多多下載利用 (≧▽≦)/


Download link: https://goo.gl/1td1re

QR Code:






解決 Java.lang.OutOfMemoryError 錯誤訊息的經驗分享就到這邊~

我們下次見~