android apk包過大安裝失敗

2021-06-18 20:23:09 字數 1057 閱讀 1871

在將adt和sdk tool公升級到最新(分別是21.1和16.0.1)之後,我的乙個工程(相對比較大)在編譯並執行的時候,出現錯誤,eclipse控制台輸出如下資訊:

unable to execute dex: cannot merge new index 67208 into a non-jumbo instruction!

conversion to dalvik format failed: unable to execute dex: cannot merge new index 67208 into a non-jumbo instruction!

很多人在公升級adt和sdk tool之後,都會遇到這個問題,只是錯誤資訊中的數字不同而已。

而且,我還發現乙個現象:如果只是編譯,但不生成apk,並不會出錯;其實,從上面的錯誤資訊中也可以看出一些線索 --- 它是在將jar檔案轉換成dex檔案的時候出錯的。

網上給出的解決方案是,將dex.force.jumbo=true新增到project.properties檔案中,然後清理工程,並重新編譯。

這個方法可以解決編譯階段問題,但是產生的apk在某些機器上不能安裝(installation error: install_failed_dexopt),針對這個問題的乙個可能解釋是:

最新的adt和sdk tool在將jar轉化成dex的時候,可能會合併類的**,這將導致巨大的類;類中的每乙個方法都分配有乙個id,位元組碼中以id標識和呼叫方法;早期的dalvik vm內部使用short型別變數來標識方法的id,最大值限制在65535;綜合上述因素,**在安裝的時候,不能通過驗證,所以安裝失敗。

最新的android可能已經解決了這個問題,但是更早的android版本可能仍然存在此問題。

因此,由於大量遺留機器的存在,這個問題是不能徹底解決的,乙個臨時的解決方案是:刪掉沒有實際使用的**,或者使用proguard處理**(可以減小**體積)。

乙個不幸的推論是:隨著乙個軟體功能的增加,**的膨脹,apk包終將超出可以處理的範圍,也許就是8m(指apk包裡面的classes.dex).

與此問題相關的兩個討論組是:

Android Apk安裝簡訴

系統自帶的應用程式,無法刪除 使用者程式安裝的目錄,有刪除許可權。安裝時把apk檔案複製到此目錄 data data 存放應用程式的資料 data dalvik cache 將apk中的dex檔案安裝到dalvik cache目錄下 dex檔案是dalvik虛擬機器的可執行檔案,其大小約為原始apk...

Android APK 安裝(相容8 0)

由於android7.0開始,對許可權控制加強,apk安裝方法也有了一些變化,接下來直接進入到 講解 kotlin fun installapk path string,mcontext activity val intent intent intent.action view if build.v...

如何檢視Android apk的包名?

有以下四種方法可以檢視apk的包名,之後有別的方法,會接著更新文件的。1.安裝apk包名檢視器 2.原始碼androidmanifest.xml中檢視package包名 3.利用 adt bundle windows x86 20130917 sdk tools hierarchyviewer.ba...