構建方法數超過65K的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選擇特定的包進行構建:
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);
...
}
本文原文發自 某學姐, 轉載請保留出處, 謝謝.