Android當代碼方法超過65536個時,在2.3機器上會不能安裝,出現INSTALL_FAILED_DEXOPT錯誤

  今天打包時,發現2.3機器,產生的APK在某些機器上不能安裝(Installation error: INSTALL_FAILED_DEXOPT),針對這個問題的一個可能解釋是:最新的ADT和SDK Tool在將jar轉化成dex的時候,可能會合並類的代碼,這將致使巨大的類;類中的每個方法都分配有一個id,字節碼中以id標識和調用方法;早期的Dalvik VM內部使用short類型變量來標識方法的id,最大值限制在65535;綜合上述因素,代碼在安裝的時候,不能經過驗證,因此安裝失敗。android

  咱們的項目由於代碼裏引入了過多的開源library,因此致使方法數過多,最後只能精簡代碼,刪除沒必要要的library來解決這個問題。
      最新的Android已經解決了這個問題,可是更早的Android版本可能仍然存在此問題。
      所以,因爲大量遺留機器的存在,這個問題是不能完全解決的,一個臨時的解決方案是:刪掉沒有實際使用的代碼,或者使用ProGuard處理代碼(能夠減少代碼體積)。
      一個不幸的推論是:隨着一個軟件功能的增長,代碼的膨脹,APK包終將超出能夠處理的範圍,也許就是8M(指APK包裏面的classes.dex).
      與此問題相關的兩個討論組是:
      
https://code.google.com/p/android/issues/detail?id=40409
      
https://groups.google.com/forum/?fromgroups=#!topic/adt-dev/tuLXN9GkVas
google

  目前2.3版本市場只有20%了,但願這個佔有率快速降低吧!spa

相關文章
相關標籤/搜索