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;綜合上述因素,代碼在安裝的時候,不能通過驗證,所以安裝失敗。

  我們的項目因為代碼里引入了過多的開源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

  目前2.3版本市場只有20%了,希望這個占有率快速下降吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM