<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다. ...
<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>

Android NDK r14

안드로이드 NDK (Native Development Kit) r14 버전이 공개되었습니다. 안드로이드 스튜디오의 SDK Manager를 통해 설치하거나 다음 링크를 통해 다운로드할 수 있습니다. r14의 새로운 점은 무엇일까요? 전체 변경 사항은 여기에서 확인할 수 있습니다. 주요 사항은 다음과 같이 정리해볼 수 있습니다.
  • 모든 플랫폼 헤더를 통합 헤더로 업데이트했습니다(아래에서 자세히 다룸).
  • 이제 Clang을 포함한 LTO가 Darwin과 Linux에서 작동합니다.
  • libc++가 업데이트되었습니다. 이제 특수한 소멸자가 있는 정적 함수에 대해 thread_local를 사용할 수 있습니다(Clang만 해당).
  • RenderScript가 돌아왔습니다!

통합 헤더

NDK에서 안드로이드 플랫폼 헤더 파일을 제공하는 방법이 개선되었습니다. 이제 API 레벨마다 각각의 헤더 세트를 제공하는 대신 하나의 단일 헤더 세트가 제공됩니다. #if __ANDROID_API__ >= __ANDROID_API_FOO__ 전처리기 지시문을 통해, 각 플랫폼 버전별로 지원되는 API만 헤더 파일에 포함됩니다.

이전에는 주기적으로 플랫폼 헤더를 확인 후 개별 API 레벨에 맞는 새로운 헤더 파일을 생성했습니다. 따라서, 만약 기존 헤더 파일에 버그가 발생있는 경우, 예외적인 경우를 제외하면, 새롭게 만들어진 최신 버전의 헤더 파일에만 버그가 수정되었습니다. 이제는 NDK API 레벨에 관계없이 버그 수정이 가능합니다.

따라서, 안드로이드 플랫폼 대상 버전과 관계없이 최신 Linux UAPI 헤더에 액세스할 수 있게 됩니다. 이는 주로 기존 Linux 코드(특히 로우 레벨 코드)를 이식하는 개발자분들에게는 큰 도움이 될 것 입니다. 다만, 주의할 점이 있습니다. 단지 헤더 파일에 정의되어  있다고 해서 기기에서 모든 syscall을 지원할 수 있는새로운 커널로 실행하고 있다는 의미는 아닙니다. 지원하지 않는 함수를 호출하는 경우 ENOSYS 오류가 발생합니다.

통합 헤더에는 Linux 헤더 외에 OpenGL, OpenSLES 등의 최신 헤더도 포함되어 있습니다. 기존에는 KitKat까지 GLES3 라이브러리를 사용할 수 없었지만, 이제 Ice Cream Sandwich에서 GLES3 헤더에 액세스할 수 있습니다. 여전히 dlopen/dlsym을 통해 모든 API 호출을 사용해야 하지만, 최소한 이 함수를 호출하는 데 필요한 모든 상수와 #defines에 액세스할 수 있습니다. 앞으로 출시될 r16 버전에서는 이전 헤더를 모두 제거할 예정입니다. 통합 과정이 부드럽게 진행될 수 있도록, 새로운 통합 헤더를 테스트하시고, 문제가 발생하면 저희에게 알려주세요.

주의 사항

API #ifdef 가드는 OpenGL에 있는 가드처럼 타사 헤더에 존재하지 않습니다. 이 경우 대상 API 레벨에서 사용할 수 없는 API를 사용하면 컴파일 오류가 아닌 링크 오류(정의되지 않은 참조)가 나타납니다.

GCC를 사용하는 독립 실행형 툴체인은 기본적으로 지원되지 않으며 앞으로도 그럴 것입니다. GCC를 사용하려면 컴파일 시 -D__ANDROID_API__=$API를 전달하세요.

빌드 시 통합 헤더 사용

개발자들이 쉽게 적응할 수 있도록, 기본적으로 기존 플랫폼 버전 별 헤더가 적용되며, 통합 헤더를 사용하기 위해서는 빌드 방식에 따라 다음과 같은 약간의 추가적인 설정이 필요합니다. 참고로, r15 버전에서는 통합 해더가 Default 옵션으로 적용될 예정입니다.

ndk-build


Application.mk에서

    APP_UNIFIED_HEADERS := true
다음과 같이 명령줄로부터 이 속성을 설정할 수도 있습니다.

    $ ndk-build APP_UNIFIED_HEADERS=true

externalNativeBuild로 Gradle을 통해 ndk-build를 사용하는 경우, build.gradle에서 다음 구성 설정을 지정하세요.

    android {
      ...
      defaultConfig {
        ...
        externalNativeBuild {
          ndkBuild {
            ...
            arguments "APP_UNIFIED_HEADERS=true"
          }
        }
      }
    }

CMake

빌드 구성 시 ANDROID_UNIFIED_HEADERS=ON으로 설정하세요. 대개 cmake -DANDROID_UNIFIED_HEADERS=ON $OTHER_ARGS를 사용하여 CMake를 호출하는 형식을 취합니다.

externalNativeBuild로 Gradle을 통해 CMake를 사용 중인 경우 다음 코드를 사용할 수 있습니다.

    android {
      ...
      defaultConfig {
        ...
        externalNativeBuild {
          cmake {
            ...
            arguments "-DANDROID_UNIFIED_HEADERS=ON"
          }
        }
      }
    }

독립 실행형 툴체인

독립 실행형 툴체인 생성 시 --unified-headers를 전달하세요. 이전 스크립트 make-standalone-toolchain.sh에서는 현재 이 옵션을 사용할 수 없고 make_standalone_toolchain.py에서만 사용할 수 있습니다.

시험용 Gradle 플러그인

곧 출시 예정입니다! 여기를 클릭해 살펴보세요.

맞춤 빌드 시스템이란?

추가 정보가 필요하세요? 빌드 시스템에 통합 헤더에 대한 지원을 추가하는 방법은 여기에서 찾을 수 있습니다.

통합 헤더에 대한 추가 정보는 관련 문서버그 추적을 참조하세요. 다음 릴리스를 미리 보려는 경우 마스터 브랜치에 최신 버전의 설명서가 있습니다.

<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 문현경(Web Technologies GDE)님이 참여해 주셨습니다. ...
<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 문현경(Web Technologies GDE)님이 참여해 주셨습니다.>
별도의 언급이 없는 한, 아래에 기술된 변경 사항은 Android, Chrome OS, Linux, Mac, Windows용 최신 Chrome 베타 채널 릴리스에 적용됩니다.

IndexedDB 2.0

Chrome에서는 이제 IndexedDB 2.0 표준이 완벽하게 지원되므로 브라우저에서 큰 데이터 세트를 더 간단히 다룰 수 있습니다. IDB 2.0은 새로운 스키마 관리, 일괄 작업 메서드 및 더욱 표준화된 실패 처리 기능을 제공합니다.



사이트의 데이터베이스 구조는 성능에 큰 영향을 미치며 변경하기 어려울 수 있습니다. 업데이트를 단순화하기 위해 이제 리팩토링 후 즉시 객체 저장소색인의 이름을 알맞게 변경할 수 있습니다. 또한, 맞춤 키를 간결하게 표현할 수 있는 바이너리 키 덕분에 성능 저하를 걱정할 필요 없이 사이트에서 더 많은 네츄럴 키를 사용할 수 있습니다.


getKey()openKeyCursor() 메소드를 사용하여 데이터를 더 쉽게 검색할 수 있고, 데이터베이스 키가 필요할 때 더 나은 성능을 제공합니다. 새 continuePrimaryKey() 커서 메서드를 사용하면 중복된 기본 키에 대한 걱정 없이 트랜잭션과 페이지 로드에서 대규모 데이터 액세스를 더욱 쉽게 나눌 수 있습니다. getAll()getAllKeys() 메서드를 사용하면 커서를 사용하지 않고서도 전체 데이터세트를 일괄 복구할 수 있습니다.

iframe 탐색 기능 개선

자동으로 페이지를 리디렉션하는 광고와 같은 타사 콘텐츠는 사용자를 성가시게 하고 보안 문제를 일으킬 수 있습니다. 따라서 개발자는 이러한 문제를 방지하기 위해 타사 콘텐츠를 샌드박싱한 iframe 안에 넣을 수 있습니다. 하지만 경우에 따라 이러한 유형의 콘텐츠는 표준 광고와 같이 클릭할 때 최상위 수준 페이지를 탐색해야 합니다.

이 문제를 해결하기 위해 이제 Chrome 58에서 iframe 샌드박스 키워드 allow-top-navigation-by-user-activation을 지원합니다. 이 키워드는 자동 리디렉션을 차단하면서 샌드박싱한 iframe 사용자 상호작용에 의해 트리거될 때 최상위 수준 페이지(the top-level page)를 탐색할 수 있는 기능을 제공합니다.

PWA용 몰입형 전체 화면

Android 메인 스크린에서 PWA(Progressive Web App)가 실행될 때 검색주소창을 숨기는 독립 실행형 앱과 같은 모드로 실행됩니다. 이 기능은 매력적인 사용자 환경을 조성하고 콘텐츠를 위한 화면 공간을 확보하는 데 도움이 됩니다. 그러나 게임, 동영상 플레이어 또는 기타 서식 있는 콘텐츠와 같이 더욱 뛰어난 몰입형 환경을 얻기 위해서는 시스템 바와 같은 다른 모바일 UI 요소가 여전히 방해가 될 수 있습니다.


이제 PWA가 웹 앱 매니페스트(web app manifest)에서 display: fullscreen을 설정하여 사이트가 시작될 때 메인 스크린에서 앱 UI 이외의 UI를 숨김으로써 완벽한 몰입형 환경을 제공할 수 있습니다.


         PWA가 메인 스크린에서 실행됨(왼쪽), 메인 스크린에서 독립형 모드로 실행됨(중간), 메인 스크린에서 전체 화면 모드로 시작됨(오른쪽)

이번 릴리스에 포함된 기타 기능

  • WorkerSharedWorker를 생성할 때 data: URL을 사용하여 불투명 출처(opaque origin)를 제공함으로써 Worker를 사용한 개발을 더욱 안전하게 만들 수 있습니다.
  • 개발자는 PointerEvents.getCoalescedEvents()를 사용하여 PointerEvent가 전달된 이후 모든 입력 이벤트에 액세스할 수 있으므로, 그리기 앱에서 정확한 포인트 기록을 사용하여 더 부드러운 곡선을 쉽게 생성할 수 있습니다.
  • 이제 개발자가 새 ControlsList API를 사용하여 download, fullscreenremoteplayback 버튼과 같은 Chrome의 네이티브 미디어 컨트롤을 맞춤설정할 수 있습니다.
  • Android용 Chrome에서 개선된 메인 스크린에 추가 흐름을 사용하여 설치된 사이트는 매니페스트의 범위에 포함된 출처에서 제공되는 오디오와 동영상을 제한 없이 자동 재생할 수 있습니다.
  • Android용 Chrome에서 autoplay 속성을 사용하는 동영상은 브라우저에서 일관성을 유지하기 위해 화면을 벗어나면 일시 중지되고 뷰로 돌아오면 다시 시작됩니다.
  • 이제 사이트에서 color-gamut Media Query를 사용하여 Chrome과 출력 기기에서 지원되는 대략적인 색상 범위에 액세스할 수 있습니다.
  • 이제 floatclear와 같은 여러 레이아웃 속성을 수동으로 재설정하지 않고, display: flow-root를 사용하여 새로운 블록 서식 지정 컨텍스트를 추가할 수 있습니다.
  • 자바스크립트 파싱 시간을 줄이기 위해 SVGPoint, SVGRectSVGMatrix지오메트리 외부에 있는새 인터페이스로 이전되었습니다.
  • 이제 개발자가removeRange()라는 새로운 Selection API 함수를 사용하여 지정된 텍스트 범위를 프로그램 방식으로 삭제할 수 있습니다.
  • 이제 스타일러스 기기와 페인팅 앱에 더 많은 정보를 제공할 수 있도록 Mac용 Chrome에서 PointerEvent.tangentialPressurePointerEvent.twist 속성이 지원됩니다.
  • 개발자 환경을 단순화하기 위해 공식 매개변수 및 인수 목록에 대해 자바스크립트에서 후행 쉼표가 허용 됩니다.
  • WebAudio API의 새 playback AudioContextLatencyCategory를 통해 개발자가 쉽게 지연 시간, 전력 및 CPU 효율성 간의 균형을 맞출 수 있습니다.

지원 중단 및 상호 운용성 개선 사항

  • Apple-interchange-newline, Apple-converted-space, Apple-paste-as-quotation, Apple-style-spanApple-tab-span은 비표준 CSS 클래스이므로 지원이 중단되었습니다.
  • usemap 속성은 이제 사양에 더 잘 부합하도록 호환성 대소문자 구분이 없는 것이 아니라 대소문자 구분 매칭을 사용합니다.
  • 이제 사이트에서 강력한 기능과 관련된 Chrome의 정책에 따라 알림 권한을 요청하거나 Notifications API를 사용하여 비 영구적인 로컬 알림을 생성할 때 HTTPS를 사용해야 합니다.
  • 사양과 더 잘 부합하도록, cancelBubble은 이제 true로 설정된 경우 stopPropagation()에 대한 별칭으로 간주되고 false로 설정된 경우 아무 것도 수행하지 않습니다.
  • VTTRegion 인터페이스 함수, addRegion()removeRegion()WebVTT 사양에서 삭제되었고 Chrome에서 삭제될 예정입니다.
  • 데이터에 대한 최상위 수준 탐색:위장이나 피싱 시도로부터 사용자를 보호하기 위해 URL 지원이 중단되었습니다. 
  • HTMLEmbedElement 또는 HTMLObjectElement의 인스턴스는 이전 호출자가 제거되었으므로 더 이상 함수로 호출할 수 없습니다.
  • 사전 표준 ChaCha20-Poly1305 암호화는 이러한 알고리즘의 표준화에 따라 RFC 7539RFC 7905와 같은 IETF 및 Chrome 41에서 표준 버전의 후속 출시에서 제거되었습니다.
  • 상호 운용성 향상을 위해 이제 Selection.addRange()가 기존 범위와 겹치는 경우 두 범위를 병합하는 대신 추가 범위를 무시합니다.  
  • 강력한 기능 및 사양 준수와 관련된 Chrome의 정책에 따라 안전하지 않은 출처를 통해 전송되는 암호화된 미디어 확장 프로그램의 지원이 중단되었습니다.
  • AudioBuffer 생성자가 이제 컨텍스트 인수 대신 AudioBufferOptions 사전의 sampleRate 멤버를 받아들여 인터페이스를 단순화하고 AudioBufferAudioContext 간에 공유할 수 있음을 강조합니다.  
  • 서비스 워커에서 동기 FileReaderSync API의 지원이 중단되었습니다. 서비스 워커 사양에서는 모든 유형의 동기 요청을 서비스 워커 외부에서 시작해야 하기 때문입니다.
  • HTML 표준에 부합하도록 이제 abbracronym 요소에서 기본적으로 점선 밑줄을 지원합니다.
  • motion-path, motion-offsetmotion-rotation CSS 속성이 새 버전인 offset-path, offset-distance, offset-rotate에 맞게 삭제되었습니다.
  • 이제 selectionDirection, selectionStart, selectionEnd와 같은 Selection API 속성에 액세스할 때 Chrome이 InvalidStateError DOMException을 발생시키지 않고 null을 반환합니다.
  • 사양에 더 잘 부합하도록 너무 큰 오프셋 값을 자동으로 제한하는 대신, 이제 Selection API의 setBaseAndExtent()IndexSizeError DOMException 예외를 발생시킵니다.
  • 사양에 더 부합하도록 DocumentType 노드 입력에 대해 자동으로 실패 처리하는 대신, 이제 Selection API의 setBaseAndExtent(), extend()collapse()InvalidNodeTypeError DOMException을 발생시킵니다.
  • 사양에 더 잘 부합하도록 이제 getRangeAt()이 항상 위치 정규화를 통해 새 Range를 반환합니다.
  • AudioSourceNode 인터페이스는 WebAudio 사양에 포함되지 않으므로 삭제되었습니다.
  • webkitdropzone 속성은 널리 채택되지 않았기 때문에 삭제되었습니다.

게시자: Victor Costan, IndexedDB Interloper




주목해 주세요! 개발자들을 위해 구글이 매년 개최하는 구글 I/O에서 올해도 어김없이 구글플레이 어워즈가 열립니다. 일시: 5월 18일 오후 6시 30분(태평양 표준시)

구글플레이 어워즈는 사용자에게 뛰어난 앱과 게임을 제공한다는 목표로 새로운 플랫폼과 사용자 환경을 도입하고 혁신을 추진하여 두드러진 활약을 보인 개발자들을 격려하는 자리입니다.

올해 구글은 몇 개 부문을 추가해 총 12개 부문에서 수상작을 선정할 예정입니다. 작년과 마찬가지로 후보작은 구글 내 관련 분야 및 제품 전문가들로 구성된 CFT(Cross-Functional Team)에서 선정했습니다. 후보작들은 모두 2016년 4월 이후에 출시되거나 주요 업데이트를 게시한 앱과 게임으로, 평점, 기술적 성능, 참신성에서 높은 평가를 받은 콘텐츠입니다. 부문별 선정 기준은 아래 각 부문에서 확인하실 수 있습니다. 수상작은 5월 구글 I/O에서 발표합니다.

시상 부문과 각 후보작은 다음과 같습니다.



최고 Android Wear 앱
Wear 2.0 신규 앱 중 디자인이 뛰어나고 즐거움과 기능성을 모두 제공하는 앱을 선정합니다. 후보작:

Bring!
Foursquare City Guide
Lifesum

최고의 접근성을 갖춘 앱/게임
장애가 있거나 특수한 상황에 처한 사용자가 혁신적인 방법으로 기기를 사용할 수 있도록 개발된 앱 또는 게임입니다. 후보작:


사회 공헌 앱
전 세계 다양한 사용자들에게 사회적으로 커다란 영향을 미친 앱입니다. 후보작:


최고의 아동용 앱/게임
아이들에게 친숙한 디자인으로 창의성, 탐구 정신, 학습 욕구를 높여 주는 앱 또는 게임입니다. 후보작:

Hot Wheels: Race Off
Toca Life: Vacation

최고의 TV용 앱/게임
큰 화면에 최적화된 혁신적인 기능으로 몰입감이 뛰어나면서도 직관적인 사용자 환경을 제공하는 앱 또는 게임입니다. 후보작:


스탠드아웃 스타트업
개성 있는 사용자 환경을 제공하고 자연적 설치수가 급성장세를 보인 신입 개발자의 앱입니다. 후보작:


스탠드아웃 인디
예술적인 디자인과 게임플레이 기술 모두에 주력하여 전반적인 완성도를 높인 인디 개발자의 게임입니다. 후보작:


최고의 멀티플레이어 게임
게이머들의 경쟁심을 북돋아 멀티플레이 참여를 유도하도록 구현된 게임입니다. 후보작:

최고의 AR 앱/게임
창의적이고 상상력을 자극하는 AR 기술을 활용한 앱 또는 게임입니다. 후보작:


최고의 VR 앱/게임
Daydream UI를 최적화하여 매력적이고 몰입감 있는 사용자 환경을 제공하는 앱 또는 게임입니다. 후보작:

베스트 앱
아름다운 디자인, 직관적인 UX, 뛰어난 사용자 만족도를 모두 구현한 앱입니다. 후보작:


베스트 게임
강력한 기술, 뛰어난 그래픽, 높은 사용률과 사용 유지율을 보여준 게임입니다. 후보작:



5월 18일 오후 6시 30분(태평양 표준시), 구글 I/O에서 열리는 구글플레이 어워즈에 참석해 주세요. 참석할 수 없는 분은 실시간 스트리밍을 통해 수상작을 확인하실 수 있습니다.