android大項目運行中出現問題彙總

複製做備用
 原文地址 http://www.cnblogs.com/yaozhongxiao/p/3521428.html

  Android 項目中,特別是當項目文件和規模達到一定的程度後,會引發一些平常不常見的問題。 下面對遇到的一些問題做一個彙總和總結。

scenario 1:

  在項目中,我們採用了chromimum內核 和 android4.4 的java層代碼來實現自定義my_webview。

  過程中編譯生成android4.4的java的class.jar文件,並將其導入my_webview的libs中作爲第三方庫導入。

  排除錯誤連接模擬器運行,報如下錯誤  

  1. Unable to execute dex: method ID not in [0, 0xffff]: 65536;

    Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

     原因: Answer

   The Dalvik VM can have a maximum of 65536 methods per dex file, due to a memory allocation issue.

   While it is possible to fix this using multiple dex files, Facebook found another fix that they could deploy within their app to get around the    problem.

   由於在使用的過程中,我們把class.jar等第三方的jar放在了libs目錄下,同時在user library目錄下又存在第二份,重複包含很多接口,所以導致接口溢出。

   如果項目擴展中,實際使用的接口超過了限制,可以採用如下方式嘗試解決!

     參見:http://androiddev.orkitra.com/?p=32706

          http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

          http://developer.android.com/tools/help/proguard.html

 

   2. unable to execute dex:GC overhead limit exceeded

        採用android4.4 編譯的class.jar 包作爲第三方庫,把jar包通過Add Jar放到Build Path中, 在生成APK過程中,Eclipse長時間停留在100%那個進度。

      最後Eclipse報告unable to execute dex:GC overhead limit exceeded錯誤

      原因:運行中佔用的堆內存超過了jvm設置的限制。

複製代碼
   -startup
     plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
   --launcher.library
     plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
   -showsplash
     org.eclipse.platform
   --launcher.XXMaxPermSize
     256m
   -vmargs
   -Xms40m
   -Xmx256m
複製代碼

      解決辦法:修改 eclipse.ini 添加內存限制  -Xms512m;  -Xmx1024 ; --launcher.XXMaxPermSize = 512;  

  瞭解一下JVM內存管理的機制,然後再解釋每個參數代表的含義。 

    JVM主要管理兩種類型的內存:堆和非堆。按照官方的說法:“Java 虛擬機具有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啓動時創建的。在JVM中堆之外的內存稱爲非堆內存(Non-heap memory)。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給自己用的,所以,方法區、JVM內部處理或優化所需的內存(如JIT編譯後的代碼緩存)、每個類結構(如運行時常數池、字段和方法數據)以及方法和構造方法的代碼都在非堆內存中。 

     對內存分配:

         -vmargs  的意思是設置JVM參數,所以後面的其實都是JVM的參數了

         -Xms:   JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;

           -Xmx:   JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。

    默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。

    因此服務器一般設置-Xms、-Xmx相等以避免在每次GC 後調整堆的大小。 

   非堆內存分配
     -XX:PermSize: JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;

          -XX:MaxPermSize: JVM使用-XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。 
   JVM內存限制(最大值)
    首先JVM內存限制於實際的最大物理內存,假設物理內存無限大的話,JVM內存的最大值跟操作系統有很大的關係。

    簡單的說就32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,這個限制一般是2GB-3GB

   (一般來說Windows系統下爲1.5G-2G,Linux系統下爲2G-3G),而64bit以上的處理器就不會有限制了。

    JVM虛擬機設置

   參數形如 "key value"這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:\Java\jre1.6.0\bin\javaw.exe參數設置虛擬機,在eclipse.ini文件中要寫成這樣:

    -vm                                            
      C:\Java\jre1.6.0\bin\javaw.exe

    其中–launcher.XXMaxPermSize(注意最前面是兩個連接線)跟-XX:MaxPermSize參數的含義基本是一樣的,

    區別就是前者是eclipse.exe啓動的時候設置的參數,而後者是eclipse所使用的JVM中的參數。

     參考:http://blog.csdn.net/zengyangtech/article/details/7003379

  

  3.  unable to execute dex:java heap space

   經過第二部的修改後,運行還是不行,Eclipse長時間停留在100%那個進度 後報unable to execute dex:java heap space錯誤提示。

   將class.jar的Jar 添加user Library,並把 as system Library 選上,並引入工程
        建立User Library:Windows->Preference->Java->Build Path->User Library, New and Add Jars (必須 System Library)
        添加User Library 到工程:Project->Properties->Java Build Path->Libraries->Add Library->User Library
 
         

      http://www.cnblogs.com/garygou/p/3501346.html

   4.  Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

     android應用的apk過大; 或者 模擬器上運行的程序越來越多,終於報內存不足的異常,安裝apk也不行了…

     原因:默認的模擬器內存被佔用,導致存儲空間不夠

     解決:修改配置文件以擴大手機內存:
     
1、網上的方法:
      配置文件目錄:
      C:\Documents and Settings\username\.android\avd\avdname.avd
      該目錄下包含:hardware-qemu.ini;emulator-user.ini;config.ini三個配置文件
      修改hardware-qemu.ini中hw.ramSize = 128 的值;
          驗證結果,網上的這種方式在模擬器重啓之後又變成原來的128了,無效!

    2、通過命令行修改手機默認內存:
      在windows cmd下運行emulator命令
      啓動已經建立好的虛擬Android系統
      ($HOME)\emulator.exe -avd <AVD名字> -memory <RAM大小> -partition-size <ROM大小>
        ($SDK_DIR)\tools\emulator.exe -avd Android -memory 512 -partition-size 1024

    3、按照上面2的步驟,每次重啓avd內存還是變成了設置前的數據了
          解決方案:創建emulator.exe的快捷方式,
      在目標中保存 ($SDK_DIR)\tools\emulator.exe -avd Android -memory 512 -partition-size 1024
      以後每次用這個快捷方式啓動模擬器!

    4. 修改eclipse中啓動時的附加參數 -memory 512 -partition-size 1024

                Window->Preference->android->Launch   Add  "-partition-size 1024” on the “Default emulator option” field.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章