前陣子把開發環境升到 Android 8.0 就是26這個版本,今天開舊的專案發現全部爛掉不能 build,命令列會吐以下 log:
Error:Android Dex: [xxx] Failed to load dx.jar
比對一下這些舊專案的特徵,都不是用 gradle 而都是用 Intellij 15 來建構,而建構的預設行為上網找是會去找最新版的 build-tools 來用(如下)。
By default, the Android SDK uses the most recent downloaded version of the Build Tools.嘗試過在 project.properties 裡頭加上 sdk.buildtools 17.0.0,嘗試要指定比較舊版本的 build tool,但完全無用,看起來 Intellij 15 沒有用到專案下(非 gradle 專案)的 ant 相關檔案,就根據專案設定的 Java SDK + Android SDK 就自己用預設值做建構了。
解決方式如下:
方法一
利用 SDK Manager 將 Android SDK Build-Tools 移除26.x.x版本,改用25.0.3。有確認過 25.0.3 和 26.0.2 的這些項目:
- build-tools/25.0.3/dx > 檔案有存在該路徑
- build-tools/26.0.2/dx > 檔案有存在該路徑,且內容與25.0.3一模一樣
- build-tools/25.0.3/lib/dx.jar > 檔案有存在該路徑
- build-tools/26.0.2/lib/dx.jar > 檔案有存在該路徑,但檔案大小與26.0.2不一樣
方法二(官方作法)
若 Android 專案是走 gradle 架構,可以在 build.gradle 裡指定要該專案要使用的 Build-Tools 版本。
另外測試過以下排列組合:
- Android SDK 17
- Java SDK 1.7 + Build-Tools 25.0.3 > Error:Android Dex: [xxx] Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
- Java SDK 1.8 + Build-Tools 25.0.3 > 沒問題
- Java SDK 1.7 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
- Java SDK 1.8 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
- Android SDK 26
- Java SDK 1.7 + Build-Tools 25.0.3 > Error:Android Dex: [xxx] Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
- Java SDK 1.8 + Build-Tools 25.0.3 > 沒問題
- Java SDK 1.7 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
- Java SDK 1.8 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar