Google I/O'17: 안드로이드 O의 새 기능!

한국 시간으로는 18일, 미국 시간으로는 17일, 안드로이드에 새 기능을 소개하는 세션, “What’s new in Android”가 발표됐습니다. 어떤 내용이 바뀌는지 간단히 살펴 보고 새 버전을 준비해 보세요.

Picture in Picture

이제 안드로이드 TV에서만 아니라 안드로이드 폰에서도 PIP가 가능합니다! 더 이상 Manifest에서 android:resizeableActivity="true"를 선언하지 않아도 됩니다. 액티비티에서는 위 그림 코드처럼 사용합니다.

색 관리

색 선택 폭이 더욱 넓어졌습니다. WCG(Wide Color Gamut, 광색역) 디스플레이 지원이 추가됐는데, 물론 애플리케이션에서 이를 지원해야 합니다. 또한, 더 많은 색상을 ICC 프로파일을 채택했으며 비트맵에 JPEG, PNG, WebP 형태로 비트맵에 임베드될 수 있습니다. 여러 기기에서 색이 다르게 재현되던 문제를 해결하는 방법도 생겼습니다.

멀티 디스플레이

여러 디스플레이에서 사용할 수 있는 기능이 강화됐습니다. 멀티 윈도우를 지원하는 앱에서는 멀티 디스플레이도 바로 사용할 수 있습니다. 인터넷에 연결된 기기들이 있고 해당 앱에서 이 기기들을 지원한다면, 사용자가 어디에서 애플리케이션을 사용할지 선택할 수 있습니다. 혹은 ActivityOptions으로 앱을 제어할 수도 있습니다. 멀티 스크린이 정말 편해지겠네요!

$ adb shell dumpsys display
$ adb shell start <activity> --display <id>

테스트를 위해서는 adb shell을 활용할 수 있습니다.

미디어

미디어 패키지에는 미디어 플레이어, 미디어 레코더, 미디어 추출기(extractor)와 코덱 등이 포함되는데 여기에 사용할 수 있는 getMetrics() 메서드를 추가했습니다. 이 메서드로 해상도, 코덱, 비트 레이트, 동영상 길이 등 여러 유용한 정보를 얻을 수 있습니다.

이런 개발 뉴스를 더 만나보세요


MediaRecorder recorder = new MediaRecorder();
// ...
PersistableBundle metrics = recorder.getMetrics();

playback도 개선됐습니다. 미리 로드할 양을 지정할 워터마크를 사용하므로 앱에서 크기나 시간을 특정해서 버퍼링을 컨트롤 할 수 있게 됩니다. 또한 탐색도 다음 키프레임 혹은 이전 키프레임과 가장 가까운 프레임을 찾거나 sync 프레임과 가장 가까운 프레임을 찾을 수 있습니다. 디지털 콘텐츠의 저작권자 권리 보호를 DRM playback도 추가했습니다.

레코딩 기능 역시 개선됐습니다. 이제까지는 영상에 음원을 추가하려면 한 영상에 하나씩만 가능했는데, 이제 여러 음원을 추가할 수 있습니다. 원하는 타입은 무엇이든 레코딩할 수 있는 커스텀 트랙도 만들 수 있습니다. “application/”으로 시작하는 MIME 타입으로, 360 비디오 등을 쉽게 만들 수 있습니다.

WebView

아주 편리한 API가 새로 추가됐습니다. 크롬에서 멀웨어와 보안되지 않은 웹페이지를 찾아주는 Google의 safe browsing이 WebView에도 추가됐습니다. manifest에 아래처럼 메타 데이터를 추가하세요.


<manifest>
  <meta-data
    android:name="android.webkit.WebView.EnableSafeBrowsing"
    android:value="true" />
</manifest>

또한 멀티 프로세스가 가능해졌고 크래시가 발생할 경우 제어 방법도 선택할 수 있습니다. 렌더러에 대한 중요도도 선택할 수 있어 선택 폭이 훨씬 넓어졌습니다.

AnimatorSet

애니메이터를 다루는 것이 훨씬 쉬워졌습니다. 이제 AnimatorSet로 자식의 애니메이터를 탐색할 수 있습니다. 리버스도 쉽게 가능하졌습니다. 개발자들이 귀찮은 작업을 줄일 수 있는 방향으로 가고 있는것 같네요.

Autofill

폼을 채우는 것도 귀찮은 일이므로 폼 채우는 것도 자동화해줍니다. 백엔드에서 이런 데이터를 캐시하고 돌려주는 백엔드 서비스도 제공하며, 클라이언트에서는 기본 뷰들이 자동으로 이 기능을 가집니다. 커스텀 뷰라면 데이터 타입을 알려주면 됩니다.

폰트

XML에서 폰트 사용

새 리소스 폰트 디렉터리에 직접 폰트를 넣을 수 있고 위 그림처럼 사용합니다.

폰트 다운로드

코드나 XML로 폰트를 다운로드 할 수 있습니다. Google Play Services 11 버전부터는 폰트 공급자가 추가돼서 방대한 수의 구글 폰트를 사용할 수 있다고 합니다.

TextView가 자동으로 리사이징됩니다! Support Library에 포함됩니다.

AccessibilityService 유틸리티

언어 감지와 Accessibility 버튼, 독립적인 볼륨 제어, 커스텀 Figerprint 제스처가 추가됩니다.

findViewById()

TextView tv = (TextView) findViewById(R.id.mytextview);
TextView tv = findViewById(R.id.mytextview);

이전에는 위처럼 귀찮게 선언해야 했던 findViewById()가 이제 아랫줄처럼 간편해졌습니다! 작은 변화지만 매번 타입을 쳐야했던 귀찮음을 Castaway로 해결했네요! 행사장에서도 우렁찬 박수가 터져 나왔습니다.

adaptive icon

배경과 전경 이미지를 넣고 마스크를 씌워서 예쁜 아이콘을 원하는대로 쉽게 만들 수 있습니다.

숏컷과 위젯

안드로이드는 시스템 UI에 앱을 커스텀 숏컷으로 넣을 수 있습니다. 또한 위젯을 런처에 넣을 수도 있죠. 새 안드로이드 버전에서는 이들을 pin하도록 사용자에게 요청할 수 있게 됩니다. 다이얼로그에서 이렇게 요청할 수 있게 돼서 훨씬 단계가 줄어들고 사용자 행동도 유지할 수 있겠네요.

노티피케이션

노티피케이션은 사용자가 제어하기 어려웠기 때문에 젤리빈에서는 차단 기능을 추가했습니다. 누가에서는 알림 강도를 조절할 수 있도록 했고요. 하지만 사용자와 개발자 모두 앱 알림의 일부만 조작하고 싶어 했습니다. 그래서 O에는 노티피케이션 채널을 추가했습니다. 단일 앱 노티피케이션에서 진동, 소리 등 같은 행동을 공유하는 노티피케이션별로 채널을 만들어서 어느 채널로 알림을 보낼 지 지정하고 사용자는 이 채널별로 알림을 제어할 수 있습니다. 주의하세요! O 타깃인 경우 무조건 이 채널을 사용하지 않으면 노티피케이션이 누락됩니다!

엄격 모드 API

ThreadPolicy에서 unbuffered I/O를 사용하면 경고가 발생해서 테스트하기 쉬워집니다. VMPolicy에서는 애플리케이션 밖에 Intent를 보내고 권한없이 열거나 소캣을 태그하지 않으면 워닝이 발생합니다.

미디어 파일 접근

커스텀 문서 공급자를 위해 파일 디스크립터 검색 기능을 추가했습니다. 파일 디스크립터 콜백에서 onGetSize(), onRead(), onRelease() 메서드를 사용할 수 있습니다.

캐시 데이터

이제 앱이 캐시 파티션의 일정 공간을 사용할 수 있습니다. StorageManage의 getCacheQuotaBytes()allocateBytes() 메서드를 사용합니다. 필요한 경우 다른 앱의 캐시 데이터를 지워서 요청한 앱에 할당해줍니다.

프라이버시

프라이버시 정책이 완전히 바뀝니다. 이제 다른 앱에서 ANDROID_ID로 같은 사용자를 추적할 수 없습니다. 필요한 경우 AdvertisingID API를 활용해야 합니다. net.hostname도 비워집니다.

Google Play의 프로텍트 기능도 강화됩니다. 스토어의 앱을 사전 검열하고, Google Play에서 설치하지 않은 앱이라면 설치 시에도 스캔해서 안전성을 확인합니다.

Kotlin

드디어 Kotlin이 안드로이드 공식 언어가 됐습니다! Android Studio 3.0에서 바로 사용할 수 있습니다. 보다 자세한 내용은 발빠른 한글 포스트 안드로이드 공식 언어가 된 Kotlin을 알아보자를 참고하세요.

Java PL 업데이트

java.time, java.nio.file, java.lang.invoke 등이 업데이트됩니다.

런타임

런타임이 크게 개선됐습니다! concurrent-copying collector로 모든 것이 다 빠르고 효율적이 됐는데요. GC가 꽉 차지 않은 이상 지연 시간이 없으므로 다른 작업을 하면서 백그라운드에서 필요한 작업을 마음껏 할 수 있습니다. 전경에서 힙을 줄일 수도 있습니다! 이전에는 Idle 상태에서만 가능했지만 이제 전경에서도 가능하게 돼서 활용 범위가 늘어나겠네요. alloc 작업과 collection도 빨라져서 ART에서 가비지와 메모리를 다루는 작업이 훨씬 훨씬 빨라졌습니다. 내부적인 최적화도 일어났고, DEX 위치도 필요한 파일들이 한 곳에 모아지는 방향으로 점차 개선되고 있습니다.

Support Library v26

Support Library v26이 베타 버전으로 개발자 프리뷰 2에서 공개됩니다. 특히 EmojiCompat을 주목할만 합니다. 다른 플랫폼에서 볼 수 없던 이모지를 볼 수 있는 방법을 제공한다고 하니 이제 표시되지 않는 이모지를 보면서 답답할 일이 줄어들겠네요.

Physics 애니메이션

Physics 애니메이션이 추가됩니다. 이전까지는 시간 정도만을 조절할 수 있었지만 이제 velocity 기반으로 쉽게 애니메이션을 조절할 수 있습니다. 사용자와의 상호 작용이 좀 더 개선되고 더욱 자연스럽고 인터렉티브한 애니메이션을 만들 수 있게 됩니다.

Architecture Component

생명 주기 개선

안드로이드 개발을 좀 더 쉽게 할 수 있도록 Architecture Component가 생명 주기 개선을 돕습니다. 이제 실제로 생명 주기에 맞춰서 영향을 받는 곳에 직접 옵저버를 추가하는 방식으로 프로그래밍할 수 있습니다. 즉, 생명 주기 변화에 맞춰서 옵저버 객체의 @OnLifeCycleEvent(ON_START) 등을 호출할 수 있게 됩니다. 또한 지속성과 오프라인 경험도 개선했습니다.

SQL 처리 개선

Architecture Component는 그 외에도 라이프 데이터, 뷰모델, Room 등을 제공합니다. 특히 Room은 insert(Feed feed), deleteAll(Feed... feeds), updateAll(List<Feed> feeds) 등의 메서드를 사용해서 SQL 처리를 간단하게 할 수 있어서 가장 이목을 집중시켰습니다.


@Dao
interface FeedDao {
  @Query("SELECT id, title, subTitle FROM feed WHERE title = :keyword")
  List<Feed> loadFeed(String keyword);
  @Insert
  public void insert(Feed feed);
  @Delete
  public void deleteAll(Feed... feeds);
  @Update
  public void updateAll(List<Feed> feeds);
}

Behavior 변경

백그라운드에 있는 앱이 자원을 보다 효율적으로 사용할 수 있도록 로케이션, wakelock, 백그라운드 실행 수 제한 등 많은 부분을 개선했습니다. 경고창도 추가됐고 레이어 규칙이 좀 더 정교하게 바뀝니다.

인스턴트 앱

이번 세션에 포함된 내용은 아니지만 큰 반향을 얻었던 인스턴트 앱도 간단히 소개하겠습니다. 인스턴트 앱은 주소를 등록해서 안드로이드 기기가 해당 주소에 접근할 때 웹 페이지 대신 해당 인스턴트 앱을 설치없이 수행할 수 없는 신개념인데요. 앱 개발의 판도를 크게 바꿀 수 있는 획기적인 기능으로 보입니다. 바로 안드로이드 스튜디오 3.0부터 앱을 기능 단위인 feature 모듈로 나눌 수 있습니다. 설치용 앱도 feature 모듈의 합으로 구성할 수 있고, 인스턴트 앱도 feature들의 합으로 구성할 수 있어서 모듈의 재사용이 가능하게 됩니다. 사용자들이 점점 더 앱을 설치해서 실행하고 유지하지 않는 추세이므로 초소형 앱을 배포하여 사용성을 개선하고 전체 앱 설치로 유도를 하려는 전략이 아닐까요?


Google I/O ‘17의 “What’s New in Android” 세션 내용을 간단히 살펴 봤는데, 많은 내용이 획기적으로 바뀔 것 같습니다. 이 글이 안드로이드 O를 단단히 준비하고 새 트랜드에 누구보다 빠르게 적응하는데 조금이라도 도움이 되면 좋겠습니다!

다음: Realm Java의 새로운 기능을 만나 보세요!

General link arrow white

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.


Eunjoo Im

Realm Asia 팀에서 일하는 임은주입니다. iOS와 안드로이드 개발자로, 현재 Realm의 기술 컨텐츠 생산 및 관리에 주력하고 있습니다.

Leonardo YongUk Kim

Leonardo YongUk Kim is a software developer with extensive experience in mobile and embedded projects, including: several WIPI modules (Korean mobile platform based on Nucleus RTOS), iOS projects, a scene graph engine for Android, an Android tablet, a client utility for black boxes, and some mini games using Cocos2d-x.

4 design patterns for a RESTless mobile integration »

close