Test-Driven Development on Android with the Android Testing Support Library (Google I/O ’17)

[음악 재생] JONATHAN GERRISH : 안녕하세요 오늘 아침 테스트 중심 개발에 오신 것을 환영합니다

Android 플랫폼 용 내 이름은 Jonathan Gerrish이며 모바일 닌자의 일부입니다 Google은 Google 내에서 소규모 팀입니다 소프트웨어 테스팅에 열정적입니다 청중에게 손을 빨리 보여줄 수 있습니까? 실제로 얼마나 많은 사람들이 테스트를 작성하고 있습니까? 일반적인 소프트웨어 개발 연습의 일환으로? 환상적입니다

승인 따라서 이전에 Android 용 테스트를 작성했다면, 아마도 우리 도구 중 일부를 사용했을 것입니다 우리는 Android 테스팅 지원 라이브러리를 개발했습니다 테스트 러너 용 JUnit 및 규칙, 에스프레소 UI 테스트 프레임 워크, 우리는 또한 적극적으로 기여합니다 Roboelectric, 오픈 소스 안드로이드 유닛 테스트 프레임 워크

그래서 모두가 테스트를 작성하라고 말하고 있습니다 그러나 당신은 왜 그것을 정말로해야합니까? 테스트를 작성하는 데 시간이 걸리는 것은 사실입니다 그들은 코드 기반에 코드를 추가하고 있습니다 그리고 아마도 당신은이 상황에 처했을 것입니다 전에 귀하의 관리자 또는 고객이 귀하에게 그들이 당신을 늦추고 있다고

그러나 테스트를 작성해야하는 많은 이유가 있습니다 테스트를 통해 장애에 대한 신속한 피드백을 얻을 수 있습니다 따라서 개발 초기에 발견 된 오류 사이클은 생존 한 것보다 해결하기가 훨씬 쉽습니다 둘째, 테스트는 안전망을 제공합니다 훌륭한 일련의 테스트를 통해 리팩토링하고, 정리하고, 최적화 할 수 있습니다

당신의 코드, 당신이 가지 않을 것이라는 지식에서 안전함 기존 행동을 어기는 것 테스트는 실제로 지속 가능한 소프트웨어의 백본입니다 개발 안정된 속도를 유지할 수 있습니다 프로젝트의 평생 동안, 그리고 당신은 위기의 붐 – 파산 사이클을 피하려고합니다

특징 시간 및 기술적 빚의 집합 따라서 소프트웨어 테스트에는 개념이 존재합니다 테스트 피라미드의 그리고 이것은 많은 층들로 이루어져 있습니다 그리고 각 계층은 당신이 가지고있는 트레이드 오프를 가져옵니다 무게를 달아야 할 것입니다

가장 낮은 계층에는 작은 테스트 또는 단위 테스트가 있습니다 그리고 이것들은 매우 빠르고 집중적 일 필요가 있습니다 그렇기 때문에 이러한 종류의 테스트를 실행하는 것이 좋습니다 로컬 단위 테스트라고합니다 그리고 이것들은 로컬 데스크탑 컴퓨터에서 실행될 것입니다

이런 종류의 테스트를 통해 얻는 트레이드 오프 네가 뛰지 않아서 불륜이야 현실적인 환경에서 당신은 아마도 많은 가짜와 가짜로 우리가 피라미드 위로 올라감에 따라, 이제 우리는 통합 테스팅 및 엔드 – 투 – 엔드 테스팅의 영역으로 그리고 이런 종류의 테스트를하는 열쇠는 충실 함을 가져 오는 것입니다 그래서 우리는 당신이 실제 장치 또는 에뮬레이터에서의 이러한 종류의 테스트 이것들은 다음과 같은 종류의 테스트입니다 귀하의 소프트웨어가 실제로 작동한다고 당신에게 말할 것입니다

그러나 초점이 덜하므로 실패 이런 종류의 테스트 중 하나에서 조금 더 오래 걸릴 수 있습니다 단위 테스트에서 추적하는 것보다 추적하는 것이 좋습니다 그리고 당신이 만드는 큰 트레이드 오프 중 하나 테스트 실행 속도에 있습니다 여러 구성 요소를 조합하기 때문에, 그들은 모두 만들어 져야하고 포장되어야합니다 테스트가 실행되는 장치로 보내지며, 결과는 다시 수집됩니다

그건 여분의 시간이 걸릴거야 이 테스트 피라미드에는 단일 레이어가 없습니다 그걸로 충분할 수 있습니다 그래서 당신이해야 할 일 각기 다른 계층의 테스트를 혼합하는 것입니다 하나의 카테고리의 강점을 활용 다른 회사의 장단점을 없앤다

여기에 진짜 어렵고 빠른 규칙은 없습니다 그러나 Google 자체 테스트 전문가 엄지의 70-20-10 규칙을 추천하십시오 중소형 테스트와 중형 테스트의 비율로 나타냅니다 우리의 워크 플로우를 살펴 보겠습니다 따라서 테스트 중심 개발을 통해 아이디어 시험을 치르기 시작하면 그런 다음 테스트를 통과시키는 코드를 구현합니다 테스트가 녹색이면 제출할 수 있습니다

다시 한 번 손을 보여줍니다 거기 밖으로 누구가 그들의 코드를 시운전했는지, 과거에 테스트 주도 개발을 시도 했습니까? 승인 시원한 우리는 테스트 중심 개발을 좋아합니다 응용 프로그램의 디자인에 대해 생각하게합니다

API에 대한 적절한 고려 사항 제공 및 코드의 구조 테스트 중심 개발을 통해 또한 코드 작성이 적어지기 때문에 테스트를 만족시키는 데 필요한 코드를 작성하십시오 이렇게하면 일찍하고 자주 발표 할 수 있습니다 네가 끊임없이 초록색 인 것처럼 순간에 작동하는 애플리케이션을 배치 할 수 있어야한다 주의

테스트 피라미드를 따르고 있다면, 워크 플로우는 다음과 같이 보입니다 우선, 우리는 더 큰 외부 반복을 가진다 그것은 기능 개발과 관련이 있습니다 여기에서는 UI 테스트에 의해 주도되며, 만트라 테스트 중심 개발은 Red, Green, Refactor입니다 우리는 실패한 시험으로 시작합니다

테스트 통과를위한 코드를 구현합니다 그런 다음 리팩토링합니다 더 큰 반복 내부에는 시리즈가 있습니다 더 작은 반복의 단위 테스트와 관련있다 여기, 필요한 유닛을 구축하고 있습니다

기능을 통과 시키십시오 그리고 다시, 당신은 여기에 같은 진언을 사용합니다 빨강, 녹색, 리펙터 빨강, 녹색, 리펙터 예제 애플리케이션을 살펴 보겠습니다

오늘 구현할 기능 샘플 메모 작성 응용 프로그램에 메모 추가 흐름입니다 우리가 목업을 들여다 보면, 노트 목록 화면에서 시작한다는 것을 알 수 있습니다 기존 음표가 가득합니다 아래쪽에는 플로팅 액션 버튼이 있습니다 사용자가 이것을 클릭하면 새로운 메모 추가 화면에 표시됩니다

여기에서 메모의 제목과 설명을 입력 할 수 있습니다 저장을 클릭하십시오 메모는 지속 된 다음 그들은 그들의 노트 목록 화면으로 돌아갈 것이고, 새로 추가 한 쪽지를 볼 수있는 곳, 이전에 존재했던 다른 모든 음표와 함께 잠시 동안 우리의 워크 플로우로 돌아와서, 실패한 UI 테스트부터 시작한다는 것을 기억하십시오 그럼이 테스트가 에스프레소를 어떻게 사용하는지 살펴 보겠습니다

UI 테스트 프레임 워크 첫 번째 단계는 Add Add (메모 추가) 버튼을 클릭하는 것입니다 그런 다음 제목과 설명을 입력하고 저장을 클릭합니다 메모 목록 화면으로 돌아갑니다 여기서 우리는 단지 우리가 추가 실제로 나타납니다

이제 테스트 중심 개발을 통해, 우리는 아직 코드를 구현하지 않을 것입니다 우리가해야 할 일은 충분히 구현하는 것입니다 우리의 테스트의 명세를 만족시키기 위해 그래서 빈 활동과 우리가 필요로하는 자원들, 충분할 것이다 일단 테스트가 끝나면 테스트를 진행할 수 있습니다 우리는 실패 할 것입니다

이제이 기능을 구현해야합니다 따라서 응용 프로그램은 많은 작은 단위로 구성됩니다 이들은 작고 집중력이 뛰어난 특수 구성 요소입니다 그것은 한 가지 일을 잘 수행합니다 이 작은 단위의 컬렉션은 다음과 같습니다

공동 작업을 통해 우리의 특징을 만족시킨다 잠시 시간을내어 좋은 단위 테스트를 만들어라 정상적인 상태뿐만 아니라, 실패 조건을 테스트하고 싶습니다 유효하지 않습니다 입력 및 경계 조건

당신은 많은 단위 테스트를 작성하게 될 것입니다 단위 테스트는 항상 매번 동일한 결과를 제공해야합니다 변화 할 수있는 것에 의존하지 마십시오 예를 들어, 외부 서버 또는 현재 시간 – 이것은 당신의 단위 테스트에 박편을 가져올 것이기 때문입니다 단위 테스트는 코드의 특정 측면을 실행해야합니다

한 번에 단위 테스트의 실패를보고 싶습니다 매우 신속하게 코드의 자연 버그로 연결됩니다 단위 테스트를 작성할 때 실제 구현에 너무 많은 가정을하고있다 귀하의 코드입니다

당신은 당신의 단위 테스트가 행동을 테스트하기를 원합니다 그렇게하면 테스트를 다시 작성하지 않아도됩니다 구현이 변할 때 단위 테스트의 가장 중요한 측면 중 하나 그들은 당신이 빠르기 때문에 빨리해야합니다 TDD 워크 플로 동안 많은 것을 작성하고 그들도 빠르게 네가 낙심한다면 그것은 끔찍할 것이다 테스트 작성 또는 코드 리팩토링 그 검사의 실행 시간에 통증이 있습니다

그리고 마지막으로 단위 테스트는 훌륭한 출처입니다 문서화와 끊임없는 방식 코드가 바뀌면서 진화하고, 시간이 지남에 따라 정체 될 정적 문서와는 다릅니다 Add Add 활동에 대한 단원 테스트를 해보겠습니다 이 활동은 사용자 입력을 받아 들일 것입니다 그리고 나서 우리는 그것을 지속 할 것입니다

장치의 로컬 저장소에 저장합니다 승인 이제 우리는 Add Note 액티비티 클래스를 만들 것입니다 Android 프레임 워크 인 Activity가 확장됩니다 수업

그것은 레이아웃과 함께 팽창 될 전망을 가지고 있습니다 사용자가 여기에 데이터를 입력합니다 그리고 나서 우리는 그 메모를 안드로이드에 보관할 것입니다 SharedPreferences 메커니즘 우리의 어플리케이션이 진화함에 따라, 그래서 우리의 요구 사항을 않았다

아마도 스토리지 요구 사항 노트를 클라우드 저장소에 저장하도록 발전 우리는 일종의 동기화 메커니즘을 구축해야합니다 오프라인 사용 사례의 로컬 저장소 이 경우에는 추상화의 기회가 있습니다 우리는이 예에서 우리가 노트 저장소를 추출 할 수 있습니다 그러나 테스트 중심 개발의 핵심 측면 중 하나 우리는 가장 간단한 경우를 먼저 작성하는 것부터 시작합니다 그런 다음 반복합니다

그래서 우리는 이것을 일찍하는 유혹에 저항 할 것입니다 이상화 된 단위가 무엇인지에 대한 샘플을 살펴 보겠습니다 테스트는 비슷할 것입니다 일반적으로 3 단계로 구성됩니다 첫 번째 단계는 설정 중입니다

시험 조건, 그리고 환경 준비, 의존성을 필요한 상태로 설정하고, 입력 데이터를 준비합니다 다음으로, 테스트 할 코드를 마지막으로 실행하기 전에, 결과 또는 국가에 단언을합니다 나는이 세 가지를 명확하게 구분하고 싶다 시험 단계와 각 시험의 관련 측면 가져 오기 프론트와 센터는 정말 읽을 수있는 테스트를 만들어줍니다 지금까지 안드로이드 플랫폼으로, 당신은 다음을 사용하여 단위 테스트를 작성하고 있습니다

조롱과 조롱하는 조롱 라이브러리 (예 : Marketo) 그리고 예제를 보자 Marketo로 작성된 테스트 승인 와우 그것은 많은 코드입니다 승인

그래서 우리는 Android와 너무 많은 상호 작용이 있기 때문에 프레임 워크를 제공해야합니다 그저 모든 것을 위해 스터 빙하는 행동만으로 우리 테스트의 실행 경로를 만족시키기 위해서입니다 게다가 Android는 많은 정적 메소드를 사용하기 때문에, 우리는 두 번째 조롱을 소개해야합니다 라이브러리, PowerMock, 처리 할 우리를위한이 특별한 경우 그리고 여기에도 꽤 나쁜 코드 [INAUDIBLE]가 있습니다

한 번 보자 알다시피, 우리는 테스트 활동에 대해 스파이를해야합니다 행동을 수정하려면이 작업을 수행해야합니다 그리고 그걸 밖으로 stubbing 몇 가지 작전을 제공합니다 따라서 우리는 블랙 박스 테스팅의 영역을 벗어나고 있습니다

이리 마지막으로, 결국 우리는 구현 세부 사항에 대한 단언 그리고 이러한 변화가 일어나면 우리의 시험도 바뀔 필요가 있습니다 좋은 단위의 특성을 기억하십시오 테스트,이 특정 테스트에 점수를 매기는 시간을 갖자

그것이 매우 집중된 동안, 우리는 단지 Add Notes 플로우의 행복한 경로 테스트, 로컬 JVM에서 실행되기 때문에 확실히 빠릅니다 그러나 우리는 오히려 많은 것을 만들고있었습니다 이 테스트의 구현에 대한 가정 그리고 이것으로 우리 구현이 바뀌면, 우리가 다시 쓸 필요가있을거야 그 테스트는 실질적으로 그리고 마지막으로, 과도한 보일러 판 stubbing 정말 혼란 스럽네

핵심 측면에서 혼란 스러워요 시험 조건, 시험 조건 당신이 문서화하려고하는 것 그럼 다행히도 도움이되는 도구가 있습니다 이러한 문제 중 일부를 해결하십시오 Robotive 소개

Roboelectric은 안드로이드 유닛 테스트입니다 우리가 적극적으로 기여하고있는 오픈 소스 툴 그리고 어떻게하면 Roboelectric으로 훌륭한 테스트를 작성할 수 있습니다 나는 너를 크리스천 윌리엄스에게 넘기겠다 Roboelectric의 원작자 [박수 갈채] 크리스티안 윌리엄스 : 고마워요, 조나단

너무나 많은 사람들이 Android 테스트 및 TDD 네, 로보 젂은이 끔찍한 작은 오픈 소스입니다 내가 해킹을 시작한 프로젝트 안드로이드 테스팅 초기 내가 배치하는데 얼마나 오래 짜증나는지 알기 때문에 에뮬레이터에서 테스트를 실행합니다 그리고 그것은 부차적 인 프로젝트였습니다 작년까지 다른 사람들의 무리의 나는 친구 인 조나단 (Jonathan)과 구글의 합류 특권을 가졌으며, 그는 이미 Roboelectric을 개선하기 위해 일하고있었습니다 Google 자체 테스트 스위트 그 이후로 우리는 로보 젂을 정말로 강화 해 왔습니다 오픈 소스 프로젝트에 다시 기여할 수 있습니다

오늘날 로보 젂은 공식적으로 지원되는 부분이 아닙니다 안드로이드 테스트 플랫폼의 그것이 올바르게 사용될 때, 그것은 당신의 테스트 전략에서 정말로 유용한 부분이 될 수 있습니다 그리고 저는 여러분에게 어떻게 당신도 그렇게 할 수 있습니다 노트 단위 테스트로 돌아가 보겠습니다 우리가 Roboelectric으로 어떻게 접근 할 수 있는지보십시오

Roboelectric은 로컬 단위 테스트로 실행되므로, 그것은 여전히 ​​당신의 워크 스테이션에서 돌아가고있을 것입니다 에뮬레이터가 아닙니다 그러나 Roboelectric은 작은 Android 샌드 박스를 제공합니다 테스트 옆에서 실제 SDK 코드가 실행되는 곳을 선택합니다 당신은 귀하의 활동, 귀하의 레이아웃, 보기 및 자원

그리고 일반적으로 대부분의 Android 메소드를 호출 할 수 있습니다 그리고 그들은 당신이 기대하는 것처럼 일할 것입니다 Android 프레임 워크의 일부가 있습니다 네이티브 코드 또는 집단 하드웨어에 의존하거나 상호 작용하는 외부 시스템 서비스 Roboelectric은 일종의 테스트 수염을 제공합니다

우리는 그림자라고 부릅니다 그리고 그것들은 대안적인 한계를 제공합니다 단위 테스트에 적합한 코드의 우리가 방금 본 코드에는 20 줄의 코드가 있었지만, 모의 설정 코드에요? Robotive에서 어떻게 보일지 봅시다 그것은 훨씬 적습니다 우리는 모든 상용구를 없앴습니다

테스트의 크기는 약 절반이며 훨씬 간결합니다 우리는 구현 세부 사항에 대해 생각하지 않아도됩니다 우리가 테스트를 작성하는 동안, 그것은 아주 좋습니다 Roboelectric이 응용 프로그램을 설정합니다 당신의 매니 페스트에 따르면

우리가 활동을 시작하라고 요구한다면, 적절한 라이프 사이클을 거치며 실행됩니다 그것을 올바른 상태로 만들 수 있습니다 조회수를 늘리고 기기에서 기대하는 모든 것을 제공합니다 사용자가 기기를 사용하는 것처럼 상호 작용할 수 있습니다 그래서 일부 필드에 텍스트를 추가하고 클릭하십시오

저장소에 메모를 추가한다고 주장합니다 자, 우리가 실제로 우리가 처음에 쓴 UI 테스트까지 올라간다 우리는 새로운 메모가 보기 화면에 나타납니다 그것은 다른 단위 테스트의 일이 될 것입니다 이제 Roboelectric의 그림자에 대해 언급했습니다

그들은 실제로 확장 된 테스트를 제공합니다 Android 클래스에 대한 API 내부 상태를 쿼리하고 때때로 변경합니다 그들의 행동 이 예에서 우리는 응용 프로그램에 어떤 활동이 의도가 테스트 도중 시작되었습니다 우리는 저것을 주장하기 위해 사용할 수 있습니다

저장소에 메모, 우리는 View Notes 활동으로 이동합니다 유사한 테스트 API가 하드웨어 응답 시뮬레이트를 위해 존재합니다 또는 외부 서비스, 그런 것들 이 시점에서 우리는 실패한 단위 테스트를 가지고 있습니다 그리고 이제 우리는

우리는 생산 코드를 작성하면서 쉬운 부분을 준비했습니다 TDD의 정신으로 우리는 테스트 패스를 작성하는 데 필요한만큼 정확하게 작성할 수 있습니다 더 이상, 추측 코딩이 없습니다

그래서 우리는 레이아웃을 팽창시키고, 클릭 핸들러를 부착하고, 클릭이 발생하면 메모가 사라집니다 저장소에 추가하십시오 이제 우리는 테스트를 실행할 수 있습니다 우리가 코드를 개선 할 수 있다면, 우리는 돌아가서 리팩토링을 할 것이고 우리는 반복 할 것입니다 이것은 당신이 철저하게하는 곳입니다

그리고 Robotive는 이것을 위해 매우 편리합니다 그것은 당신에게 좋은, 빠른 시운전을 제공하기 때문입니다 당신은 편한 사이클을 시작할 수 있습니다 우리는 단지 행복의 길을 시험하지 않고 싶습니다 우리 코드의 모든 다른 경우를 테스트 할 것입니다

마주 칠 가능성이있다 예를 들어, 입력 검증 및 외부 조건 네트워크가 다운되는 것과 같은 일이 일어나는 것처럼 말입니다 로봇 전기는 또한 장치 조건을 시뮬레이션하는 데 도움을 줄 수 있습니다 당신이 마주 치게 될 것입니다 예를 들어 한정자를 지정할 수 있습니다

테스트는 함께 실행되어야합니다 여기서 우리는 특정 화면 크기와 방향을 말하고 있습니다 레이아웃을 약간 바꿀 수도 있습니다 Roboelectric에 특정 SDK에서 테스트를 실행하도록 요청할 수 있습니다 그래서 우리는 여기서 Jelly Bean을 말할 것입니다

그리고 실제로는 해당 버전의 SDK 코드를 사용합니다 그리고 당신은 또한 Roboelectric, 모든 SDK에서이 테스트를 실행하고 싶습니다 당신이 지원하거나, 그들 중 일부 범위 당신이 관심을 갖고있는 그리고 지금 O를 통해 Jelly Bean을 지원합니다 Google에서는 Roboelectric에 크게 의존합니다 우리는 더 나은 투자에 투자하고 있습니다

우리는 수십 개의 앱을 보유하고 있습니다 이것들은 수십만 가지가있다 내부에서 실행되는 단위 테스트 따라서 전투 테스트가 잘되었습니다 또한 최근 Android CTS를 실행하기 시작했습니다 Roboelectric에 대한 공식 안드로이드 테스트 모음입니다

그리고 우리는 지금 70 % 가량 나아지고 있습니다 매 릴리스마다 그래서 과거에 로보 틱을 사용했다면 그리고 그것이 짧다고 생각했습니다 또는 이전 버전에 머물렀다면, 나는 당신이 최신 정보를 얻을 것을 분명히 권한다 왜냐하면 그것은 먼 길을 왔기 때문입니다

우리는 마찰을 줄이기 위해 노력해 왔습니다 Roboelectric을 Android 툴 체인과 통합합니다 Gradle과 함께 Android Studio에서 매우 잘 작동합니다 Google의 자체 공개 소스 인 Bazel에 대한 지원도 제공됩니다 조만간 시스템을 구축하십시오

Roboelectric은 하나의 크기에 맞는 테스트 도구가 아닙니다 빠르지 만 Android와 100 % 동일하지는 않습니다 모든면에서, 당신은 현명하게 그것을 사용하고 싶습니다 전에 말했듯이, 링크 된 단위 테스트를 작성하지 마십시오 함께 여러 활동

그것은 단위 테스트가 아닙니다 에스프레소에게는 훨씬 좋습니다 여러 스레드를 처리하는 경우, 동기화 문제, 같은 것들 그것도 아마 단위 테스트를 작성하지 않았을 것입니다 전기에 좋다 특히 Roboelectric을 사용하지 마십시오

Android API 및 사물과의 통합을 테스트하는 방법 Google Play 서비스와 같은 당신은 당신에게 더 높은 수준의 테스트를 제공해야합니다 그것이 작동하고 있다는 자신감 이제 우리는 지나가는 단위 테스트를 얻었습니다 너를 내 동료 스테판에게 넘겨 줄거야 더 높은 수준의 테스트에 대해 이야기하기

[박수 갈채] 고마워, 크리스천 개발자 워크 플로 다이어그램으로 돌아가 보겠습니다 이 시점에서, 우리는 단위 테스트 톤을 가지길 바랍니다 그들은 우리의 모든 비즈니스 로직을 철저히 테스트합니다 하지만 기어를 바꿔 실제로 어떻게 할 수 있는지 알아 봅시다

일부 통합 테스트를 작성하여 이러한 단위가 통합되는 방식을 확인하고, 실제로 Android와 어떻게 통합되는지 실제 환경에서 어떻게 작동하는지 설명합니다 Android에서 이러한 테스트는 일반적으로 참조됩니다 계측 테스트 그리고 저는 여러분 대부분이 계측을 작성했음을 확신합니다 전에 테스트해라

그리고 비록 그들이 표면에 슈퍼 간단하게 보이지만, 두포의 밑에 실제로 많은 것이 계속하고있다, 당신이 그것에 대해 생각한다면 코드를 컴파일해야합니다 당신의 자원을 처리해야합니다 전체 시스템 이미지를 가져온 다음 테스트를 실행해야합니다 그리고 다양한 수준으로 진행되는 많은 것들이 있습니다

안드로이드 스택의 따라서이 테스트는 높은 충실도를 제공합니다 그러나 요한이 언급 할 때, 그들은 비용으로, 그들은 느린입니다 때때로, 그들은 단위 테스트보다 더 편찮습니다 그럼 실제로 어떻게 작동하는지 보겠습니다 일상적인 개발 과정에서 Android Studio라고 가정 해 보겠습니다

방금 새 에스프레소 테스트를 작성했습니다 실행 버튼을 눌러 테스트를 실행합니다 Android Studio에서 가장 먼저 할 일은 당신을 위해 두 개의 APK를 설치하려고합니다 테스트는 APK와 앱을 테스트합니다 이제 APK 테스트에는 Android JUnit Runner, 그것은 테스트 케이스와 테스트 매니페스트를 포함합니다

그런 다음 테스트를 실행하려면 안드로이드 스튜디오는 ADB Shell AM Instrument를 호출합니다 그런 다음 Android JUnit Runner는 계측 도구를 사용합니다 테스트 할 때 앱을 제어 할 수 있습니다 계측이란 무엇입니까? 나는 너희들이 이것을 알아 차렸을지도 모른다라고 생각한다 매니페스트의 최상위 태그이며 그 이유는 무엇입니까? 계측은 실제로 무엇인가입니다

그것은 안드로이드 프레임 워크 내부 깊숙이 사용됩니다 활동의 라이프 사이클을 제어하는 ​​데 사용됩니다 예를 들면 그래서 당신이 그것에 대해 생각한다면 그것은 완벽한 가로 채기 지점입니다 우리는 테스트 주자를 투입하는데 사용할 수 있습니다

그래서 Android JUnit Runner는 그다지 많지 않습니다 계측보다 조금 더 깊이 들어가 보자 Android Studio가 실제로 테스트를 실행하면 어떻게됩니까? ADB Shell AM Instrument를 실행합니다 활동 관리자에게 전화를 겁니다

그런 다음 활동 관리자는 한 번에 전화를 걸어 onCreate하여 계측하십시오 이제 Android JUnit Runner가 우리의 장비는,이 시점에서, 그것은 runner에서 onCreate를 호출합니다 그러면 주자가 당신을 위해 몇 가지 일을 할 것입니다 모든 검사를 수집 할 것입니다 그런 다음이 모든 테스트를 순차적으로 실행하게됩니다

그런 다음 결과를보고합니다 여기서 주목해야 할 것은 Android JUnit 러너 – 너는 이것을 눈치 채 셨을지도 모른다 응용 프로그램과 동일한 프로세스에서 실행됩니다 그리고 더 중요한 것은, 평소에 Android JUnit Runner를 사용하면 모든 테스트가 실행됩니다 하나의 단일 계기 호출에서

Android JUnit 러너는 Google 내부에서 많이 사용됩니다 매월 수십억 개의 테스트를 실시합니다 Android JUnit 러너를 사용합니다 그렇게하면서 우리는 직면 한 몇 가지 문제를 발견했습니다 우리가 해결해야만하는 것이 었습니다

우리가 많이 볼 수있는 한 가지는 공유 상태입니다 그리고 나는 그런 종류의 공유 ​​된 국가에 관해 말하는 것이 아닙니다 당신이 통제하고 당신이 당신의 앱에 코드를 넣었다 저는 메모리에 축적 된 공유 상태에 대해 말하고 있습니다 디스크에 빌드하고 테스트가 실패하게 만듭니다

이유가 없거나 예기치 않은 상황이 아닐 수도 있습니다 그리고 이것은 다른 것들 사이에서, 어느 시점에서, 충돌로 이어집니다 그러나 방금 전에 보여 드린 이전 모듈에서, 테스트 중 하나가 계측기에 충돌하는 경우, 그것으로 전체 애플 리케이션 프로세스를 취할 것입니다 모든 후속 테스트는 더 이상 실행되지 않습니다 그리고 이것은 분명히 큰 테스트 스위트에 대한 문제입니다 마찬가지로, 디버깅에 대해 생각한다면, 한 번의 호출로 수천 개의 테스트를 실행하면, 너의 자물쇠 머리에 대해 생각 해봐

디버깅을 위해 진행해야 할 때처럼 보일 것입니다 그래서 Google 내부에서 다른 접근 방식을 취했다 Google 내부에서 모든 테스트 방법 자체 계측 및 위치에서 실행됩니다 자, 오늘 할 수 있겠지? 여러 번의 ADB 호출을 할 수 있습니다 러너 호를 사용하고 사용자 정의 스크립트를 유지 관리 할 수 ​​있습니다

그러나 문제는 실제로는 그렇지 않을 수도 있다는 것입니다 개발 환경과 잘 통합하십시오 그래서 오늘 Android Test를 발표하게 된 것을 기쁘게 생각합니다 오케 스트레이터 그리고 Android Test Orchestrator Google에서와 마찬가지로 테스트를 실행할 수있는 방법입니다

백그라운드에서 실행되는 서비스 APK입니다 단일 계측 호출로 테스트를 실행합니다 그리고 이것은 명백하게 이익을 얻습니다 더 이상 공유 된 상태가 없습니다 실제로 Android Test Orchestrator 테스트를 실행하기 전에 PM을 실행합니다

따라서 충돌이 완전히 격리되었습니다 우리는 단일 계기 호출을하기 때문에 충돌이 발생하면 모든 후속 테스트 여전히 실행됩니다 마찬가지로 디버깅을 위해 모든 디버깅 정보 너가 장치를 모으고 떼어내는 이제 특정 테스트의 범위가 지정됩니다 이것은 훌륭하며 Google 내부에서 많은 이점을 얻습니다

그것이 실제로 어떻게 작동하는지 봅시다 테스트 APK 설치 및 테스트에 더하여, 이제 우리 장치에 세 번째 APK를 설치합니다 APK 백그라운드에서 실행중인 서비스입니다 오케 스트레이터 그런 다음 여러 개의 ATB 명령을 실행하는 대신, 우리는 하나의 ATB 명령을 실행합니다 그러나 우리는 테스트중인 앱을 설치하지 않습니다

우리는 오케 스트레이터를 직접 조작합니다 그리고 나서 오케스트라가 가고 있습니다 장치에서 모든 작업을 수행 할 수 있습니다 따라서 Android JUnit Runner를 사용하여 당신의 테스트,하지만 그때는 계속 될 것입니다 각 테스트는 자체 호출로 수행됩니다

그리고 그것은 놀랍습니다 그리고 저는 여러분이 이것을 많이 좋아할 것이라고 확신합니다 그리고 다음 Android 테스팅 지원에서 사용할 수 있습니다 라이브러리 릴리스 더 중요한 것은, 우리는 Android Studio를 사용합니다

Gradle에서 사용할 수 있으며 Firebase Test와의 통합 올해 말에 실험실에 올거야 이제 우리는 테스트를 수행하는 방법을 알고 있으므로, 실제로 이러한 통합을 작성하는 방법을 살펴 보겠습니다 테스트 그리고 대개 Android에서 [INAUDIBLE] 테스트를 작성하면 당신은 에스프레소 테스트 프레임 워크를 사용하고 있습니다 아시다시피 에스프레소에는 이처럼 단순하고 간단한 API가 있습니다

그리고 실제로는 꽤 간단합니다 그것이하는 일은 뷰 매처를 제공하는 것입니다 우리는 계층 구조에서 해당 일치 자와 일치합니다 그런 다음 뷰 작업을 수행합니다 또는 뷰 어설 션을 확인하십시오

이 API는 매우 간단하기 때문에, 빠른 TDD 프로토 타이핑을위한 완벽한 도구이기도합니다 UI 테스트 중 그러나 당신에게 그러한 간단한 API를 제공하기 위해, 후드 아래로 갈 필요가 많은 것들이 있습니다 그럼 실제로 에스프레소가 어떻게 작동하는지 살펴 보겠습니다 따라서 onView를 호출하고 우리에게 당신의 일치자를 주면, 우리가 할 첫 번째 일은 우리는 당신을 위해 뷰 인터랙션을 만들 것입니다

그리고 나서 다음 단계는 우리가 앱이 공회전 상태, 정상 상태 임 우리가 그것과 상호 작용할 준비가되기 전에 그리고 당신은 그것을 생각할 수 있습니다, 이것은 에스프레소의 핵심입니다 Espresso는 동기화 보증으로 잘 알려져 있습니다 그리고 우리가하는 일은 우리가 메시지를 반복하는 것입니다 메시지가 없을 때까지 큐에 넣다

합리적인 시간 동안 우리는 귀하의 모든 유휴 자원을 살펴 봅니다 그들이 유휴 상태인지 확인하십시오 또한 비동기 작업을 확인하여 실행중인 백그라운드 작업 없음 앱이 제정신이고 안정된 상태에 있고 우리는 상호 작용할 준비가되어 있습니다

우리는 계속 전진 할 것입니다 그런 다음 뷰 계층 구조를 탐색합니다 그리고 당신의 일치하는 사람과 일치하는보기를 찾으십시오 일단 우리가 견해를 갖게되면 우리는 뷰 동작 또는 뷰 어설 션을 수행 할 것입니다 그리고 이것은 위대합니다

이제 다시 테스트에 돌입니다 우리가 처음에 보여준 것 에스프레소가 어떻게 작동하는지 이제 알게되었습니다 그래서 첫 번째 줄에는 기억할 수 있듯이, 우리는 Add Add 버튼을 클릭하려고했습니다 그리고 여기에서는 ID 매치러와 함께 사용할 것입니다 보기에서보기와 일치하는 간단한 일치 프로그램입니다

그것의 ID에 따라 계층 구조 다음으로 우리가하고 싶은 일은보기를 클릭하는 것입니다 이를 위해 클릭보기 동작을 사용합니다 이제 흥미로운 부분은 다음 줄입니다 이 행에 제목과 설명을 입력해야하기 때문입니다

그리고 우리는 그것을 위해 타입 텍스트 액션을 사용하고 싶습니다 그러나 여기, 모든 에스프레소 동기화 보장 우리가 우리가 응용 프로그램과 상호 작용할 준비가되었습니다 우리는 타입 테스트 액션을 호출 할 것입니다 그리고 이것은 당신을 해방시켜주기 때문에 위대합니다 추가 상용구 추가에서 코드 및 추가 미끄러짐 코드를 테스트합니다

마찬가지로 메모를 저장합니다 그런 다음 화면에 표시되는지 확인합니다 그리고 이것은 위대합니다 이제 에스프레소가 어떻게 작동하는지 알고 있습니다 테스트 주도 개발을 수행하는 데있어 훌륭한 도구임을 알 수 있습니다

그리고 이제 저는 그것을 닉에게 넘겨 줄 것입니다 UI 테스트를 향상시키는 방법에 대해 조금 더 이야기하기 대규모 및 중급 테스트 전략을 개선하는 방법에 대해 설명합니다 [박수 갈채] 고마워, 스테판 UI 테스트의 좋은 특성 하나 절대 잠들지 않는 시험입니다

예를 들어 설명하기 위해 돌아가 보겠습니다 이 점은 조금 더 나아 갔다 우리의 예에서는 기억하고있는 것처럼 우리는 우리가 기억에 남긴 메모를 가지고, 꽤 빠르고 믿을만합니다 그러나 실제로 앱이 성장함에 따라, 이 기능을 확장하고 싶을 것입니다 메모를 클라우드 또는 Google 드라이브에 저장합니다

따라서 대규모 엔드 – 투 – 엔드 테스트를 실행할 때, 우리는 실제 환경을 사용하고 싶다 우리는 실제 서버를 공격했습니다 그리고 네트워크 연결에 따라, 이 작업에는 시간이 오래 걸릴 수 있으므로 아마도 하고 싶지는 배경에 있습니다 이제 문제는 에스프레소 동기화가 장기간 실행되는 작업에 대해 알고 있어야합니다 이것은 개발자가 아마 스레드에서 코드를 잠자 게하는 것만큼이나 못생긴 일을하십시오

그러나 에스프레소는 실제로는 필요하지 않습니다 Idle Resource를 작성할 수 있기 때문에 공회전 리소스는 간단한 인터페이스입니다 에스프레소를 가르치기 위해 구현하는 개발자로서 사용자 정의 된 장기 실행 태스크의 동기화 앱의 따라서이 유휴 리소스를 사용하여 우리는 대규모 엔드 – 투 – 엔드 테스트를 수행했습니다 더 듬직 해요 이제 중간 크기의 테스트를 몇 가지 추가 할 수있는 방법을 알아 보겠습니다 테스트 스위트에

중형 테스트의 경우 그 (것)들을 작게 유지하고 단 하나 UI 분대에 집중, 곳에 단일 UI 구성 요소는 특정 뷰, 프래그먼트, 또는 활동 이제 예제로 돌아가 봅시다 대규모 엔드 – 투 – 엔드를 더 많이 분리 할 수있는 방법 격리 된 구성 요소 여기이 예제에서 다시, 당신은 주목했을 것입니다 두 가지 활동이있다

왼쪽의 목록 활동 및 추가 오른쪽에 활동을 기록하십시오 지금까지 우리는 대규모 엔드 – 투 – 엔드 테스트를 작성했습니다 그게 우리에게 많은 확신을 주네 코드를 많이 사용하기 때문에 앱에서 큰 엔드 투 엔드 테스트에 적합합니다 그러나 iterative test-driven을 위해 그렇게 좋지는 않습니다

개발주기 그럼 어떻게 이들을 분리 할 수 ​​있는지 봅시다 격리 된 각 활동에 대한 테스트를 격리했습니다 왼편을 격리하기 위해, List 액티비티, Espresso Intent를 사용할 수 있습니다 Espresso Intent는 당신이 가로 챌 수있는 간단한 API 귀하의 진행중인 의도 중 어떤 것도 자신의 콘텐츠를 확인하고, 모의 활동 결과를 제공 할 수 있습니다

큰 API가 실제로 어떻게 보이는지 보도록하겠습니다 보시다시피, 매우 간단합니다 당신은 당신의 성장 의도와 일치하는 의도를 가진 일치자를 가지고 있습니다 활동 결과 버전을 제공 할 수 있습니다

다시 발신자에게 승인 이 API를 사용하여 첫 번째 고립 테스트를 작성해 보겠습니다 이 테스트에서는 첫 번째 행에서 우리는 정확하게 그것을합니다 우리는 우리의 콘텐츠를 가로 채고 우리는 우리 활동 결과의 스텁 버전

이제 두 번째 줄에서 우리가 수행 할 때 새 활동을 시작하는 대신에를 클릭하십시오 에스프레소는이 의도를 가로 챌 것입니다 스텁 액티비티 결과를 제공 할 수 있습니다 마지막 줄에서 UI가 업데이트되었는지 확인하십시오 따라서

이제 격리 된 테스트가 있습니다 승인 이제 예제로 돌아가서 두 번째 부분을 어떻게 분리 할 수 ​​있을까요? 따라서 일반적으로 테스트를 작성할 때 네가 할 수있는 위치에 일부 외부 의존성을 가지고있다 귀하가 통제 할 수없는 곳입니다 앞의 예에서 보았 듯이, 우리는 저장하고 실제 서버에 도달한다는 메모가 있습니다

비록 우리가 지금 다른 자원을 가지고 있지만 지금 그게 더 안정적이게, 당신의 테스트 서버가 어떤 이유로 든 충돌 할 수 있습니다 그래서 당신의 임무는 실패 할 것입니다 우리가 완전히 고립되면 더 좋지 않을까요? 이러한 조건에서 우리의 테스트를 밀폐 된 환경에서? 이것은 당신의 시험을 훨씬 빠르게 할뿐만 아니라, 그러나 그것은 또한 모든 박편을 제거 할 것입니다 그리고이 구체적인 예를 넘어서서, 너 자신을 더 고립시키고 싶어 모든 외부 종속성으로부터

예를 들어 Android 시스템을 테스트하고 싶지는 않습니다 UI 또는 기타 UI 구성 요소 아마 이미 테스트했기 때문에 소유하지 마십시오 그리고 그들은 당신의 알지 못함에도 변화 할 수 있습니다 그래서 당신의 테스트는 실제로 실패 할 것입니다 우리 두 번째 고립 된 방법을 보자

테스트 코드에서 찾을 것입니다 여기에서 핵심은 더 이상 사용하지 않는다는 것입니다 실제 서버 대신, 우리는 밀폐 저장소를 설정했습니다 이제는 여러 가지 방법으로이 작업을 수행 할 수 있습니다

이것은 단지 하나의 방법 일뿐입니다 그럼이 밀폐 저장소를 사용할 수 있습니다 메모가 실제로 있는지 확인하려면 앱 컨텍스트를 벗어나지 않고 저장 됨 또는 네트워크에 타격 그래서이 시점에서, 당신이 그것에 대해 생각한다면, 당신은 더 신뢰할 수있는 두 개의 더 작은 테스트를 가지고 있습니다 훨씬 더 빨리 달릴 수 있습니다

그러나 동시에, 당신은 같은 금액을 유지합니다 귀하의 대규모 엔드 – 투 – 엔드 테스트로 테스트 커버 리지의 그리고 이것이 우리가 더 작은 것들을 더 갖고 싶어하는 이유입니다 대규모 엔드 – 투 – 엔드 테스트에 비해 격리 된 테스트 전에 보여 줬어 승인

이제 개발자 사이클을 반복했습니다 몇 번이고 우리는 모든 검사를 봐야합니다 초록색으로 바뀌면 우리는 자신감을 가져야한다 우리의 특징 그러나 결론을 내리기 전에 미래로 한 순간 도약해라

앱이 성장하고 팀이 성장함에 따라, 앱에 계속해서 더 많은 기능을 추가하게됩니다 그리고 당신은 자신을 어떤 위치에 놓을 수 있습니다 UI가 여러 프로세스에서 실행될 수 있습니다 정확히 Google에서 일어난 일입니다 따라서 Add Notes 예제로 가면, 이것은 다음과 같이 보일 수 있습니다

주 프로세스에서 실행되는 첫 번째 활동이 있습니다 왼쪽에 이제 두 번째 활동이 개인 프로세스에서 실행됩니다 이 경우에는 메모 추가라고합니다 그럼 어떻게 테스트할까요? 음, Android O 이전에는 테스트가 불가능했습니다

하지만 Android O에는 새로운 계측 도구가 있습니다 속성을 정의하기 위해 사용할 수있는 속성 당신이 계측하고자하는 프로세스 테스트를 실행하고 실행하는 동안, 각각의 프로세스는 분리되어 좋은 아이디어입니다 그리고 너는 그것을해야만한다 하나의 테스트에서 경계를 교차 처리하려는 곳

그래서 당신은 아마 에스프레소를 쓰고 싶을 것입니다 시험은 이렇게 보입니다 이것이 프레임 워크 레벨에서 불가능한 것은 아니었지만 Android O 이전에는 에스프레소 수준에서도 불가능했습니다 이 특정 예에서, 에스프레소는 당신의 2 차 과정을 알고 있지도 않습니다 동기화 보증을 유지할 수도 없습니다

우리 모두는 알고 있고 사랑합니다 오늘은 멀티 프로세스 에스프레소 (Multiprocess Espresso) 지원을 발표하게되어 기쁩니다 테스트 코드 나 앱 코드를 변경하지 않고 이렇게하면 UI와 원활하게 상호 작용할 수 있습니다 모든 프로세스를 유지하면서 우리 모두를 유지합니다 에스프레소 동기화 보장

Android Test의 차기 버전에서 사용할 수 있습니다 라이브러리 릴리스 지원 그럼 실제로 어떻게 작동하는지 간략하게 살펴 보겠습니다 전통적으로, 아시다시피,이 예에서는, 우리는 하나의 프로세스에서 시작합니다 Android JUnit Runner 및 Espresso의 인스턴스가 있고, 이 경우에

이제, 우리의 예를 기억한다면, Add Add (메모 추가) 버튼을 클릭하면 새로운 활동이 생겨 이제는 새로운 과정이 생깁니다 이제 문제는 우리가 Android JUnit의 두 가지 인스턴스를 사용하는 두 개의 프로세스 러너와 에스프레소는 서로에 대해 알지 못합니다 그래서 우리가하고 싶은 첫 번째 일 우리는 두 사람 사이의 의사 소통을 만들고 싶습니까? Android JUnit Runners 그리고 이제 우리는이 대화를 나눕니다 우리는 그것을 사용하여 의사 소통을 할 수 있습니다

에스프레소 예 우리가하는 일은 Android JUnit Runner에서 테스트를 등록하는 기능 Android JUnit Runner가있는 Espresso와 같은 프레임 워크 그러면 주자가 모든 핸드 쉐이킹을 용이하게합니다 두 사람 사이의 의사 소통을 위해 필요한 에스프레소 예 이제 두 개의 에스프레소 인스턴스 서로 이야기 할 수 있으면 프로세스 간 테스트를 가능하게하기 위해 그것을 사용하라

모든 동기화 보장을 유지한다 우리가 전에 가지고 있었던 승인 이를 통해 개발자 워크 플로우가 끝났습니다 우리는 당신에게 모든 도구를 보여주었습니다

길의 각 단계에서 사용할 수있다 TDD가 Android에서 발생하도록하기 위해 그리고 그 말로는, 당신이이 흐름을 정확하게 따르지 않더라도, 잘하면, 모든 단일 도구를 사용하는 방법을 알고 있습니다 앱을 가져 오기 위해 우수한 테스트를 작성하는 방법 품질을 한 단계 높여줍니다 따라서 테스트를 작성하고 쓰기 및 실행하려는 경우 Google에서하는 것처럼 테스트합니다 여기에 몇 가지 리소스가 있습니다

너를 시작하게 고마워 우리 생각 엔 질문에 시간을 보내십시오 그렇지 않은 경우 오늘 3시 30 분에 근무 시간이 있습니다

다행히도, 우리는 거기서 만날 것입니다 고맙습니다 [박수 갈채] [음악 재생]

안드로이드 오토, 이제 볼보자동차에서도 마음껏 쓰세요

안드로이드 오토, 이제 볼보자동차에서도 마음껏 쓰세요 볼보 XC60 볼보자동차코리아가 18일, 볼보자동차의 최신 SPA 및 CMA플랫폼이 적용된 주요 차종에서 '안드로이드 오토(Android Auto)' 애플리케이션 서비스를 이용할 수 있게 됐다고 밝혔다

안드로이드 오토는 차에 안드로이드 기반의 스마트폰을 연결해 스마트폰에서 제공하는 특정 기능을 차량에서 구현해주는 시스템이다 내비게이션과 전화, 미디어 등 운전자들이 자주 사용하는 기능을 실내 디스플레이에 직접 연결해 간편하게 사용할 수 있다 운전자의 편의를 위한 음성 제어도 가능하다 구글 어시스턴트(Google Assistant) 음성인식 기능을 통해 운전에 대한 집중력을 잃지 않으면서 일정 확인과 문자 전송, 검색 등 스마트폰의 다양한 기능을 사용할 수 있다 안드로이드 오토는 호환되는 스마트폰에 안드로이드 오토 애플리케이션을 설치하고 실내 USB 포트에 연결한 뒤 약관을 승인하면 사용할 수 있다

 음성 제어는 스티어링휠 우측의 보이스 컨트롤 버튼을 약 1~2초간 길게 눌러 활성화하면 된다 볼보 크로스컨트리 해당 기능 화면은 실내의 세로형 9인치 센터 콘솔 디스플레이에서 구현된다 사용자는 안드로이드 오토 앱을 디스플레이에서 직접 터치하거나 스티어링 휠의 우측 키패드를 조작, 모바일 기기 조작을 통해 제어할 수 있다 안드로이드 오토 서비스가 지원되는 차량은 크로스 컨트리(V90)과 S90, XC90(2017년형 모델부터), XC40과 XC60(2018년형 모델부터)이다

해당 서비스는 신형 S60을 비롯한 차후 출시될 모든 신차에서도 사용 가능하다 차종 및 서비스 사용 안내는 볼보자동차의 안드로이드 오토 사용 안내 사이트에서 확인할수있다 이미지 : 볼보자동차

✅ 벤츠도 ‘안드로이드 오토’ 활성화..S·E클래스 등 주력 모델 적용

[데일리 카 하영선 기자] 메르세데스 벤츠 코리아는 스마트 폰으로 S 클래스 · E 클래스와 같은 모델을 선보였다 Android (Android Auto) 안드로이드 오토는 차량 및 스마트 폰을 사용하고, 음성 명령을 내리고, 전화, 미디어 스마트 폰의 기능을 통해 차량을 작동시킵니다

국내 부 카카오 내비게이션과 연동 표시기 안내는 물론, 음성 인식을 할 수있는 경로 설정 등의 서스가 가능하다 (Apple Car Play®) '와 함께 스마일 네트워크 구축'을 통해 사용자 편의를 도모 할 수있게되었습니다 중 메르세데스 벤츠 차량 고 멀티미디어 고해상도 디플레이이닝, 내비게이션 등등 헤드 업 디스플레이 (headup display) 사용중인 Android 스마트 폰) '앱을 설치 한 후 차량 센터 아이콘을 클릭하십시오 USB 포트에서 스마트 폰을 연결하십시오 E 클래스 전 종과 S 클래스 (8 년식), 207 년식 이후 GLS, GLE 쿠페 GLE, GLS, CLA 등등 클래스가 다른; 자동차 뉴스 데일리 카 http : // ww dailycarco

kr 본 기사에 기부금 전재 및 환불 [관련 기사] ▶ ▶ ▶ ▶ ▶ ▶

Tabs and ViewPager (Android Development Patterns Ep 9)

안드로이드 개발 패턴에 오신 것을 환영합니다 저희는 여러분이 더 나은 앱을 만들 수 있도록 하는데요 저는 이안 레이크입니다 시작해보겠습니다 앱에서 이동하는 방법을 생각해보시길 바랍니다 패런트뷰 (Parent View)에서 상세보기로 이동하거나 시블링뷰 (Sibling View) 사이를 이동할 수 있습니다 여기에서 탭과 뷰페이져(ViewPagers)가 필요합니다 뷰페이저가 무엇일까요? 이로 인하여 콘텐츠가 있는 다양한 페이지 사이를 스와이프하는 것을 제어할 수 있습니다 뷰페이저는 페이저어댑터에서 콘텐츠를 가져옵니다 이건 각각의 페이지나 전체 프래그먼트를 위한 일반적 보기가 될 수 있는데요 FragmentPagerAdapter나 FragmentStatePaferAdapter를사용하고 계신다면 FragmentStatePaferAdapter는 모든 프래그먼트를 유지시키고 메모리에서 생성되어, 이미 로드 된 탭 사이를 전환하는 걸 더 가볍고 빠르게 만듭니다 하지만, 메모리 측면에서 보면 무게가 있는 편입니다 많은 개수의 프래그먼트를 가지고 있다면 말입니다 FragmentStatePagerAdapter과 같은 것은 필요에 따라 프래그먼트를 제거하고 다시 생성하면서 해결하여 오로지 상태를 유지합니다 PageAdaptor에는 많은 것들이 있지는 않습니다 여러분이 가지고 있는 페이지의 수로 반환하기 위해서 getCount를 치환해야 합니다 FragmentPagerAdapter의 경우에 getItem을 실행해야 합니다 그러면 각각의 위치에 연결된 프래그먼트가 반환될 것입니다 여기에서는 각각의 위치를 위한 오른쪽 프래그먼트를 선택하여 간단한 switch statement을 해보겠습니다 하지만 여러분이 원하는 접근법을 사용하셔도 괜찮습니다 여기에서 치환해야 할 또 다른 것은 각각의 페이지에 적혀있는 문자열을 반환하는 getPageTitle입니다 페이지에 제목이 왜 필요할까요? 여러분의 뷰페이저에 연결된 몇 가지 탭을 가지기를 원하면 이러한 페이지 제목이 정말로 유용할 것입니다 탭은 모든 페이지를 끝까지 보지 않더라도 사용자들이 페이지에 있는 것들을 쉽게 볼 수 있도록 합니다 이를 통하여 사용자들은 탭을 선택하여 페이지 사이를 건너뛸 수도 있습니다 안드로이드 디자인 지원 라이브러리에 속한 탭레이아웃 클래스는 모든 머티리얼 디자인을 사용하여 탭을 실행하기 쉽도록 만들어 줍니다 그리고 이전 버전인 안드로이드 21까지 호환이 됩니다 전부 다같이 다뤄보겠습니다 먼저 뷰페이저를 setAdapter를 사용하여 페이저어댑터에 연결시켜야 합니다 그 다음에 탭레이아웃을 연결하는 것은 setupWithViewPager 하나의 방법입니다 이를 통해서, 페이저어댑터의 제목에서 탭을 만들 수 있습니다 그러면 페이지를 스와이프 하면서 탭을 변경하고 탭을 선택하면 페이지가 변경될 것입니다, 예상했듯이요 디자인 라이브러리를 추가하여 탭레이아웃과 뷰페이저를 시작해보시길 바랍니다 디자인 가이드라인과 상세한 훈련 문서를 확인하시는 것도 잊지 마시길 바랍니다 안드로이드 개발 패턴에 함께해주셔서 감사합니다 탭과 뷰페이저를 사용하여 더 나은 앱을 만드시길 바랍니다

데레스테 – 나는야 고철 안드로이드 (デレステ – アタシポンコツアンドロイド) MV

나는 고철 안드로이드 주인님 좋아해요

두근두근 사랑에 빠져버렸어 좋아 좋아 주인님 셀룰로이드 안경이 사랑스러워 가정부인 수수한 로이드가 사랑에 빠지다니 말도 안 돼 당신은 아마 모르겠지 두근거린 순간에 무언가 시작됐어 고물인 나, 이제 곧 터질 것 같아 규잉- 근질근질 근질근질 두근두근 알몸이 되어버릴까 (되어버려!) 하트를 보여줄까 (보여줘!) 갓 태어난 보석은 핑크 회로는 진작에 타버렸어 (팡!) 인간이 된 걸지도? (깜짝!) 기적이 일어난다는 건 이런 거야? (츄루루루루루루) 오늘부터 성가신 사랑을 하게 된 여자아이랍니다 쨘쨘 알몸이 되면 안 되겠지 (안돼 안돼!) 하트를 보여주면 무섭겠지 (츄루루루루루루) 오늘부터 부조리하고 귀여운 여자아이랍니다 쨘쨘 여자아이랍니다 쨘 쨘쨘 쨘쨘쨘 쨘쨘쨘쨘 쨘

What’s New in Android (Google I/O ’17)

안녕하세요, Android의 새 기능에 오신 걸 환영합니다 제 개인적으로 Android 키노트라고 부르고 싶습니다 Android UI 툴킷 팀에서 온 쳇 하제입니다 전 그래픽 팀의 호만 기입니다 전 시스템 UI 팀의 댄 샌들러입니다 시간이 얼마 없으니 바로 시작하겠습니다 Android의 새 기능을 볼 준비 됐나요? 지난 번에 여기에서 그만 뒀죠, API 25 그냥 깃-sha를 하고 깃-diff에 넣으면 다 된 거죠 이거 받아 적으세요 좋습니다 다음이요 네, 그것도 좋았죠 맘에 듭니다 이걸 이넘으로 만들 뻔 한 거 기억나요? 정말 웃겼죠 됐죠? 사람들이 이거 보러 왔다고 생각해요? 왜 이 생각을 못 했을까요 저희는 이 발표를 오래 해 왔습니다 새 기능을 몇 년째 알려 드리죠 보시다시피 자켓을 안 입고 왔죠 사실 예쁜 빨간 자켓이 있었는데 키노트 때 누가 빌려 갔죠 됐죠 당신 [청취불가] 하는 것 같아요 그러나 올해는 조금 다릅니다, 그렇죠? 훨씬 미리 개발자 미리보기가 있었고 이런 API 많이 보셨을 겁니다 Google 키노트에서도 신나는 일을 좀 자랑했죠 개발자 관련 일을 더 많이 알게 된 개발자 키노트도 있었죠 그럼 우린 뭐하는 거죠? Android의 새 기능 세션이 왜 필요하죠? 존재 위기이죠 그럼 클리커 시험해봤어요? – 했죠 – 네 이 발표를 와인 시음이나 위스키 시음이나 여러 버튼을 누를 수 있는 탄산음료 기계라고 생각하세요 Android 새 출시에서 놓쳤을 지도 모르는 것을 수공업으로 직접 선택한 겁니다 Android O의 일부분이 되려면 해야 할 것들이고 솔직히 저희가 무대에서 말하고 싶은 것들일 뿐이죠 이것이 Android의 새 기능입니다 구체적으로 개발자 미리보기나 I/O 키노트나 다른 키노트에서 놓쳤고 여러분이 관심을 가져야 하는 이유에 대한 거죠 오늘 꼭 하고 싶은 마지막 부분은 바로 이겁니다 모든 분들이 항상 이에 대해 흥분하지만 마지막에 다루도록 하겠습니다 괜찮을 겁니다 좋습니다, 시작하죠 로맨, UI와 그래픽 시작하죠 네, 시작하겠습니다 저희가 다루고 싶은 첫 번째 기능은 오늘 아침 키노트 중에서 보신 겁니다 쳇, 이 클릭커 안 됩니다 테스트 안 한거죠 시간 낭비 중이죠 여기 뒤에 서서 제가 슬라이드 넘겨 줄게요 – 알겠습니다 – 다음 슬라이드 부탁해요 이래서 미리 안 준 거죠 알겠습니다 전 괜찮아요 그냥 그 뒤에 있어요 안 보고 싶어요 오늘 아침 키노트에서 보신 첫 기능은 사진 속 사진은 더는 TV만을 위한 것이 아니라 핸드폰에서도 됩니다 여기 제 3자 애플리케이션의 예가 있죠 여러분 핸드폰에서 실행되는 넷플릭스도 사진 속 사진이죠 클리커 주세요 다시 가죠 됐네요 여러분의 애플리케이션에서 실행하기 정말 쉽습니다 그냥 목록만 수정하면 됩니다 애니메이션도 그만 하시죠 사진 속 사진 지원하기 트루라고 하면 되죠 O에서는 크기 조정 가능한 활동 트루 속성이 더는 필요 없고 컨피겨레이션 변화도 검사하셔야 합니다 그리고 코드에서 사진 속 사진 모드로 들어가고 싶으면 라인 하나만 부르면 되죠 getActivity와 enterPictureInPicture하면 되죠 정말 간단하고 사용자를 정말 행복하게 해 줄 겁니다 다음은 제가 정말 아끼는 기능이죠 색깔 관리입니다 O를 대신할 넓은 색영역 지원도 추가했죠 모든 기기에서 되는 건 아니죠 이 기능을 지원하는 기기만 여러분의 앱을 위해 이를 켜줄 겁니다 16비트 PNG 파일 지원이 추가되니 더 넓은 색깔과 채도가 더 넓은 색도 생기죠 ICC 프로파일을 지원하니 색깔 프로파일이 JPEG, PNG, WebP에서 비트맵에 임베드되죠 여러 화면에 걸쳐 색깔을 정확하게 전달해줄 겁니다 새로운 API도 많이 있죠 그건 다른 발표에서 주말에 더 얘기하겠습니다 사진 한장이 백마디 말보다 나으니 이것이 사진 관리이고 그 원리입니다 이해 잘 되시길 바랍니다 어쨌든 사진 관리는 아마 여러분의 앱으로 경험하는 것이겠죠 색깔은 기기에 따라 다르게 보입니다 따라서 Android O에서 해결책을 만들었죠 더 알고 싶으시면 제2무대에서 금요일 11시 30분에 제가 발표할 겁니다 색깔 이해하기라는 제목이죠 다음으로 다양한 디스플레이에 대한 지원도 추가했습니다 여러분의 애플리케이션이 이미 클리커가 잘 안 되네요 여러분의 애플리케이션이 이미 다양한 창을 지원한다면 여러 창 모드를 지원한다면 그 앱은 O에서 이미 다양한 디스플레이를 지원하게 될 겁니다 핸드폰이나 네트워크 기기가 다양한 디스플레이에 연결되고 호완되는 앱이 있다면 사용자는 다른 디스플레이셔 여러분의 애플리케이션을 보내도록 선택할 수 있죠 이럴 때 크기 변화 컨피겨레이션 변화가 생기겠죠 어느 디스플레이에서 활동을 보일지도 제어할 수 있습니다 이를 위해 활동 옵션을 사용하시면 됩니다 이 기능을 지원하고 싶으시면 꼭 여러분의 앱을 검사해 보세요 검사를 돕기 위해 새 개발자 도구 두 가지를 만들었죠 adb shell dumpsys 디스플레이를 실행하시면 됩니다 기기에서 현재 사용 가능한 모든 디스플레이 목록을 보여주죠 활동 인텐트로 adb shell start를 부르면 활동을 시작하고 싶은 기기를 구체적으로 정할 수 있죠 따라서 검사하기 아주 쉬운 방법입니다 API에는 더 많으니 오피스 아워에 가시길 권장합니다 목요일과 금요일이고 Windows와 활동에 대한 오피스 아워이죠 다음은 미디어 미디어 패키지에 굉장히 유용한 클래스가 많습니다 미디어 플레이어, 미디어 레코더 익스트렉터 그리고 코덱이 있죠 새 getMetrics API도 각각의 모든 클래스에 추가했죠 이는 여러분이 다루고 있는 미디어에 대한 정보를 쿼리할 때 도와주죠 따라서 해상도, 코덱 비트레이트, 지속 기간 등의 데이터를 쿼리할 수 있죠 사용하기 정말 쉽죠 오브젝트에 getMetrics만 불러오면 되죠 PersistableBundle이 있고 developerandroid

com에서 문서를 찾아보시면 됩니다 어떤 쿼리가 있는지 궁금하시면 말이죠 재생도 많이 향상되었죠 이제 여러분 앱의 버퍼링도 제어할 수 있습니다 높고 낮은 워터마크도 구체적으로 정할 수 있죠 비디오의 재생은 워터마크가 낮아질 때까지 시작하지 않을 겁니다 그 시스템은 이 높고 낮은 워터마크 사이에서 캐시 데이터를 유지하려고 최선을 다 하겠죠 지속시간나 데이터 양 크기에서 워터마크를 구체화할 수도 있습니다 찾기 기능도 향상됐습니다 비디오에서 찾기 기능을 할 때 그 행동을 선택할 수도 있죠 가장 가까운 프레임을 찾고 싶은지 다음 키프레임, 이전 키프레임 혹은 가장 가까운 동기화 프레임을 찾고 싶은지 말이죠 마지막으로 모든 애플리케이션에서 더 쉽게 사용할 수 있도록 Widevine으로 DRM 재생도 만들었죠 레코딩의 경우 지금까지 미디어 믹서는 하나의 비디오 혹은 오디오 트랙만 추가할 수 있었죠 이제 원하시면 얼마든지 오디오나 비디오 트랙을 추가할 수 있습니다 또한 맞춤형 트랙도 만들 수 있죠 MIME 타입은 애플리케이션으로 시작해야 하고 기본적으로 원하시는 어떠한 데이터도 인코딩할 수 있는 사이드 밴드이죠 정규 예시는 자바스크립트 데이터를 인코딩하는 거죠 360개의 비디오를 재생하고 싶거나 하면 말이죠 WebView는 정말 유용한 새 API와 함께 옵니다 브라우징을 저장하는 기능을 추가했죠 Chrome을 통해 아시고 좋아하시는 부분이죠 이는 멀웨어와 안전하지 않은 웹페이지를 탐지합니다 따라서 여러분 목록에 이 메타 데이터 태그를 추가하면 이는 Chrome 자체가 여러분의 사용자들을 위해 브라우징 경험을 안전하게 하려고 사용하는 것과 같은 후단부와 API를 쓰겠죠 WebView은 이제 다양한 처리를 사용하죠 특히 렌더 처리가 있습니다 또한 이러한 다양한 처리를 다루기 위한 새 API도 있습니다 따라서 렌더 과정이 고장나면 이 고장을 탐지하는 터미네이션 핸들 API를 쓰면 되죠 애플리케이션에서 뭘 할지 정하는 거죠 원하시면 애플리케이션을 고장내도 되고 WebView를 다시 시작하려고 하거나 뭔가를 로그해서 사용자에게 메시지를 보여줘도 됩니다 이전보다 훨씬 우아하죠 또한 렌더 중요 API를 사용해도 되죠 메모리가 적은 경우를 더 잘 해결하기 위해서 말이죠 시스템 메모리가 적을 때 어딘가에서 RAM을 되찾으려고 하겠죠 그러면 WebView가 애플리케이션에 정말 중요한지 별로 중요하지 않은지 그 시스템에 말해주는 거죠 WebView가 여러분의 애플리케이션에 아주 중요하다면 이 API를 꼭 봐야겠죠 오른쪽 버튼인 거 알고 계시죠? 네, 알아요 애니메이터, 특히 애니메이터세트를 위한 긴 요청된 기능이 몇 개 있습니다 실행하기 거짓말처럼 어려워서 시간이 좀 걸렸죠 하지만 Android O에서는 이제 애니메이터세트에서 찾기 능력이 생겼습니다 이제 아동 애니메이션 모음집인 애니메이터가 있다면 전체 애니메이터세트에서 아동 애니메이터를 찾을 수 있는 거죠 그렇습니다 이런 능력도 있습니다 뒤집기 쳇, 그 API 오래 전에 실행하려고 하지 않았나요? 글쎄요 마지막에 API를 실행한 사람은 누구죠? 전 아니죠 – 네 – 네 바로 그거죠 애니메이터세트에서의 새 기능은 뒤집기이죠 기능성을 가진 별도의 애니메이터를 설치해서 리스너를 받고 그럴 필요가 더는 없다는 거죠 저희가 모든 지루한 작업을 다 해드렸죠 자동완성이죠 반복해서 내용을 수정하는 건 정말 지루하죠 전에 키노트에서 봤죠 이런 기능인데 작성해야 할 폼이 있고 그 정보를 여러분에게 줄 수 있는 제공자가 있죠 따라서 그 문자 필드를 받으면 여러분의 위해 저희가 자동으로 그 정보를 입력할 수 있죠 이에 대한 다른 측면도 몇 개 있습니다 하나는 여러분 각자의 서비스를 실행할 수 있는 능력을 드리거나 저희가 대신 제공하는 서비스에 의존할 수 있다는 점이죠 혹은 좀 더 전형적으로 클라이언트를 실행할 겁니다 표준 뷰만으로도 되죠 텍스트뷰나 에딧뷰를 사용한다면 서비스와 상호작용하기 위해 이 정보를 어떻게 받을지 저희는 이미 알죠 따라서 표준 뷰를 위해 아무것도 안 해도 됩니다 맞춤형 뷰를 쓰시거나 표준 뷰에 대해 더 많은 정보를 제공하고 싶으시면 저희한테 힌트를 주는 API가 있죠 밸류 타입이 뭔지 API가 저희에게 여러분의 맞춤 뷰에 대해 또 여러분이 어떻게 상호작용하고 싶어하는지 더 얘기해주죠 또한 맞춤 뷰 위계가 있다면 내부 뷰가 있는 표면 뷰가 있지만 저희가 아는 건 표면 뷰가 있다는 게 다라고 가정하면 API가 저희에게 여러분이 저희와 상호작용하고 싶어하는 가상 위계에 대해 말해 주는 거죠 금요일 오전 세션에 이에 대해 더 많은 내용을 다룰테니 자동완성에 대해 더 알고 싶으시면 참석해 주세요 이제 텍스트에 대해 좀 이야기해 보죠 이번엔 텍스트 쪽에서 많은 일이 일어났죠 다시 적어도 될 것 같아요 됐죠 이 폰트는 오로지 덴에게 상처주려고 쓴 겁니다 신체적으로 괴롭히거든요 멋지죠 덴을 망친 것 같아요 좋습니다, 먼저 폰트 정보를 디클레어하기 위해 XML을 사용할 수 있죠 멋진 데이터 바인딩으로 말이죠 하지만 좀 까다롭습니다 그리고 이 기능을 제공해야 하는 이유가 굳이 있을까요? 지금은 있죠 이제 폰트 파일을 이 새 리소스 폰트 디렉토리에 직접 넣을 수 있는 겁니다 정말 멋지죠 디렉토리에 넣거나 저희한테 폰트 페밀리에 대해 말해주면 됩니다 각각의 스타일에 대한 정보로 여러 폰트를 제공할 수 있고 다른 리소스와 마찬가지로 폰트를 바로 사용할 수 있게 되죠 코드에서 그냥 그 리소스를 달라고 하면 되는 겁니다 다운로드 가능한 폰트죠 이제 폰트를 디클레어할 수 있는 기능이 있으니 이제 아직 없다면 저희가 여러분을 위해 시스템에 다운 받아 캐시할 수 있는 거죠 혹은 시스템에 있다면 캐시에서 사용하겠죠 코드나 XML에서 하실 수 있고 신나는 이전 슬라이드에서 XML 폰트로 한 것처럼 리소스로 사용하시면 되죠 아직 출시되지 않은 버전의 Gooogle Play 서비스에서 폰트 제공자도 제공할 겁니다 이번 주 학회에서 베타 버전을 이용하실 수 있죠 자세한 건 모르지만 자세히 배우실 수 있는 세션도 있고 아니면 Play 서비스 웹사이트에서 더 자세히 배우실 수 있을 겁니다 이는 모든 Google 폰트을 이용할 수 있게 해줍니다 표준 폰트를 사용하고 싶으시면 예컨대 제가 이 섹션 시작 때 사용한 아름다운 폰트 같은 거죠 그것도 아마 거기 있을 겁니다 서비스에서 바로 물어보시면 됩니다 또한 자동 사이즈 변환 텍스트뷰 기능도 있습니다 보통 텍스트뷰의 사이즈를 조정하면 뭐가 성공할지 정말 아무도 모르죠, 그렇죠? 텍스트 텍스트는 멋집니다, 특히 적당한 폰트가 있을 때 말이죠 이제 좌측에서의 행동이 나타나죠 뷰 자체의 크기를 조정하는 거죠 폰트에는 변화가 없습니다 그러나 우측에는 자동 크기 변경 텍스트뷰 행동을 선택하셨다면 여러분을 위해 폰트 크기를 조절할 겁니다 쓰고 싶은 행동이나 증가 단계나 크기가 조정될 때 원하는 특정 크기에서 멈출 수 있도록 구체적으로 정할 수 있습니다 이를 위한 API가 있죠 XML과 자바 프로그래밍 언어 코드 모두에 API가 있으니 마음대로 하시면 되죠 또한 이 모든 텍스트 기능 즉 XML 폰트, 다운 가능한 폰트 자동 크기 변경 텍스트뷰는 지원 라이브러리의 새 기능 관련 세션에서 내일 아침 모두 얘기할 겁니다 그럼 여러분들은 왜 지원 라이브러리 세션에서 이런 말을 할까 궁금하시겠죠? 이건 O 플랫폼 API 아닌가요? 맞습니다 또한 지원 라이브러리에도 있습니다 이 모든 기능을 이전에 출시된 버전에서도 모두 사용할 수 있는 거죠 접근성서비스 유틸리티 접근성서비스에서 쓰고 있다면 유용한 일이죠 여러분이 사용할 수 있는 새 기능들이 있습니다 언어 탐지는 접근을 더 쉽게 만드는 다른 버튼과 함께 내비게이션 바에 버튼을 두는 기능이죠 접근성 음량을 위한 별도의 음량 조절도 있죠 기기의 다른 음량과 섞이지 않도록 합니다 또한 맞춤형 지문 제스쳐를 정의하는 기능도 있죠 이에 대해 더 알고 싶으시면 오늘 오후에 접근성 관련 세션이 있으니 확인하시기 바랍니다 마지막으로 제가 가장 좋아하는 작은 변화는 제가 작다고 말한 건 API를 위한 코드 한 줄이기 때문이지만 이전 실행에 의존하는 모든 코드를 고치려는 실제 cl은 엄청납니다 그 중요성을 손상시키고 싶진 않습니다 하지만 API 측면에서는 정말 작고 숨겨졌죠 밖에서 보면 거의 같아 보입니다 findViewById는 이렇게 드클레어 됐었죠 퍼블릭뷰, findViewById 등으로 말이죠 그러고 나서 그걸 부르고 리소스 ID를 넘겨서 뷰를 가지고 나면 바로 원하는 것으로 캐스트되는 거죠 따라서 텍스트뷰에 이를 말해야 합니다 좌측 우측 모두에서 말이죠 그리고 괄호가 있고 좀 귀찮죠 이게 보기 너무 흉하다는 이유만으로 사람들은 헬퍼 라이브러리를 씁니다 이제 이게 생겼죠 전 이 기능을 캐스트어웨이라고 부릅니다 제 생각에 저만 그런 것 같지만요 제 첫 장을 그냥 저렇게 넘기죠 괜찮아요 여러분이 보시게 될 시스템 UI에 대해 조금 얘기해 보겠습니다 앱이 있으시면 어댑티브 아이콘을 아셔야겠죠 오늘 좀 전에 있었던 스테파니의 슬라이드에서 아주 잠깐 언급된 것 같습니다 근본적으로 저희는 여러분의 시간과 돈을 절약하려는 거죠 요즘 론처가 정말 많고 그 각각은 아이콘 모양에 대해 다른 제안을 합니다 따라서 어댑티브 아이콘은 여러분이 O에서 이렇게 할 수 있도록 하는 새로운 기술이죠 여기 내 배경이 있고 전경이 있으니 원하는 모양으로 잘라내라고 말이죠 따라서 론처가 동그라미나 둥근 사각형이나 흉한 모양이더라도 지역색을 정확히 맞춘 아이콘이 생기는 겁니다 어댑티브 아이콘에 대한 정보가 목요일 발표에 많을 겁니다 꼭 가 보세요 그럼 쇼트컷과 위젯에 대해 얘기해 보죠 론처 또한 시스템 UI의 일부이기 때문이죠 이전에 사용자 화면에서 쇼트컷과 위젯으로 가려면 작동되는 쇼트컷에 대한 알림이 있었고 위젯의 경우 사용자에게 사정해야 했죠 론처 내에서 위젯을 찾을 수 있는지 말이죠 O에서는 이제 이러한 것들이 사용자 작업공간에 고정되도록 요청할 수 있습니다 쇼트컷은 쇼트컷 매니저를 통해 위젯은 앱 위젯 매니저를 통해서 말이죠 그러면 사용자는 이럴 수 있는 기회가 생기죠 내 데스크탑에 그건 싫어 혹은 그래, 좋아 또한 사실 원하는 곳에 정확히 넣을 수도 있습니다 물론 그냥 위치 선정해 줘 해도 되죠 이는 이전 행동이었죠 이제 긴 플로를 사용자에게 설명할 필요 없습니다 이 대화로 바로 보내면 되는 거죠 정말 편리하죠 여러분의 위젯을 사용할 모든 새로운 사용자를 생각해 보세요 실제로는 여기 클릭커로 고생할 때 박수를 위해 잠시 중단하는 척 할 수 있죠 목요일 4:30분에 이 모든 것에 대해 이야기할 겁니다 다음은 예상하셨겠지만 알림이죠 정말 유용합니다 집중도를 위해 좋죠 사용자도 좋아합니다 약간 통제불능일 수도 있죠 지금 알림 스트림에서 사용되는 것이 아주 많고 원하는 메시지를 사용자에게 전달하기 아주 힘듭니다 사용자가 요구사항의 유입에 그들의 주의를 관리하기 상당히 여럽죠 이제 통제불능이지만 사용자는 항상 통제할 수 있어야죠 그것이 애초부터 저희의 원칙이었습니다 젤리 빈에서 패키지로부터의 알림을 차단하는 기능을 추가했습니다 또한 누가는 약간 정비해서 무음도 추가했죠 하지만 이 모든 것을 통해 사용자에게 가장 많이 받는 요청은 이겁니다 일부 앱의 알림만 차단할 수는 없나요? 반면 개발자로부터 가장 많이 받는 요청은 사용자가 제 알림의 일부만 차단할 수는 없나요? 하는 거죠 똑같은 겁니다 모두가 같은 걸 요구하고 있는 거죠 이때 알림 채널이 등장하는 거죠 O의 새로운 API로 채널은 모두 같은 행동을 공유하는 앱 하나의 지명된 알림 카테고리입니다 진동, 소리, 빛, 화면에 뜨던 사용자는 표면적이고 정교한 통제력을 가지는 거죠 앱에 있고 여러분은 각자의 채널을 모두 설정해야죠 O를 위한 기본값 행동을 정의하면 개인 메시지가 뜰 겁니다 태그는 아마 뜨지 않거나 더 낮은 우선순위를 가지겠죠 그러면 사용자가 알림을 길게 누르거나 새 슬라이드 제스쳐로 어느 채널에 있는지 볼 수 있고 바로 그 라인에서 바꿀 수 있습니다 일단 O를 겨냥하시면 2분 간의 저의 발표에서 이것만 기억해 주세요 모든 알림에 대한 채널을 사용하셔야 합니다 안 그럼 빠질 거예요 따라서 O를 겨냥하실 때까지 천천히 알림 시스템을 채널로 진화시키기 시작하세요 O를 겨냥하신다면 모두 채널화되어야 합니다 사용자가 자신이 뭘 얻게 될지 아는 것에 대해 일관된 경험을 제공하려고 노력 중이니 말이죠 그리고 저희는 이 내용과 다른 많은 멋진 내용 디디자인 고려와 여기 넣지 못한 모든 코드, 또 저기 깜빡거리는 작은 것 등을 내일 4:30에 발표하겠습니다 시스템 UI에 멋진 것들이 많이 추가됩니다 여기 그 중 일부의 목록이 있죠 또 다 적지 못했죠 전 슬라이드에 저러는 거 좋아해요 개발자 미리보기를 확인하시거나 베타를 설치해서 이용해 보는 것을 적극 권장하고 싶습니다 정말 뿌듯합니다 미국 개발자를 위한 새로운 API는 분명 모두 디버깅에서 사용하시는 스트릭트 모드 API를 확장시켰습니다 따라서 이제 스레드팔러시에서 버퍼되지 않은 I/O를 사용할 때 경고를 받을 수 있죠 버퍼된 스트림으로 쌓여지지 않은 인풋 혹은 아웃풋 스트림을 사용하면 플레시 같은 여러분이 설정한 경고를 유발할 겁니다 Vm팔러시에서는 소켓을 태그하지 않으면 경고를 받을 수 있죠 소켓을 태그하는 건 Android 스튜디오를 사용한 디버깅을 트래픽할 때 정말 유용하죠 마지막으로 또 다른 인텐트를 열 때 여러분의 앱 밖으로 인텐트를 보내고 허락을 줘야 할 때도 경고를 받을 수 있죠 사용하기 쉽습니다 이전 API와 비슷하죠 미디어 파일 에세스 오래 전 문서 제공자를 소개했었죠 두 버전 전이었고 정말 유용했습니다 큰 문서의 경우를 제외하면 말이죠 큰 문서가 있으면 그 문서 제공자의 사용자에게 넘기기 전 데이터 전체를 다운로드 받아야 했죠 이제 찾을 수 있는 파일 설명어를 만들 수 있습니다 오디오, 비디오 혹은 어떠한 큰 유형의 콘텐츠에도 정말 유용하죠 또한 사용하기도 정말 쉽습니다 따라서 저장매니저로 가서 프록시 파일 설명어를 열고 콜백을 주면 문서의 크기를 요청하는 콜백을 유발하게 되겠죠 바이트 열에 데이터 양을 요구하면 저희가 언제 닫을 건지 말해 드릴 겁니다 캐시된 데이터 이는 새 API로 여러분을 더 나은 시민으로 만들어주는 시스템입니다 각 앱은 캐시 파티션에서 사용할 수 있는 특정한 한도가 있죠 시스템에 저장 용량이 부족해지면 캐시 데이터의 일부를 삭제하기 시작할 겁니다 따라서 주어진 한도 이하에 머무르면 데이터가 삭제되는 것을 피할 수 있겠죠 이를 위해 저장매니저를 사용하시면 됩니다 여러분 앱에 할당된 바이트 수를 쿼리할 수 있죠 가끔 쿼리하셔야 합니다 여러분이 사용하는 양에 따라 그 한도가 바뀔 수 있기 때문이죠 혹은 사용자가 얼마나 자주 그 앱을 사용하는가에 따라 말이죠 그런 후 데이터를 할당하고 싶을 때 바이트할당하기를 사용하면 되죠 스스로 하실 수 있죠 그냥 파일, 아웃풋 스트림을 만드셔도 되겠죠 하지만 이 방법이 훨씬 낫습니다 필요할 때 바이트할당하기를 쓰시면 시스템이 여러분의 데이터 공간을 위해 다른 앱의 캐시 데이터를 삭제하기 때문이죠 따라서 getCacheQuotaBytes는 기기에 남아있는 여유 공간보다 더 클 수도 있습니다 setCacheBehavior Tombstone를 사용하실 수도 있죠 여러분의 앱이 캐시된 적 없는 파일과 캐시됐지만 지워진 파일 사이의 차이를 구분할 수 있도록 하는 데에 유용하죠 따라서 그 행동을 설정하고 시스템이 캐시에서 일부 파일을 삭제한다면 그 파일을 잘라낼 겁니다 따라서 그 파일은 여전히 있지만 크기가 0으로 설정되죠 이는 시스템이 그 캐시를 삭제했다고 말해주는 겁니다 마지막으로 사용 가능 공간과 할당 가능 공간은 다릅니다 이번 출시에서 Android 안전에 많은 일이 일어나죠 시간이 조금 밖에 없지만 Android O에 새로 나온 개인 정보 보호 정책 일부를 언급하겠습니다 Android ID를 사용해 오셨다면 이제는 모든 앱과 모든 사용자에 대해 달라질 것이라는 걸 아셔야 합니다 더는 같은 기기에서 앱 사이에 사용자를 추적하기 위해 사용될 수 없죠 유사하게 nethostname을 얻기 위해 시스템 속성을 봐 왔다면 지금은 비어있습니다 따라서 맥락에 맞는 광고를 사용자에게 보낼 수 있기 위해 광고 ID가 필요할 경우 Google Play 서비스에서 광고 ID API를 사용하시면 됩니다 Google Play에서 확인해 보세요 하지만 Android ID는 사용할 수 없습니다 더는 지금까지 하신 것처럼 신뢰하시면 안 됩니다 여기 웹뷰에 대한 슬라이드가 있었는데 로맨이 치웠죠 웹뷰에서의 안전한 브라우징에 대해 하나 더 말씀드리고 싶은 것은 이제 웹뷰가 6달마다 Play 스토어로 푸쉬되기 때문에 롤리팝까지 거슬러 올라가는 안전한 브라우징 기능을 선택할 수 있을 겁니다 아주 멋진 기능이죠 또한 키노트 때 밝혀졌죠 Google Play 보호라고 부르는 것으로 이전에 가지고 있던 많은 기술이지만 보여드리지 못했던 겁니다 정말 그럴 가치가 있죠 저희가 항상 사람들을 지켜주기 때문이죠 따라서 Google Play가 있는 어떠한 기기도 보호를 켤 수 있습니다 Play로 업로드되는 모든 앱은 미리 검열되고 업로드되는 새 버전마다 다시 검열됩니다 또한 앱을 설치할 때마다 Play 보호가 설정되어 있으면 그 앱 또한 검열될 겁니다 다른 스토어나 ADB 설치에서 가져온 것이라도 말이죠 정말 신나는 일이죠 할 말이 더 많습니다 Android 안전에 대해서 말이죠 슬라이드 더미를 저한테 주더군요 그래서 따로 발표하지 그래? 했죠 실제로 그렇게 말하진 않았죠 발표 따로 있거든요 목요일 2:30에 Android 안전의 새 기능을 알게 될 겁니다 커널에서부터 웹뷰에 대한 더 많은 사항까지 모두 말이죠 언어와 런타임 제가 할 말을 이미 아실 것 같습니다 오늘 아침 코틀린에 대한 공식적인 지원을 발표했죠 무대에서 스테파니를 보셨을 겁니다 여기 통로에 보이네요 I/O에서 스테파니를 보시면 감사 인사해 주세요 스테파니와 팀 전체가 과거에 정말 멋진 일을 해냈죠 얼마의 시간이 걸리든 해냈습니다 그러니 감사를 전해주세요 여러분의 감사를 팀 전체에게 전해줄 겁니다 오늘 Android 30에서 이용 가능하죠 이미 온라인에 문서가 많습니다 전 코틀린에 대해 몇 시간 얘기할 수도 있어요 왜 여러분과 저희에게 좋은지 말이죠 – 제가 잠시 말해도 될까요? – 되죠 사실 이 사람 정말 잘 해요 정말 그렇죠 하지만 아쉽게도 이 세션에 시간이 얼마 없어요 따라서 대신 금요일 10:30분 이 무대로 여러분을 초대하겠습니다 코틀린 입문이라는 발표가 있죠 젯브레인스의 언어 디자인 팀장 안드레이 브레스레브와 개발자 변호 부사장 하이디가 발표할 겁니다 그러고 나서 제 4무대에서 오후에 인생은 즐겁고 모든 것이 잘될 거야 코틀린이 있어라는 발표를 핀터레스트의 크리스티나 리와 스퀘어의 잭 워톤이 할 겁니다 이건 저희한테 아주 중요합니다 코틀린을 소개한 온 이유는 여러분 커뮤니티가 사용하기 때문이죠 여러분의 말을 들었고 여러분이 원하는 걸 가져오는 겁니다 여러분 커뮤니티를 무대에 모시고 저희가 할 수 있는 것 이상으로 말하고 싶었죠 또한 질문이 있으시면 Android 플랫폼 부스의 개발자 샌드박스에 오시면 됩니다 오늘 3시에서 4:30까지 목요일 2시에서 4시까지 그리고 금요일은 12시에서 2시까지입니다 언어 디자이너이인 앤드레이가 모든 질문에 답해 줄 겁니다 코틀린에 대해 궁금한 점 있으시면 꼭 오세요 가서 그냥 질문하세요 이제 스테파니가 말했듯 다른 프로그래밍 언어 또한 강화하고 있습니다, 자바스크립트나 C와 C++도 있죠 자바 프로그래밍 언어의 경우 Android O에 새 패키지를 추가합니다 javatime이 마침내 시간과 날짜를 쉽게 조정할 수 있게 됩니다 말이 되죠 더 오래 된 API보다 더 이해 갑니다 그럴 때가 됐죠 네, 그렇죠 javanio

file도 선보입니다 좋은 옛날 javaiofile API를 향상시키죠 파일의 속성에 접근할 수 있게 해 주죠 경로를 쉽게 조정하고 파일을 읽을 수 있게 합니다 예시를 보겠습니다 마지막으로 javalanginvoke는 약간 변형한 것으로 대략적 추정이지만 멋집니다 애플리케이션에서 방법 핸들을 변형하고 랩하게 해줍니다 새 파일 API에 대한 예시를 보죠 경로를 얻기 위해 경로 클래스를 사용할 수 있죠 그러고 나서 그냥 files

lines를 불러오면 되죠 파일의 콘텐츠 전체를 읽을 겁니다 스트림이 있겠죠 이 예시에서 전 모든 빈 라인 즉 파운드 사인으로 시작하는 모든 라인을 지우기 위해 람바다와 스트림 API를 사용하고 그런 후 마지막에 하나의 스트림으로 모든 것을 가져오죠 따라서 이전보다 훨씬 쉽습니다 런타임에서의 변화를 보시죠 오늘 아침에 일부는 들으셨을 겁니다 이번 주에 또 더 있습니다 새로운 병행 복사 콜렉터는 모든 것을 빠르고 더 괜찮게 만들어 줍니다 병행 복사란 멈추는 시간이 없다는 거죠 전체 GC의 경우만 빼고 말이죠 따라서 다른 걸 하는 동안 배경에서 해야 했던 온갖 작업을 할 수 있는 거죠 특히 정말 멋진 작업은 전경에서 히프를 실제로 압축할 수 있다는 점입니다 제 생각에 이전 버전에서 히프를 압축하는 기능은 있었죠 조각모음도 하고 히프를 더 작게 만들 수 있으며 할당과 콜렉션을 더 빠르게 할 수 있지만 활동이 배경인 경우에만 가능한 일이었죠 따라서 쉬는 상태로 들어가고 그 상태에서 일을 하겠죠 하지만 전경에 있을 때는 히프를 확장하거나 조각내는 일은 할 수 없었죠 이이제 전경에서도 모을 수 있고 전경에서 조각모음도 할 수 있고 모든 게 빨라졌죠 할당을 위한 더 빠른 새 메커니즘도 있습니다 그냥 포인터 할당으로 갈 수 있습니다 훨씬 빠르죠 콜렉션이 더 빠르고 이 모든 것은 여러분이 할 일을 줄여주게 되는 거죠 더 빨리 할당하고 더 빨리 수집하는 건 전반적으로 쓸모 없는 것과 메모리를 다루는 것이 O 출시에서 ART를 사용해 더 빨라졌다는 뜻이죠 다양한 최적화, 루프 언롤링 인라이닝이 있죠 또 하나 언급하고 싶은 건 달빅은 메모리 형태의 제한으로 만들어졌다는 거죠 달빅은 모든 것이 메모리를 절약에 초점을 뒀고 최적화만 많이 할 수 있다는 의미겠죠 최적화를 위해 할 수 있는 건 이제 거의 끝에 다다랐습니다 ART가 온라인으로 됐을 때 앞으로의 최적화를 만들 수 있도록 하는 플랫폼에 넣었죠 O와 앞으로의 출시를 포함한 매 버전마다 생기는 이러한 혜택을 이제 수확하기 시작하는 겁니다 더 많이 할 수 있겠죠 이번 출시에서도 많습니다 이번 주 말에 더 많은 정보를 얻을 수 있는 세션을 참고하시기 바랍니다 DEX 지역성도 있습니다 이는 특히 활동을 위한 시작 시간을 향상시켜 줍니다 같은 공간에 있는 모든 메모리를 수집할 수 있기 때문이죠 여러분의 앱이 시작할 때 더 쉽고 더 빠르게 접근할 수 있죠 성능과 메모리 향상이라는 세션이 금요일 아침에 있습니다 더 자세한 사항은 그 세션을 참조하세요 플랫폼 이상으로 지원 라이브러리가 있죠 O 출시에 대한 것이 아닌 것을 전달하기 위한 다른 메커니즘도 있습니다 그중 일부를 보시죠 개발자 미리보기 2와 함께 나오는 v26 베타 출시가 있습니다 저희가 이미 언급한 것이죠 텍스트, 폰트, XML 다운 가능한 폰트 자동 크기 변경 텍스트 뷰 등이죠 모두 포함됩니다 확인해 보세요 게다가 이모지컴팻이라는 것도 있습니다 이모티콘에서의 큰 문제 중 하나가 여러분의 친구가 여러분이 실행하는 버전에서 출시된 것이 아닌 최근 기준에서 이모티콘을 보내려고 하면 여러분은 그 이모티콘을 못 본다는 거죠 대신 두부 조각을 보게 될 겁니다 제가 본 일부 이모티콘보다 매력적일 순 있어도 의미 있지는 않죠 그러니 여러분의 기기에 업데이트 된 이모티콘을 받을 수 있다면 좋지 않을까요? 앱이 업데이트된 이모티콘을 사용할 수 있는 메커니즘이 2개 있습니다 하나는 앱이 실제로 업데이트된 이모네콘과 합쳐질 수 있죠 앱을 Play 스토어에 업데이트해서 사용자에게 업데이트 하면 그 사용자는 이모티콘에 대한 더 시기적절한 업데이트를 받을 수 있죠 다른 것은 아마 장기적으로는 더 나은 해결책으로 조금 전에 말씀 드린 다운로드 가능한 폰트를 위해 제공하는 서비스를 사용하는 거죠 이건 다운로드 가능한 폰트를 통해 자동으로 업데이트된 폰트를 가져올 수 있는 거죠 따라서 이 앱은 저희가 서비스에 제공하면 업데이트된 이모티콘을 가질 수 있는 다운로드 가능한 폰트 기능을 사용하는 기능을 만들 수 있죠 더 자세히 알고 싶으시면 내일 오전 지원 라이브러리의 새 기능 발표에 가보세요 제가 아까 말씀 드린 애니메이터세트에서의 작은 부분 외에도 애니메이션도 많이 발전 했죠 이제 물리학 기초의 애니메이션 같은 것도 할 수 있습니다 이걸 애니메이션 형태로 보고 싶다면 근본적으로 속도를 통해 가동되는 애니메이션을 가질 기능이죠 지금까지 플랫폼에 있는 모든 애니메이션 기능은 지속 기간에 의해 가동되어 왔습니다 얼마나 오래 실행될지 말하는 거죠 하지만 많은 애니메이션은 속도가 중요합니다 특히 사용자, 상호작용에 의해 가동되는 애니메이션이라면 말이죠 화면에 뭔가를 끌고 와서 놔 줄 때 놔 줄 때의 속도가 끌고 와서 손가락으로 놔줄 때까까지의 속도와 같다면 좋지 않을까요? 던지기나 스크롤 같은 건 속도 기초의 애니메이션 시스템이 정말 필요합니다 애니메이터로 할 수 있지만 정말 지루하죠 수학이 필요하고 수학은 어렵죠 따라서 저희는 그 기능을 이 새 물리 애니메이션 시스템으로 만들었죠 더 자연스럽고 더 상호작용하며 더 방해 가능합니다 사용자 상호작용 모델과 작업할 목적에서 만들어 졌기 때문이죠 작은 데모를 보여드리죠 상단의 원을 끌고 가는 동안 다른 두 원은 근본적으로 여러분이 정의내리는 스프링을 통해 상단의 원에 연결되어 있죠 따라서 공간에서 따라다니는 겁니다 록스텝이 아니라 연결된 스프링인 거죠 상호작용과 이러한 스프링의 물리 기초 개념에서 즉각적으로 혜택을 받습니다 새로운 물리 기초 애니메이션에 대한 발표가 금요일 오후에 있습니다 더 알고 싶으시면 그 발표에 가세요 건축 컴포넌트 키노트에서 언급되었죠 저희는 가끔 Android 개발이 필요 이상으로 어렵다고 생각했습니다 따라서 한 걸음 물러나 이렇게 생각했죠 앱 개발자들을 위해 단순화하려면 어느 주요 문제를 다시 한번 살펴봐야 할까? 하고 말이죠 저희가 특별히 신경 써서 지금 당장 살펴 보거나 라이프사이클로 본 몇 가지가 있죠 활동이 언제든 죽을 수 있다는 사실은 받아드리기 힘들죠 화면을 돌리거나 배경에 가거나 뭐 그럴 때 말이죠 여러분이 정확히 어느 상태에 있는지 알아내는 건 지겨울 수 있죠 모든 앱 개발자가 해결해야 할 계속 진행되는 문제이죠 따라서 저희는 이를 더 쉽게 만들기 위해 다르게 접근했죠 또한 저희는 지속성도 살펴보았죠 이제 원래의 SQL을 이슈할 수 있고 그것이 시스템에서 오는 전부이죠 그 기능에서 만들 수 있는 새로운 방식이 있고 더 쉽고 강력하게 만들어 줍니다 이번 주에 다 말씀드릴 겁니다 건축 컴포넌트를 소개할 예정이니 오늘 오후에 오시기 바랍니다 사실 이 세션 바로 다음이죠 내일 아침엔 라이프사이클 문제와 저희가 이를 어떻게 해결했는가에 대한 발표가 있죠 지속성과 오프라인에 대한 발표도 있습니다 이 모든 것은 이미 이전 버전에서 시도할 수 있는 것이죠 확인해 보세요 개발자 분들의 삶을 더 쉽게 만들어주길 바랍니다 행동 변화도 좀 있고 그 중 일부는 다른 것보다 더 좋아하실 겁니다 배경 앱의 행동에 변화가 좀 있고 특히 위치에 대한 거죠 배경 앱으로 실행하신다면 대략적인 위치 정보만 얻게 되겠죠 이 모든 것은 더 어렵게 만드는 게 아니라 기기를 더 괜찮게 만드는 것이죠 모든 앱이 모든 기능을 동시에 가진다면 또 언제든 필요하거나 원하는 걸 할 수 있다면 근본적으로 배터리를 다 쓰게 될 겁니다 모두가 항상 너무 많은 일을 하기 때문이죠 따라서 저희는 어떤 앱이 실제로 언제 서비스가 필요한지 신중하려고 노력하고 있습니다 사용자의 경험을 더 좋게 하기 위해서 말이죠 여러분의 사용자를 위한 경험 역시 훨씬 더 낫겠죠 그중 하나는 장소인데 배경에 있을 때 대략적인 정보를 얻죠 다른 건 웨이크 록입니다 저희는 앱이 배경 상태로 들어가고 나서 캐시 상태로 들어가는 것이 흔하고 그떄 웨이크 록이 있을 거라는 걸 알았죠 그냥 그 웨이크 록을 유지하고 아주 오랫동안 잡고 있겠죠 그것이 정말 배터리를 소모합니다 이제는 캐시 상태로 들어간 직후 웨이크 록이 자동으로 풀려서 기기를 부적절한 상태로 들어어가지 않게 하는 거죠 실행에 대한 제한 또한 있습니다 배경에서 실행할 때 말이죠 얼러트 창에도 변화가 있습니다 특히 타입 애플리케이션 오버레이라는 새로운 유형의 창이 있습니다 O SDK를 겨냥하신다면 얼러트 창 기능을 가지길 원하실 때 꼭 써야 하는 창 유형입니다 초기 버전이라면 이건 분명 없었죠 이건 안 쓰실 겁니다 여러분이 어떤 창을 쓰시던 이러한 유형 애플리케이션 오버레이 창 밑에 레이어될 것임을 알아 두세요 이를 통해 더욱 명확히 정의된 레이어링 정책이 있기 때문이죠 오늘 오후 5시에 배경 체크와 다른 통찰이라는 발표에서 더 자세히 들으실 수 있습니다 자세히 알고 싶으시면 그 발표에 참석해 주세요 마지막으로 여기로 돌아오기로 약속했었죠 그랬죠 딱 하나 남았죠 그렇죠 이에 대해 이야기하려고 했는데 드럼롤 있어야 할 것 같지 않아요? 다리라도 때리는 게 어때요? 다리로 될까요? 네 좋네요 안타깝게도 무대에 시계를 보고 있습니다 O가 의미하는 건 뭐죠 이런 시간이 다 됐네요 감사합니다

What’s new in Android development tools – Google I/O 2016

-다들 좋은아침 -안녕하세요 오늘 토크에 와주셔서 감사합니다 Android 개발 툴의 바뀐 모습을 알아보는 자리인데요

전 세계의 개발자 분들이 와주셔서 정말 즐겁습니다 게다가 이런 큰 자리에서요 정말 기대조차 못한 멋진 일이라고 말씀드리고 싶습니다 Steph Cuthbertson입니다 오늘은 Tor Norbye하고 Jamal Eason와 함께인데요

Android Studio 내부를 구경해 보기로 하죠 이미 내부 관계자나 마찬가지이신 분들 올해는 Zav가 스테이지에 안나왔죠? 전 그냥 대타입니다, 대타 하와이 해변에 늘어졌대요 좋냐, Zav 처음 Android Studio 개발을 시작할 때 우리가 쓰는 언어에 중점을 둔 IDE가 목표였다는 건 아시죠 그래서 Android 플랫폼 네이티브인 IntelliJ를 선택했습니다

이번 Android Studio는 단기간에 엄청난 노력이 들어갔는데요 어제 발표한 내용 중 하나는 이제 탑 125 앱의 92%가 Android Studio를 쓴답니다 3년 전 여기 I/O에서 발표했었는데 데모 시연을 한 게 Tor였는데 기억하시나요 프리뷰 베타하고 안정판 합쳐서 릴리즈가 131개나 됩니다 이젠 그게 저희의 성공 요소이기도 합니다 아주 활발하고 열정적인 개발자 커뮤니티요 초기 빌드를 직접 써보시고 피드백을 항상 잘 해주시니까요

그래서 팀도 집중할 수 있고 진척도 빠릅니다 작년엔 뭘 다르게 해야 생산성도 올라가고 삶이 편해질까 곰곰이 생각해봤는데요 아직 Android Studio를 잘 모르시는 분들을 위해 2016하고 그 전까지의 개발 상황을 60초만에 안내해드리죠 그럼 다들 아시는 게 비슷해질 거고 그 다음에 22하고 그 이후의 미래에 대해 얘기해봅시다

그러니까 올해 이미 20을 발표했지요 Instant Run하고 에뮬레이터로 속도에 포커스를 맞춘 버전이었습니다 새로운 에뮬레이터 UI도 나왔고요 GPU 디버거 프리뷰요

검색에서 딥 링크 생성 테스팅 등등등 그리고 그 조금 후에는 21 N하고 동시에 개발했습니다 그런고로 N의 기능과 API가 다 지원되지요 에뮬레이터로 N을 경험해 보실 수 있어요

Jack 컴파일러로 Java 8 지원을 확인하실 수 있고 21에서는 Instant Run의 속도를 높였습니다 dex 스텝을 프로세스 중에 실행되도록 옮긴 결과인데요 속도가 엄청 올랐죠? 이걸 기반으로 나온 게 22입니다 속도, 스마트 기기, 그리고 Android 플랫폼 지원에 중점을 맞추었죠 여기 I/O가 좋은 점이 청중이 다 개발자분들이시라는 겁니다 그래서 오늘 토크의 처음 25분은 2

2 프리뷰의 거의 모든 기능을 라이브로 시연해볼겁니다 나중에 직접 써보시고요 여기서 기억하실 건 이건 프리뷰 빌드니까 기대치도 프리뷰 퀄리티로 맞춰주세요 그다음엔 저희가 항상 하는 일을 할겁니다 다음 몇 주 동안에 안정화 작업을 하는거죠

항상 그러듯이, 베타하고 안정판을 내면서요 그다음엔 저하고 Jamal이 다시 가지고 돌아와서 디자인, 개발, 제작, 테스팅까지 스크린샷까지 찍어서 단계적으로 보여드리겠습니다 그다음엔 개발 비화 각 기능이 왜, 어떻게 개발되었나 보여드리지요 그렇게 22를 소개해드릴 Tor Norbye를 박수로 맞이해주시기 바랍니다

감사합니다 알겠습니다 다들 화면 보이세요 데모 좋습니다 데모 기기는요? 고마워요

그럼 좀 작고 간단한 것부터 시작하죠 마음에 꼭 드실 거라 생각합니다 어제 SDK 콤포넌트를 많이 발표했는데 Android Studio 22를 이렇게 인스톨하시면 이젠 배경에 버튼이 생겼습니다 최신 기능을 인스톨하시면서도 코딩을 계속 하실 수 있습니다 작년 한 해 동안은 속도 향상에 중점을 두었습니다

다들 그게 가장 중요하실 것 같아서요 현재의 Instant Run을 보여드리겠습니다 이 오른쪽이 I/O 앱입니다 여기 코드를 주석 처리하고 실행하면 그렇게 변경하니까 대충 1초도 안걸려서 디바이스에 변경된 버전이 실행됩니다 Instant Run없이는 15초쯤 걸리겠군요 서로 안 맞는 쪽으로 변화를 줘도 예를 들어 이걸 메소드로 만들면 그래도 1, 2초밖에 안 걸립니다

데모 이후에 Steph가 Instant Run in 22하고 23에 대해서 이야기할겁니다 Instant Run 작업중에 해야했던 것이 APK 내부 구조를 파악하는 것이었습니다 그래서 그 용도로 만든게 APK Analyzer

이젠 제 프로젝트의 APK나 다른 APK도 열 수 있습니다 파일 내부 상황을 파악할 수 있지요 그래서 예를 들자면 assets 나 res 폴더를 볼수있고 이 경우에는 Instant Run이군요 이렇게 앱을 부분별로 리패키징하는 겁니다 실제 앱을 써보기로 하겠습니다

Chrome APK입니다 이 툴의 기능은 두어 가지 있는데 첫째는 다운로드 사이즈를 보는 겁니다 이게 아주 중요한 마켓도 있지요 다운로드 사이즈도 인스톨 사이즈도 최소로 이건 앱에 뭐가 들어 있는지를 보여주고 삭제해도 되는지 정할 수 있게 해줍니다 Assets 폴더 내부 파일을 볼까요

레이아웃 폴더도 보이고 바이너리 XML을 소스 코드로 디컴파일도 할 수 있습니다 리소스 레퍼런스는 아직 손볼 게 많군요 이걸 다시 리소스 이름하고 매칭시켜줄겁니다 각 값 테이블도 보실 수 있습니다 이전엔 보기 좀 힘든 파일이었죠 이젠 뷰어가 있으므로 그냥 들어가서 뭐가 있나 보시면 됩니다

그리고 또 하나 중요한게아 하나 더, 이걸로 dex 파일을 열 수 있습니다 64k 메소드 한계는 아마 다 아실겁니다

사실 메소드 한계가 아니라 메소드+레퍼런스 한계입니다만 이젠 뭘 선언해줬나 보실 수 있습니다 그리고 뭘 참조하고있는지 64k가 안되게 하거나 multidex를 켤 수 있습니다 빌드 아웃풋의 manifest 파일을 보신 적이 있으시다면 분명히 쓴 적 없는 게 많이 보이지요? 그렇죠? 어디서 나왔을까요 22에는 manifest 에디터가 새로 생겼습니다

XML 탭인데요, 여기 아래쪽에 Merged Manifest 탭이 생겼습니다 이걸 누르면 보시다시피 전체 manifest가 나오죠 코드가 변경될 때마다 업데이트 됩니다 여기 오른쪽에는 설명문 각자 어디서 생겨나나 보여주죠 예를 들어 인터넷 허가 Play 서비스에서 오는군요 여기 들어가서 병합하는 줄을 찾아봅니다 Gradle의 manifest 합병 프로세스의 미스테리를 푸셨으면 좋겠군요

미스테리라고 하면 프로젝트를 설정하시기 위해 빌드 파일을 편집하시는 건 이상하지요 그래서 프로젝트 구조 대화상자를 아예 다시 쓰는 중입니다 -중이라고 하는 건 아직 의존성 부분밖에 못해서요 뭐 따져보자면 그게 가장 힘든 부분이지만 새 PSD에서 가장 좋아하는 부분은 메시지 패널입니다 IDE가 추천하는 걸 보여주는 건데요

여기 보시는 대로 제 프로젝트는 jCenter에 의존하는데 이거 새거 나왔는데 하고 알려주는거죠 그럼 제가 여기 업데이트 링크를 누르면 이제 최신 버전을 사용중입니다 Update All 눌러서 다 할수도 있고요 이건 Lint가 하던 것처럼 로컬 저장소만 보는 게 아니라 원격 저장소도 찾아봅니다 의존성 뷰로 바꾸면 의존성 소프트웨어를 볼 수 있지요 모듈별로도 아니면 프로젝트 전체로도요 볼 수 있는 것의 예를 들어보죠 그때 그때 사용되는 의존성 소프트, 프로젝트에서 어떤 의존성 소프트를 어떻게 쓰나

의존성 소프트를 추가해줄 수도 있습니다 이제 검색도 할 수 있는 멋진 UI가 생겼습니다 업데이트 추천처럼 얘도 원격 저장소를 봅니다 로컬 저장소도 보고요 가능한 버전을 다 보여주고 의존성 리스트의 범위 스트링도 조정하게 해 줍니다

여기 experimental 설정에 있습니다 갖고 노시려면요 다음 두세 번 릴리즈 중에 구현 완료할 생각입니다 다음 볼 부분은 C++입니다 작년에 편집 지원이 얼마나 잘 되나 보여드렸었는데요 이번에 통합한 JetBrains의 Sea-lion C++ 기능입니다

아직 실험중인 Gradle 플러그인이 필요합니다만 22에서 획기적인 뉴스는 외부 빌드 시스템 지원을 추가했습니다 네이티브 코드를 짜는데 CMake를 쓸 수 있습니다 안정판 플러그인을 쓰면 이렇게 선언해줍니다 그럼 C++를 쓰실 수 있습니다

C++ 관련해서, 곧 마법사 하나 추가할 예정입니다 프로젝트에 C++ 지원을 추가하기 아주 쉬워지는거죠 그러면 샘플 프로젝트가 하나 생깁니다 이거하고 똑같이 생겼어요 그럼 메인에서 네이티브 라이브러리를 로드하고 샘플 라이브러리로 "hello world"가 있습니다 이걸 써보죠 먼저 여기 C++ 코드에 브레이크 포인트를 설정해주고 여기 메인은 그냥 디폴트 레이아웃을 보여줍니다 중간에 한 줄 있군요

이 문자열을 바꿔서 C++의 값을 보여주게 할까요 그럼 TextView textView = findViewById 그리고 아까 그 ID를 씁니다 그렇게 해주고 setText 메소드 호출 C++ 쪽에서의 호출이죠 여기에도 브레이크 포인트 이젠 디버거를 쓸겁니다 이게 Gradle을 실행하면 CMake도 실행되고 빌드 되고 패키지 만들어지고 한 1초만에 앱이 에뮬레이터에서 실행되고 있을겁니다 됐군요 브레이크포인트 Java 부분입니다

이제 마음놓고 manifest를 보시면 실수, activity 현황이요 여기서 디버거를 다시 보면 우리가 이제 C++ 영역에 있군요 여기저기 쑤셔봅시다 하이브리드 디버거와 CMake 지원 클래스였습니다 마지막으로 보여드릴 건 빌드 시스템 영역 커맨드 라인에서 갑니다 직장 동료한테서 프로젝트가 왔다고 치죠 아니면 Git poll했더니 새 빌드 툴 버전이 나왔던가 아니면 컴파일된 프로젝트의 SDK버전이라던가 빌드하시면 이런 메시지가 뜹니다 2201 빌드 툴이 없답니다 그럼? SDK Manager로 가서 인스톨하셨죠? 2

2 알파는 experimental 플래그를 포함합니다 그리고 빌드를 실행하면 아 라이센스는 동의했고 보시다시피 Gradle이 알아서 다운로드해줘요 그래서 이제는 프로젝트에 서버를 끼워넣는 게 훨씬 더 쉬워졌죠 커맨드 라인은 좀 극단적이고 비쥬얼 에디터로 가봅시다 Layout Editor가 새로 바뀌었죠 아 Layout Editor라고 하면 안되지 레이아웃만 하는 게 아니거든요 일단 메뉴 파일을 열고 여기 있군요 디자인 메뉴를 드래그&드롭 해주고 설정 파일도 드래그&드롭

그리고 보시는 대로 Component Inspector 이거 정말 멋지게 잘되었어요 물론 레이아웃이 큰 비중을 차지하니까 오른쪽에는 새 Component Inspector, 지금 선택된 컴포넌트의 주요 속성을 보여드립니다 지금은 TextView군요 TextView 예를 들자면 텍스트 모습을 보여드리죠 Component Inspector에 회색 글자가 있지요? 아직 텍스트 모습을 안 정했는데? 이게 런타임 실제 모습인겁니다 그럼 예로 들어 폰트 크기는 14 SP 다른 걸로 변경하면 그 사이즈를 계산해 줍니다 여기에는 속성이 일부밖에 나와있지 않아요 찾기 쉽게요

다른, 전체 속성을 찾으시려면 여기 위에 클릭 한 번만 더하시면 됩니다 디자인에는 청사진 모드가 있고요 청사진 모드는 기본적인 뼈대만 보여드리는 겁니다 앱의 x-레이 사진 같은거죠 청사진 모드하고 디자인 모드를 옆에 나란히 둘 수도 있습니다 이거는 주문하신대로 스크롤 뷰입니다 이젠 디자인을 바로 스크롤하실 수 있지요

청사진 모드는 constraint 레이아웃 쓰실 때 좋습니다 constraint 레이아웃을 보기로 할까요 일단 auto connect 모드를 끄고 컴포넌트를 좀 끌어올까요 여기에 텍스트 뷰를 놓고 텍스트 에디터에 텍스트 뷰도 하나 더 암호도 하나 더 오른쪽 아래에 버튼도 좀 추가하고 작업하는 꼴이 좀 엉망이지만 뭐 선택해서 제대로 할 수 있거든요 우클릭하고 이 아래에 있는 거 정렬하기 얘네 다 왼쪽에 정렬할래요 수직으로도 맞춰버릴까 그러면 디자인은 완성이고 이걸 랜드스케이프 모드로 눕히면? 안되겠네요 버튼이 화면 밖으로 나가니까 이거 고쳐보죠 여기 작은 전구 아이콘이 있는데 constraint를 파악하는 겁니다 이거 클릭하면 어떻게 되는지 잘 보세요 constraint가 이렇게 되있군요 우리가 원하는 게 뭔지 예상해 본 겁니다

이제 이걸 리사이즈하면 이젠 버튼도 잘 움직이는군요 보통은 Auto connect 모드니까 여기에 버튼을 드래그하면 이걸 드롭하는 순간 바로 constraint가 자동으로 추가됩니다 물론 마음에 안들면 클릭해서 지울수도 있고요 새로 끌어올 수도 있습니다 이건 프리뷰 비스무리한 겁니다 이걸 쓰시면 어떤 게 된다 하고요

그리고 constraint에도 장점이 있는데요 드래그 중에, 보이시죠? 자동으로 1/4나 설정한 %로 가서 붙습니다 어제 어느 분이 이거 XML 에디팅에서도 되냐고 물어보셨는데, 물론 됩니다 보시면 지금 XML입니다 이쪽의 constraint를 건드리고 놀 수도 있고 XML 에디팅도 잘 되는군요 그러니까 이건 아주- 감사합니다 그러니까 아주 편한 constraint 툴인데요

이걸로 레이아웃 hierarchy를 줄일 수도 있고 아시다시피 최적화에 아주 중요하죠 그래서 그걸 도와드릴 기능도 있습니다 이 레이아웃을 볼까요 보시기 편하게 청사진 모드로 바꿔서 이 레이아웃은 실제로는 nested 리니어 레이아웃의 집합인데 이 리니어 레이아웃을 constrint 레이아웃으로 바꾸게 명령한다면 구조를 단순화하면 어떻겠냐고 하네요 그럼 보시는대로 화면은 똑같지만 constraint입니다 왼쪽 리스트는 많이 단순화됐고요

네 그럼 에디팅을 볼까요 에디팅 부분에도 기능을 좀 추가했습니다 첫째, Firebase가 통합되었습니다 이제 Firebase로 작업하시려면 크래쉬 리포팅을 추가한다던가 해서 그럼 여기 도우미 창을 더 열고 원하시는 걸 선택하고 크래쉬 리포팅은 이거요 그럼 여기 소스 에디터 옆에 지시문이 나와서 그것만 따라하시면 됩니다 그리고 예를 들어 이 라인들을 실행하고 싶다 그러면 소스 코드로 불러오시면 에디팅이 됩니다 어떤 API의 사용법을 알고 싶으시다거나 하시면요 Job Scheduler를 포함해야된다 하면 네 Job Scheduler는 포함하셔야합니다 우클릭하면 자동으로 샘플 코드가 찾아지는 겁니다 보시는대로 얘가 서버에 가서 추천된 코드를 가져오는 거죠 서보시라고

우클릭해서 브라우저 새 창에 열고 더 자세히 보실 수도 있습니다 22는 IntelliJ 161 기반입니다 당연히 그 쪽 관련해서 새 기능도 많은데요 그 중 하나는 양방향 문자열의 에디팅 지원입니다

저희 국제 수요층 분들이 요청하시던 기능인데요 아랍어 텍스트입니다 보시는대로 소스 에디터가 이제는 이걸 정확하게 다룹니다 요게 그동안 골칫거리였는데 이젠 잘 됩니다 IntelliJ 고마워요 IntelliJ 16에서는 에디터의 검사기능이 많이 추가되었는데요

덤으로 저희 쪽에서도 추가한 게 있습니다 Android 전용으로요 좀 볼까요 뭐 데이터를 넘겨줄 때 필드를 정적으로 하는 건 아주, 매우, 정말로 안 좋은 거라는 거 다들 아실겁니다 절대 안돼요

이제는 Lint가 잡아내 줍니다 그게 누수 요인이기도 하지만 그래야 Instant Run이 좋아하거든요 지금 예로 든 것만큼 간단하지는 않은 건데 여기 필드를 정적으로 하고 app data 1은 문제가 없지만 app data 2 이후로는 context로 인스턴스가 있는데 그걸 포인팅하는 정적 참조문이 있습니다 그럼 안돼죠 그럼 여기 지원 주석을 봅시다 어제 발표한 지원 라이브러리인데 새 기능이 몇 있죠

먼저 이 메소드, 이젠 드디어 야 이 메소드 워커 스레드 클래스 안에 있는데도 스레드-세이프인데? 라고 하실 수 있습니다 아무 스레드에서나 부르실 수 있습니다 전에 있던 API 체크는 Lint가 플랫폼 API를 메인 SDK에 비교하는 형식이었는데요 이것도 픽스가 있는데 뭐, 체크 넣어줘 하는거죠 하지만 이제는- 아 죄송 이제는 제 메소드가 이 API를 요구할 거라 얘상하고 API에서 부르는 책임을 넘겨주는겁니다

라이브러리 API 체크를 클라이언트로 보내고 그럼 이 호출들이 제 API를 부르고 있지만 API체크가 적용됩니다 이 다음은 dimension 리소스- dimension annotation입니다 그러니까 이 정수가 하나의 dimension인데요 적용하실 수 있는 유닛이 많지요 여기서, 픽셀이 아주 중요합니다 SDK의 대다수의 API는 픽셀 space에서 작동합니다

그래서 픽셀 annotation을 따로 만들었는데요 @Px입니다 이걸 하면 잘못 사용된 부분에 다 플래그가 뜨죠 dimension이어야할 리소스를 넘겨주는 부분이요 도움이 되면 좋겠네요 마지막 또 중요한 annotation이 keep annotation입니다 메소드하고 클래스에 @Keep을 쓰실 수 있는데요 그리고- Gradle 플러그인 2

2 ㅣ점에서는 ProGuard나 새 Incremental Shrinker를 쓰시면 릴리즈하실 때 자동으로 제거되지 않습니다 support annotation이 마음에 드신다면 더 유용하게 만들 수 있을 기능이 있습니다 새 추론기능입니다 한동안 IntelliJ에 분석 기능이 있었는데요 null인지 추론하는 것이었습니다 아직 flag 기능이지만 써보시려면 support annotation 추론기능입니다

그래서 이걸 현재 파일에 쓰면 분석을 몇 돌려서 프로젝트에 사용중인 annotations를 알아내실 수 있습니다 그래서 파일을 다시 보면 이런 div 마커가 다 이렇게 알아낸 adaptation입니다 예를 들어 여기 퍼미션이 요구되는데 annotations를 시작하고 Lint가 코드의 버그를 찾게 해줄겁니다, 아마도요 오레곤 주립대의 연구팀과 협업해서 퍼미션 관련 작업중입니다 그래서 이건 아직 WIP인데요 이게 다 되면 앱이 Android 쪽 퍼미션으로 옮겨갑니다

여기서 이 액션을 invoke하면 리퀘스트가 들어가서 Android 쪽 퍼미션의 callback을 처리하는 겁니다 사용되지 않은 리소스는 없애도록 리팩토링도 했습니다 그러니까 실제로는 사용되지 않을 리소스를 추가하면 Refactoring에 가서 Remove unused resources하면 IDE가 그런 리소스를 찾아서 없애 줍니다 앱이 좀 더 가벼워지죠 네 마지막으로 소개할 건 Espresso Test Recorder인데요 객석에서 벌써 탄성이 들려오네요, 네에 그럼 프로젝트 창에서 Run 메뉴에서 Record Espresso test

Espresso입니다 Ex-presso아닙니다 그래서 그걸 하면 보시는 대로 앱 빌드를 시작하고 왼쪽에 이벤트 레코더를 시작합니다 오른쪽에는 앱이 실행중이지요 그래서, 예를 들어, 여기 카테고리를 클릭하면 보시는 바와 같이 이벤트가 기록됩니다 Back 버튼을 눌러서 돌아가고 좀 아래로 가서 음악 타일을 눌러봅시다

제가 누르는 대로 여기에 기록되고있지요 그게 뭔지 이해하려고 노력하는겁니다 예를 들어 여기 빨간 버튼을 누르면 제가 FAB quiz 버튼을 눌렀다고 기록이 됩니다 그래서 레코딩하면서 또 할 수 있는게 assertion 추가입니다 여기 Add Assertion 버튼을 누릅니다 그러면 스크린샷하고 뷰 hierarchy를 받아서 앱 내부 구조를 알 수 있습니다

보시다시피 앱의 내부 논리 구조에서 옮겨다닐 수 있지요 그리고 예를 들어 이 질문 Who was the youngest Beatle? 이걸 클릭하면 그걸 받아서 assertion을 제안합니다 그러니까, 어, 이 시점에서 테스트가 실행중이면, 이 문자열이 Who was the youngest Beatle? 이어야 한다는 거지요 그럼 Save Assertion을 누르고 계속합니다 그래서 혹시 누구- 여기서 정답 전까지 오답 좀 누를 겁니다 아셨죠? 틀렸네요

틀렸대요 정답은 조지였습니다 ok, 그럼 이젠 Submit 버튼을 눌러보죠 저게 정답이었다고 보이시죠? 테스트 레코딩은 이걸로 충분한거같고 Complete Recording 시작합니다 이걸 누르면 테스트 결과를 어떤 클래스로 저장할지 묻는데 디폴트값으로 하겠습니다

여기 Espresso Test인데요 처음에 오답 클릭한 거 보이시죠? 테스트 편집도 가능합니다 그러니까 예를 들어 오답 타일 클릭한거 없애고 다시 가서 테스트를 다시 하고 해볼까요 여기 Run 버튼을 누르기만 하면 됩니다 클라우드 테스트도 가능하지요 지금 보여드릴 시간은 없지만 등록해보세요 서로 다른 폼 팩터 여럿을 가지고 UI 테스트를 실행합니다 꽤 유용하죠

그럼 이걸 에뮬레이터에 다시 돌려서 테스트를 빌드하고 실행하고 여기 오른쪽 앱 실행창을 봐주세요 저보다 클릭이 빠릅니다 APK 인스톨, 완료, 클릭, 클릭, 클릭 그리고 녹색 패스 감사합니다 그럼 여기까지 하고 다시 Jamal한테 넘기겠습니다 비쥬얼 에디터에 대해 이야기 해줄 겁니다 Thanks Tor, 좋은 데모였습니다 Tor이 저희가 하는 일을 보여드렸고 저는 저희가 왜 그걸 하는지 그리고 왜 개발자분들이 개발 workflow에 통합하셔야할지 설명해보겠습니다 디자인 측면에서 메인 토픽이 두가진데 XML 하고 레이아웃입니다

XML은, 여러분중에 전체 UI를 XML로 디자인하시는 분도 계시다는거 압니다, 좋은 일입니다 하지만 저한테는, 다른 많은 분들한테도 비쥬얼라이징 툴이 있어서 앱이 어떻게 보일지 알 수 있는 편이 좋습니다 그래서 저희 팀 스스로 목표를 세웠죠 XML 에디팅이 필요없는 툴을 만들 수 있을까 하고요 물론 이후에 코드를 리뷰하실 수 있지만 기본 문제가 되어서는 안됩니다 그게 새로 나온 레이아웃 에디터의 기본 이념입니다 Tor가 보여드렸듯이 새 기능이 많은데 위젯을 컴포넌트 트리로 드래그한다던가 디자인 위로요 또 청사진 모드 앱 뒷면에서 위젯이 상호작용하는걸 보실 수 있지요 그리고 새 속성 패널 전에는 뷰에 사용 가능한 모든 속성을 보여드렸는데 이제는 저희가 엄선해서 현재 뷰 레이아웃에 보아서 가장 어울리는 속성만을 골라 보여드립니다

저희가 또 자문해본게 레이아웃 관련인데요 Android 레이아웃 옵션이 몇 가지있는데 linear 레이아웃이 있고 horizontal and linear가 있지요 하지만, 경우에 따라서는 프레임이나 테이블 레이아웃이 필요한데 그건 안되네요? grid 또는 relative 레이아웃은요 그래서 그 둘중 어느걸 써야하죠? 저희가 풀려는 문제가 그겁니다 레이아웃에 어떤 컨테이너를 쓸지 자주 고민하시게 될 테니까요 이 경우 해답은 constraint 레이아웃입니다

컨테이너 고민은 하실 필요 없이 컨텐츠하고 레이아웃 상의 위젯 배열에 집중하실 수 있습니다 그래서 constraint 레이아웃의 장점을 알아보죠 첫째 UI 개발이 빠릅니다 데모에서 보셨듯이 위젯을 가볍게 추가하고 여러 contraint도 연결 가능합니다 또 중요한 것은 이걸로 더 반응성 좋은 디자인이 가능하다는 것입니다

그러니까, 내 앱 스크린이 Nexus 4나 타블렛이나 다른 Nexus 기기에 어떻게 보이냐를 생각하기보다 이제는 constraint를 추가해서 컨텐츠가 화면 사이즈에 자동으로 반응하게 합니다 셋째 최적화가 중요합니다 데모에서 보셨듯이 hierarchy를 대신 해드릴 수 있습니다 이미 아실 것 같지만 linear하고 relative 밑에 relative를 또 하시면 Android OS의 처리 속도가 실제로는 더 느려집니다 그러니까 nesting의 경우 constraint 레이아웃으로 간소화시켜줄수 있습니다

그리고 마지막으로 하위호환이 됩니다 그러니까 새 프로젝트에 쓰실 수 있고 지원 라이브러리라 기존 프로젝트에도 사용하실 수 있습니다 이자인 관련 보여드린 세번째 툴이 Layout Inspector입니다 가끔 앱 로딩하실때 생각하신적 있죠 왜 내 뷰가 오버랩하나 아니면, 속성 중 하나가 예상과는 다른 값인데? 그런거요 그래서 저희 툴을 쓰시면 우클릭으로 현재 레이아웃의 스샷을 찍으셔서 모든 속성을 직접 살펴보실 수 있고 전체 뷰 hierarchy도 보실 수 있습니다

디버깅에 큰 도움이 되겠지요 이제 개발에 관해 또 개발 편의를 위해 저희가 어떤 툴을 만들었나 잠시 토크 타임을 가지겠습니다 데모에서 보여드렸듯이 새로 Firebase 플러그인이 나왔는데요 어제 Google I/O에서 출시한 Firebase 서비스를 지원합니다 Google Analytics, Ads, 클라우드 메시징, 전부 Android Studio 20 내에서 원클릭으로 사용 가능합니다

Samples 브라우저도 좋은데요 보여드렸다시피 API 사용례를 찾으신다면 이제 Google Samples를 버튼 원클릭으로 보실 수 있습니다 이제 앱 개발의 스타팅 포인트를 찾기가 좀 더 쉬워지실겁니다 그러면 이젠 빌드 툴에 대해 이야기할 차례고 그건 Steph가 해 주겠습니다 수고하셨습니다, Jamal 빌드에 관해서는 Instant Run으로 시작하죠

개발자로서 가장 좋을 대는 다음 단계로 계속 나아가는, 플로우를 타는 거고 저희의 목표 중 하나는 Android 개발을 웹 개발만큼이나 가볍게 만드는 것입니다 그래서 코드를 변경하시고 그걸 리프레시해서 보시고 코딩의 플로우를 잃지 않지요 그래서 Instant Run을 만든 겁니다 그래서 그 작동법을 좀 이야기하자면 하나를 변경하시면 IDE는 그걸 이렇게 스왑합니다 점증적인 변경이라면 가장 빠른 스왑이 가능한데 hot-swap이라고 부릅니다

여기서 하는것은 처음 빌드 시에 바이트코드를 다 만들고 그 후에 변경을 하시면 변경된 코드를 반영하기 위해 코드 패스를 리다이렉트합니다 두번째는 warm swap인데 액티비티 재시작이 요구되죠 그래서 필요하실때마다 그렇게 합니다 예를 들면, 리소스 체인지요 Cold swap은 앱 자체의 재시작이 요구됩니다 구조적인 변경이 있을 시에 필요합니다 상속에 변경이 있던가 메소드의 signature를 바꾸시는 경우 등이 그렇지요

여기서 이야기를 조금 뒤로 돌려 어제 키노트에서 이야기했던 벤치마크에 대해서 말씀드리겠습니다 벤치마크 테스트는 다양한 앱과 툴로 이루어집니다 여기서 다 얘기할 생각은 없고 예 하나만 들지요 위키피디아 앱으로도 테스트를 합니다 오픈 소스 앱이라 GitHub에 있습니다

그리고 그냥 재미로 보시라고 저희 규준도 써놨습니다 보시다시피 Instant Run 비활용 상태에서 20하고 비교했는데 cold swap을 쓰면 21이 47배 빠르고 hot-swap을 쓸 경우 10

7배 빠릅니다 그 의미는, 잘 생각해보시면 빌드가 10배 넘게 빠르다는 것입니다 20과 비교하는건데 20은 1

5보다 빠르지요 dex 구조를 변경해서요 ADB push 속도도 10배 빨라졌습니다 그래서 따지고보면 좀 저평가된건데 뭐 저희 제일 목표는 개발자분들이 한층 빠른 빌드를 가능하게 하는 거니까요 그래서 거기 집중해서 저희 벤치마크에서 apples to apples 비교가 가능합니다 저희가 하는 다른 벤치마크 테스트가 참여하시는 유저분들의 통계를 봅니다

그리고 서로 다른 방식을 구현합니다 참여하시는 분들 감사합니다 저희가 보는 통계 샘플인데요 hot swap을 쓰는 Instant Run의 평균 빌드 타임입니다 전 유저층을 나타내므로 전세계, 모든 OS 각국, 모든 하드웨어 등을 포함합니다 아주 오래되고 느린 프로세서를 가진 하드웨어나 그 비슷한 것도요

지금 보시는 것은 대부분의 유저들의 hot-swap은 4,5초나 그 미만입니다 항상 저희 목표는 그래프 시프트입니다 최대한 많은 게 1초 내에 이루어지도록 하고 있습니다 그러니까 저희가 원하는 것은 풀 빌드 시간을 낮추기 hot-swaps의 속도 향상 최대한 많은 스왑을 hot swap으로 그런 게 목표입니다 hot swap, warm swap cold swap의 분포도와 풀 빌드 타임, 그리고 cold swap이 요구되는 요인을 봤습니다

이걸 보면 결국 개발자분들의 데이터이죠 22에서 가장 큰 변경점이 이 덕택에 이루어졌습니다 22는 AAPT로의 체인지를 포함합니다 아시다시피 리소스를 변경할 때 AAPT가 엔드 ID를 manifest에 집어넣습니다

아마도 모르셨겠고 일단 저희는 몰랐던 점은 리소스를 변경하거나 새로 추가하면 AAPT가 이 ID의 숫자를 다시 매깁니다 그래서 결과가 뭐냐면 코드 변경을 하셔도 cold swap을 하게 됩니다 이게 cold swap의 16~19%를 차지하는 요인이었습니다 그래서 22에서는 AAPT에 변경이 이루어져 리소스 ID가 항상 동일합니다

그냥 22 Instant Run이 빨라졌다 수준이 아닌 더 자세한 인사이더 뷰를 보여드렸습니다 hot swap 빈도가 늘어난 걸 보실 테니까요 그리고 또다른 변경점이 Split APK의 이점을 사용한 것인데요 지금은 빌드 시에 앱이 11~12개의 dex파일로 나누어집니다 풀 빌드를 하시면 실제로는 변경된 코드만 빌드하는겁니다

빌드 타임을 계속 낮출 예정입니다 22만이 아니라 다른 릴리즈에서도요 그러니까 여전히 빌드가 느리다 하면 저희를 찾아오시면 엔지니어링 팀이 감사해할겁니다 그럼 이번에는 프로젝트 구조

Tor가 데모를 잘 해줬는데요 그래서 저는 인사이더 뷰만 드릴겁니다 프로젝트 구조 대화창 밑으로 빌드 모델에 상당히 흥미로운 체인지가 있었는데요 Gradle은 참 유용했죠 아주 융통성 있는 언어고 Android에 좋았습니다 하지만, 생각해보면 IDE는 구조 input을 기대하고 Gradle은 프로그래밍 언어지요 그러니까 꽤 복잡합니다

22의 변경점 중 하나는 Gradle parser를 밑바닥부터 완전히 새로 썼습니다 그러니까 Gradle 파일을 읽어들일 때 훨씬 정확하고 IDE에서 써서 다시 내보낼때도 훨씬 더 정확합니다 그러니까 앞으로 보실 것은 예를 들자면 Gradle 파일에 변수를 쓰실 때 IDE에서도 맞게 읽어들입니다 앞으로 프로젝트 구조 대화창에서도 UI 요소 변경이 가능합니다

22의 Gradle 모델의 변경은 이미 완료되었습니다 Tor가 말했듯이 프로젝트 구조 대화창은 22에서 일부 완료이며 experimental flag에서 실험해보실 수 있습니다 2

3에서 전부 완료할 예정이며 그 시점에서는 디폴트가 되겠지요 Tor가 보여드린 Merged Manifest Viewer의 스크린샷입니다 잠시 이야기를 앞당기죠 Jack이요 Jack컴파일러는 2

1에서 Gradle에 통합되었고 22에서는 annotation 처리기능도 포함합니다 그러니까 이제 클래스 패스에 annotation processor 사용 가능합니다 여기 포함되는게 컴파일의 의존성 소프트웨어 등 그리고 다 자동으로 적용됩니다 자세한 사용법은 저희 문서 사이트에있고 여기 I/O에서 알려드리고 싶은 건 툴을 작성하시고 클래스 파일을 프리- 혹은 포스트-프로세싱하는 분은 Jack의 가장 큰 장점 중 하나가 구조적인 API로 조작이 쉽다는 것입니다

이후 릴리즈에서 차츰 Jack의 비중을 늘려나갈 것입니다 그러니까 실제로 한 번 써보시고 미흡한 점이 있으면 꼭 알려주세요 마지막 토픽은 C++ 지원입니다 이부분은 그냥 저희가 뭘 하는지 전체를 알려드리겠습니다 C++를 처음부터 끝까지 이해할 좋은 방법이라고 생각합니다

저희가 그렇게 많은 투자를 하는 이유는 그래픽이 아주 중요한 앱과 게임을 개발하시는 분이 많아서입니다 그리고 C++은 정말로 중요하다고 저희한테 강조하고 또 강조하셨죠 이미 C++에디팅과 디버깅을 지원합니다 전부 IntelliJ를 통한 것이지요 2016

1의 새로운 점 하나는 IntelliJ의 향상된 C++지원입닏다 22의 가장 큰 변경점은 CMake와 Gradle일겁니다 CMake 예시를 설명드리죠 Gradle파일에서 CMake 프로젝트를 참조할 수 있습니다

이걸로 SO 파일이 빌드되고 APK에 패키징되었습니다 이게 가능한 것은, Gradle이 이제 CMake에도 나갑니다 저희는 CMake가 프로젝트 메타데이터를 더 내보내게 하려고 합니다 어떻게 빌드하는지 프로젝트에 있는 파일 목록 등 Tor가 보여드렸듯이 프로젝트 hierarchy에

cpp 파일이 보이게되고 같은 폴더에 있는 경우 h 파일도 추가됩니다 파일 자체는 프로젝트 hierarchy의 노드로 추가됩니다 외부 빌드 파일 밑에요, 그래서 거기서나 IDE에서 파일을 편집하실 수 있습니다 Tor가 보여드린 것처럼 이제 앱을 실행하시거나 브레이크포인트도 설정하시거나 다 예상하는대로 작동합니다 NDKBuild 셋업도 같습니다

Android mk 파일을 참조하실 수 있지요 C++ 디버거의 개선점도 잠시 소개하고 싶습니다 우선 22에서는 말씀드렸다시피 굳이 C++, Java, 혹은 하이브리드 디버거를 명시해주지 않아도 auto를 쓰면 IDE가 자동으로 맞는 디버거를 선택해드립니다

N에서 디버깅 중이시라면 Java하고C++ 디버거는 일체입니다 그리고 마지막으로 추가한게 watchpoint인데요 변수를 추가하시고 그게 빨간색이거나 변경되었으면 프로세스를 프리즈할 수 있습니다 Watchpoint는 x86과 Nexus 9에서 사용하실 수 있으며 다른 온라인 기기에도 확대할 예정입니다 지금 당장은 체험해보고싶으시다면 에뮬레이터에서 하시면 됩니다

Samsung S5, S6 기기와의 호환성 이슈도 여럿 고쳤습니다 그게 22의 C++에 관한 거 다고 앞으로 나올 릴리즈에서도 계속 개선점을 기대해주세요 마지막으로 이야기할 분야는 테스트입니다 Jamal에게 다시 마이크를 넘깁니다

모두들 감사합니다 그래서 테스트를 할 때 핵심은 로컬 테스트 환경입니다 올해 초 Android 에뮬레이터를 출시하게돼서 정말 흥분됐는데요 아직 안써보신 분이 있다면 정말 좋은 툴입니다 장점은 CPU, GPU, I/O 속도가 다 향상된거라 실제 기기보다도 빠릅니다 ADB 속도도 향상되었습니다 사실 asset을 push하는 와중에 앱하고 생기는 병목 현상의 원인은 ADB입니다

새 Android 에뮬레이터로는 10배 빨라졌습니다 그리고 Tor가 보여드린대로 UI도 바뀌었고요 회전, 스크린샷 찍기 등이 가능합니다 그리고 확장 UI도 있어서 센서를 컨트롤할 수도 있습니다 위치 정보 확인, SMS 메시징, 통화하기 앱 테스트에 필요한 모든 툴이요

로컬 테스트에 더해서 Android Studio 내에서 Firebase Test Lab을 출시하였습니다 Tor 데모에 나온 것처럼 Clouds 탭에서 클라우드에 있는 기기 선택이 가능합니다 그러면 보유하고계시지 않은 기기로도 테스트되고 APK하고 테스트를 보내서 앱 테스트를 합니다 그리고 아까 보여드렸죠, Espresso Test Recorder 좋은 데모인데 이게 왜 중요하냐면요 테스트를 만드는 건 지루할 수도 있는 작업이고 그다지 많은 사람들이 선호하진 않지요

그래서 이제는 기기를 누르시면 테스트 캡쳐가 됩니다 결과물은 Test Lab에 업로드하셔도되고 아니면 로컬 머신에서 실행하셔도 됩니다 마기막으로 APK Analyzer 이거는 왜 중요하냐면 완료라고 생각하시고 빌드해보시면 APK가 너무 큽니다 왜냐하면 결국 나중에가서 유저가 Google Play에서 앱을 다운받을 때는 최소로 작은APK를 원하거든요 이 툴은 APK를 해부합니다 dex와 asset 파일을 보고 뭐가 문제라서 APK가 이렇게 큰가 보는거죠

모든 기능을 이야기할 시간은 없습니다 그래도 새 Lint 분석기능하고 IntelliJ 2016는 말씀드렸고 접근성에 큰 투자를 했고 Android Studio 22에 새로 추가한 기능들입니다 간단하게 다시 말씀드리자면 새 기능이 추가된 부분은 디자인, constraint 레이아웃 매니저와 디자이너 코딩에 도움이 될 Firebase의 통합 향상된 C++지원과 빌드 지원 그리고 테스트를 도와드릴 레코더입니다 어디서 시작하냐고요? Android Studio 2

2을 쓰시려면 업데이트를 체크하시면 canary채널의 Android Studio 22를 받아보시라고 뜰겁니다 그리고 혹시라도 Android Studio가 없으시다면 이 링크로 가셔서 새 걸로 다운받으세요 물론 채널은 canary채널로 변경하셔야 Android Studio 22가 다운받아집니다

끝입니다 대단히 감사합니다 감사합니다

Getting Started with Firebase Auth on Android – Firecasts

안녕하세요? Firebase팀의 로렌스 머니입니다 또 다른 Firecast 에피소드를 준비했습니다

오늘은 안드로이드에서 Firebase Auth를 사용하여 구글에 로그인하는 방법을 소개합니다 다른 계정으로도 로그인 할 수 있습니다 몇 분 만에 바로 이 기능을 추가 할 수 있습니다 그럼 시작해 볼까요? 시작하기 전에 개발 환경이 잘 갖춰졌는지 확인해 주세요 안드로이드용 Firebase를 시작하려면 안드로이드 스튜디오로 새 프로젝트를 만드세요

디폴트 폼 팩터에서 Empty Activity로 생성시키세요 Grandle 파일을 수정하면 동기화가 필요하다는 메시지를 보게 될 것입니다 동기화시키세요 모듈 레벨의 buildgradle에서 Google Services Packages를 classPath에 이렇게 추가하세요

app-level buildgradle에서는 google-services플러그인을 적용하세요 동기화 시킬 때 google-services JSON파일이 없으면 에러가 납니다 걱정 마세요 간단히 해결됩니다

Firebase 콘솔로 갑니다 아직 프로젝트가 없다면 절차에 맞춰 생성하세요 완료되면 스크린에 프로젝트가 보입니다 프로젝트를 선택하면 연결된 앱을 볼 수 있습니다 Add App 버튼을 누르고 안드로이드를 선택하세요

패키지 이름과 SHA1이 필요합니다 패키지 이름은 앱을 정의 할 때 쓰는 것 입니다 SHA1은 debug keystore에서 이렇게 받을 수 있습니다 복사해 붙이고 앱을 추가하세요 google-service JSON 파일이 다운로드됩니다

프로젝트 뷰를 선택해서 앱을 여세요 파일을 이렇게 앱 폴더로 드래그하세요 이제 Gradle이 동기화되고 모두 잘 돌아갑니다 이제 Firebase를 사용할 수 있습니다 자, 좋습니다

개발 환경이 잘 준비됐다면 이제 안드로이드에서 구글로 로그인할 수 있는 간단한 앱을 만들어 봅시다 필수 파일을 임포트하고 간단한 생글 액티비티 앱을 생성하고 로그인 버튼을 만들어서 구글로 로그인하면 사용자의 아이디가 출력되도록 코딩해 보겠습니다 시작해 볼까요 안드로이드 앱을 코딩하기 전에 모든 속성들이 Firebase콘솔에 제대로 설정됐는지 확인합시다 다 되면 Overview스크린이 이렇게 뜹니다

다음은, 프로젝트에 Auth가 활성화됐는지 봅시다 Auth 섹션을 보세요 원하는 로그인 메쏘드를 선택하세요 구글을 선택해 보겠습니다 안드로이드 스튜디오에서 build

gradle을 체크해 보세요 play-services-auth 라이브러리가 포함돼야 합니다 레이아웃 파일에서 로그인 버튼을 선택하면 런타임일 때 가져옵니다 코딩을 할 때 따라야 할 몇 가지 단계가 있습니다 첫째 Google 로그인 옵션 객체를 만들고 이를 이용해, Google API 클라이언트를 생성합니다

사용자가 로그인 버튼을 누르면 사인인 인텐트와 액티비티를 생성합니다 여기서 볼 수 있습니다 API로부터 인텐트를 불러와 액티비티를 시작합니다 그러면, 사용자의 데이터를 받아올 수 있습니다 인텐트로부터 돌아온 데이터에서 Google 로그인 결과 객체를 받습니다

여기서 Google 로그인 계정을 받고 디스플레이 네임을 받습니다 데모에서 보듯이 사용자의 이메일을 받은 후 이름으로 바꾸어 출력할 것입니다 로그아웃은 더 쉽지요 로그아웃 API를 불러 결과를 받아 UI를 업데이트하면 됩니다 어떻게 돌아가나 봐요

이것이 우리가 만든 앱입니다 로그인 버튼과 로그아웃 버튼이 있습니다 로그인 버튼을 누르면 선택창이 뜹니다 원하는 계정을 선택하고 로그인을 하면 됩니다 다시 로그아웃 하면 UI가 클리어됩니다

로그인할 때 계정 생성을 선택할 수도 있습니다 그러면 사용자 추가 플로우로 넘어갑니다 지금은 직접 해 보지 않겠습니다 다시 돌아가서 계정을 선택하겠습니다 Firebase 기반 안드로이드 앱에서 구글 로그인 추가가 얼마나 쉬운지 아셨죠? 이상입니다

드디어 안드로이드에서 구글로 구글계정으로 로그인하는 앱을 만들어 봤습니다 불과 몇 분 걸렸어요 이제 앱을 맞춤 설정 하거나 페이스북이나 GitHub과 같은 서비스를 추가할 수 있습니다 오늘은 여기까지 입니다 질문은 댓글로 남겨 주시고 트위터나 G+에서는 #AskFirebase에서 만나요

'구독' 단추 누르는 것 잊지 마시고요 저는 로렌스 모니입니다 시청해 주셔서 감사합니다

Getting Started with Firebase and AdMob on Android – Firecasts

이번 Firecast 에피소드에 오신 여러분을 환영합니다 모바일 광고 SDK 팀의 앤드류 브로그던 입니다 오늘은 Gradle을 사용해 안드로이드 앱에서 Firebase와 Admob를 함께 사용하는 법을 배워볼게요 먼저 앱과 Firebase를 연결합니다 그런 후 Google 서비스 JSON파일을 다운받고 파일을 사용하는 Gradlee플러그인 설정을 합니다 마지막으로 앱에 귀속된 개별 서비스를 더해줄게요 첫 단계를 앱을 연결하는 건데요 Admob 콘솔에서 할게요 브라우저 창에서 살펴보겠습니다 영상 마지막에 연결되는 방법에 대한 가이드를 첨부할 테니 참고해주세요 오늘은 가장 쉬운 방법을 배워볼 텐데 Admob 콘솔의 애널리틱스 탭 상단의 ‘Firebase로 시작하기’를 클릭하는 방법입니다 클릭 하시면, Admob 앱 목록이 뜨게 되고 Firebase와 연결하는 버튼을 클릭하시면 Firebase에 연결됩니다 앱 패키지 이름의 프롬트가 주어지고 이것은 나중에 설정 단계에서 쓰이게 됩니다 다음은, 이전에 Firebase 프로젝트를 생성했는지에 따라 몇 가지 선택 창이 나타나게 됩니다 이전에 프로젝트를 생성하지 않았다면 이런 화면이죠 계속하기를 누르면 다음 화면으로 넘어가고 앱이 성공적으로 연결됐다는 결과가 보입니다 벌써 첫 단계를 마쳤네요 두 번째는 Google 서비스 JSON 설정파일을 다운받는 것인데, 보시면 화면에 링크가 있으니, 바로 클릭하시면 됩니다 클릭하시면 콘솔로 이동해서 다운로드가 자동으로 시작됩니다 다운로드를 마치면 안드로이드 스튜디오 프로젝트에 가서 소스 트리에 드래그해서 넣으세요 앱 소스의 루트 폴더로 들어가겠죠? 나중에 Google 서비스 플러그인에서 사용될 부분입니다 좋아요, 이제 앱도 연결하고 프로젝트의 설정정보가 든 JSON파일도 다운로드 받았으니 Google 서비스의 Gradle 플러그인을 설정하죠 다시 안드로이드 스튜디오로 가시죠 안드로이드 스튜디오 화면입니다 프로젝트 레벨 빌드 Gradle 파일입니다 이 파일은 앱 분만 아니라 전체 프로젝트의 소스 트리에 적용되죠 여기에 Google 서비스 플러그인을 위한 새로운 클래스 path를 넣어줄게요 Gradle 싱크를 맞춰주면 됐습니다 이제 앱 빌드Gradle로 넘어가서 플러그인을 적용하라는 행을 끝에 넣어줄게요 끝마쳤고요 이 파일은 Google 서비스 JSON파일을 사용해서 빌드가 이루어질 때 설정 데이터 입력하죠 또한 여러가지 Firebase 관련 설정을 진행하기도 합니다 멋지네요! 이렇게 세 단계를 이미 끝냈어요 이제 개별 Firebase 서비스를 추가할 차례입니다 오늘은 Admob만 다루니 그걸 추가해보도록 할게요 항상 그래왔듯, Gradle dependencies로 할게요 Admob과 Firebase의 Gradle 아티팩트는 Firebase-adds 입니다 됐네요 다양한 아티팩트가 있다는 걸 알고 계셨나요? 사용 가능한 서비스 목록입니다 이건 Firebase 안드로이드 설정 가이드에서 찾을 수 있어요 여기 보시는 것처럼 엄청 많네요 실시간 데이터베이스, 인증 등과 같은 여러 가지가 있죠 좋아요, 이제 마지막 단계까지 마쳤어요 다시 내 엑티비티 파일로 가보시면 AdView와 같은 여러 Admob을 사용해볼 수 있습니다 화면에 보시는 것처럼 분석이 진행됐고요 SDK가 제대로 불러들여진 게 확인됐습니다 이렇게 앱에 Firebase와 Admob이 단 몇 분만에 함께 돌아가네요 오늘 여기까지입니다 질문이나 코멘트는 아래에 남겨주시거나 저희 트위터나 Google+ 에 #askfirebase 로 보내주세요 그리고 모바일 광고에 대한 영상을 더 보고 싶으시다면 제가 만든 다른 시리즈들이 많답니다 스크린캐스트나, 기능 오류, 복제 스웨터를 입은 털 없는 고양이 같은 것들을 다루니 한 번 봐보세요 모바일 광고에 관심이 많다면 후회하지 않으실 거예요 며칠에 한 번씩 새로운 에피소드를 내 보내니 잊지 말고 이 채널을 구독해주셔서 최신 정보를 받아보세요 이상 앤드류 브로그던이었습니다

Getting Started with Firebase Storage on Android – Firecasts

또 하나의 파이어캐스트에 오신 것을 환영합니다 더그 스티븐슨 입니다 오늘은 저장소를 이용해 이미지 파일을 업로드하고 다운로드 받을 수 있는 웹URL을 생성하는 법에 대해 알아볼게요 Firebase 저장소는 안전하고 확장 가능한 솔루션으로 앱과 관련된 파일을 저장할 수 있는 기능입니다 우선 시작에 앞서 Firebase SDK를 앱에 적용해야 해요 적용법에 대해 영상에서 확인해 보실 수 있습니다 먼저 새로운 프로젝트를 생성하는 방법을 알아볼게요 당시 최신 버전은 Firebase SDK 96

1이니 참고하시기 바랍니다 좋아요 여기 앱 세팅을 이미 해놨어요 Firebase 저장소와 쓸 수 있도록 해보죠 앱이 어떤 형태인지 살펴볼게요 하늘색 배경에 Firebase 로고가 있는 앱화면입니다 텍스트 위젯에 텍스트를 입력하면 이미지 위로 텍스트가 표시되는 형태입니다 여기에 업로드 버튼도 있군요 현재는 아무런 기능을 하지 않고 있습니다 버튼을 누르면, 보이는 화면이 Firebase 저장소에 업로드되도록 해볼게요 우선 아셔야 할 것은 Firebase 저장소는 인증과 연동된다는 것입니다 보통은 로그인된 사람만 업로드할 수 있도록 설정하는 게 좋겠죠? 누구나 아무런 자료를 스토리지에 넣으면 문제가 발생할 테니까요 이번 회차가 너무 길어지면 안 되니까 인증 절차는 넘어가도록 할게요 업로드를 하기 위해서는 디폴트 보안 역할을 변경해야 합니다 프로젝트 저장소 버킷을 접근할 때마다 인증 절차를 진행하면 번거로우니까요 Firebase 콘솔을 보시면 왼쪽의 스토리지를 선택할게요 보시는 것처럼 비어있습니다 Rules탭으로 이동하시면 해당 프로젝트에 대한 기본적인 설정들이 보이죠? 인정된 사용자만 읽고 쓸 수 있도록 설정되어 있습니다 아직 설정에 대해서 모르셔도 되지만 바꾸는 법을 보여드릴게요 인증 절차를 생략하고, 읽기와 쓰기를 자유롭게 할 수 있도록 말이죠 하지만 지금부터 보여드리는 부분은 개발을 위한 부분일 뿐, 보안상 안전하지 않을 수 있다는 걸 알아두세요 저장소에서 이것저것 해보신 후 보안 설정을 꼭 다시 하셔야 합니다 인증을 다시 설정해서 인증된 사용자만 스토리지 버킷에 접근할 수 있도록 하세요 좋습니다 다시 콘솔을 보시면 보안 설정을 가장 쉽게 해제하려면 전체 버킷에 대한 읽기와 쓰기 권한을 True값으로 변경하는 것입니다 보시는 바와 같이 까먹지 않기 위해 퍼블리시 버튼 푸쉬 구문 다음에 코멘트를 달아두겠습니다 이제 인증 없이 버킷에 작성 되도록 설정했습니다 안드로이드 스튜디오에서 가장 먼저 하실 것은 아래에 저장소관련 Compile구문을 버전에 맞춰 입력합니다 현재 최신 버전은 961입니다 이러면 Firebase 저장소 클라이언트 API접근권한이 주어지죠 좋습니다 앱의 활성 코드를 한 번 살펴보시죠 이미 생성된 코드가 화면에 노출된 활동사항을 찾고 초기화하도록 합니다 업로드 버튼 클릭 관련한 구문도 이미 작성돼 있네요 해당 구문에서 저는, 안드로이드 API로 업로드될 이미지의 비트맵을 추출하도록 됐어요 그런 후, 비트맵은 PNG포맷으로 압축하게 되고요 마지막으로 byte array에 Raw pixel이 생성되네요 저는 추가로 Firebase 저장소에 이미지를 업로드하도록 수정하고 싶네요 하는 방법을 알려드리죠 Firebase 저장소 관련 레퍼런스를 추가하셔야 합니다 상단에 Private 사용자 변수로 저장하도록 작성합니다 다음은 프로젝트 저장소 버킷에 저장될 이미지의 경로를 지정해줘야 합니다 Firememes라는 디렉토리에 저장하도록 설정해보죠 Random UUID로 업로드 파일 이름을 랜덤 생성하도록 할게요 PNG 확장자를 사용하기로 했으니 그것도 입력해 줄게요 경로 이름을 지정하면, 저장소 API관련 구문도 다음과 같이 작성합니다 이 저장소 레퍼런스 오브젝트는 이미지를 관리할 주요 기준이 됩니다 주어진 경로로 이미지를 프로젝트 저장소 버킷에 저장하도록 기준으로 삼을 것입니다 한가지 더 해볼게요 SDK의 빌더를 이용해서 이미지에 커스텀 메타데이터를 입력할게요 이 필드는 test라고 지정해서 로고 위로 겹칠 글자를 담당하게 합니다 이렇게 두 요소를 작성해주면, 저장소 레퍼런스의 putBytes를 활용해서 업로드와 함께 메타데이터를 함께 업로드하도록 쉽게 할 수 있습니다 uploadTask를 불러와서 전송되는 것을 모니터링 할 수 있도록 해줍니다 이 정도면 코딩을 더 안 해도 작동할 것 같네요 나머지는 Firebase 저장소 SDK가 알아서 업로드를 해줍니다 그래도 업로드가 완료되었다는 정보를 앱 사용자에게 알려주는 기능을 넣는 게 좋겠죠? UploadTask를 활용해서 진행도를 보여주는 장치를 넣어주도록 할게요 한 번 보시죠 이 앱에는 이미 회전하는 형태의 바 위젯이 있는데 보시는 것처럼 업로드 버튼 아래에 숨어있습니다 업로드가 시작되면 노출되도록 업로드 버튼 클릭 핸들러에 행을 삽입합니다 또한 업로드가 진행되는 동안 업로드를 또 할 수 없도록 업로드 버튼을 비활성화할게요 UploadTask에 Success Listener도 삽입합니다 이런 구문은 안드로이드 스튜디오에서 알아서 생성됩니다 활성 인스턴스를 생략하고 넘어간 게 보이시나요? 이러면 수신자의 활성 인스턴스의 범위가 설정되어 업로드가 전에 멈출 경우, 수신자가 엑티비티에 붙어있도록 하지 않도록 방지합니다 엑티비티 요소가 새어나가지 않도록 해주는 거죠 사용 가능한 TaskAPI에 대해 더 알고 싶으시면 이 문서를 확인해보세요 더 상세히 설명된 블로그 포스팅 시리즈도 여기 있습니다 업로드 테스크가 완료되면 OnSuccess 콜백이 진행되어 결과를 알려줄 TaskSnapshot 오브젝트를 지나게 됩니다 콜백이 성공할 경우, 진행바를 숨기고 업로드 버튼을 다시 활성화합니다 마지막으로 TaskSnapshot에서 다운로드 URL를 가져오고 기본적으로 숨겨진 그 텍스트를 보이도록 변경해 주겠습니다 다운로드 URL은 기본적인 HTTP 스타일의 주소값이며 이미지를 다운받을 수 있도록 합니다 잠시 후에 한 번 실험해보죠 좋습니다 앱을 한 번 실행해서 잘 되나 볼게요 텍스트를 입력한 후, 업로드 버튼을 누릅니다 이렇게 업로드 하는 동안 피드백이 있네요 다 된 후, 다운로드 URL을 볼 수 있습니다 이걸 사용해서 아무나 이미지를 볼 수 있죠 여기 에뮬레이터에서 보시면 앱상에서 브라우저를 열고, 이미지를 다운로드하고 화면에 표시합니다 Firebase 콘솔 저장소에 가셔서 새로 고침하시면 아까 설정한 firememes 디렉토리가 보이네요 방금 업로드한 이미지도 안에 있고요 우측에는, 파일에 대한 정보가 노출됩니다 Png 확장자로 되어있는 것도 보이고요 메타데이터 섹션에서는 입력한 커스텀 메타데이터가 잘 보입니다 파일 경로 섹션에서는 앱에서 클릭한 동일한 다운로드 경로가 있습니다 만일 범용 다운로드 경로를 원치 않는다면 링크와 연결된 토큰 값을 revoke버튼을 눌러서 제거하시면 됩니다 그러면 해당 URL이 더 이상 작동되지 않죠 새로운 다운로드 주소값을 입력할 수도 있습니다 이걸 클릭하시면 되죠 자, 오늘은 Firebase 저장소에서 파일은 업로드하고 저장 경로를 추출하고 접근하는 방법에 대해 간단히 알아봤습니다 Firebase 저장소에 대해 더 알고 싶으시면 이 문서를 한 번 읽어보셔도 좋을 것 같네요 입력 스트림을 통해 데이터를 업로드, 삭제, 관리하는 방법을 필히 숙지하시고 테스크에서 발생할 수 있는 오류를 고칠 방법도 알아보세요 아, 그리고 잊지 마시고 보안이나 저장소 인증에 대한 것도 알아보셨으면 좋겠네요 안드로이드 개발자라면 업로드와 다운로드를 할 때 엑티비티 순환을 처리하는 부분에 특히 관심을 가지고 공부하시기 바랍니다 UI가 인식할 수 있도록 SDK는 진행 중인 업로드와 다운로드를 다시 연결해주는 역할을 합니다 어떤 이유로 엑티비티가 중단될 경우에 말이죠 이상 오늘의 #AskFirebase를 마치겠습니다 이제 가셔서한 번 사용해보세요 사용 소감도 아래에 덧글로 남겨주시거나 트위터로 메시지를 보내주시면 감사하겠습니다 다음에 또 뵐게요