2013-07-08 45 views
2

我測試一個移動應用程序,並一直在努力應對當我使用Android模擬器的應用程序不斷崩潰。我在Android設備上沒有任何問題,但模擬器每天都會崩潰幾次。一旦我找到應用程序的「工作流程」中易於出現崩潰的部分,該應用程序就會一直崩潰。但究竟在應用程序觸發崩潰的位置似乎因版本而異。如何修復Android模擬器上的頻繁內存不足錯誤?

這裏是崩潰報告

Android: 2.3.7 
Model: Full Android on x86 Emulator 

java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:525) 
at our.app.util.OurAppFileManager.getBrandingImageFromSD(OurAppFileManager.java:104) 
at our.app.MainScreen.onResume(MainScreen.java:150) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
at android.app.Activity.performResume(Activity.java:3832) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668) 
at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3683) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

這裏是我的仿真器設置一個截圖:

emulator settings

我試圖改變的RAM和VM堆和內部存儲設置沒有多少運氣。事實上,如果我將RAM設置得太高,模擬器啓動器就會開始抱怨。

+0

你試過'使用主機GPU'嗎?通常,如果你使用x86,你會需要這個。但林不知道它是否適用於2.3.3(它現在可能,但最初沒有) – AJak

+0

你提到的設備也運行在2.3.7上? –

+0

AJak,我嘗試了主機GPU,但是模擬器沒有正常啓動:它看起來像是開始,然後顯示黑屏。 –

回答

4

您確實已經耗盡了堆空間,或者堆足夠分散,Android無法分配您請求的任何內容。這也會發生在生產設備上,所以把它當作模擬器問題是恕我直言的錯誤。

我會先用4.x模擬器做更多的測試。部分原因是,這會爲您提供更好的崩潰信息,包括分配失敗的程度。部分地,當使用MAT來確定你的堆在哪裏時,它會給你帶來更好的結果。

StackOverflow有關於OutOfMemoryError位圖分配的問題和答案不勝枚舉。你可能希望瀏覽一些。他們將指向您在相同的基本方向:

  • 在Android 3.0+,使用inBitmapBitmapOptions您傳遞給BitmapFactory,重新使用現有的存儲,而不是分配新的內存

  • recycle()Bitmap當你完成它們的對象時

  • 由於Android的垃圾收集器是非壓縮的,所以一般要小心你的內存分配,所以最終你將不能分配大塊內存再次

  • 使用MAT,看看你是什麼地方的內存泄漏是造成您的問題

等。

2

看看這個Developer's Guide

使用此工作流,同時從外部源解碼位圖:

private Bitmap decodeFile(File f, int reqHeight, int reqWidth){ 
    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=reqWidth && o.outHeight/scale/2>=reqHeight) 
      scale*=2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 

    return null; 
} 

的重要部分是inJustDecodeBounds