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} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
129  .class} --&gt; {@code .dex})
130  </li>
131
132  <li>新的 Jack 工具鏈:<br>
133  <b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@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>