Xamarin.Android MultiDex Dalvik VM 64K

在 Xamarin.Android 當中啟用 Multi-Dex 的編譯設定

James Tsai 2017/08/01 22:20:01
1332

主題

Xamarin.Android 當中啟用Multi-Dex 編譯設定

文章簡介

在開發 Xamarin.Android 的時候,如果有了解 Android OS 的基本運作概念的話,應該會知道其實 Android App Java code是仰賴運作在 Dalvik VM上,而如果你的 App 不大也不用仰賴第三方的套件,通常沒什麼太大的問題,但這是不可能的吧所以只要 App 開始變得比較複雜時,應該會遇上有名的 "Dex 64k method 的限制" 問題,那在Xamarin.Android 該怎麼處理呢?

作者

James Tsai

版本/產出日期

V1.0/2017.7.31



1. 前言


在Android 的App開發上,著名的”Dex 64k method的限制”問題經常困擾著 Android App的開發者們。當然,Xamarin.Android 開發的 Android App也同樣躲不過這個問題。但請記住,這不是 Xamarin.Android 才造成的問題,而是Android OS 先天上的設計限制造成的,請勿倒果為因。


2. 環境準備


Visual Studio 2015/2017

Visual Studio for Mac



3. 本文


前置準備


一個大而複雜的 Xamarin.Android 專案準備

這個專案的準備請自行想辦法,當在Xamarin.Android 編譯時遇到如下圖的錯誤訊息時,就可能是遇上這樣的問題了。





Xamarin.Android 專案當中啟用 Multi-Dex 編譯


如果 Xamarin.Android 專案編譯後,出現如前一節所提到的java.exe 以返回碼X結束 錯誤訊息首先,請先檢查在 Xamarin.Android的編譯設定中, Java SDK 是不是正確的使用到1.8.XXX以後的版本。

Visual Studio 當中,找到工具->選項。



在選項對話窗左邊的窗格選單當中找到 Xamarin->Android 設定。



確認 Java 開發套件的版本是否套用正確,如果不是1.8.XXX以後的版本,請到OracleJava官網上下載新版的Java SDK安裝。安裝完成後,請再回來到這個畫面,點選變更選到安裝好的新版Java SDK

如果確定Java SDK的部分沒有問題,但重新建置Xamarin.Android 專案,還是遇到相同的 java.exe 以返回碼X結束錯誤訊息那再來就該考慮是不是遇上AndroidDex 64k method限制問題了。

如果要解決這個問題,在原本的Android開發時要調整的設定還挺麻煩的,不過 Xamarin 已經幫你簡化到很簡單。有多簡單?只要打個勾就行。

Visual Studio 的方案總管當中選到 Xamarin.Android 的專案檔,再點選檢視”->”屬性頁,或是在Xamarin.Android的專案檔上的右鍵選單,選到屬性




在該屬性頁中,點選Android選項



在這個Android 選項當中,我們可以看到有個啟用Multi-Dex 的選項,在這邊就將它打勾。





這邊有件設定的動作要注意,這個設定是跟著組態調整的,所以如果是在Debug下模式設定的,到了要發布App時會切到Release模式,也還要再設定勾選一次。





設定完成後,再次回到Xamarin.Android專案重新建置編譯應該就可以順利編譯成功了。


啟用 Multi-Dex 後的編譯錯誤


如果在啟用Multi-Dex 的設定後,編譯後發現如下圖的呈現的錯誤,那就要再請檢查Android SDK所在的檔案位置了





Visual Studio 當中,找到工具->選項。




在選項對話窗左邊的窗格選單當中找到 Xamarin->Android 設定。看到Android SDK 位置,如果這個位置的路徑中間有空格的存在,請將這整個Android SDK的資料夾,搬移到沒有空格的路徑下。





Android SDK的資料夾搬移好後,再回到上述的畫面,點選變更套用新的路徑,就可以正常順利的編譯Xamarin.Android專案了。


4. 參考來源


Part 1 - Preparing an Application for Release:
https://goo.gl/9cqix6

"java.exe" exited with code 2.:
https://forums.xamarin.com/discussion/46765/java-exe-exited-with-code-2

MultiDex in Xamarin:
https://przemekraciborski.eu/2016/09/30/multidex-in-xamarin/

Multidex in Xamarin.Android:
http://www.jon-douglas.com/2016/09/05/xamarin-android-multidex/

Configure Apps with Over 64K Methods:
https://developer.android.com/studio/build/multidex.html

預防 Android Dex 64k Method Size Limit:
https://ingramchen.io/blog/2014/09/prevention-of-android-dex-64k-method-size-limit.html

James Tsai