1page.title=Android N for Developers
2meta.tags="preview", "androidn"
3page.tags="preview", "developer preview"
4page.image=images/cards/card-n-apis_2x.png
5@jd:body
6
7
8
9
10<div id="qv-wrapper">
11<div id="qv">
12  <h2>주요 개발자 기능</h2>
13  <ol>
14      <ul style="list-style-type:none;">
15        <li><a href="#multi-window_support">다중 창 지원</a></li>
16        <li><a href="#notification_enhancements">알림</a></li>
17        <li><a href="#jit_aot">JIT/AOT 컴파일</a></li>
18        <li><a href="#quick_path_to_app_install">앱 설치를 위한 빠른 경로</a></li>
19        <li><a href="#doze_on_the_go">이동 중 잠자기 모드</a></li>
20        <li><a href="#background_optimizations">백그라운드 최적화</a></li>
21        <li><a href="#data_saver">Data Saver</a></li>
22        <li><a href="#vulkan">Vulkan API</a></li>
23        <li><a href="#tile_api">Quick Settings 타일 API</a></li>
24        <li><a href="#number-blocking">번호 차단</a></li>
25        <li><a href="#call_screening">통화 스크리닝</a></li>
26        <li><a href="#multi-locale_languages">로케일 및 언어</a></li>
27        <li><a href="#emoji">새 이모티콘</a></li>
28        <li><a href="#icu4">Android의 ICU4J API</a></li>
29        <li><a href="#gles_32">OpenGL ES 3.2 API</a></li>
30        <li><a href="#android_tv_recording">Android TV 녹화</a></li>
31        <li><a href="#android_for_work">Android for Work</a></li>
32        <li><a href="#accessibility_enhancements">접근성</a></li>
33        <li><a href="#direct_boot">직접 부팅</a></li>
34        <li><a href="#key_attestation">Key Attestation</a></li>
35        <li><a href="#network_security_config">네트워크 보안 구성</a></li>
36        <li><a href="#default_trusted_ca">신뢰할 수 있는 기본 CA</a></li>
37        <li><a href="#apk_signature_v2">APK Signature Scheme v2</a></li>
38        <li><a href="#scoped_directory_access">범위가 지정된 디렉터리 액세스</a></li>
39        <li><a href="#keyboard_shortcuts_helper">Keyboard Shortcuts Helper</a></li>
40        <li><a href="#sustained_performance_api">지속적인 성능 API</a></li>
41        <li><a href="#vr">VR 지원</a></li>
42        <li><a href="#print_svc">인쇄 서비스 개선 사항</a></li>
43        <li><a href="#virtual_files">가상 파일</a></li>
44        <li><a href="#framemetrics_api">FrameMetricsListener API</a></li>
45      </ol>
46</div>
47</div>
48
49
50
51<p>Android N은 아직 한창 개발 중이지만, N Developer Preview를
52통해 지금 Android N을 일부 체험해 볼 수 있습니다. 아래 섹션에서는
53개발자를 위한 몇 가지 새로운 기능을 중점적으로 다룹니다. </p>
54
55<p>
56  플랫폼 변경 사항이 앱에 영향을 미칠 수도 있는 부분에
57대해 알아보려면 <a href="{@docRoot}preview/behavior-changes.html">동작 변경 사항</a>을 살펴보고,
58 주요 기능에 대해 자세히 알아보려면 개발자 가이드를 참조하고, 새로운 API에 대한 자세한
59내용을 보려면 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>를 다운로드하세요.
60</p>
61
62<h2 id="multi-window_support">다중 창 지원</h2>
63
64
65<p>Android N에서 저희는 요청이 많은 새로운 멀티태스킹
66기능인 다중 창 지원을 플랫폼에 도입하고 있습니다. </p>
67
68  <p>이제 사용자가 화면에서 두 개의 앱을 동시에 열 수 있습니다. </p>
69  <ul>
70  <li>Android N이 실행되는
71전화와 태블릿에서 사용자가 화면 분할 모드에서 두 개의 앱을
72나란히 또는 상하로 실행할 수 있습니다. 또한 앱 사이에 있는 분할선을 끌어서 앱의 크기를
73조정할 수 있습니다. </li>
74
75<li>Android TV 기기에서, 앱이 <a href="{@docRoot}preview/features/picture-in-picture.html">PIP(Picture-In-Picture)
76모드</a>로 배치될 수 있으므로, 사용자가 검색을 수행하거나 다른
77앱과 상호 작용하는 중에도 앱이 계속해서 콘텐츠를 표시할 수 있습니다.</li>
78  </ul>
79
80<div class="col-4of10">
81<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
82<p class="img-caption">
83  <strong>그림 1.</strong> 화면 분할 모드에서 실행되는 앱.
84</p>
85
86  </div>
87
88<p>특히 태블릿이나 다른 대형 화면 기기에서 다중 창
89지원을 통해 새로운 방식으로 사용자를 참여시킬 수 있습니다. 또한, 앱에서 드래그 앤 드롭 기능을 활성화하여
90사용자가 편리하게 앱에서나 앱으로 콘텐츠를 드래그할
91수 있으므로, 사용자 환경이 크게 개선됩니다. </p>
92
93<p>다중 창 지원을 앱에 추가하고 다중 창이 표시되는 방식을
94구성하는 것은 매우 간단합니다. 예를 들어, 액티비티의
95최소 허용 크기를 지정하면 사용자가 액티비티의 크기를 지정된 크기보다
96작게 조정하지 못합니다. 또한, 앱에 대해 다중 창 표시를 비활성화할 수도 있으며
97 이 경우 시스템은 전체 화면 모드에서만 앱을 표시합니다.</p>
98
99<p>
100  자세한 내용은 <a href="{@docRoot}preview/features/multi-window.html">다중 창 지원</a>
101 개발자 문서를 참조하세요.
102</p>
103
104<h2 id="notification_enhancements">알림 향상</h2>
105
106<p>Android N에서 저희는 알림을 더 쉽고 빠르게 사용할 수
107있도록 재설계했습니다. 몇 가지 변경 사항은 다음과 같습니다.</p>
108
109<ul>
110  <li>
111    <strong>템플릿 업데이트</strong>: 히어로 이미지와 아바타를 새롭게
112 강조하기 위해 알림 템플릿을 업데이트하는 중입니다. 개발자는 최소한의
113 코드 조정만으로 새로운 템플릿을 활용할 수 있습니다.
114  </li>
115
116  <li>
117    <strong>메시지 스타일 사용자 지정</strong>: <code>MessageStyle</code> 클래스를 사용하여
118 알림과 관련된 사용자 인터페이스 레이블을 더 많이
119사용자 지정할 수 있습니다. 메시지, 대화 제목, 콘텐츠 뷰를
120 구성할 수 있습니다.
121  </li>
122
123  <li>
124    <strong>묶음 알림</strong>: 시스템에서 메시지를 함께
125 그룹화하고(예: 메시지 주제별로 그룹화) 해당 그룹을 표시할 수 있습니다. 사용자는
126 이 그룹에 대해 해제 또는 보관과 같은 동작을 적절히 수행할 수 있습니다. Android
127 Wear용 알림을 구현한 적이 있으시다면 이미 이 모델도 친숙하게 느껴질
128 것입니다.
129  </li>
130
131  <li>
132    <strong>직접 회신</strong>: 실시간 통신 앱의 경우 Android 시스템은
133 인라인 회신을 지원하므로, 사용자가 알림 인터페이스
134 내에서 신속하게 SMS 또는 텍스트 메시지에 직접 응답할 수 있습니다.
135  </li>
136
137  <li>
138    <strong>사용자 지정 뷰</strong>: 두 개의 새로운 API를 사용하면 알림에 사용자
139 지정 뷰를 사용할 때 시스템 장식(예: 알림 헤더 및 액션)을
140 활용할 수 있습니다.
141  </li>
142</ul>
143
144<div class="col-4of12">
145  <img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
146</div>
147
148<div class="col-4of12">
149  <img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
150</div>
151
152<div class="col-4of12">
153  <img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
154</div>
155
156
157<p class="img-caption">
158  <strong>그림 2.</strong> 묶음 알림 및 직접 회신.
159</p>
160
161<p>새로운 기능을 구현하는 방법에 대해 알아보려면
162 <a href="{@docRoot}preview/features/notification-updates.html">알림</a>
163가이드를 참조하세요.</p>
164
165
166
167<h2 id="jit_aot">프로필 가이드 방식의 JIT/AOT 컴파일</h2>
168
169<p>Android N에서 저희는 코드 프로파일링이 있는
170JIT(Just in Time) 컴파일러를 ART에 추가했습니다. 이를 통해 ART에서 Android 앱이 실행되는 동안
171그 성능을 계속 향상시킬 수 있습니다. JIT 컴파일러는 ART의 현재 AOT(Ahead of Time) 컴파일러를 보완하고
172런타임 성능을 개선하고, 저장 공간을 절약하고, 앱 업데이트와
173시스템 업데이트의 시간 단축을 도와줍니다.</p>
174
175<p>프로필 가이드 방식의 컴파일을 통해 ART는 실제 사용량과 기기의
176조건에 따라 각 앱의 AOT/JIT 컴파일을 관리할 수 있습니다. 예를 들어, ART는 최상의 성능을 위해 각 앱의 핫 메서드에 대한 프로필을
177유지 관리하고 이들 메서드를 미리 컴파일하고
178캐시할 수 있습니다. 이 경우 앱의 다른 부분들은
179실제로 사용될 때까지 컴파일되지 않고 유지됩니다.</p>
180
181<p>프로필 가이드 방식의
182컴파일은 앱의 주요 부분들의 성능을 높여줄 뿐만 아니라,
183관련 바이너리를 비롯한 앱의 전체 RAM 공간을 줄이는 데 도움이 됩니다. 이 기능은 저용량 메모리 기기에 특히 중요합니다.</p>
184
185<p>ART는 기기 배터리에 미치는 영향이 최소화되는 방식으로
186프로필 가이드 방식의 컴파일을 관리합니다. ART는 기기가 유휴 상태이고 충전 중일 때만 사전 컴파일을 수행하며,
187해당 작업을 미리 수행함으로써 시간과 배터리를 절약합니다.</p>
188
189<h2 id="quick_path_to_app_install">앱 설치를 위한 빠른 경로</h2>
190
191<p>ART의 JIT 컴파일러가 가진 가장 눈에 띄는 이점 중 하나는
192앱 설치 및 시스템 업데이트 속도가 빠르다는 것입니다. Android 6.0에서 최적화하고 설치하는 데
193몇 분이 걸리는 대용량 앱조차도 이제는 단 몇 초 만에 설치할 수
194있습니다. 또한, 더 이상 최적화 단계가 없으므로 시스템 업데이트도 더 빠르게 이루어집니다. </p>
195
196<h2 id="doze_on_the_go">이동 중 잠자기 모드...</h2>
197
198<p>Android 6.0에서는 기기가 테이블 위에 올려져 있거나 서랍 안에
199들어 있는 등의 유휴 상태일 때 앱이 CPU와 네트워크를 사용하는 작업을 지연시킴으로써 배터리를
200절약하는 시스템 모드인 잠자기 모드를 도입했습니다. </p>
201
202<p>이제 Android N에서 잠자기 모드는 한걸음 더 나아가서 이동 중에도
203배터리를 절약합니다. 화면이 일정 시간 동안 꺼져 있고 기기의 플러그가
204뽑혀 있으면 잠자기 모드는 친숙한 일부 CPU 및 네트워크 제한을 앱에 적용합니다.
205즉, 사용자가 기기를 주머니에 휴대하고 다닐 때도 배터리를
206절약할 수 있습니다.</p>
207
208
209<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
210<p class="img-caption">
211  <strong>그림 3.</strong> 이제 잠자기 모드는 기기가 정지 상태가 아니더라도
212배터리 수명을 개선할 수 있도록 제한을 적용합니다.
213</p>
214
215
216<p>기기의 배터리가 켜져 있는 동안 화면이 꺼지면 잠시 후에
217잠자기 모드는 네트워크 액세스를 제한하고 작업과 동기화를 지연시킵니다. 잠시 동안의 유지 관리 기간 중에
218애플리케이션의 네트워크 액세스가 허용되고
219지연된 작업/동기화가 실행됩니다. 화면을 켜거나 기기의 플러그를 꽂으면 기기가 잠자기 모드 상태에서
220벗어납니다.</p>
221
222<p>기기가 다시 일정 시간 동안 배터리로 켜져 있고 화면이 꺼진
223정지 상태가 되면, 잠자기 모드는 {@link
224android.os.PowerManager.WakeLock}, {@link android.app.AlarmManager} 알람 및
225GPS/Wi-Fi 스캔에 대해 전체 CPU 및 네트워크 제한을 적용합니다.</p>
226
227<p>앱을 잠자기 모드에 맞게 적용하는 최선의 방법은 기기가 움직이든
228움직이지 않든 동일합니다. 따라서 잠자기 모드를 효율적으로 처리하도록
229앱을 이미 업데이트했다면 모든 준비가 완료된 것입니다. 아직 업데이트하지 않았다면 지금 <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">앱을 잠자기 모드에 맞춰
230조정</a>해 보세요.</p>
231
232<h2 id="background_optimizations">Project Svelte: 백그라운드 최적화</h2>
233
234<p>Project Svelte는 에코시스템에 속한 전체 Android 기기에서 시스템 및 앱에
235의해 사용되는 RAM 크기를 최소화하기 위한 지속적인 노력입니다. Android N에서 Project
236Svelte는 앱이 백그라운드에서 실행되는 방식을 최적화하는 데 초점을 맞추고 있습니다. </p>
237
238<p>백그라운드 처리는 대부분의 앱에서 필수적인 부분입니다. 백그라운드 처리가 올바로
239수행된다면 즉각적이고 빠르고 상황에 맞는 멋진 사용자 환경을 만들 수 있지만, 백그라운드
240처리가 올바로 수행되지 않는다면 RAM과 배터리를 불필요하게 소모하고
241다른 앱의 시스템 성능에 영향을 미칠 것입니다. </p>
242
243<p>Android 5.0 이후로,
244사용자가 선호하는 백그라운드 작업
245수행 방식은 {@link android.app.job.JobScheduler}였습니다. 앱은 메모리, 전원 및 연결 상태에 따라 시스템을 최적화하면서도
246작업을 예약할 수 있습니다. JobScheduler는 제어 기능과 간편성을 함께
247제공하므로, 저희는 모든 앱에서 이것을 사용하기 원합니다. </p>
248
249<p>
250  또 한 가지 좋은 옵션은 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
251<code>GCMNetworkManager</code></a>입니다. 이는 Google Play
252 서비스의 일부분으로, 레거시 Android 버전에서 호환성이
253 있는 유사한 작업 예약을 제공합니다.
254</p>
255
256<p>Google에서는 더 많은 사용 사례를 충족시키기 위해 <code>JobScheduler</code> 및
257<code>GCMNetworkManager</code>를 계속
258확장하고 있습니다. 예를 들어, 이제 Android N에서는 콘텐츠 공급자의 변화에 따라
259 백그라운드 작업을 예약할 수 있습니다. 이와 동시에, Google에서는 특히
260저용량 메모리 기기에서 시스템 성능을 저하시킬 수
261있는 일부 오래된 패턴들을 없애기 시작했습니다.</p>
262
263<p>Android N에서 저희는 자주 사용되는 세 가지 암시적 브로드캐스트인
264 {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
265 android.hardware.Camera#ACTION_NEW_PICTURE} 및 {@link
266 android.hardware.Camera#ACTION_NEW_VIDEO}를
267제거하는 중입니다. 왜냐하면 이것들은 여러 앱의 백그라운드 프로세스를 동시에 깨워서 메모리와 배터리를 과도하게 소모시킬 수 있기 때문입니다. 앱이
268이러한 브로드캐스트를 수신한다면, N Developer Preview를
269  활용하여 <code>JobScheduler</code> 및 관련 API로 마이그레이션하세요. </p>
270
271<p>
272  자세한 내용은 <a href="{@docRoot}preview/features/background-optimization.html">백그라운드
273 최적화</a> 문서를 참조하세요.
274</p>
275
276
277<h2 id="data_saver">Data Saver</h2>
278
279<div class="col-5of12" style="margin-right:1.5em;">
280<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
281
282<p class="img-caption" style="padding-right:2em;">
283  <strong>그림 4.</strong> Settings의 Data Saver.
284</p>
285  </div>
286
287<p>모바일 기기의 수명 전체에 걸쳐, 모바일 데이터 요금제에 따른 비용이
288기기 자체의 가격보다 일반적으로 많이 듭니다. 많은 사용자들에게 모바일 데이터는
289아껴 써야 하는 값비싼 자원입니다. </p>
290
291<p>Android N에서는 새로운 시스템 서비스인 Data Saver
292모드를 도입하며, Data Saver는 로밍 시나 결제 주기가 끝날 무렵
293또는 소액 선불 데이터 팩 사용 시에 앱에 의해 사용되는 모바일 데이터 사용량을 줄여줍니다. Data Saver를 통해 사용자는 앱이
294모바일 데이터를 사용하는 방식을 제어할 수 있으며, Data Saver가 켜져 있을 때 개발자가 더 효율적인 서비스를
295제공할 수 있습니다. </p>
296
297<p>사용자가 <strong>Settings</strong>에서 Data Saver를 활성화하고
298해당 기기가 데이터 통신 네트워크에 있는 경우, 시스템은 백그라운드
299데이터 사용을 차단하고, 가능하면 스트리밍의
300비트 전송률을 제한하거나 화질을 줄이거나 낙관적 사전 캐싱을
301지연시키는 등의 방식으로 포그라운드에서 데이터를 더 적게 사용하도록 앱에게 신호를 보냅니다. 사용자는 Data Saver가 켜진 경우에도 백그라운드 데이터 통신 연결을 허용하기 위해
302특정 앱을 허용 목록에 추가할 수 있습니다.</p>
303
304<p>Android N은 {@link android.net.ConnectivityManager}를 확장하여 <a href="{@docRoot}preview/features/data-saver.html#status">사용자의
305Data Saver 기본 설정을 검색</a>하고 <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">기본
306설정 변경을 모니터링</a>하는 방법을
307앱에 제공합니다. 모든 앱은 사용자가 Data Saver를 활성화했는지 여부를 확인해야 하며
308포그라운드 및 백그라운드 데이터 사용을 제한하도록 노력해야 합니다.</p>
309
310
311<h2 id="vulkan">Vulkan API</h2>
312
313<p>
314  Android N은 새로운 3D 렌더링 API인 <a href="http://www.khronos.org/vulkan" class="external-link">Vulkan™</a>을 플랫폼에 통합합니다.
315<a href="https://www.khronos.org/opengles/" class="external-link">OpenGL™
316 ES</a>와 마찬가지로, Vulkan은 Khronos Group에 의해 관리되는 3D 그래픽 및 렌더링을 위한
317 공개 표준입니다.
318</p>
319
320<p>
321  Vulkan은 처음부터 드라이버에서 CPU 오버헤드를 최소화하도록 설계되었고,
322 애플리케이션이 GPU 작업을 더욱 직접적으로 제어할 수 있게 해줍니다. 또한, Vulkan은
323 멀티스레드가 명령 버퍼 생성과 같은 작업을
324한 번에 수행하도록 허용하여 병렬 처리 성능을 높입니다.
325</p>
326
327<p>
328  Vulkan 개발 도구와 라이브러리가 Android NDK에 배포되며, 그 포함 내역은
329 다음과 같습니다.
330</p>
331
332<ul>
333  <li>헤더
334  </li>
335
336  <li>유효성 검사 계층(디버그 라이브러리)
337  </li>
338
339  <li>SPIR-V 셰이더 컴파일러
340  </li>
341
342  <li>SPIR-V 런타임 셰이더 컴파일 라이브러리
343  </li>
344</ul>
345
346<p>
347  Vulkan은 Nexus 5X, Nexus 6P 및 Nexus Player와 같은 Vulkan 지원 하드웨어가 있는 기기의
348 앱에만 사용될 수 있습니다. Google은
349 최대한 조속히 Vulkan을 더 많은 기기에 도입하기 위해 파트너들과 긴밀히 협력하고 있습니다.
350</p>
351
352<p>
353  자세한 내용은 <a href="{@docRoot}ndk/guides/graphics/index.html">API 문서</a>를 참조하세요.
354</p>
355
356<h2 id="tile_api">Quick Settings 타일 API</h2>
357
358
359<div style="float:right;max-width:320px">
360<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
361
362<p class="img-caption" style="padding-left:2em;">
363  <strong>그림 5.</strong> 알림 창의 Quick Settings 타일.
364</p>
365
366
367  </div><p>Quick Settings는 키 설정 및 작업을 알림 창에서 직접 노출시키기
368위해 널리 사용되는 간단한 방법입니다. 더욱 유용하고 편리한 설정을
369위해 저희가 Android N에서 Quick Settings의 범위를 더욱 확장했습니다. </p>
370
371<p>Google에서는 Quick Settings 타일에 필요한 공간을 더 추가했으며,
372사용자는 페이지가 지정된 디스플레이 영역에서 왼쪽이나 오른쪽으로 스와이프하여 이들 타일에 액세스할 수 있습니다. 또한, 사용자가 Quick Settings 타일의
373모습과 표시 위치를 제어할 수 있도록 했습니다. 따라서 사용자는 끌어서 놓는 간단한 방법으로
374타일을 추가하거나 이동시킬 수 있습니다. </p>
375
376<p>또한, Android N은 개발자를 위해 새로운 API도 추가했으며
377 이를 통해 자신만의 Quick Settings 타일을 정의할 수 있으며, 사용자가 앱에서 키 컨트롤 및 작업에 쉽게 액세스할 수 있습니다.</p>
378
379<p>
380  빠른 설정 타일은 긴급하게 필요하거나 자주 사용되는 컨트롤 또는
381작업을 위해 예약되어 있으며, 앱을 시작하기 위한 바로가기로
382사용되어서는 안 됩니다.
383</p>
384
385<p>
386  타일을 정의한 후에는 이 타일을 사용자에게 표시할 수 있으며, 사용자가
387 드래그 앤 드롭하는 것만으로 이 타일을 Quick Settings에 추가할 수 있습니다.
388</p>
389
390<p>
391  앱 타일 만들기에 대한 자세한 내용은
392다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에서 <code>android.service.quicksettings.Tile</code>에 대한 문서를 참조하세요.
393</p>
394
395
396
397<h2 id="number-blocking">번호 차단</h2>
398
399<p>이제 Android N에서는 플랫폼에서 번호 차단을 지원하며,
400서비스 공급자가 차단된 번호 목록을 유지 관리할 수 있도록 프레임워크 API를 제공합니다. 기본
401SMS 앱, 기본 전화 앱 및 이동통신사 앱은
402차단된 번호 목록에서 읽기와 쓰기가 가능합니다. 다른 앱은 이 목록에 액세스할 수 없습니다.</p>
403
404<p>Android에서는 번호 차단을 플랫폼의 표준 기능으로 만들어,
405광범위한 기기에서 번호를 차단하기 위한 일관된 방식을 앱에
406제공합니다. 앱에서 활용할 수 있는 기타 이점은 다음과 같습니다.</p>
407
408<ul>
409  <li> 통화에서 차단된 번호가 텍스트에서도 차단됩니다.
410  <li> 차단된 번호는 재설정 시에도 백업 및 복원 기능을 통해
411기기에서 유지될 수 있습니다.
412  <li> 여러 앱이 동일한 차단된 번호 목록을 사용할 수 있습니다.
413</ul>
414
415<p>또한 Android를 통한 이동통신사 앱 통합은 이동통신사들이 기기의
416차단된 번호 목록을 읽고 서비스측 차단을 수행할 수 있음을 의미하며,
417이를 통해 사용자들은 원치 않는 통화와 문자가
418특정 매체(예: VOIP 엔드포인트 또는 착신 전화)를 통해 자신들에게 도달하는 것을 차단할 수 있습니다.</p>
419
420<p>
421  자세한 내용은
422 다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
423 참조</a>에서 <code>android.provider.BlockedNumberContract</code>를 참조하세요.
424</p>
425
426<h2 id="call_screening">통화 스크리닝</h2>
427
428<p>
429  Android N에서는 기본 전화 앱이 수신 통화를 스크리닝하도록 허용합니다. 이를 위해
430전화 앱에는 새로운 <code>CallScreeningService</code>가 구현되며, 이를 통해 전화 앱은
431수신 통화의 {@link android.telecom.Call.Details Call.Details}에 따라
432다음과 같은 다양한 작업을 수행할 수 있습니다.
433</p>
434
435<ul>
436  <li> 수신 통화 거절
437  <li> 통화를 통화 기록에 허용하지 않음
438  <li> 통화 알림을 사용자에게 표시하지 않음
439</ul>
440
441<p>
442  자세한 내용은
443 다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
444 참조</a>에서 <code>android.telecom.CallScreeningService</code>를 참조하세요.
445</p>
446
447
448<h2 id="multi-locale_languages">다중 로케일 지원, 더 많은 언어 지원 추가</h2>
449
450
451<p>두 가지 언어로 된 사용 사례를 지원하기 위해 이제
452Android N에서는 사용자가 Settings에서 <strong>다중 로케일</strong>을 선택할 수 있습니다. 앱은 새로운
453API를 사용하여 사용자의 로케일을 가져온
454다음, 검색 결과를 여러 언어로 표시하거나 사용자가 이미 알고 있는
455언어로는 웹 페이지를 번역하지 않는 등의 더욱 정교한 사용자 환경을
456다중 로케일 사용자들에게 제공합니다.</p>
457
458<p>다중 로케일 지원과 함께 Android N에서는 또한 사용자가
459사용할 수 있는 언어의 범위도 더욱 넓혔습니다. 영어, 스페인어, 프랑스어,
460아랍어 등의 자주 사용되는 언어에 대해 각각 25가지 이상의 변형을 제공하며, 100가지 이상의 새로운 언어에 대한 부분적인
461지원도 추가합니다.</p>
462
463<p>앱은
464<code>LocaleList.GetDefault()</code>를 호출하여 사용자가 설정한 로케일 목록을 가져올 수 있습니다.  더 많은 수의 로케일을 지원하기 위해 Android N에서는 리소스 확인 방식을
465바꾸는 중에 있습니다. 새로운 리소스 확인 논리에서
466앱이 예상대로 작동하는지 테스트하고 확인해야 합니다.</p>
467
468<p>새로운 리소스 확인 동작과 따라야 하는 모범 사례에 대해
469알아보려면, <a href="{@docRoot}preview/features/multilingual-support.html">다국어 지원</a>을 참조하세요.</p>
470
471
472<h2 id="emoji">새 이모티콘</h2>
473
474<p>
475  Android N에서는 피부 색조 그림 이모티콘과 변형 선택기 지원을
476 비롯한 추가적인 그림 이모티콘과 그림 이모티콘 관련
477 기능을 도입했습니다. 앱에서 그림 이모티콘을 지원하는 경우
478 아래 지침에 따라 이러한 그림 이모티콘에 관련된 기능을 잘 활용해 보세요.
479</p>
480
481<ul>
482  <li>
483    <strong>그림 이모티콘을 삽입하기 전에 기기에 해당 그림 이모티콘이 들어 있는지 확인하세요.</strong>
484    시스템 글꼴에 어떤 이모티콘이 있는지
485 확인하려면 {@link android.graphics.Paint#hasGlyph(String)} 메서드를 사용하세요.
486  </li>
487  <li>
488    <strong>그림 이모티콘이 변형 선택기를 지원하는지 확인하세요.</strong>
489    변형 선택기를 사용하면 특정 이모티콘을 컬러나
490 흑백으로 표현할 수 있습니다.
491    모바일 기기에서는 앱이 흑백보다는 컬러로 이모티콘을 표시해야 합니다. 하지만
492 앱이 텍스트와 함께 이모티콘을 표시하는 경우에는 흑백 변형을 사용해야 합니다.
493    그림 이모티콘에 변형 이모티콘이 있는지 확인하려면 변형 선택기를 사용하세요.
494    변형이 있는 캐릭터의 전체 목록은
495<a class="external-link" href="http://www.unicode.org/Public/9.0.0/ucd/StandardizedVariants-9.0.0d1.txt">변형에
496대한 유니코드 설명서</a>의 <em>그림 이모티콘 변형 시퀀스</em> 섹션을
497검토하세요.
498  </li>
499  <li>
500    <strong>그림 이모티콘이 피부 색조를 지원하는지 확인하세요.</strong> Android N 사용자는 이모티콘의 렌더링된 피부 색조를
501 자신의 기본 설정에 맞게 수정할 수 있습니다. 키보드 앱은 여러 가지 피부 색조가 있는
502이모티콘에 대한 시각적 표시를 제공해야 하며, 사용자가 선호하는 피부 색조를 선택하도록
503허용해야 합니다. 어떤 시스템 이모티콘에 피부 색조
504한정자가 있는지 확인하려면 {@link android.graphics.Paint#hasGlyph(String)}
505메서드를 사용하세요.
506<a class="external-link" href="http://unicode.org/emoji/charts/full-emoji-list.html">
507유니코드 설명서</a>를 읽어보면 어떤 이모티콘에서 피부 색조가 사용되는지 확인할 수 있습니다.
508  </li>
509</ul>
510
511
512<h2 id="icu4">Android의 ICU4J API</h2>
513
514<p>
515  이제 Android N에서는 <code>android.icu</code> 패키지 아래의 Android 프레임워크에 있는 <a href="http://site.icu-project.org/">ICU4J</a> API의 하위 세트를
516 제공합니다. 마이그레이션이
517 용이하며, 대개는 <code>com.java.icu</code> 네임스페이스를
518 <code>android.icu</code>로 변경하는 것이 간단합니다. 앱에서 ICU4J 번들을
519 이미 사용 중이신 경우, Android 프레임워크에서 제공되는 <code>android.icu</code>
520 API로 전환하면 APK 크기를 상당히 줄일 수 있습니다.
521</p>
522
523<p>
524  Android ICU4J API에 대해 자세히 알아보려면 <a href="{@docRoot}preview/features/icu4j-framework.html">ICU4J 지원</a>을 참조하세요.
525</p>
526
527
528
529<h2 id="gles_32">OpenGL&trade; ES 3.2 API</h2>
530
531<p>Android N에서는 다음을 비롯하여 OpenGL ES 3.2용 프레임워크 인터페이스와 플랫폼 지원을 추가합니다.</p>
532
533<ul>
534  <li> <code>EXT_texture_sRGB_decode</code>를 제외한 <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">
535Android 확장 프로그램 팩</a></a>(AEP)의 모든 확장 프로그램.
536  <li> HDR 및 지연 셰이딩을 위한 부동 소수점 프레임 버퍼.
537  <li> 일괄처리 및 스트리밍 성능을 향상시키는 BaseVertex 그리기 호출.
538  <li> WebGL 오버헤드를 줄여주는 강력한 버퍼 액세스 제어.
539</ul>
540
541<p>Android N에 있는 OpenGL ES 3.2용 프레임워크 API에는
542<code>GLES32</code> 클래스가 제공됩니다. OpenGL ES 3.2를 사용 중인
543경우 반드시 <code>&lt;uses-feature&gt;</code> 태그와 <code>android:glEsVersion</code>
544속성을 사용하여 매니페스트 파일에서 요구 사항을 선언하세요. </p>
545
546<p>기기의 지원되는 OpenGL ES 버전을 런타임에 확인하는
547방법을 비롯하여, OpenGL ES 사용에 대한 자세한 내용은 <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API 가이드</a>를 참조하세요.</p>
548
549
550<h2 id="android_tv_recording">Android TV 녹화</h2>
551
552<p>Android N에서는 새로운 녹화 API를 통해 Android TV 입력
553서비스로부터 콘텐츠를 녹화하고 재생하는 기능을 추가합니다.  기존의 타임 시프트 API를 기반으로 구축된 TV 입력
554서비스는 녹화 가능한 채널 데이터와 녹화된 세션의 저장 방식을 제어할 수 있으며,
555녹화된 콘텐츠와의 사용자 상호 작용을 관리할 수 있습니다. </p>
556
557<p>자세한 내용은 <a href="{@docRoot}preview/features/tv-recording-api.html">Android TV Recording API</a>를 참조하세요.</p>
558
559
560<h2 id="android_for_work">Android for Work</h2>
561
562<p>Android for Work에서는 Android N이 실행되는 기기를
563위해 여러 가지 새로운 기능과 API를 추가합니다. 몇 가지 특징이 아래에 나와 있으며, 변경 사항의 전체 목록은
564<a href="{@docRoot}preview/features/afw.html">Android for Work 업데이트</a>를 참조하세요.</p>
565
566<h3 id="work_profile_security_challenge">작업 프로필 보안 인증 질문 </h3>
567
568<p>
569  N SDK를
570대상으로 하는 프로필 소유자는 작업 프로필에서 작동하는 앱에 대해
571별개의 보안 인증 질문을 지정할 수 있습니다. 사용자가 업무용 앱을 열려고 시도할 때 작업 프로필 보안 인증 질문이
572표시됩니다. 보안 인증 질문에 올바로 답하면 작업 프로필의 잠금이 해제되고 필요하다면
573작업 프로필의 암호가 해독됩니다. 프로필 소유자의 경우,
574<code>ACTION_SET_NEW_PASSWORD</code>는
575작업 프로필 보안 인증 질문을 설정하라는 메시지를 사용자에게 표시하고, <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code>는 기기
576잠금을 설정하라는 메시지를 사용자에게 표시합니다.
577</p>
578
579<p>
580  프로필 소유자는 <code>setPasswordQuality()</code>, <code>setPasswordMinimumLength()</code> 및 관련 메서드를 사용하여
581작업 프로필 보안 인증 질문에 대해
582별개의 비밀번호 정책을 설정할 수
583있습니다(예: PIN의 길이는 얼마로 해야 할지 또는 프로필을 잠금 해제하기 위해 지문을 사용할 수 있는지 여부). 프로필 소유자는
584새 <code>getParentProfileInstance()</code> 메서드에 의해 반환되는 <code>DevicePolicyManager</code>
585인스턴스를 사용하여 기기 잠금을 설정할 수도 있습니다.
586  그 밖에도, 프로필 소유자는
587새 <code>setOrganizationColor()</code> 및 <code>setOrganizationName()</code> 메서드를 사용하여 작업 프로필 보안 인증 질문에 대한 자격 증명 화면을
588사용자 지정할 수 있습니다.
589</p>
590<h3 id="turn_off_work">작업 해제 </h3>
591
592<p>작업 프로필이 있는 기기에서는 사용자가 작업 모드를 설정하거나 해제할 수 있습니다. 작업 모드가
593해제되면 관리된 사용자가 일시적으로 종료되며, 이 경우 작업 프로필
594앱, 백그라운드 동기화 및 알림이 비활성화됩니다. 여기에는 프로필 소유자 애플리케이션이
595포함됩니다. 작업 모드가 해제되면 사용자가 업무용 앱을 실행할 수 없음을
596미리 알려주기 위한 영구적인 상태 아이콘이 표시됩니다. 런처는
597업무용 앱과 위젯에 액세스할 수 없음을 나타냅니다. </p>
598
599<h3 id="always_on_vpn">상시 접속 VPN </h3>
600
601<p>기기 소유자 및 프로필 소유자는 항상 지정된 VPN을 통해 업무용 앱을
602연결하도록 보장할 수 있습니다. 시스템은 기기가 부팅된
603후에 해당 VPN을 자동으로 시작합니다.</p>
604
605<p>
606  새로운 <code>DevicePolicyManager</code> 메서드는
607 <code>setAlwaysOnVpnPackage()</code> 및
608 <code>getAlwaysOnVpnPackage()</code>입니다.
609</p>
610
611<p>앱 상호 작용 없이 시스템에 의해
612VPN 서비스가 직접 바인딩될 수 있으므로, VPN 클라이언트는 상시 접속 VPN에 대해 새로운 진입점을 처리해야 합니다. 이전과
613마찬가지로, 서비스는 <code>android.net.VpnService</code> 액션과 일치하는 인텐트 필터에
614의해 시스템에 표시됩니다. </p>
615
616<p>
617  또한, <strong>Settings&gt;More&gt;Vpn</strong>을 사용하여 사용자는 기본 사용자에서
618 <code>VPNService</code> 메서드를
619 구현하는 상시 접속 VPN 클라이언트를 수동으로 설정할 수도 있습니다.
620</p>
621
622<h3 id="custom_provisioning">사용자 지정 프로비저닝</h3>
623
624<p>
625  애플리케이션은 기업 색상과 로고로 프로필 소유자 및 기기 소유자 프로비저닝
626 흐름을 사용자 지정할 수 있습니다.
627<code>DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR</code>가 흐름 색상을
628사용자 지정하고, <code>DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI</code>가
629기업 로고로 흐름을 사용자 지정합니다.
630</p>
631
632<h2 id="accessibility_enhancements">접근성 향상</h2>
633
634<p>이제 Android N에서는 새로운 기기 설치 시 Welcome 화면에서
635Vision Settings를 바로 제공합니다. 이렇게 하면 사용자가 자신의
636기기에서 확대 제스처, 글꼴 크기,
637디스플레이 크기 및 TalkBack 등과 같은 접근성 기능을 휠씬 더 쉽게 검색하고 구성할 수 있습니다. </p>
638
639<p>이렇게 눈에 띄는 위치에 접근성 기능을 배치하면, 사용자가 이
640기능을 활성화하여 앱을 사용할 가능성이 더욱 커집니다. 이들 설정을 활성화하여 조기에 앱을
641테스트해야 합니다. Settings &gt;
642Accessibility에서 설정을 활성화할 수 있습니다.</p>
643
644<p>Android N에서도 마찬가지로, 운동 장애가 있는 사용자가
645이제 접근성 서비스를 통해 화면을 터치할 수 있습니다. 이 새로운 API를 사용하면 얼굴 추적, 시각 추적,
646지점 스캐닝 등의 기능으로 서비스를 구축하여 해당 사용자의
647요구를 충족시킬 수 있습니다.</p>
648
649<p>자세한 내용은
650 다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에서 <code>android.accessibilityservice.GestureDescription</code>을 참조하세요.</p>
651
652
653<h2 id="direct_boot">직접 부팅</h2>
654
655<p>직접 부팅은 기기 시동 시간을 개선해주며, 예상치 못한 재부팅
656후에도 등록된 앱이 제한된 기능을 유지하도록 해줍니다. 예를 들어,
657사용자가 취침하는 중에 암호화된 기기가 재부팅되는 경우,
658이제는 등록되어 있는 알람, 메시지 및 수신 통화로 사용자에게 알려줄
659수 있습니다. 즉, 재시작 직후에도 접근성 서비스를
660 바로 사용할 수 있습니다.</p>
661
662<p>직접 부팅은 Android N의 파일 기반 암호화를 활용하여 시스템
663및 앱 데이터에 대해 정밀한 암호화 정책을 활성화합니다. 이 시스템은
664선택된 시스템 데이터와 명시적으로 등록된 앱
665데이터에 대해 기기 암호화 저장소를 사용합니다. 기본적으로, 다른 모든
666 시스템 데이터, 사용자 데이터, 앱 및 앱 데이터에 대해 자격 증명 암호화 저장소가 사용됩니다. </p>
667
668<p>부팅 시에 시스템은 제한된 모드에서 시작되며, 기기 암호화
669데이터에만 액세스할 수 있고 앱 또는 데이터에는 액세스하지
670못합니다. 이 모드에서 구성 요소를 실행하려는 경우,
671매니페스트에 플래그를 설정하여 구성 요소를 등록할 수 있습니다. 재시작 후에 시스템은 <code>LOCKED_BOOT_COMPLETED</code>
672인텐트를 브로드캐스트하여
673등록된 구성 요소를 활성화합니다. 잠금을 해제하기 전에, 시스템은 등록된 기기
674암호화 앱 데이터를 사용할 수 있는지 확인합니다. 사용자가 잠금 화면 자격 증명을 확인하여
675 암호를 풀기 전까지는 다른 모든 데이터를 사용할 수 없습니다. </p>
676
677자세한 내용은 <a href="{@docRoot}preview/features/direct-boot.html">직접 부팅</a>을 참조하세요.</p>
678</p>
679
680
681<h2 id="key_attestation">Key Attestation</h2>
682
683<p>하드웨어 기반 키 저장소는 Android 기기에서 암호화 키를
684만들고 저장하고 사용하기 위한 훨씬 더 안전한 방법입니다. 이
685키 저장소는 Linux 커널, 잠재적 Android 취약점, 루팅된 기기의
686공격으로부터 키를 보호해 줍니다.</p>
687
688<p>하드웨어 기반 키 저장소를 더욱 쉽고 안전하게 사용하도록
689Android N에서는 Key Attestation을 도입했습니다. Key Attestation을 사용하여 앱
690및 오프-기기는 RSA 또는 EC 키 쌍이 하드웨어 기반인지 여부를 결정할 수
691있으며, 키 쌍의 속성에는 어떤 것이 있고 어떠한 제약 조건이 사용성
692및 유효성에 적용되는지 여부를 결정할 수 있습니다. </p>
693
694<p>앱 및 오프-기기 서비스는 X.509 증명 인증서를 통해 키 쌍에 대한
695정보를 요청할 수 있으며 이 인증서는 유효한 증명 키로 서명되어야
696합니다. 증명 키는 공장에서 기기의 하드웨어 기반
697키 저장소에 주입되는 ECDSA 서명 키입니다. 따라서 유효한 증명 키에 의해
698서명된 증명 인증서는 하드웨어 기반 키 저장소에 있는 키 쌍의
699세부 정보와 함께 이 키 저장소의 존재 여부를
700확인합니다.</p>
701
702<p>안전한 공식 Android 공장 이미지가 기기에 사용 중인지
703확인하기 위해, Key Attestation은
704기기 <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">부트로더</a>가 다음의 정보를 <a class="external-link" href="https://source.android.com/security/trusty/index.html">TEE(Trusted Execution Environment)</a>에
705제공하도록 요구합니다.</p>
706
707<ul>
708<li>기기에 설치된 OS 버전 및 패치 수준</li>
709<li><a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">확인된 부팅</a> 공개 키 및 잠금 상태</li>
710  </ul>
711
712<p>하드웨어 기반 키 저장소 기능에 대한 자세한
713내용은 <a href="https://source.android.com/security/keystore/" class="external-link">하드웨어 기반 키 저장소</a> 가이드를 참조하세요.</p>
714
715<p>Key Attestation 이외에도 Android N에서는 지문 등록
716시 취소되지 않는 지문 바인드 키도 도입했습니다.</p>
717
718<h2 id="network_security_config">네트워크 보안 구성</h2>
719
720<p>Android N에서 앱은 오류가 발생하기 쉬운 기존의 프로그래밍 방식
721API(예: X509TrustManager)를 사용하는 대신 선언적
722<em>네트워크 보안 구성</em>을 사용하여 보안(HTTPS, TLS) 연결의 동작을 코드
723수정 없이 안전하게 사용자 지정할 수 있습니다.</p>
724
725  <p>지원되는 기능:</p>
726<ul>
727<li><b>사용자 지정 신뢰 앵커.</b> 애플리케이션이 보안 연결을 위해
728어떤 인증 기관(CA)을 신뢰할 수 있는지 사용자 지정할 수 있게 해줍니다. 예를 들어,
729특정한 자체 서명 인증서를 신뢰하거나 제한적인 공용 CA 세트를 신뢰하도록 사용자 지정할 수 있습니다.
730</li>
731<li><b>디버그 전용 재정의.</b> 애플리케이션 개발자가 설치 기반에 위험을 더하지
732않고 애플리케이션의 보안 연결을 안전하게
733디버그할 수 있게 해줍니다.
734</li>
735<li><b>일반 텍스트 트래픽 옵트아웃.</b> 애플리케이션이 일반 텍스트 트래픽을 실수로 사용하지
736않도록 스스로를 보호할 수 있게 해줍니다.</li>
737<li><b>인증서 고정.</b> 애플리케이션이 보안 연결을 위해 어떤 서버 키를
738 신뢰할지 제한하도록 해주는 고급 기능입니다.</li>
739</ul>
740
741<p>자세한 내용은 <a href="{@docRoot}preview/features/security-config.html">네트워크 보안 구성</a>을
742참조하세요.</p>
743
744<h2 id="default_trusted_ca">신뢰할 수 있는 기본 인증 기관</h2>
745
746<p>기본적으로, Android N을 대상으로 하는 앱은 시스템에서
747제공되는 인증서만을 신뢰하며 사용자가 추가한 인증 기관(CA)은 더 이상 신뢰하지 않습니다. Android N을 대상으로 하는 앱이 사용자가
748추가한 CA를 신뢰하려는 경우에는
749<a href="{@docRoot}preview/features/security-config.html">네트워크 보안 구성</a>을 사용하여
750사용자 CA를 신뢰해야 하는 방법을 지정해야 합니다.</p>
751
752<h2 id="apk_signature_v2">APK Signature Scheme v2</h2>
753
754<p>
755  Android N에서는 앱 설치 시간을 더욱 단축시켜 주고
756APK 파일을 무단으로 변경하지 못하도록 더욱 강력하게
757보호해주는 새로운 앱 서명 구성표인 APK Signature Scheme v2를 도입했습니다. 기본적으로, Android Studio 2.2 및 Android
758 Plugin for Gradle 2.2는 APK Signature Scheme v2 뿐만 아니라 JAR 서명을 사용하는 기존의 서명 구성표를 둘다
759 사용하여 앱에 서명합니다.
760</p>
761
762<p>
763  앱에 APK Signature Scheme v2를 적용하는 것이 좋지만, 이 새로운
764 구성표를 반드시 적용해야 하는 것은 아닙니다. APK
765 Signature Scheme v2를 사용할 때 앱이 올바로 빌드되지 않을 경우 이 새 구성표를 비활성화할 수 있습니다. 비활성화 프로세스가
766실행되면 Android Studio 2.2 및 Android Plugin for Gradle 2.2는 기존의 서명 구성표만 사용하여
767앱에 서명합니다. 기존 구성표만으로
768서명하려면 모듈 수준의 <code>build.gradle</code> 파일을 연 다음, 릴리스 서명
769구성에 <code>v2SigningEnabled false</code> 줄을
770추가하세요.
771</p>
772
773<pre>
774  android {
775    ...
776    defaultConfig { ... }
777    signingConfigs {
778      release {
779        storeFile file("myreleasekey.keystore")
780        storePassword "password"
781        keyAlias "MyReleaseKey"
782        keyPassword "password"
783        <strong>v2SigningEnabled false</strong>
784      }
785    }
786  }
787</pre>
788
789<p class="caution"><strong>주의: </strong> APK
790 Signature Scheme v2를 사용하여 앱에 서명하고 앱을 추가로 변경하는 경우 앱의 서명이
791 무효화됩니다. 따라서 <code>zipalign</code>과
792 같은 도구는 APK Signature Scheme v2를 사용하여 앱에 서명한 후가 아니라 서명하기 전에 사용되어야 합니다.
793</p>
794
795<p>
796  자세한 내용은 Android Studio에서
797<a href="{@docRoot}studio/publish/app-signing.html#release-mode">앱에
798서명</a>하는 방법을 설명하고 Android Plugin for Gradle을 사용하여 <a href="{@docRoot}studio/build/build-variants.html#signing">앱
799 서명을 위한 빌드 파일을 구성</a>하는 방법에 대해 설명하는 Android Studio 문서를 읽어보세요.
800</p>
801
802<h2 id="scoped_directory_access">범위가 지정된 디렉터리 액세스</h2>
803
804<p>Android N에서 앱은 새로운 API를 사용하여 특정
805<a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">외부 저장소</a> 디렉터리(SD 카드와 같은 이동식 미디어의 디렉터리 포함)에
806대한 액세스를 요청할 수 있습니다. 새로운 API는 애플리케이션이
807표준 외부 저장소 디렉터리(예: <code>Pictures</code> 디렉터리)에 액세스하는 방식을 훨씬 단순화합니다. 사진
808앱과 같은 앱은 모든 저장소 디렉터리에 대해 액세스 권한을 부여하는
809<code>READ_EXTERNAL_STORAGE</code>를 사용하는 대신 또는 사용자가 디렉터리를 탐색하도록 하는 저장소 액세스 프레임워크(SAF)를
810사용하는 대신 이들 API를
811사용할 수 있습니다.</p>
812
813<p>또한, 새로운 API는 사용자가 외부 저장소 액세스 권한을
814앱에 부여하는 단계를 단순화합니다. 새로운 API를 사용하는 경우 시스템은
815애플리케이션이 어떤 디렉터리에 대한 액세스 권한을
816요청하는지를 명확하게 설명해주는 단순한 권한 UI를 사용합니다.</p>
817
818<p>자세한 내용은
819<a href="{@docRoot}preview/features/scoped-folder-access.html">범위가 지정된
820디렉터리 액세스</a> 개발자 문서를 참조하세요.</p>
821
822<h2 id="keyboard_shortcuts_helper">Keyboard Shortcuts Helper</h2>
823
824<p>
825Android N에서는 사용자가 "Alt + /" 키를 눌러 <em>Keyboard Shortcuts</em>
826화면을 트리거할 수 있는데, 이 화면에는 시스템과 해당 앱에서 둘다 사용할 수 있는 모든
827바로 가기가 표시됩니다. 이들 바로 가기는 앱의 메뉴에서 자동으로 검색되지만(사용 가능한 경우),
828개발자가 화면에 맞춰 스스로 미세 조정한 바로 가기 목록을
829제공할 수 있습니다. 이를 위해서는 다운로드 가능한
830<a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에 설명되어 있는 새
831<code>Activity.onProvideKeyboardShortcuts()</code> 메서드를 재정의할 수 있습니다.
832</p>
833
834<p>
835앱의 어느 곳에서든 Keyboard Shortcuts Helper를 트리거하려면 관련 액티비티에 대해
836{@code Activity.requestKeyboardShortcutsHelper()}를 호출하세요.
837</p>
838
839<h2 id="sustained_performance_api">지속적인 성능 API</h2>
840
841<p>
842기기 구성 요소가 온도 제한에 도달할 때
843시스템에서는 시스템온칩(system-on-chip) 엔진을 조절하므로, 장시간 실행되는 앱의 성능이 크게 변동될
844수 있습니다. 이러한 변동은 장시간 실행되는 고성능 앱을 만들려는 앱 개발자
845입장에서는 일종의 움직이는 과녁과도 같은 것입니다.
846</p>
847
848<p>
849이러한 제한을 해결하기 위해, Android N에서는
850<em>지속적인 성능 모드</em>를 지원하며, 이 모드를 통해 OEM들은 장시간 실행되는 앱의
851기기 성능에 대한 힌트를 제공할 수 있습니다. 앱 개발자는
852이들 힌트를 사용하여 장기간에 걸쳐
853기기 성능을 예측 가능하고 이 성능을 일관된 수준으로 유지하기 위해 앱을 적절히 조정할 수 있습니다.
854</p>
855
856<p>
857앱 개발자는 N Developer Preview에 있는 이
858새 API를 Nexus 6P 기기에서만 시험해 볼 수 있습니다. 이 기능을 사용하려면
859지속적인 성능 모드에서 실행하려는 기간에 대해
860지속적인 성능 기간 플래그를 설정하세요.
861{@code Window.setSustainedPerformanceMode()} 메서드를 사용하여 이 플래그를 설정하세요. 해당 기간이 포커스 안에 없을 때는
862이 모드가 자동으로 비활성화됩니다.
863</p>
864
865<h2 id="vr">VR 지원</h2>
866
867<p>
868개발자가 사용자를 위한 고품질 모바일 VR 환경을 만들 수 있도록, Android N에서는
869새로운 VR 모드에 대한 플랫폼 지원과 최적화를 추가합니다. VR 앱 전용 CPU 코어에 대한 액세스를 비롯하여
870다수의 성능 개선 사항이 있습니다.
871지능적 머리 추적과
872VR용으로 작동하는 스테레오 알림 기능을 앱 내에서 이용할 수 있습니다. 가장 중요한 점은, 지연 시간이 매우 짧은
873그래픽을 Android N이 제공한다는 사실입니다. Android N용 VR 앱 만들기에 대한 자세한 정보는
874<a href="https://developers.google.com/vr/android/">Android용 Google VR SDK</a>를 참조하세요.
875</p>
876
877
878<h2 id="print_svc">인쇄 서비스 개선 사항</h2>
879
880<p>
881  이제 Android N에서는 인쇄 서비스 개발자가 개별 프린터와 인쇄 작업에
882대한 추가적인 정보를 노출시킬 수 있습니다.
883</p>
884
885<p>
886  개별 프린터를 나열할 때, 이제 인쇄 서비스가 다음 두 가지 방식으로 프린터마다
887아이콘을 설정할 수 있습니다.
888</p>
889
890<ul>
891  <li><code>PrinterInfo.Builder.setResourceIconId()</code>를 호출하여 리소스 ID로부터
892아이콘을 설정할 수 있습니다.
893  </li>
894
895  <li><code>PrinterInfo.Builder.setHasCustomPrinterIcon()</code>을 호출하고,
896<code>android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon()</code>을 사용하여 아이콘이 요청될 때 콜백을 설정하여
897네트워크에서 아이콘을 표시할
898 수 있습니다.
899  </li>
900</ul>
901
902<p>
903  또한, <code>PrinterInfo.Builder.setInfoIntent()</code>를 호출하여 추가적인 정보를 표시하도록
904프린터당 액티비티를 제공할 수 있습니다.
905</p>
906
907<p>
908  <code>android.printservice.PrintJob.setProgress()</code> 및
909<code>android.printservice.PrintJob.setStatus()</code>를 각각 호출하여
910인쇄 작업 알림에서 인쇄 작업의
911진행률과 상태를 나타낼 수 있습니다.
912</p>
913
914<p>
915  이들 메서드에 대한 자세한 내용은 다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>를 확인하세요.
916</p>
917
918<h2 id="framemetrics_api">FrameMetricsListener API</h2>
919
920<p>
921앱은 FrameMetricsListener API를 통해 UI 렌더링
922성능을 모니터링할 수 있습니다. 이 기능을 제공하기 위해 이 API는 앱의 현재 창에 대한 프레임 타이밍
923정보를 전송하는 스트리밍 Pub/Sub API를 노출시킵니다. 반환되는 데이터는
924<code><a href="{@docRoot}tools/help/shell.html#shellcommands">adb shell</a>
925dumpsys gfxinfo framestats</code>가 표시하는 데이터와 동일하지만, 지난 120개 프레임으로 제한되지 않습니다.
926</p>
927
928<p>
929FrameMetricsListener를 사용하면 USB 연결 없이 프로덕션 환경에서
930상호 작용 수준의 UI 성능을 측정할 수 있습니다. 이 API를
931사용하면
932{@code adb shell dumpsys gfxinfo}보다 훨씬 세분화된 수준에서 데이터를 수집할 수 있습니다. 시스템은 앱에서 발생하는 특정한 상호 작용에
933대한 데이터를 수집할 수 있기 때문에, 이처럼 높은 수준의 세분화가 가능합니다. 시스템은
934전체 앱의 성능에 대한 전체 요약을 캡처하거나
935전체 상태를 지울 필요가 없습니다. 이 기능을 사용하면
936앱 내에서의 실제 사용 사례에 대한 UI 성능에서
937성능 데이터를 수집하고 성능 저하를 찾아낼 수 있습니다.
938</p>
939
940<p>
941창을 모니터링하려면 <code>FrameMetricsListener.onMetricsAvailable()</code>
942콜백 메서드를 구현하고 해당 창에 등록하세요. 자세한 내용은 다운로드 가능한
943<a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에서 {@code FrameMetricsListener} 클래스 문서를
944참조하세요.
945</p>
946
947<p>
948이 API는 {@code FrameMetrics} 객체를 제공하며 여기에는 렌더링 하위 시스템이 프레임 수명 주기의 다양한 이정표에 대해 보고하는
949타이밍 데이터가 포함됩니다.
950지원되는 지표는 {@code UNKNOWN_DELAY_DURATION},
951{@code INPUT_HANDLING_DURATION}, {@code ANIMATION_DURATION},
952{@code LAYOUT_MEASURE_DURATION}, {@code DRAW_DURATION}, {@code SYNC_DURATION},
953{@code COMMAND_ISSUE_DURATION}, {@code SWAP_BUFFERS_DURATION},
954{@code TOTAL_DURATION}, {@code FIRST_DRAW_FRAME}입니다.
955</p>
956
957
958<h2 id="virtual_files">가상 파일</h2>
959
960<p>
961  이전 버전의 Android에서는 사용자가
962Google 드라이브와 같은 자신의 클라우드 저장소 계정에서 파일을 선택할 수 있도록, 앱이 저장소 액세스 프레임워크를
963사용할 수 있었습니다. 하지만 직접적인 바이트코드 표시가 없는
964파일을 표시하기 위한 방법이 없었으며, 모든 파일이 입력 스트림을
965제공해야 했습니다.
966</p>
967
968<p>
969  Android N에서는 <em>가상 파일</em>이라는 개념을 저장소 액세스
970 프레임워크에 추가합니다. 가상 파일 기능을 사용하면,
971{@link android.content.Intent#ACTION_VIEW} 인텐트와 함께 사용될 수 있는
972문서 URI에 직접적인 바이트코드 표시가 없더라도 이 문서 URI를 {@link android.provider.DocumentsProvider}가 반환할 수
973있습니다. 또한 Android N에서는 가상 파일이든 아니든 간에, 사용자 파일에 대한
974대체 형식을 제공할 수 있습니다.
975</p>
976
977<p>
978  앱에서 가상 문서의 URI를 가져오려면 먼저
979{@link android.content.Intent}를 만들어 파일 선택기 UI를 여세요. 앱은 {@link android.content.ContentResolver#openInputStream(Uri) openInputStream()}
980 메서드를 사용하여
981 가상 파일을
982직접 열 수 없으므로,
983{@link android.content.Intent#CATEGORY_OPENABLE} 카테고리를 포함하는 경우에는 앱이 어떤 가상 파일도 수신하지 못합니다.
984</p>
985
986<p>
987  사용자가 선택한 후에는, 시스템이
988{@link android.app.Activity#onActivityResult onActivityResult()} 메서드를 호출합니다.
989  아래의 코드 조각에서 볼 수 있듯이, 앱이 가상 파일의 URI를 검색하고
990입력 스트림을 가져올 수 있습니다.
991</p>
992
993<pre>
994  // Other Activity code ...
995
996  final static private int REQUEST_CODE = 64;
997
998  // We listen to the OnActivityResult event to respond to the user's selection.
999  &#64;Override
1000  public void onActivityResult(int requestCode, int resultCode,
1001    Intent resultData) {
1002      try {
1003        if (requestCode == REQUEST_CODE &amp;&amp;
1004            resultCode == Activity.RESULT_OK) {
1005
1006            Uri uri = null;
1007
1008            if (resultData != null) {
1009                uri = resultData.getData();
1010
1011                ContentResolver resolver = getContentResolver();
1012
1013                // Before attempting to coerce a file into a MIME type,
1014                // check to see what alternative MIME types are available to
1015                // coerce this file into.
1016                String[] streamTypes =
1017                  resolver.getStreamTypes(uri, "*/*");
1018
1019                AssetFileDescriptor descriptor =
1020                    resolver.openTypedAssetFileDescriptor(
1021                        uri,
1022                        streamTypes[0],
1023                        null);
1024
1025                // Retrieve a stream to the virtual file.
1026                InputStream inputStream = descriptor.createInputStream();
1027            }
1028        }
1029      } catch (Exception ex) {
1030        Log.e("EXCEPTION", "ERROR: ", ex);
1031      }
1032  }
1033</pre>
1034
1035<p>
1036  사용자 파일 액세스에 대한 자세한 내용은
1037<a href="{@docRoot}guide/topics/providers/document-provider.html">저장소
1038액세스 프레임워크 가이드</a>를 참조하세요.
1039</p>
1040