1page.title=Java 8 語言功能 2page.keywords="android N", "Java 8", "Jack" 3@jd:body 4 5<div id="qv-wrapper"> 6 <div id="qv"> 7 <ol> 8 <li> 9 <a href="#supported-features">支援的 Java 8 語言功能與 API</a> 10 </li> 11 <li> 12 <a href="#configuration">啟用 Java 8 功能與 Jack 工具鏈</a> 13 </li> 14 </ol> 15 </div> 16</div> 17 18<p>Android N 引進對 Java 8 語言功能的支援,供您在開發目標為 Android N 的應用程式時使用。此頁面描述「Android N Preview」中支援的新語言功能、如何正確地設定您的專案以使用它們,以及您可能會遇到的所有已知問題。 19 20 21 22 23</p> 24 25<p>如果要開始使用這些功能,您必須下載並安裝 Android Studio 2.1 (預覽版) 與 Android N Preview SDK,其中包括必要的 Jack 工具鏈與適用於 Gradle 的已更新 Android 外掛程式。如果尚未安裝 Android N Preview SDK,請參閱<a href="{@docRoot}preview/setup-sdk.html">設定以針對 Android N 開發</a>。 26 27 28</p> 29 30 31 32<p class="note"> 33 <strong>注意:</strong>使用新的 Java 8 語言功能並不是開發以 Android N 平台為目標之應用程式的需求。如果不想使用 Java 8 語言功能撰寫程式碼,您可以將專案的來源與目標相容性值維持設定為 Java 7,但仍必須與 JDK 8 相容,以針對 Android N 平台建置。 34 35 36 37 38</p> 39 40<h2 id="supported-features"> 41 支援的 Java 8 語言功能與 API 42</h2> 43 44<p> 45 Android 目前不支援所有 Java 8 語言功能。然而,開發目標為「Android N Preview」的應用程式時,可以使用下列功能: 46 47 48</p> 49 50<ul> 51 <li> 52 <a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">預設與靜態介面方法</a> 53 54 </li> 55 56 <li> 57 <a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">Lambda 運算式</a> 58 59 </li> 60 61 <li> 62 <a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">可重複的註解</a> 63 64 </li> 65</ul> 66 67 68<p> 69 此外,下列 Java 8 語言功能 API 現已可用: 70</p> 71 72<ul> 73 <li>Reflection 與語言相關 API: 74 </li> 75 76 <li style="list-style: none; display: inline"> 77 <ul> 78 <li>{@code java.lang.FunctionalInterface} 79 </li> 80 81 <li>{@code java.lang.annotation.Repeatable} 82 </li> 83 84 <li>{@code java.lang.reflect.Method.isDefault()} 85 </li> 86 87 <li>與 Reflection API (與可重複的註解關聯),例如 {@code AnnotatedElement.getAnnotationsByType(Class)} 88 89 </li> 90 </ul> 91 </li> 92 <li>公用程式 API: 93 </li> 94 95 <li style="list-style: none; display: inline"> 96 <ul> 97 <li>{@code java.util.function} 98 </li> 99 </ul> 100 </li> 101</ul> 102 103<p class="note"> 104 <strong>注意:</strong>Android N 的 Lambda 運算式實作是以匿名類別為基礎。此方法可讓它們向下相容並可在舊版 Android 上執行。如果要在舊版上測試 Lambda 運算式,請務必移至您的 {@code 105 build.gradle} 檔案,並將 {@code compileSdkVersion} 與 {@code 106 targetSdkVersion} 設定為 23 或更低的層級。 107 108 109 110</p> 111 112<h2 id="configuration"> 113 啟用 Java 8 功能與 Jack 工具鏈 114</h2> 115 116<p> 117 如果要使用新的 Java 8 語言功能,您也必須使用新的 <a class="external-link" href="https://source.android.com/source/jack.html">Jack 工具鏈</a>。這個新的 Android 工具鏈可將 Java 語言原始程式碼編譯成 Android 可讀取的 Dex 位元組程式碼、具有其自己的 {@code .jack} 程式庫格式,並在單一工具之外提供最多工具鏈功能:重新封裝、縮減、混淆 (Obfuscation ) 與多 Dex (Multidex)。 118 119 120 121 122 123</p> 124 125<p>以下是用來建置 Android DEX 檔案之兩個工具鏈的比較:</p> 126<ul> 127 <li>傳統 javac 工具鏈:<br> 128 <b>javac</b> ({@code .java} --> {@code .class}) --> <b>dx</b> ({@code 129 .class} --> {@code .dex}) 130 </li> 131 132 <li>新的 Jack 工具鏈:<br> 133 <b>Jack</b> ({@code .java} --> {@code .jack} --> {@code .dex}) 134 </li> 135</ul> 136 137<h3> 138 設定 Gradle 139</h3> 140 141<p> 142 如果要為您的專案啟用 Java 8 語言功能與 Jack,請在您的模組特定 {@code build.gradle} 檔案中輸入下列內容: 143 144</p> 145 146<pre> 147android { 148 ... 149 defaultConfig { 150 ... 151 jackOptions { 152 enabled true 153 } 154 } 155 compileOptions { 156 sourceCompatibility JavaVersion.VERSION_1_8 157 targetCompatibility JavaVersion.VERSION_1_8 158 } 159} 160</pre> 161 162<h3> 163 已知問題 164</h3> 165 166<p> 167 立即執行 (在 Android Studio 2.0 (Beta) 引進) 目前無法搭配 Jack 使用,而且會將它停用並使用新的工具鏈。 168 169</p> 170 171<p>因為 Jack 在編譯應用程式時不會產生中繼類別檔案,相依於這些檔案的工具目前無法搭配 Jack 使用。這些工具的某些範例為: 172 173</p> 174 175<ul> 176 <li>在類別檔案上運作的 Lint 偵測器 177 </li> 178 179 <li>需要應用程式類別檔案 (例如 JaCoCo 與 Mockito) 的工具與程式庫 180</li> 181</ul> 182 183<p>如果在使用 Jack 時發現任何問題,請<a href="http://tools.android.com/filing-bugs">回報錯誤</a>。</p>