[go: up one dir, main page]

Posted by Eiji Kitamura - Developer Relations Team

최근 공개된 I / O Bytes 2014 시리즈의 Polymer 관련 동영상 한국어 자막이 추가되었습니다. 동영상의 설정에서 자막 언어를 한국어로 설정하시면 한국어 자막과 함께 영상을 보실 수 있습니다. Polymer Web Components 편리하게 사용할 수 있도록, 라이브러리에서 지원하지 않는 브라우저에서도 Web Components(웹 컴포넌트)를 이용할 수 있게(Polyfill) platform.js (webcomponents.js 명칭 변경 예정)를 포함하고 있습니다. 또한 Polymer를 사용하여 웹에서도 편리하게 Material Design를 구현할 수 있습니다.





Web Components 개요, Polymer 요소의 개발 방법을 설명해 드립니다. seed-element에서 npm이나 bower 사용하여 다른 요소를 이어 받는 방법, Flexbox 레이아웃의 이용 방법, GitHub 공개하는 방법까지 소개 됩니다.






Google Polymer 사용하여 Google API 이용하는 요소들을 제작하고 있습니다. 중에서  <google-map> <google-sheets> 을 소개하여 Polymer Web Components 편리함을 알려 드립니다.






반응형 디자인에서 툴 바, 작은 메뉴 바를 모으는 UI 자주 사용됩니다. 비디오에서는 Polymer <core-media-query> 사용하여 어떻게 이것을 구현하는지 설명합니다.






누구나 웹 디자인에 쉽게 접근할 수 있어야 합니다. 이 비디오에서는 Polymer를 사용한 키보드 탐색, WAI-ARIA를 사용한 어시스트, 색상에 관계없이 쓸 수 있는 디자인 등에 대해 소개합니다.

여러분이 Polymer를 사용해 멋진 응용 프로그램을 제작하는 것을 기대하고 있겠습니다.


By Roman Nurik, Design Advocate

머티리얼 디자인이 안드로이드에 찾아옵니다. 안드로이드 롤리팝 플랫폼과 시스템 앱들은 머티리얼 디자인 원칙에 따라 디자인되었습니다. 다음 주 부터 실제 사용자들을 대상으로 롤리팝 이미지가 OTA 형태로 배포될 예정이며, 사용자들은 새롭게 업데이트 되는 구글 플레이 뉴스 스탠드, 구글의 새로운 인박스 앱, 텀블러 와 같은 앱을 통해 머티리얼 디자인을 직접 체험 할  수 있게됩니다. 지금 이 순간, 개발자 분들은 앞 서 공개된 안드로이드 5.0 SDK 와 최신 버전의 AppCompat 호환 라이브러리에 포함된 머티리얼 관련 기능들을 활용할 수 있고, 디자이너 분들을 위해서는 포토샵, 일러스트레이터, 스케치 템플릿이 공개되어 있습니다. 네. 그렇습니다. 마침내 여러분의 안드로이드 앱에 머티리얼 디자인을 적용할 때가 됐습니다! 

그럼 지금부터 어떤식으로 머티리얼 디자인을 적용할 수 있는지 알아 보겠습니다.

아래의 정리된 항목들을 살펴 보시면,  어떤 요소들을 적용하여, 머티리얼 디자인 시스템을 구현할 수 있는지 알 수 있습니다. 각 항목은 머티리얼 디자인의 4가지 주요 측면에 따라 4개의 키워드로 나눠져 있습니다. 그 중에서 ‘주요 원칙’ 으로 분류된 것들을 적용하고, 일반적인 안드로이드 디자인 가이드라인을 잘 준수하신다면, 최고로 멋진 머티리얼 디자인 앱을 만드실 수 있습니다.



입체적인 표면


'UI 를 구성하는 표면('디지털 종이')들은 다양한 높낮이를 가질 수 있으며, 각각의 표면 뒤에는 그림자가 생깁니다.'


  • 주요 원칙: 그림자는 어떤 구성 요소가 다른 것 보다 앞에 있는지 나타내기 위해 사용되며, 사용자가 전체 UI의 계층을 쉽게 파악할 수 있도록 돕습니다. UI에서 깊이와 레이어를 만드는 법에 대해서는 여기를 참조하세요.
    • 코드: 안드로이드 5.0에서는 android:elevation 속성과 android:translationZ 속성을 이용해 그림자를 표현할 수 있으며, 이전 버전에서는 PNG 형식의 이미지 리소스를 대신 활용할 수 있습니다.

<표면 과 레이어링>
  • 표면과 그림자의 구조는 일관성있게 유지되어야합니다. 하나의 그림자는 하나의 표면을 나타내며, 표면은 명확한 이유와 목적을 갖고 생성되어야 합니다.
  • 하나의 화면은 10개 미만의 표면으로 구성되는 것이 좋습니다. 화면 구성이 너무 복잡하지 않아야 하며, 너무 많은 중첩은 피하는 것이 좋습니다.
  • 특정 콘텐츠가 화면 끝이나 다른 표면 아래로 스크롤되는 경우, 해당 콘텐츠를 담는 표면 자체가 움직이고 있다고 알 수 있도록, 화면 가장자리나 표면 아래에 그림자를 표시합니다. 다시 말해, 표면 위에 콘텐츠(잉크) 자체가 스크롤 되는 경우는 거의 없으며, 항상 표면 자체가 스크롤 되어야합니다.
    • 코드: ListViewScrollViewandroid:clipToPadding 속성을 false 로 설정 합니다.
  • 단순한 단색으로 칠해진 표면을 사용합니다.





대담하며 인쇄물의 특징을 같는 디자인


"디지털 종이에 그려지는 '디지털 잉크'는 전통적 인쇄물 디자인과 같이, 대담한 색상과 텍스트, 상황에 맞는 이미지, 구조적인 여백과 같은 특징을 갖습니다."



    <주요색과 강조색이 지정된 머티리얼 테마>

  • 주요 원칙: 앱의 브랜딩을 위해 색상 팔레트가 주의깊게 선정되어야 하며, 표면의 배경과 텍스트 뷰, 체크박스와 같은 주요 UI 위젯에는 기본 색 (primaryColor) 과 강조 색 (accentColor)이 일관되게 사용되어야 합니다. 두 색은 대비를 이루어야 하며, 예를 들어 기본 색이 짙은 파랑일 경우 강조 색은 네온 핑크색이 사용될 수 있습니다. 특히, 동그란 액션 버튼 (FAB), 선택된 탭, 폼 필드 등 주요 UI 요소들이 눈길을 끌 수 있도록 대비도가 높은 색상을 사용하는 것이 좋습니다.
    • 코드: 테마에 새로운 colorPrimarycolorAccent 속성이 추가되었습니다. AppCompat 라이브러리를 사용하는 경우 더 이상 android 네임스페이스를 사용하지 않아도 되며, 롤리팝 이전 기기에서 자동으로 텍스트 필드, 체크박스 및 기타 다른 요소들의 색이 지정됩니다.


  • 주요 원칙: 안드로이드 5.0에서 상태 바는 앱의 기본 색상 혹은 현재 스크린에 표시되는 콘텐츠의 색상에 맞추어 변경되어야 합니다. 화면을 꽉 채우는 이미지가 사용되는 경우, 반투명 상태바를 활용할 수 있습니다.
    • 코드: 테마 요소에서 colorPrimaryDark 혹은 statusBarColor 속성을 설정합니다. Window.setStatusBarColor 메서드를 활용할 수도 있습니다.
  • 주요 원칙: 앱 내의 아이콘은 시스템 아이콘 가이드라인을 따라야 하며,  머티리얼 디자인 아이콘 세트를 활용할 수 있습니다.
  • 아이콘, 사진, 텍스트 및 기타 표면 위에 위치되는 요소들은 '잉크' 요소입니다. 잉크 요소는 그림자를 갖지 않으며, 그라디언트 칼라를 사용하지 않습니다.
  • 이미지에서 추출된 색상을 인접한 UI 요소 혹은 표면의 배경색으로 사용할 수 있습니다. 
    • 코드 : Palette 라이브러리를 사용해 손쉽게 이미지에서 유용한 칼라 셋을 추출할 수 있습니다.
  • 사진의 경우 시스템 상태바를 포함, 화면을 꽉 채우는 형식으로 표시합니다. 예를 들어 세부 사항을 나타내는 화면의 경우, 이미지 주변에 테두리를 그리지 않고 화면을 전부 활용해이미지를 표시합니다. 가능한 경우 앱 바와 상태 바 뒤 공간도 활용합니다.

    • 코드: 새로운 Toolbar 위젯 (AppCompat 라이브러리에 포함) 을 투명하게 설정하고, 레이아웃에 직접 배치할 수 있습니다. 상태 바를 설정하는 방법은 Stack Overflow 의 포스트를 확인해 보세요.
<세 종류의 키라인>
  • 주요 원칙: 가능한 경우, 본문 텍스트, 썸네일, 앱 바 제목 등의 요소들은 세 종류의 키라인에 맞추어 정렬되어야 합니다. 스마트폰에서는 왼쪽 부터 16dp 와 72dp, 그리고 오른쪽 부터 16dp가 기준입니다. 태블릿의 경우에는 24dp 와 80dp 키라인이 사용됩니다.
  • 모든 UI 요소들은 8dp 단위의 베이스라인 그리드를 기준으로 정렬 됩니다. 예를 들어 앱 바의 높이는 스마트폰의 경우 56dp 이며 태블릿에서는 64dp 입니다. 패딩과 여백은 8dp, 16dp, 24dp 등의 값을 가질 수 있습니다. 텍스트의 경우는 조금 더 세밀한 4dp 그리드가 사용됩니다.









의미있는 모션


"주의 깊게 사용된 모션은 사용자에게 앱의 상태에 관한 시각적 연속성을 제공하며, 사용자가 UI에서 일어나고 있는 일을 쉽게 알아 챌 수 있도록 돕습니다. 또한, 작지만 세밀하게 표현된 전환 효과들은 즐거움을 줄 수도 있습니다."



<Hero 전환 애니매이션>

  • 일반적으로 UI 와 콘텐츠 요소는 갑자기 나타나거나 사라지지 않으며, 자신의 위치로 자연스럽게 이동해야 합니다. 각 요소가 함께 움직일 수도 혹은 각각의 요소가 따로 따로 움직일 수 있습니다.

  • 주요 원칙: 어떤 아이템을 클릭하여 상세 화면으로 전환되는 경우, 옆의 그림과 같이 선택 된 아이템이 목록 화면에서 상세 화면으로 자연스럽게 전환되는 'Hero 전환' 을 적용합니다.
    • 코드: 안드로이드 5.0 SDK에서는 이를 지원하기 위한 shared element transitions API 가 포함되어 있습니다. 서포트 라이브러리의 FragmentTransaction 에도 이를 위한 몇 가지 기능이 포함되어 있습니다.


  • 주요 원칙: 잔물결 효과 는 터치가 일어난 자리에서 시작되며 아이템에 터치가 되었다는 피드백을 주기 위해 사용됩니다.
    • 코드: 플랫폼에서 기본으로 제공 하는 android:selectableItemBackgroundandandroid:selectableItemBackgroundBorderless 리소스에는 잔물결 효과가 포함되어 있습니다. 혹은 5.0 에서 새롭게 추가된 RippleDrawable을 사용해 개발자 여러분이 직접 해당 기능을 구현할 수 있습니다. 아쉽지만, 안드로이드 5.0 이전 버전에서는 잔물결 효과가 지원되지 않습니다.
  • 주요 원칙: UI 요소는 원형의 '나타나기(reveal)' 애니메이션을 사용해 나타납니다.
    • 코드: 이 문서를 참고하거나 ViewAnimationUtils 클래스를 확인해 보세요.
  • 주요 원칙: 애니메이션은 아이콘 상태 전환 혹은 텍스트 전환 등 좀 더 섬세하고 재밌는 방법으로 사용될 수 있습니다. 예를 들어 + 형태의 아이콘을 x 형태로 변신시키거나, 외곽선만 있는 하트 모양 아이콘에 칠하기 효과를 이용해 색을 채울 수도 있습니다.
    • 코드: 아이콘 전환은 새로운 AnimatedStateListDrawable과 이에 상응하는 XML 요소를 통해 구현될 수 있습니다. Google I/O 앱의 소스를 살펴보시면 내용을 확인하실 수 있습니다. 또한, 새롭게 벡터 아이콘 애니메이션 도 지원됩니다.
  • 일반적으로 애니메이션 과 전환효과는 300ms 이하의 빠른 속도로 이루어져야 합니다.
  • 하위 아이템을 탐색할 때는 세로 방향의 슬라이드를 앱 내비게이션을 위해서는 가로 방향의 슬라이드 전환 효과를 사용할 수 있습니다. 슬라이드 전환 시에는 단순한 선형의 모션을 활용하고, 빠른 가속 효과와 부드러운 감속 효과를 추가할 수 있습니다. 머티리얼 디자인의 모션 스펙은 여기에서 확인하실 수 있습니다.




적응형 디자인과 UI 패턴


"입체적 표면, 대담한 그래픽 디자인, 의미있는 모션은 핸드폰, 태블릿, 랩탑, 데스크탑, TV, 웨어, 자동차까지, 어떤 스크린에서든 통일성 있는 사용자 경험을 제공하기 위해 어우러져야 합니다. 또한 아래에 있는 주요 UI 패턴들은 앱이 디바이스를 넘나들며 일관되게 유지되어야 합니다."



<FAB - Floating Action Button>

  • 반응형 디자인이 적용된 가장 좋은 사례화면의 크기와 회전 여부에 따라 앱의 UI 가 알맞게 변경되는 것 입니다. 태블릿 최적화에 관한 보다 자세한 내용은 태블릿 앱 체크리스트를 확인해 보세요. 또한, 이 블로그 포스트에서는 태블릿 최적화에 관한 추가적인 팁을 얻으실 수 있습니다. 
    • 상세 화면은 'Hero 전환' 효과와 함께 팝업 형태가 사용됩니다.
    • 여러개의 창으로 구성된 경우, 하나 이상의 앱 툴바를 활용해, 연관된 콘텐츠 가까이에 적절한 액션을 배치할 수 있습니다.
  • 주요 원칙: 가능한 경우, 앱은 동그란 형태의 플로팅 액션 버튼을 사용해 주요 액션을 나타낼 수 있습니다. 플로팅 액션 버튼은 그림자를 갖는 별 개의 표면이며, 배경색으로는 밝은 계통의 강조 색을 사용하는것이 일반적 입니다. (위 내용 참조). 보내기, 작성하기, 추가하기, 검색하기 등의 기본 액션을 표시하며 다른 표면들보다 보통 8dp 상승되어 있습니다. 주로 스크린 오른쪽이나 두 표면이 만나는 가장자리 가운데에 위치시키는 것이 일반적입니다. 

앱 바 (액션 바)


  • 주요 원칙: 일반적인 표준 안드로이드 앱 바 (액션바)를 사용하시면 됩니다. 앱 바는 앱 아이콘 대신 색상과 타이포그라피를 통해 앱의 브랜드를 나타낼 수 있습니다. 앱 바는 그림자를 갖고 있으며, 보통 4dp 상승되어 있습니다.
    • 코드: 안드로이드 5.0의 새로운 Toolbar 위젯을 사용합니다. 최신 버전의 AppCompat 라이브에는 모든 플랫폼 버전을 지원하는 android.support.v7.widget.Toolbar 가 제공되고 있습니다.
  • 앱 바는 표준 앱바의 세로 길이 보다 2배 혹은 3배 길게 디자인 될 수 있습니다. 화면이 스크롤 됨에 따라 앱바의 크기가 자연스럽게 표준 크기로 줄어 들도록 구현 할 수 있습니다.
  • 앱 바는 경우에 따라 완전히 투명하게 디자인 될 수도 있으며 텍스트와 액션을 갖고 이미지 위에 위치할 수 있습니다. 구글 플레이 뉴스스탠드 앱이 이러한 방식으로 구현되었습니다.
  • 앱 바에 표시되는 제목은 두 번째 키라인에 맞춰 정렬되어야 합니다. (키라인에 대한 내용은 위의 내용 참조)
    • 코드: Toolbar 위젯의 android:contentInsetStart 속성을 사용할 수 있습니다.
  • 필요한 경우, 콘텐츠를 위한 공간을 더 확보할 수 있도록 스크롤을 올릴 때 앱 바가 사라지고, 다시 아래로 스크롤하면 앱 바가 나타나도록 구현할 수 있습니다.

<머티리얼 디자인 탭>

  • 주요 원칙: 탭은 머티리얼 디자인의 새로운 상호작용과 스타일 가이드를 준수해야 합니다. 탭 사이에는 구분선이 없으며 최상위 탭은 시각적으로 앱 바의 일부처럼 보이게 디자인 되어야 합니다. 
    • 코드 : SlidingTabsBasic SDK의 샘플 코드를 확인하거나 Google I/O 앱 소스를 참조 할 수 있습니다. ("My Schedule" 섹션을 확인해 보세요)
  • 사용자가 스와이프를 통해 탭을 전환 할 수 있어야 합니다.
    • 코드: 서포트 라이브러리에 포함된 ViewPager 위젯을 사용할 수 있습니다.
  • 선택된 탭은 전경색의 변화와 탭의 텍스트 혹은 아이콘 밑의 강조 색상(colorAccent)의 구분선으로 구분됩니다.

네비게이션 드로어

<머티리얼 디자인이 적용된
네비게이션 드로어>

  • 주요 원칙: 네비게이션 드로어를 사용하는 경우, 옆의 그림과 같은 새로운 머티리일 디자인 가이드라인을 준수해야 합니다. 드로어는 앱바 위 그리고 반투명한 스테이터스 바 아래에 위치해야 합니다
  • 주요 원칙: 안드로이드 5.0 에서 앱 바에서 가장 왼쪽에 있는 아이콘은 네비게이션 드로어 표시 이며, 앱 아이콘은 사용되지 않습니다. 개발자 여러분이 원하는 경우, 이전 버전의 플랫폼에서는 기존 안드로이드 4.0 에서처럼 앱 아이콘과 더 좁은 형태의 드로어 아이콘을 사용할 수 있습니다.
    • 코드 : 서포트 라이브러리의 DrawerLayout 위젯을 사용해 새로운 툴바 위젯과 함께 드로어를 구현하세요. 다음 Stack Overflow 포스트에서 더 자세한 정보를 보실 수 있습니다.
  • 드로어의 표준 너비는 스마트폰에서는 320dp를 넘기지 않으며 태블릿에서는 400dp를 넘기지 않습니다. 최소 너비는 스크린 너비에서 표준 툴바의 높이를 뺀 값보다 더 적지 않은 것이 좋습니다. (넥서스5에서 360dp - 56dp = 304dp)
  • 드로어에 있는 아이템의 높이는 기본 그리드 라인을 따릅니다. 각 열은 48dp 높이를 갖으며, 리스트 섹션 위는 8dp 의 여백을, 각 열을 구분하는 구분선 위 아래에도 8dp 여백을 남겨둡니다.
  • 텍스트와 아이콘은 위에 설명된 키라인을 따라 배치됩니다.
구글에서 제공하는 앱을 포함하여 점점 더 많은 앱들이 머티리얼 디자인으로 업데이트 될 예정입니다. 2014년 겨울은 안드로이드 디자인에 있어서 큰 지표가 될 것 입니다. 디자이너 분들을 위한 머티리얼 디자인에 대한 더 다양한 내용을 DesignBytes 시리즈에서 확인하실 수 있습니다. 개발자 분들은 머티리얼 디자인으로 앱 만들기 문서를 참조하실 수 있습니다.


By Chris Banes, Developer Platforms



새로운 안드로이드 5.0 롤리팝 SDK 에는 머티리얼디자인을 지원하기 위한 새로운 위젯과 기능이 포함되어 있습니다. 이와 동시에, 이전 안드로이드 플랫폼에서도 머티리얼 디자인을 적용할 수 있도록 서포트 라이브러리가 확장되었습니다. AppCompat 라이브러리에 많은 업데이트가 있었으며, 이와 함께 RecyclerView, CardView, Palette 라이브러리도 정식으로 공개되었습니다.

AppCompat 라이브러리를 이용해 어떻게 여러분의 앱에 머티리얼디자인을 적용할 수 있을지 살펴보도록 하겠습니다.


AppCompat 의 새로운 기능들

처음 AppCompat 라이브러리는 아이스크림 샌드위치에 포함된 액션바 API와 기능을 이전 버전의 안드로이드에서도 사용할 수 있도록 지원하기 위해 시작되었습니다. 이와 마찬가지로, 새롭게 업데이트된 AppCompat v21 라이브러리는 최신 안드로이드 5.0 에서 제공하는 API 와 기능들을 이전 버전의 안드로이드에서 사용할 수 있도록 만들어 줍니다.

이번 버전에서는 새로운 Toolbar 위젯이 추가되었습니다. Toolbar는 좀 더 일반적인 형태의 액션바입니다. 매우 유연하게 설계되었고, 개발자 여러분은 필요에 따라 Toolbar의 모습, 형태, 동작 방식등을 쉽게 변경할 수 있습니다. Toolbar는 다른 안드로이드 뷰와 마찬가지로 여러분이 관리하는 뷰 계층 구조에 포함됩니다. 때문에, 개발자 여러분은 큰 어려움없이 앱 내의 다른 뷰와 Toolbar가 서로 상호작용하게 만들 수 있고, 애니매이션 효과를 부여하거나, 화면 스크롤 이벤트에 Toolbar가 반응하도록 만들 수 있습니다. 물론 Toolbar를 기존의 표준적인 액션바처럼 사용할 수 있으며, 이 경우 개발자 여러분이 기존에 액션바를 위해 지정한 모든 메뉴가 Toolbar위에 동일하게 나타납니다.

개발자 여러분은 사실 이미 새로운 AppCompat 라이브러리와 Toolbar 위젯을 사용하고 계실 수도 있습니다. 지난 몇 주간 Play 스토어, 뉴스 스탠드와 같은 다양한 구글 앱들이 최신 AppCompat 라이브러리를 이용하여 업데이트 되었습니다. 또한, 위 스크린샷에서 확인하실 수 있 듯이 오픈소스로 공개된 구글 I/O 안드로이드 앱에도 적용되었습니다.


AppCompat 적용하기 

Gradle 을 사용하고 계신 경우, build.gradle 파일에 다음과 같은 내용을 추가하시면 됩니다.
dependencies {
    compile "com.android.support:appcompat-v7:21.0.+"
}


처음으로 AppCompat 를 적용하는 경우

현재 AppCompat 라이브러리를 사용하지 않거나, 처음부터 앱을 만들 예정인 경우 다음 단계를 거쳐 AppCompat 라이브러리를 적용할 수 있습니다.


  • 모든 엑티비티는 반드시 ActionBarActivity 를 확장해야 합니다. ActionBarActivity 는 v4 서포트 라이브러리에 포함된 FragmentActivity 를 확장하고 있기 때문에 Fragment를 계속 사용하실 수 있습니다.
  • 사용하는 모든 테마는 반드시 Theme.AppCompat 를 상속받아야 합니다. AppCompat 테마는 기존 시스템 테마와 마찬가지로 Light 와 NoActionBar 같은 다양한 옵션을 지원합니다.
  • 네비게이션을 목적으로 Toolbar 에 포함되는 Spinner 와 같이 Toolbar 상에 추가될 뷰를 생성할 때는 반드시 getSupportActionBar().getThemedContext() 메서드를 이용하여, 액션바 테마가 적용된 컨텍스트를 받아와 사용해야 합니다.
  • MenuItem 를 이용해 getActionProvider 와 같은 액션 기능에 관한 메서드를 호출할 때는 반드시 서포트 라이브러리에 포함된 MenuItemCompat 클래스의 정적 메서드를 활용해야 합니다.

보다 자세한 내용은 안드로이드 개발자 문서의 Action Bar API 가이드 항목을 살펴보시기 바랍니다.



AppCompat 를 이미 사용중인 기존 앱에 적용하는 경우

특별한 작업이 필요하지 않습니다. 한 가지, 더 이상 v14 이상 버전을 위해, 액션바 스타일을 위한 속성을 별도로 지정해서 관리할 필요가 없으며, 하나의 테마 파일을 통해 앱의 스타일을 정의할 수 있습니다. 액션바에 적용되는 모든 속성들은 이제 일괄적으로 AppCompat 라이브러리에 정의된 속성들이 적용됩니다. ('android:actionBarStyle' 를 중복해서 선언하지 않아도 됩니다.)
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
    <!-- Set AppCompats actionBarStyle -->
    <item name="actionBarStyle">@style/MyActionBarStyle</item>

    <!-- Set AppCompat’s color theming attrs -->
    <item name=”colorPrimary”>@color/my_awesome_red</item>
    <item name=”colorPrimaryDark”>@color/my_awesome_darker_red</item>
    
    <!-- The rest of your attributes -->
</style>


테마 적용하기

AppCompat 에는 새로운 앱의 칼라 팔레트 를 지정할 수 있는 새로운 속성이 추가되었습니다. 다음과 같이 Primary 색상과 Accent 색상 속성을 지정하면 손쉽게 앱의 브랜드 칼라를 전체적으로 적용할 수 있습니다.
values/themes.xml:
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
    <!-- colorPrimary is used for the default action bar background -->
    <item name=”colorPrimary”>@color/my_awesome_color</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name=”colorPrimaryDark”>@color/my_awesome_darker_color</item>

    <!-- colorAccent is used as the default value for colorControlActivated,
         which is used to tint widgets -->
    <item name=”colorAccent”>@color/accent</item>

    <!-- You can also set colorControlNormal, colorControlActivated
         colorControlHighlight, and colorSwitchThumbNormal. -->
    
</style>

안드로이드 5.0 이상 버전에서, AppCompat 라이브러리는 지정된 속성 값들을 자동으로 프레임워크 속성으로 변환해 적용합니다. 


또한, 이전 버전의 안드로이드에서는 지정된 색상이 최대한 앱에 반영될 수 있도록 액션바와 현재 지원되고 있는 위젯들에 적절히 속성값을 적용합니다. 지원되는 위젯의 목록은 바로 다음 이어지는 항목에서 확인하실 수 있습니다.


위젯의 색상 변경 (Widget Tinting)

안드로이드 5.0 에서는 모든 위젯들이 칼라 팔레트 정보에 맞추어 그 색상이 적절히 변경됩니다. 롤리팝에는 동적으로 Drawable 에 색상을 입힐 수 있는 ‘Tinting’ 기능과, Drawable 에서 테마의 속성을 참고할 수 있는 기능이 추가되었으며, 두 가지 기능을 통해 안드로이드 프레임워크는 개발자가 지정한 색상을 모든 위젯에 반영할 수 있습니다.

이전 버전의 안드로이드에서도 앱의 전체적인 모습을 일관되게 유지할 수 있도록, 널리 사용되는 다음 위젯들의 색상은 개발자가 정의한 칼라 팔레트 속성에 맞추어 적절히 변경됩니다.지원되는 위젯 목록은 AppCompat 라이브러리가 업데이트 될 때 마다 계속 늘어날 것 입니다.


위젯에 색상을 적용하기 위해 개발자 여러분이 추가로 해야할 작업은 없습니다. 다만, 몇 가지 주의사항이 있는데 아래 이어질 FAQ 항목을 참고하시기 바랍니다.




Toolbar 위젯



AppCompat 를 통해 안드로이드 5.0 롤리팝에서 새롭게 추가된 Toolbar 위젯을 이전 버전에서도 동일하게 사용할 수 있습니다. Toolbar 는 android.support.v7.widget.Toolbar 클래스에 구현되어 있으며, 다음과 같이 두 가지 형태로 활용할 수 있습니다.


  • Toolbar를 액션바처럼 사용합니다. 액션바에서 제공하는 메뉴 생성이나 ActionBarDrawerToggle 기능들을 사용하면서 동시에 그 모습을 조금 더 자유롭게 꾸미고 싶은 경우가 해당됩니다.
  • Toolbar를 독립적으로 사용합니다. 하나 이상의 Toolbar가 필요하거나 화면 전체 너비 보다 작은 Toolbar를 사용해야 하는 등, 여러분의 앱에 액션바를 사용하는 것이 적절하지 않은 경우 Toolbar를 독립적인 위젯으로 활용할 수 있습니다.


액션바 처럼 사용하기

Toolbar를 액션바 처럼 사용하기 위해서는 우선 시스템에서 제공되는 액션바를 제거해야 합니다. 손 쉽게 Theme.AppCompat.NoActionBar 테마를 적용하면 액션바를 제거할 수 있습니다. 그리고 XML 에 다음과 같은 방식으로 Toolbar를 생성합니다.
<android.support.v7.widget.Toolbar
    android:id=”@+id/my_awesome_toolbar”
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”?attr/actionBarSize”
    android:background=”?attr/colorPrimary” />

높이와 너비, 배경색등은 원하는 대로 적용하실 수 있습니다. 위에서 사용한 값들은 그저 하나의 예시에 불과합니다. Toolbar는 일반적인 ViewGroup 이기 때문에 여러분이 원하는 곳 어디에든지 위치시킬 수 있습니다.

다음으로, 엑티비티나 프레그먼트 코드 상에 Toolbar가 액션바 처럼 사용되도록 선언합니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blah);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);
}

이 후, 안드로이드의 표준적인 메뉴 생성 콜백을 통해 생성되는 모든 메뉴는 Toolbar 위에 표시됩니다.



독립적으로 사용하기

Toolbar를 독립적으로 사용하기 위해서는 Toolbar가 액션바처럼 동작하도록 선언하지 않습니다. 여러분은 AppCompat 의 어떤 테마든 사용할 수 있고 (액션바가 적용된 테마를 포함하여), 시스템에서 제공하는 액션바와 함께 Toolbar 를 사용할 수 있습니다. 

다만, 이 경우 Toolbar를 생성할 때, 개발자 여러분이 직접 올바른 컨텐츠와 액션을 포함하여 Toolbar를 생성해야 합니다. 예를 들어, Toolbar에 메뉴를 추가하고 싶은 경우, 다음과 같이 Toolbar를 통해 직접 메뉴를 생성하고, 이벤트를 처리하위 위한 콜백을 구현해야 합니다.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blah);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);

    // Set an OnMenuItemClickListener to handle menu item clicks
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // Handle the menu item
            return true;
        }
    });

    // Inflate a menu to be displayed in the toolbar
    toolbar.inflateMenu(R.menu.your_toolbar_menu);
}

Toolbar를 이용해 훨씬 더 다양한 일들을 할 수 있습니다. 보다 자세한 내용은 안드로이드 개발자 문서의 Toolbar API reference 항목을 살펴보시기 바랍니다.



스타일링

Toolbar 는 액션바와 달리 뷰에 직접 원하는 스타일을 적용할 수 있습니다. 예를 들어 Toolbar 를 액션바처럼 사용하고자 한다면 다음과 같이 정의할 수 있습니다.
<android.support.v7.widget.Toolbar  
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

또한, “DarkActionBar” 테마 (어두운 컨텐츠, 밝은 색의 오버플로우 메뉴) 는 Toolbar 의 theme 와 popupTheme 속성을 다음과 같이 지정해 구현할 수 있습니다.

<android.support.v7.widget.Toolbar
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”@dimen/triple_height_toolbar”
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />


SearchView 위젯

AppCompat 에는 롤리팝의 최신 SearchView API 가 포함되어 있습니다. 훨씬 더 쉽게 커스터마이징할 수 있으며 원하는 스타일을 적용할 수 있습니다. 이전의 SearchView 에서 사용된 속성 값 대신 새로운 롤리팝 스타일의 속성 값들이 사용됩니다.

SearchView는 다음과 같은 속성들을 이용하여 스타일을 변경할 수 있습니다.

values/themes.xml:
<style name=”Theme.MyTheme parent=”Theme.AppCompat”>
    <item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle parent=”Widget.AppCompat.SearchView”>
    <!-- Background for the search query section (e.g. EditText) -->
    <item name="queryBackground">...</item>
    <!-- Background for the actions section (e.g. voice, submit) -->
    <item name="submitBackground">...</item>
    <!-- Close button icon -->
    <item name="closeIcon">...</item>
    <!-- Search button icon -->
    <item name="searchIcon">...</item>
    <!-- Go/commit button icon -->
    <item name="goIcon">...</item>
    <!-- Voice search button icon -->
    <item name="voiceIcon">...</item>
    <!-- Commit icon shown in the query suggestion row -->
    <item name="commitIcon">...</item>
    <!-- Layout for query suggestion rows -->
    <item name="suggestionRowLayout">...</item>
</style>

물론 이런 값들을 모두 수정할 필요는 없습니다. 대부분의 경우 기본 스타일을 사용하는 것 만으로 충분합니다.




새로운 머티리얼 테마의 시대가 다가오고 있습니다.

이 포스트를 통해 AppCompat을 사용하는 법과 멋진 머티리얼 디자인 앱을 만드는 데에 도움을 받으셨길 바랍니다. AppCompat이나 다른 라이브러리 지원에 대해 질문이 있거나 관련된 문서를 어디서 더 볼 수 있는지 궁금하시다면 구글플러스, 트위터 등을 통해 알려주시기 바랍니다.



FAQ

왜 제 롤리팝 이전 버전 기기에서는 EditText (혹은 상단 위젯 리스트)가 색이 바뀌지 않나요?
AppCompat 에서 위젯의 색을 변경하는 Tinting 기능은 레이아웃이 생성되는 시점을 가로채 기존 위젯을 색상 변경을 인지할 수 있는 새로운 위젯을 적용하는 방식으로 구현되어 있습니다. 대부분의 경우 별 문제없이 동작하지만 다음과 같은 경우 문제가 발생할 수 있습니다.
  • 기존 위젯을 확장한 커스텀 뷰를 사용하는 경우 (예: EditText를 확장한 경우)
  • LayoutInflater 를 통하지 않고 다른 방식으로 위젯을 생성한 경우 (예: new EditText() )
색상 변경을 인지할 수 있는 위젯들은 아직 구현이 끝나지 않았기 때문에 숨겨져 있는 상태입니다. 구현 내용이 변경될 수 있으며 해당 위젯들을 직접 활용하지 말기를 바랍니다.

롤리팝 이전 버전에서 X 위젯들은 왜 머티리얼 디자인 스타일로 바뀌지 않나요?

현재는 가장 보편적인 위젯 몇 가지만 업데이트 된 상태입니다. AppCompat이 업데이트 될 때 다른 위젯들도 추가로 수정될 예정입니다.

안드로이드 롤리팝에서 android:windowContentOverlay를 null로 설정했는데, 왜 제 액션 바는 그림자가 있나요?

롤리팝에서 액션 바의 그림자는 새로운 Elevation API를 이용해 제공되고 있습니다. 그림자를 제거하려면 getSupportActionBar().setElevation(0); 메서드를 호출하거나 액션 바 스타일에서 Elevation 속성을 0으로 설정하세요.

왜 롤리팝 이전 버전에서는 잔물결(ripples)이 나타나지 않나요?

RippleDrawable 이 부드럽게 동작하기 위해서는 안드로이드 5.0의 새로운 RenderThread가 필요합니다. 이전 버전의 안드로이드들의 퍼포먼스를 최적화 하기 위해서 안드로이드 5.0 이전 버전에서는 RippleDrawable 가 제거되었습니다.

AppCompat 를 활용할 때 Preference 는 어떻게 구현해야 하나요?

API v11+ 기기를 대상으로 하고 있다면, PreferenceFragment를 활용할 수 있습니다. 그 이전의 기기들의 경우 머티리얼 디자인이 적용되지 않은 PreferenceActivity를 사용해야 합니다.

Posted by Ankur Kotwal, Developer Advocate.



안드로이드 5.0 롤리팝에서는 안드로이드가 처음 공개된 이래 가장 큰 발전이 있었습니다. 새로운 비주얼 스타일이 소개되었고, 성능이 향상되고 그 외에도 정말로 다양한 기능이 추가되고 개선되었습니다. 안드로이드 5.0 롤리팝은 작은 화면에서 큰 화면까지 폰과 태블릿, TV, 자동차를 포함하여 다양한 화면 크기를 지원하고, 사용자는 가장 원하는 순간에 필요한 정보를 제공받을 수 있습니다. 개발자 분들을 위해 안드로이드 5.0 롤리팝의 개발자 하이라이트를 다음과 같이 정리해 보았습니다.


사용자 경험

  • 멀티스크린을 위한 머티리얼 디자인 - 머티리얼 디자인(Material Design)은 여러 플랫폼과 폼 팩터에 일관되게 적용할 수 있는 어플리케이션 디자인 원칙이며, 비주얼, 모션, 인터랙션 디자인에 대한 포괄적인 전략을 포함하고 있습니다. 안드로이드 5.0 은 머티리얼 디자인이 플랫폼 전반에 걸쳐 적용되었으며, 여러분의 어플리케이션에도 머티리얼 디자인을 구현할 수 있도록 필요한 도구가 함께 공개되었습니다. 시스템은 대단히 유연하여, 여러분은 대담한 색상을 활용하여 브랜드나 앱의 개성을 담고, 다양한 스크린을 위한 반응형 UI (Responsive UI)를 구현하고, 테마 요소들을 적용할 수 있습니다.
  • 향상된 알림 - 새로운 잠금 화면 알림(Lockscreen Notification)을 통해, 사용자는 기기의 잠금을 풀지 않고도 새로운 컨텐츠와 액션을 확인 할 수 있고, 각 알림의 Visibility 속성을 제어하여, 잠금 화면 위에서 보여지는 정보의 종류를 관리 할 수 있습니다. 새로운 헤드 업(Heads-up) 알림은 현재 어떤 어플리케이션이 실행 중인지 관계 없이, 화면 최상단에 시스템이 관리하는 작은 창을 띄워 컨텐츠와 액션을 표시합니다. 알림은 머티리얼 디자인에 맞추어 새로운 테마가 적용되었으며, 개발자 여러분은 강조색을 이용해 앱의 브랜드를 표현할 수 있습니다.
  • 도큐먼트단위로 관리되는 오버뷰 메뉴 — 개발자 여러분은 앱을 태스크 단위로 분리하여 관리하고, 각 태스크는 별개의 “도큐먼트” 형태로 오버뷰(Overview) 메뉴에서 표시됩니다. 예를 들어, 크롬 브라우저의 각각의 크롬탭은 오버뷰 메뉴 상에서 서로 다른 도큐먼트로 분리되어 나타납니다. 사용자는 오버뷰에서 여러 도큐먼트를 스크롤하여 특정 크롬 탭을 찾은 후, 한 번의 터치를 통해 해당 사이트를 바로 열어볼 수 있습니다.


성능

  • 안드로이드 런타임(ART) - 안드로이드 5.0 에서는 새로운 안드로이드 런타임 ART가 사용됩니다. ART 는 ahead-of-time (AOT) 컴파일과 보다 효과적인 가비지 컬렉션, 향상된 개발과 디버깅 환경을 제공합니다. 대개의 경우, 코드를 수정하지 않아도 ART를 통해 앱의 성능이 향상될 수 있습니다.
  • 64 bit 지원 - 64 bit ABI가 지원됨에 따라, 메모리 주소 공간이 증가하고, 특정 종류의 연산 작업의 성능이 향상될 수 있습니다. 자바로 작성된 어플리케이션은 수정없이 64 bit 에서 바로 구동 될 수 있습니다. 네이티브 코드를 사용하는 앱과 게임들을 위해 64 bit 지원을 포함하는 NDKr10c 버전이 업데이트 되었습니다. 
  • 프로젝트 볼타 — 전력소모를 줄이고 효율적으로 동작하는 앱을 만들기 위한 도구와 API가 추가되었습니다. SDK 에 포함된 배터리 히스토리안(Battery Historian)을 통해 앱의 시간별 전력사용을 시각화하여 한 눈에 살펴보고, 앱이 어떤식으로 배터리를 사용하는지 분석할 수 있습니다. 개발자 여러분은 JobScheduler API 를 이용해 특정 조건에 따라, 이를테면 기기가 대기 상태에 있거나 무제한 네트워크에 연결되어 있거나, 혹은 충전기에 연결되어 있을 때 등, 백그라운드 태스크와 다른 작업들을 실행하도록 조건을 설정하고 배터리 소모의 영향을 최소화할 수 있습니다.
  • OpenGL ES 3.1 와 Android Extension Pack - OpenGL ES 3.1 이 지원되며, 컴퓨트 쉐이더(Compute Shaders), 스텐실 텍스처(Stencil Textures), 텍스처 게더(Texture Gather)와 같은 기능들을 제공합니다. Android Extension Pack (AEP) 는 안드로이드에 데스크탑 수준의 그래픽을 가능하도록 하는 OpenGL ES의 새로운 확장 셋 입니다. 다양한 GPU에서 테셀레이션(Tessellation)과 지오메트리 쉐이더(Geometry Shaders)를 이용할 수 있고, ASTC 텍스처 압축(Texture Compression)을 사용할 수 있습니다. 
  • Webview 업데이트 - WebView 가 업데이트되어 WebRTC, WebAudio, WebGL 을 지원합니다. 또한, WebView 는 이제 시스템에서 분리되어, 구글 플레이를 통하여 업데이트 될 수 있게 되었습니다.


엔터프라이즈

  • 관리되는 프로파일과 프로필 주인 - 직원들이 하나의 기기를 개인 용도와 업무 용도로서 편리하게 사용할 수 있도록 안드로이드 프레임워크는 사용자의 앱, 알림, 최근 사용기록 등을 통합적으로 관리합니다. 프로파일 관리자는 Profile Owner API 를 통해 업무에 사용되는 프로파일을 생성하고 관리하고, 새로운 프로비저닝 프로세스 과정에서 업무용 프로파일을 정의할 수 있습니다.

미디어

  • 향상된 카메라 기능 - 새로운 카메라 API는 향상된 이미지 캡쳐와 프로세싱 기능을 제공합니다. 디바이스가 지원하는 경우, 어플리케이션은 최대 8 메가 픽셀, 30프레임으로 이미지를 캡처할 수 있습니다. 또한, 프레임 별로 로우 센서 데이터를 캡쳐하며 동시에 ISO 감도, 노출 시간, 프레임 길이 등과 같은 캡처 설정 값들도 프레임 별로 설정할 수 있습니다.
  • 오디오 개선 - 사운드 아키텍처가 개선되어, OpenSL 에서 오디오 입력 대기 시간이 감소되었고, 멀티채널 믹싱 기능이 추가되었으며, USB 오디오 모드가 지원됩니다.

커넥티비티

  • BLE 주변기기 모드 - 이제 안드로이드 기기는 Bluetooth Low Energy (BLE) 주변 기기 모드로 동작할 수 있습니다. 어플리케이션은 이 기능을 이용하여 주변의 다른 디바이스에 자신의 존재를 알릴 수 있습니다. 예를들어, 만보기나 건강 모니터처럼 기능하는 앱을 작성한 후, 다른 BLE 기기로 데이터를 송수신하도록 만들 수 있습니다.
  • 멀티네트워킹 - 어플리케이션은 비용이 청구되는 네트워크 / 무제한 네트워크등 특정 기능을 가진 네트워크를 동적으로 찾고, 해당 네트워크에 자동으로 연결 할 수 있습니다. 이 기능은 개발자 여러분이 전화 통신망과 같은 특정한 네트워크를 사용하고 싶은 경우 유용하게 활용할 수 있습니다. 또한, 앱은 현재 인터넷이 사용가능한지 다시 확인하도록 요청할 수 있으며, 이 기능은 앱이 동작할 때 네트워크 지연 시간이 갑자기 늘어나는 경우 특정 네트워크에 문제가 있는게 아닌지 확인하고 가능하면 더 좋은 네트워크로 자동으로 변경하도록 플랫폼에 요청할 때 사용할 수 있습니다.

그리고 마지막으로 안드로이드 5.0 롤리팝 버전의 개발자 하이라이트를 간단히 정리한 다음 DevByte 동영상도 함께 참고해보시기 바랍니다.



개발자 여러분은 바로 지금 안드로이드 5.0 에서 앱을 개발하고 테스트하실 수 있습니다. SDK 매니저를 통해 안드로이드 플랫폼 (API 레벨 21)과 SDK 도구, 플랫폼 도구, 서포트 패키지를 다운받을 수 있습니다.



안녕하세요. 구글 디벨로퍼 어드보케 양찬석 입니다. 안드로이드 5.0 롤리팝 공식 SDK 와 함께 개발자 분들이 새로운 SDK 를 테스트 할 수 있도록 프리뷰 시스템 이미지가 업데이트되었습니다. 넥서스 5 혹은 넥서스 7(2013) 디바이스를 갖고 계신 분들은 다음과 같은 과정으로 안드로이드 5.0 롤리팝 프리뷰 이미지를 사용해보실 수 있습니다.


단, 아래 과정을 통해 프리뷰 시스템 이미지를 덮어쓰시면 디바이스가 완전히 초기화되며, 저장되어 있던 모든 개인 정보나 앱 데이터가 삭제될 수 있습니다. 이 점 주의하시기 바랍니다.

0. 시스템 이미지를 적용할 때는 안드로이드 SDK 에 포함된 adbfastboot 툴이 사용됩니다. 시작하기에 앞서 SDK 매니저를 통해 'Android SDK Tool' 와 'Android SDK Platform-tools' 를 설치하시기 바랍니다.

1. 시스템 어디서나 fastboot 툴을 실행할 수 있도록 시스템의 PATH 환경 변수를 수정 합니다 .이 후 사용되는 flash-all 스크립트에서 fastboot 툴을 확인할 수 있어야합니다. fastboot 툴은 안드로이드 SDK 의 'platform-tools/' 디렉토리 안에 포함되어있습니다.

2. 디바이스를 USB 디버깅이 가능한 상태로 설정하 후, PC 에 연결 합니다. 'adb devices' 명령을 통해 디바이스가 정상적으로 연결되었는지 확인할 수 있습니다.

3. 디바이스에 맞는 시스템 이미지를 다운로드 합니다.

4. 다음 adb 명령어를 통해 디바이스를 fastboot 모드로 부팅 시킵니다.
adb reboot bootloader

5. 만일 디바이스가 시스템 이미지를 업데이트 할 수 없도록 잠겨있는 경우 다음 명령어를 통해 디바이스를 언락 합니다. 언락 확인 화면에서 볼륨키를 이용해 'Yes' 를 선택한 후, 전원버튼을 누르면 디바이스가 언락됩니다.
fastboot oem unlock

6. 다운로드한 시스템 이미지의 압축을 푼 후, 터미널 상에서 flash-all 스크립트를 실행 합니다. 필요한 부트로더를 비롯하여 베이스밴드 펌웨어 및 OS 가 설치됩니다.

7. 설치가 완료되면 디바이스가 자동으로 리부팅 되며 '달콤한' 안드로이드를 체험해보실 수 있습니다. 하지만, 보안을 위하여 디바이스를 다시 락하는 것을 추천드립니다.

마지막으로, 주의사항이 한 가지 더 있습니다. 11월 3일 부터 진행될 안드로이드 5.0 롤리팝 정식 OTA 를 받기 위해서는 프리뷰 시스템 이미지를 통해 덮어 쓰셨던 디바이스의 이미지를 정식 팩토리 이미지로 다시 리셋 하셔야 합니다. 각 디바이스의 버전별 팩토리 이미지는 다음 링크에서 확인 하실 수 있습니다.



안녕하세요. 구글 디벨로퍼 어드보케 양찬석입니다. 안드로이드 5.0 롤리팝이 드디어 정식으로 공개되었습니다. 플랫폼 SDK 와 에뮬레이터, 넥서스 5, 넥서스 7용 시스템 이미지가 공개되었는데요. 새로운 넥서스 디바이스를 포함하여 실제 일반 사용자들이 롤리팝을 손에 쥐기 까지는 약 2주 정도의 시간이 남아있습니다.

<안드로이드의 V 사인은 남은 2주간을 나타낸다는 설이 있습니다.>

이번 안드로이드 롤리팝은 추가된 API 의 숫자만도 5,000 개가 될 만큼 기존 버전에 비해 정말 다양한 변화가 있었는데요, 그 변화의 폭도 넓어서 새로운 사용자 UX 인 머티리얼 디자인 부터 새로운 런타임 ART 까지, 플랫폼 가장 위에서 아래까지 많은 변화가 있었습니다. 그런만큼 혹시라도 여러분의 앱이 새로운 안드로이드 5.0 플랫폼 버전에서 별다른 문제 없이 잘 동작하고 있는지, 안드로이드 5.0을 지원하는 디바이스가 정식 출시 될 때까지, 남은 2주간의 시간을 잘 활용해서 다음과 같은 부분을 꼭 한번 확인해보시기 바랍니다.

아래 정리한 내용은 안드로이드 개발자의 영원한 동반자. 안드로이드 개발자 사이트의 API 21 소개 페이지의 내용을 기반으로 정리하였습니다.


안드로이드 런타임(ART)이 기본 런타임으로 사용됩니다.

안드로이드 4.4 킷캣 버전부터 새로운 안드로이드 런타임 ART 가 추가되었습니다. 4.4 까지 ART 는 개발자 옵션을 통해서만 기능을 사용할 수 있었지만, 안드로이드 5.0 부터는 ART 가 기본 런타임으로 사용됩니다. ART는 Ahead-of-time(AOT) 컴파일, 개선된 가비지 컬렉션(GC), 개선된 디버깅 기능등을 지원합니다. 보다 자세한 내용은 ART 소개 페이지를 참고하시기 바랍니다. 

대부분의 안드로이드 앱은 별다른 변경 없이 ART상에서 잘 동작합니다. 그러나 기존 Dalvik 과 동작 방식에 몇 가지 차이가 있기 때문에, 특히 다음과 경우에는 앱의 ART 호환성 여부를 꼭 확인해봐야 합니다. 

  • C / C++ 코드를 실행하기 위해 Java 네이티브 인터페이스 (JNI)를 사용합니다. 
  • 서드파티 난독화 도구등 비표준 코드를 생성하는 개발 도구를 사용하고 있습니다. 
  • 가비지 콜렉션 컴팩트 기능이 동작하면 호환되지 않는 기술을 사용하고 있습니다. (ART 현재 GC 컴팩트 기능을 사용하지 않지만, 안드로이드 오픈 소스 프로젝트 상에서 해당 기술을 개발 중입니다.)

이외 ART 호환성 이슈가 발생하는 경우는 개발자 사이트의 ART 호환성 검증에 관한 문서를 확인해보시기 바랍니다.


알림(Notification) 기능이 크게 변경발전 되었습니다.

앱에서 알림 기능을 사용하고 계시다면,  안드로이듸 5.0 의 새로운 알림 기능과 잘 조화를 이루는지 확인할 필요가 있습니다. 특히 안드로이드 5.0 알림 디자인에 관한 자세한 내용은 디자인 가이드문서를 확인해 보시기 바랍니다.

머티리얼 디자인 스타일의 알림

알림은 새로운 머티리얼 디자인 위젯에 맞게 흰색(혹은 아주 가벼운) 배경에 어두운 텍스트로 표시되도록 다시 한번 변경되었습니다. 사용중인 알림이 새로운 배경색에 잘 어울리는지 확인하고 이상한 점이 있으면 잘 어울리도록 멋지게 수정해주시기 바랍니다 : )
  • setColor() 메서드를 이용해 아이콘 이미지 뒤에 원 안에 악센트 색상을 설정할 수 있습니다.
  • 알림에 사용되는 이미지들에 색상이 입혀 있다면 이를 수정해야 합니다. 여러분의 알림에서 사용된 리소스의 색상 정보는 시스템에 의해 무시되며 오직 알파 채널 값만이 사용됩니다. 실제 아이콘의 색상과는 무관하게 알림 아이콘은 흰색, 액션 아이콘은 짙은 회색으로 그려집니다.


소리와 진동

만일 여러분이 Ringtone, MediaPlayer, Vibrartor 클래스를 이용해 알림의 소리나 진동을 구현하고 있다면, 시스템이 새로운 '우선 순위 모드(priority mode)' 에 있을 때, 이를 적절히 처리할 수 있도록 해당 코드는 제거해주시기 바랍니다. 대신 Notification.Builder 를 이용해 사운드나 진동을 추가할 수 있습니다. 

디바이스를 RINGER_MODE_SILENT 모드로 설정하면, 디바이스가 새로운 우선 순위 모드로 변경됩니다. 디바이스는 음소거 모드를 벗어날때 까지 우선 순위 모드로 유지됩니다.

지금까지 안드로이드 테블릿 장치의 마스터 볼륨을 제어하기 위해서는 STREAM_MUSIC 이 사용되었습니다. 안드로이드 5.0 부터는 스마트폰과 태블릿 모두 STREAM_RING 혹은 STREAM_NOTIFICATION 에 의해 마스터 볼륨이 제어됩니다.


잠금 화면(Lock Screen)

안드로이드 5.0에서 기본적으로 모든 알림은 잠금 화면에 표시됩니다. 잠금 화면에 민감한 정보가 표시되지 않도록,사용자는 민감한 정보가 표시되지 않도록 설정할 수 있습니다. 이렇게 되면 알림 내용이 표시될 때 텍스트 내용이 자동으로 제거됩니다. 개발자 여러분이 편집된 알림의 내용을 직접 정의하려면 setPublicVersion() 메서드를 사용할 수 있습니다.

만일 알림에 개인 정보가 포함되어 있지 않거나, 알림을 통해 미디어를 제어할 수 있게 하려면 setVisibility() 메서드를 호출해 알림을 VISIBILITY_PUBLIC 으로 설정합니다.


미디어 재생

기존의 커스텀 RemoteView 를 사용하는 대신, 새로운 Notification.MediaStyle 을 이용해 사용자에게 미디어 재생 컨트롤 기능을 제공할 수 있습니다. 어떤 방법을 사용하던 알림의 Visibility 를 VISIBILITY_PUBLIC 으로 설정하면 사용자는 잠금화면에서 바로 미디어를 컨트롤 할 수 있습니다. 안드로이드 5.0 부터는 더이상 잠금 화면에 RemoteControlClient 객체를 표시하지 않습니다. 바로 아래에 이와 관련된 보다 자세한 내용을 확인하실 수 있습니다.


헤드 업(Heads-up) 알림

새로운 해드 업 알림 기능이 추가되었습니다. 디바이스가 활성화된 상태일 때 화면에 떠있는 형태로 표시되는 작은 창 모양의 알림으로 사용자가 바로 실행할 수 있는 액션버튼을 포함할 수 있습니다. 사용자는 현재 실행 중인 어플리케이션을 벗어나지 않고도 바로 헤드 업 알림 내용을 확인하고 특정 액션을 실행하거나 알림을 닫을 수 있습니다.

헤드 업 알림은 다음과 같은 경우에 발생할 수 있습니다.

  • 알림이 fullScreenIntent를 갖고 있으며, 전체 화면을 필요로 할 때
  • 알림의 우선 순위가 높으며 벨소리 및 진동을 사용하고 있을 때

여러분이 어플리케이션이 해당 조건을 만족하는 알림을 사용하고 있다면, 헤드 업 알림이 제대로 표시되는지 확인하시기 바랍니다. 



RemoteControlClient 가 더이상 지원되지 않습니다.

안드로이드 5.0 에서는 RemoteControlClient 를 사용해도 미디어 재생 컨트롤 화면이 잠금 화면에 표시되지 않습니다. 대신, 새로운 Notification.MediaStyle 탬플릿을 통해 미디어 재생 컨트롤을 잠금 화면에 표시할 수 있습니다.

Notification.Builder.addAction() 메서드를 통해 추가한 액션은 미디어 재생 알림에 버튼 형태로 추가되며 setSession() 메서드를 통해 현재 어떤 미디어 세션이 재생되고 있는지 지정할 수 있습니다. 새로운 MediaStyle 스타일 알림을 사용할 때는 사용자가 잠금 화며에서 미디어를 컨트롤 할 수 있도록 VISIBILITY_PUBLIC 속성을 사용하시기 바랍니다.

안드로이드 TV 나 안드로이드 웨어 디바이스에서도 미디어 재생 기능을 지원하기 위해서는 MediaSession 클래스를 구현해야 합니다. 또한, 안드로이드 디바이스에서 미디어 버튼 이벤트를 받아 특정 작업을 수행하려고 하는 경우에도 마찬가지로 MediaSession 클래스를 구현 하셔야 합니다.


getRecentTasks() 는 더 이상 지원되지 않습니다.

안드로이드 5.0 에서는 하나의 앱을 여러 개의 다큐먼트와 엑티비티 태스크로 분리하여 지정하고 관리할 수 있는 방법이 추가되면서, 사용자의 개인정보를 보호하기 위하여 ActivityManager.getRecentTasks() 메서드는 더 이상 지원되지 않습니다. 하위 호환을 위하여 안드로이드 5.0 에서 이 메서드는 메서드를 호출한 프로그램과 홈과 같은 덜 민감한 태스크의 정보만을 반환하도록 수정되었습니다. 만일 현재 여러분의 앱에 속한 태스크의 정보를 확인하고자 한다면, 새로운 getAppTasks() 메서드를 사용하실 수 있습니다.


64비트가 지원됩니다. 최신 NDK를 이용해 앱을 다시 빌드해야 합니다.

안드로이드 5.0은 64비트 시스템을 지원합니다. 64비트로 주소 공간이 늘어나며 성능이 향상 될 수 있습니다. 또한 64비트 지원을 통해 OpenSSL의 암호화 성능도 개선될 수 있습니다. 여기에 이번 릴리즈에서는 새로운 네이티브 NDK API 와 OpenGL ES 3.1이 추가적으로 지원됩니다.

안드로이드 5.0에서 지원되는 64비트 지원을 활용하려면 NDK 페이지에서 최신 NDK 10c 버전을 다운로드 받아 설치해 보시기 바랍니다. 릴리즈 노트를 참고하시면 NDK 의 주요 변경 및 버그 수정에 관한 내용을 확인하실 수 있습니다.


Context.bindService() 는 명시적 인텐트만을 지원합니다.

안드로이드 5.0 부터 서비스에 바인드 하기 위해서는 반드시 명시적 인텐트를 사용해야 합니다. 만일 암시적 인텐트를 이용해 bindService() 를 호출하는 경우 예외가 발생합니다. 여러분의 앱이 보안을 위하여 서비스에 바인드 할 때는 반드시 명시적 인텐트를 사용하고 서비스를 위한 인텐트 필터는 사용하지 않는 것이 권장됩니다.