1. 程式人生 > >解決Android中單個dex檔案中方法數越界的問題

解決Android中單個dex檔案中方法數越界的問題

通常一個Android應用中單個dex檔案所能包含的最大方法數為65536個,這包含FrameWork、依賴的第三方jar包以及應用本身程式碼中的所有方法。

一般來說一個簡單的應用裡面的方法很難達到65536這個值,但是對於一些比較大型的專案來說,65536也是比較容易達到的,一旦應用的方法數達到65536後,編譯器就無法正常完成編譯工作了並會丟擲類似這樣的異常:

UNEXPECTED TOP-LEVEL EXCEPTION:

com.android.dex.DexIndexOverflowException:method ID not in [0, 0xffff]:65536

還有一種情況是,方法數沒有達到65536,編譯也正常編譯通過了,但是在低版本的手機上安裝時卻出現了異常終止:

E/dalvikvm : Optimization failed

E/installd : dexopt failed on '/data/dalvik-cache/[email protected]@[email protected]' res=63282

...

這是因為應用在安裝時會通過一個dexopt的程式來優化dex檔案,並且在優化過程中dexopt通常會給應用一個8M或16M的快取區,但是在Android2.2和2.3中通常只有5MB,所以會出現儘管應用中的方法沒有超過65536個,但是其儲存空間可能有超過5MB,這時候就會出現這樣的問題,導致安裝失敗。

所以如何解決這樣的問題呢?

在Android5.0以前需要引入Google提供的android-support-multidex.jar,這個jar包可以在SDK目錄下的extras/android/support/multidex/library/libs下面找到。

5.0以後:(AndroidStudio)

一、修改工程目錄下的build.gradle檔案:

defaultConfig {
    applicationId "com.xxx.xxx"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
//解決方法數量超過65536個時無法編譯的問題 }
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:multidex:1.0.0'
}
二、在程式碼中新增支援multidex的功能(三種方法)

1、在manifest檔案中指定Application為MultiDexApplication,如:

<application
android:name="android.support.multidex.MultiDexApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
2、讓應用的Application繼承MultiDexApplication,如:
public class App extends MultiDexApplication {......}
3、重寫Application的attachBaseContext方法(該方法比onCreate要先執行):
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
MultiDex.install(this);
}

通過以上修改,則可以順利編譯通過了。

相關推薦

解決Android單個dex檔案方法越界的問題

通常一個Android應用中單個dex檔案所能包含的最大方法數為65536個,這包含FrameWork、依賴的第三方jar包以及應用本身程式碼中的所有方法。 一般來說一個簡單的應用裡面的方法很難達到65536這個值,但是對於一些比較大型的專案來說,65536也是比較容易達

解決安卓單個dex方法超過65535的方法

ati oid 超過 sta get ble text enabled 方法 1、百度下載 60K-methods.jar包,復制至libs文件夾中,添加到gradle中 2、在build.gradle中的defaultConfig{}下添加 multiDexEnable

解決Android單個dex檔案不能超過65536個方法問題

  當我們的專案程式碼過大時,編譯執行時會報Unable to execute dex: method ID not in[0, 0xffff]: 65536)錯誤。當出現這個錯誤時說明你本身自己的工程程式碼中含有的太多的方法,或者你的工程lib資料夾下引用的第三方外掛ja

解決應用Dex檔案方法超過了最大值65536的上限

在android studio的依賴裡面加 compile 'com.android.support:multidex:1.0.1' 再加入,用來增加java堆記憶體大小: dexOptions{ javaMaxHeapSize "4g" } 還要允許分割方法

解決Android單個dex檔案不能超過65535個方法問題

一、找坑:谷歌規定單個dex檔案中的方法不能超過65536的限制 我們編寫專案過程中在工程的lib資料夾下引用的第三方外掛jar包太多或者專案過大,編譯執行時就有可能報出com.android.dex.DexIndexOverflowException: method I

安卓開發筆記(五)——資料儲存SharedPreference以及Android常見的檔案操作方法

中山大學資料科學與計算機學院本科生實驗報告 (2018年秋季學期) 一、實驗題目 個人專案3 資料儲存(一)應用開發 二、實現內容 第九周任務 實驗目的 學習SharedPreference的基本使用。 學習Android中

Android Studio配置so檔案方法

    最近要在專案中加入百度地圖api的支援。剛開始的時候總是出現     Error inflating class com.baidu.mapapi.map.MapView這個錯誤,對照百度地圖給的demo之後發現是沒有在自己繼承的Application類裡面加入S

Androidxml佈局檔案使用include引入佈局進行復用(解決使用include佈局重疊,顏色設定無效問題)

使用include引入佈局的作用   提取重複的佈局程式碼,方便進行復用 如何使用   比如我們想要線上性佈局中建立三塊需要複用的佈局headview、centerview、butto

Android Studio建立Selector檔案方法

Selector檔案的格式是xml,通過該檔案用來改變ListView和Button控制元件的背景。在Android Studio中可以使用兩種方法來新增Selector檔案,一種是在“Android”

專案引入JS檔案方法

在單個的Vue檔案中,寫入一些體積比較大的方法,顯得很累贅,就把這些放到一個JS中,然後再引入 引入的過程中出現了一些小問題,比如我們在 src/publicMethod/tool.js中,寫入了一個方法 //宣告一個方法 function test(){ ... } //將其暴露

ssh資料庫配置檔案加密方法

 在applicationContext.xml檔案中 <bean id="propertyConfigurer" class="com.common.util.ProPertyPlaceholderConfigure">       

在python讀取TXT檔案方法

【時間】2018.11.14 【題目】(轉載)在python中讀取TXT檔案的方法 【轉載連結】https://www.cnblogs.com/youyou0/p/8921719.html 一、讀檔案  1.簡單的將檔案讀取到字串中   f = open(

script標籤引用js檔案的變數或方法

例如專案中使用app.js檔案做如下定義: //定義變數 (function($){ window.dog = {}; })(mui); //定義方法 function run(){ console.log('呼叫js檔案中的run方法'); } 接著在html

資料庫工作筆記003---在Centos匯入sql檔案方法

在資料中心部署專案時候用到了,記錄一下.... 利用mysql -u root -p進入mysql資料庫 對於檔案的匯入,在Centos下里面的是首先要新建一個和檔案相同名字的資料庫。 例如: mysql>create database Student; 然

批量向mysql資料庫匯入資料夾的excl檔案方法2)

前一篇是直接將excl檔案匯入到資料庫中,這次是現將excl檔案轉化成Dataframe格式的,然後直接匯入mysql資料庫(有現成函式哦) import numpy as np import pandas as pd import pymysql from sqlalchemy import

apiCloud讀寫檔案方法

    在apicloud中分別有api.readfile和api.writeFile兩個方法可以對檔案進行讀寫。 function Examination(){ //alert('ok');//讀取配置資訊並判斷api.readFile({path:'fs://confi

Linux設定隱藏檔案方法

本文將介紹linux系統隱藏檔案的設定方法:   首先我建立一個測試檔案   [[email protected] test]# touch test   [[email protected] test]# ls   test   然後我將t

IntelliJ IDEA怎麼檢視檔案所有方法(類似eclipse裡面的outline)

IntelliJ IDEA中實現跟eclipse一樣的outline方法,檢視檔案內所有已經宣告的方法。 mac的可以在key map 裡搜尋下這個: file structure  然後看

根據List單個物件的某方法進行去重

public static void main(String[] args){ List<TQxtjEntity> list = new ArrayList<TQxtjEntit

Android 總結:Manifest檔案,application和activity標籤屬性詳解

一、application 標籤屬性 < application /> :應用的宣告。 這個元素包含了子元素,這些子元素聲明瞭應用的元件,元素的屬性將會影響應用下的所有元件。