Android 在Multidex下使用Instant Run

1442650559 8年前發布 | 38K 次閱讀 安卓開發 Android開發 移動開發

 

Instant Run 是Android studio 2.0新的逆天功能,在 Run 和 Debug 的時候,只有在第一次build會花費大量的時間,之后再次Run或者Debug的時候會直接把變化的代碼更新到手機,再上面生成一個新的APK直接運行,這樣就能很快的顯示出更改代碼之后的變化,加快了開發效率和調試效率,每次更改代碼50多秒的build時間還是挺浪費的。

Instant Run 要求Gradle的版本在2.0以上,minSdkVersion必須為15以上,最好的minSdkVersion是21(后面會解釋為什么是21)。隨著Android studio 2.0正式版上線,想正式的在團隊內容推行 Instant Run 功能,但是卻遇到了一個問題:

Instant Run is disabled: Instant Run does not support deploying build variants with multidex enabled, to a target with API level 20 or below.  To use Instant Run with a multidex enabled build variant, deploy to a target with API level 21 or higher.

Instant Run 在我們的項目中無法使用,這段提示的大意是開啟了 multidex 之后,SDK的最低版本要是21才能使用 Instant Run 。

為什么會有這個出現提示呢?首先說說什么是 multidex 。

Multidex

Android的Apk文件中代碼部分會編譯成 Dalvik Exexutable (DEX)文件,而每個DEX文件都是有方法數的限制的,4.0以前的是不能超過65536個方法,包括項目使用的類庫,和自己寫的代碼的方法數之后,65536又是64k,這個限制又稱為64k限制,說話在大量使用各種類庫的今天超過64K個方法數還是挺容易的,怎么解決這個問題呢?

1.減少方法數
2.使用多個DEX文件

很明顯減少方法數是一個比較困難的方式,因為使用的庫就很多了,支付寶,微信,友盟,push消息....那么只能使用多個DEX文件了。使用多個DEX的方式,需要先在gradle里配置:

android {
    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23

        multiDexEnabled true
    }
}

另外需要導入multidex的依賴在Application進行分包:

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

可以使用兩種方式讓Apk分包。

第一種,使用 MultiDexApplication :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.jjz">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

使用 MultiDexApplication 作為application即可。

第二種,如果已經有了Application文件可以在Application重寫 attachBaseContext 方法:

 @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

對于 Instant Run 很遺憾的是APK依賴的庫比較多,沒有辦法將方法數減少到64K以下,也就是無法去掉 MultiDex .在提示里面說如果使用 MultiDex 最小的SDK大于等于21(Android 5.0)以上也是可以使用,我們Android 5.0有什么不一樣呢?

ART

為什么Android 5.0會不一樣呢,因為 ART 。

Android runtime(ART)是管理runtime和系統服務的技術,ART和Dalvik能夠讀取DEX的二進程文件,ART天然地支持multiple DEX文件,ART在安裝應用的時候掃描所有的DEX文件,編譯成一個單獨的 .oat 文件提供Android設備運行。更多的內容可以看: ART

一方面想使用 Instant Run 的強大功能,另一方便又不能放棄4.0的Android設備。有沒有一種能夠兩者兼具呢?

Build Variant

不能每次調試的都去更改minSdkVersion,這樣一是不方便,另外是容易出錯,錯誤的把代碼提交到版本庫,導致不必要的錯誤出現。

有沒有一種方式能夠通過配置構建出不同的環境,答案是:gradle。

使用gradle中的 Build Variant 可以做到不用每次都更改minSdkVersion還能使用 Instant Run 。

productFlavors 是gradle中的一個功能,能夠根據不通的定義構建不通的APK,比如構建不同渠道構建不同的渠道包,一般 productFlavors 的DSL是這樣的:

android {

    productFlavors {
        flavor1 {
        }
        flavor2 {
        }
    }
}

Build Variant Build Type加上productFlavors就是Build Variant,一般的Build Type有兩種 debug 和 release 。對應的Build Variant就是:

flavor1+debug
flavor1+release
flavor2+debug
flavor2+release

利用Build Variant可以定義不同的APK,比如:可以設置不同的version,也可以設置不同的 minSdkVersion 。

下面看下如何使用 Build Variant 。

首先定義兩個 productFlavors 。

android {
    productFlavors {
        instant {
            minSdkVersion 21
        }
        app {
            minSdkVersion 17
        }
    }
}

同步完gradle之后,可以在View->Tool Windows找到 Build Variants :

可以看到對于的Build variant:

如果選擇 appDebug 運行使用的 minSdkVersion 就是17,選擇 instantDebug 運行使用的 minSdkVersion 就是21,在開發的時候使用 instantDebug 就可以使用 Instant Run 功能了,而且不會影響其他人的開發。

來自: https://segmentfault.com/a/1190000004962523

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