解決 Android N requires the IDE to be running with Java 1.8 or later

最近升級了一下IDE,升級到了AS 2.1.1,打開Layout Editor的時候遇到這個問題:

Android N requires the IDE to be running with Java 1.8 or later

AS裏面我們需要兩個JDK:Project JDK & IDE JDK

  • 前者用於編譯Java代碼
  • 後者用於啓動運行AS自己

Project JDK

  • 可以通過file-> other settings-> default project structure 裏面查看修改

  • 如果項目 compileSdkVersion >= 21, 應該設置爲Java7 or 8

  • 這個配置也可以在 local.properties 裏面設置

這裏寫圖片描述

IDE JDK

  • MAC OSX 裏面運行IDE的JDK一般系統會幫你自動選擇,而且這是基於IDE裏的Info.plist文件裏面的一條實體信息,Android Studio.app/Contents/Info.plist。

  • 這個問題的主要原因就是因爲IDE JDK太低了,但是請注意請不要修改info.plist來選擇一個不同的jdk版本。因爲這不僅僅會破壞AS的簽名,還會影響以後的補丁更新
    參考 form [1]: Please note: Do not edit Info.plist to pick a different version. That will break not only the application signature, but also future patch updates to your installation.

  • 正確的方式應該是給IDE設置 $STUDIO_JDK 環境變量:

$ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk
$ open /Applications/Android\ Studio.app

export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_92,這個命令也可以編輯到 .bash_profile 裏面,以後就只要用Terminal 執行第二個命令就可以了

  • Java 6 是AS 默認的運行使用JDK版本,但這是爲什麼呢?原因是因爲Java6有一個完整的亞像素LCD反鋸齒功能,但是Java7/8沒有 – 簡單的說,就是使用Java6,代碼文字反鋸齒顯示效果好
    Java 8:
    這裏寫圖片描述
    Java 6:
    這裏寫圖片描述

以上可以解決這個問題,但是解決了這個問題之後又出現了一個新的渲染問題:Exception raised during rendering: com/android/util/PropertiesMap
Detail:

java.lang.NoClassDefFoundError: com/android/util/PropertiesMap
    at com.android.layoutlib.bridge.android.BridgeContext.createStyleBasedTypedArray(BridgeContext.java:940)
    at com.android.layoutlib.bridge.android.BridgeContext.obtainStyledAttributes(BridgeContext.java:638)
    at android.content.res.Resources_Theme_Delegate.obtainStyledAttributes(Resources_Theme_Delegate.java:71)
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java:1436)
    at android.widget.TextView.<init>(TextView.java:761)
    at android.widget.TextView.<init>(TextView.java:704)
    at android.widget.TextView.<init>(TextView.java:700)
    at com.android.layoutlib.bridge.MockView.<init>(MockView.java:50)
    at com.android.layoutlib.bridge.MockView.<init>(MockView.java:45)
    at com.android.layoutlib.bridge.MockView.<init>(MockView.java:41)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:163)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:858)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at com.android.layoutlib.bridge.bars.CustomBar.<init>(CustomBar.java:95)
    at com.android.layoutlib.bridge.bars.StatusBar.<init>(StatusBar.java:67)
    at com.android.layoutlib.bridge.impl.Layout.createStatusBar(Layout.java:222)
    at com.android.layoutlib.bridge.impl.Layout.<init>(Layout.java:144)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:297)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:429)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
    at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:520)
    at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:508)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:967)
    at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:508)
    at com.android.tools.idea.rendering.RenderTask.access$600(RenderTask.java:75)
    at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:620)
    at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:617)
    at com.android.tools.idea.rendering.RenderService.runRenderAction(RenderService.java:371)
    at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:617)
    at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:639)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:654)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1700(AndroidLayoutPreviewToolWindowManager.java:82)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:596)
    at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:142)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:446)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:392)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:127)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:591)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:337)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:327)
    at com.intellij.util.ui.update.MergingUpdateQueue$3.run(MergingUpdateQueue.java:271)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:286)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:244)
    at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:234)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
    at com.intellij.util.Alarm$Request$1.run(Alarm.java:352)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

這個問題現在暫時還沒有解決,網上找到的方法都是說將要渲染的Preview版本調到Api23:Android API 23,N Preview 以下。

PS:這個方法甚至可以解決Android N requires the IDE to be running with Java 1.8 or later

但是肯定不是一個正確或完美的解決方案,只是逃避性的解決方案。現在我已經在StackOverflow上面再次提問了這個問題:
http://stackoverflow.com/questions/37598554/exception-raised-during-rendering-com-android-util-propertiesmap

相關參考:
[1] http://tools.android.com/tech-docs/configuration/osx-jdk

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章