構建方法數超過65K的Android應用

44lufei44 8年前發布 | 14K 次閱讀 Android開發 移動開發

來自: http://wangxinghe.me/blog/2016-02-04/android-method-over-65k/


1. 關于65535限制

通常一個APK文件中包含一個Dex文件,而一個Dex文件允許的最大方法數是65535。當APK很大,方法數很多時,可以將一個APK文件拆分為多個Dex的方式。 #### 2. 如何避免65535問題及MultiDex限制條件
(1)使用MultiDex方式

Android5.0之前的機制是Dalvik運行時(Dalvik Runtime),依賴庫multidex support library作為主Dex的一部分用于管理從Dex

Android5.0及以后的機制是ART運行時(ART Runtime),ART運行時在程序安裝階段進行預編譯,將所有Dex文件預編譯為.oat文件

MultiDex使用方法如下:

在build.gradle中進行如下配置

 android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}
...

} dependencies { compile 'com.android.support:multidex:1.0.0' }</pre> </div>

然后配置Application

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

或者extends MultiDexApplication,并在attachBaseContext() 方法中添加MultiDex.install(this)

(2)動態加載(后續研究)

限制條件:

multi support library在某些情況下可能存在問題,如:

  • 當從Dex過大時,在某些設備上安裝時會引起ANR
  • 在Android4.0之前的設備上可能無法啟動程序,必須減少方法數
  • 在Android5.0之前如果存在過大內存分配的case,根據Dalvik線性內存分配限制,會導致crash
  • 關于主Dex應包含哪些類會有復雜的需求

3. 開發小技巧

通常MultiDex都是很耗時的,因為構建系統會花較多時間來決定哪些類放在主Dex,哪些類放在從Dex。平常開發過程中,可以充分利用Android5.0的ART運行時方式進行開發,不過需要用5.0以上的設備。

ART運行時只進行如下操作:

  • 預分包階段,將每個module構建成一個Dex文件
  • 將所有Dex文件按原樣封裝到APK
  • 不需要花時間重新決定哪些放到主Dex,哪些放到從Dex這一過程,因此節約很多時間
  • </ul>

    配置過程如下,平常構建dev即可,發布時使用prod:

    android {
        productFlavors {
            // Define separate dev and prod product flavors.
            dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
            }
            prod {
                // The actual minSdkVersion for the application.
                minSdkVersion 14
            }
        }
          ...
        buildTypes {
            release {
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
            }
        }
    }
    dependencies {
      compile 'com.android.support:multidex:1.0.0'
    }    

    IDE中可以先Sync一下工程,再在Build Variant選擇特定的包進行構建:

    pic

    4. 測試

    使用MultiDexTestRunner進行測試(在Gradle1.1之前,需要添加下面的dependencies),先進行配置:

    android {
      defaultConfig {
          ...
          testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
      }
    }

    dependencies { androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') { exclude group: 'com.android.support', module: 'multidex' } }</pre> </div>

    再在MultiDexTestRunner的onCreate方法中添加如下代碼:

    public void onCreate(Bundle arguments) {
        MultiDex.install(getTargetContext());
        super.onCreate(arguments);
        ...
    }
    本文原文發自 某學姐, 轉載請保留出處, 謝謝.

     本文由用戶 44lufei44 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!