Modern Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)

[음악 재생] 안녕, 안녕 다른 이야기에 오신 것을 환영합니다

현대 Android 개발에 오신 것을 환영합니다 나는 우리가 시작하기 전에, 이 태양은 나보다 훨씬 밝다 그래서 우리는 이것을해야 할 수도 있습니다 그래서 우리는 안경을 끼울 수 있습니다 슬라이드를 보지 않거나 안경을 착용하지 마십시오

그리고 아무것도 보지 마라 그래서 재미있을 것입니다 CHET HAASE : 오늘이 일이 어떻게 진행되는지 살펴 보겠습니다 현대 Android 개발에 오신 것을 환영합니다 나는 안드로이드 툴킷 팀의 Chet Haase입니다

Romain Guy : 저는 Android 프레임 워크 팀의 Romain Guy입니다 뭔가를 내리십시오 CHET HAASE : 그리고 우리는 많은 것들에 대해 이야기 할 것입니다 이미 알고 계시 겠지만 우리에게 일어났습니다 우리가 당신에게 조언과 정보를 어떻게 제공했는지 오래 동안 안드로이드를위한 좋은 앱을 개발할 수 있습니다

그리고 그 정보는 수년에 걸쳐 변했습니다 새로운 기능, 새로운 API, 플랫폼의 새로운 성능, 모든 종류의 것들 그리고 약간 혼란 스럽습니다 정보 검색을 할 수 있습니다 일부 문서 사이트에서도 가능합니다

정말로 정보를 얻지 못한다 현재 많은 상황에 적용됩니다 그래서 우리는 그것을 모두 함께 포장하고 싶었습니다 2018 년에 중요한 일들에 대한 우리의 견해가 있습니다 Android에 대해 생각해보십시오

ROMAIN GUY : 올해 안드로이드는 10 년, Chet가 말했듯이, 시대에 뒤 떨어진 많은 정보가 있습니다 때로는 스택 오버플로에 대한 블로그를보고, 누군가 뭔가에 대해 정말로 화가났다 우리가 10 년 전에 말했던 화 내지 마 괜찮아 모든것은 변한다

상황이 진화합니다 우리가 당신을 싫어하기 때문이 아닙니다 우리가 틀렸기 때문이 아닙니다 그것은 다른 시간 이었기 때문입니다 – 다른 필요, 다른 장치 그래서 우리는 그 중 일부에 대해 이야기 할 것입니다

차이점을 이해하고 있는지 확인하십시오 사물을하는 현대적인 방법 그리고 일을하는 오래된 방법, 우리는 슬라이드에 약간의 힌트가있다 따라서 슬라이드 중 일부는 이와 같이 보일 것입니다 우리가 시작하자 이제 타임 라인을 살펴 봅시다

이것은 일종의 안드로이드 역사입니다 2008 년에 10이 나왔다가 분명히, 우리는 몇 년 동안 많이하지 않았다 [웃음] 나는 거기에서 무슨 일이 일어나고 있는지 모른다 나는 거기에 넣을 것들을 생각할 수 없었다

최적화, 최적화, 최적화 그리고 나서 Android Studio가 나왔습니다 그게 뭐야? ROMAIN GUY : 웹에 따르면, 우리는 나쁜 API를 개발하는 데 바빴다 [웃음] CHET HAASE : 분명히, 그것들은 당신이 원하는 것이 아니 었습니다 그래서 우리는 지난 몇 년 동안 더 잘 해냈습니다

그래서 Android Studio가 나왔고 Eclipse에서 이제 Android Studio에 더 풍부한 기능을 구축했다 우리가 그 당시에 할 수 있었던 것보다 예술이 나왔다 그것은 KitKat에서 기본적으로 꺼졌으며 Lollipop에서만 실행되는 런타임입니다 우리의 권장 사항 중 일부에서 보게 될 것입니다

정말로 변화했기 때문에 거기에서, 시간이 지남에 따라, 우리가 당신을 바라 보는 방식 코드를 작성해야합니다 사전 Dalvik 정보가 꼭 필요하지는 않습니다 예술 세계에 적용한다 Recycler보기가 해제되었습니다 List의 더 나은 버전이기 때문에 중요합니다

더 많은 유연성을 가진보기 그러나 또한 우리는 부품을 출시하기 시작했습니다 연결 라이브러리에서 연결이 끊어졌습니다 플랫폼 릴리즈에서 이 새로운 기능을 사용할 수 있습니다 모든 릴리스에서 애플리케이션에서 네가 신경 써 줬어

잠시 후, 우리는 Constraint Layout Android Studio에 내장되어 있습니다 반대로 실제로 API를 디자인하는 더 풍부한 방법 XML을 직접 타이핑하는 다양한 방법을 제공합니다 코 틀린 – 작년에 나온 것 같아요 나는 모른다 일부 IO 회의 또는 뭔가

아키텍처 구성 요소 – 이는 작년에 발표되었습니다 가을에 10 새로운 일을하는 방식 해결하려고하거나, 적어도 도움을줍니다

안드로이드와 관련된 많은 복잡한 문제들, 커뮤니티로부터 피드백을받는 것 이 API를 사용하여 당신을 쉽게 해줍니다 그것이 전체 목표입니다 Studio Profilers, 훨씬 더 풍부한 방법 성능 측정 항목이 실제로 무엇인지 알아 내기 위해 귀하의 응용 프로그램에 대한 KTx, 나온 확장 라이브러리 몇 달 전에 코 틀린에게 그리고 최근 페이징 라이브러리가 나왔습니다

이번 주에 10을 기록했습니다 그래서 이것은 일종의 일종의 범위입니다 그것은 시간이 지남에 일어났습니다 나는 2008 년과 2013 년 사이에 더 많은 일이있을 것이라고 확신합니다

나는 그것이 무엇인지를 기억할 수 없다 알았어 우리는 도구로 시작할 것입니다 다음은 당신이 알고있는 도구입니다 이 도구 인 Hierarchy Viewer를 얼마나 많이 사용하셨습니까? 오, 꽤 잘됐다

모두는 아니다 그래서 그것은 Hierarchy Viewer라는 도구였습니다 그것은 SDK의 일부입니다 독립형 애플리케이션이었습니다 그 전에 실제로 다른 버전이있었습니다

그게 내가 원래 주말에 쓴 것이 었어 플랫폼을 최적화하기위한 디버깅 도구가 필요했기 때문입니다 그리고 웬일인지, 우리는 SDK에서 그것을 출하하기 시작했다 가장 빠른 도구는 아니 었습니다 그것은 가장 좋은 도구가 아니 었습니다

사실,이 사람은 우습게도, 실제로 자고있는 시간을 많이 보내고있었습니다 그들의 책상에서 그것은 매우 흥미 롭습니다 전에는 그 기술을 전혀 사용하지 않았습니다 그것은 효과가 없었습니다

이제 우리는 그것을 훨씬 더 나은 것으로 대체했습니다 레이아웃 검사기 (Layout Inspector) Android Studio의 일부입니다 좋은 장점 중 하나는 한 번에 여러 검사 훨씬 더 빠릅니다

따라서이 도구를 사용하지 않았다면 사용하십시오 그것은 당신의 계층 구조를 분석하는 매우 쉬운 방법입니다 임베딩 및 마지 닝과 같은 다양한 디버깅, 심지어는 실적이 좋지 않을 수도 있습니다 서로 겹친다 코드를 프로파일 링하는 오래된 방법이 또 하나 있습니다

이것을 추적보기라고합니다 따라서 Trace View는 이미 존재하는 도구입니다 2007 년에 Android 팀에 합류했을 때 주변에있었습니다 꽤 오랫동안 여기에서 우리는 이클립스 내부의 동작을 봅니다

이전에는 독립형 도구였습니다 Trace View에서 우리가 가진 문제점 중 하나는 원래 버전은 계장 된 프로파일 러였습니다 그래서 많은 오버 헤드가있었습니다 그것은 호출 된 모든 메소드에서 실행 중입니다 그것은 해석 모드에서 실행 중이었습니다

그래서 그 숫자를 정말로 믿을 수는 없습니다 그래서이 방법은 3 밀리 초가 걸렸습니다 그건 사실이 아니야 그 방법은 실제로 그것보다 훨씬 빠르다 당신이 할 수있는 유일한 일은 상대 시간을 비교하는 것입니다

다른 방법들 사이 심지어 방법이 네이티브 코드를 호출하면 네이티브 코드가 영향을받지 않습니다 그래서 네이티브 코드를 호출하는 모든 메소드 숫자가 너무 잘못 되었기 때문에 비뚤어졌습니다 수년에 걸쳐 샘플링을 추가했습니다 이 도구에 프로파일 링

하지만 여전히 사용하기가 어려웠습니다 우리 중 몇 명만이 내부적으로 사용하고있었습니다 왜냐하면 그것은 그렇게 위대하지 않았기 때문입니다 몇 년 후 다행히 Systrace를 도입했습니다 따라서 Trace View를 통한 Systrace의 큰 이점 당신에게 포괄적 인 시각을 제공한다는 것입니다

전체 시스템의 추적보기는 얼마나 많은 시간을 알려줍니다 애플리케이션 내부의 모든 코드 라인에 지출하고 있으며, 원래 하지만 때로는 성능 문제 시스템의 다른 곳에서 왔습니다 어쩌면 너는 무언가에 막혔을거야 그것은 다른 과정에 있습니다

그래서 Systrace는 당신에게 필요한 견해를 제공합니다 그 전에 우리는 완전히 눈이 멀었습니다 이제는 새로운 프로파일 러가 있습니다 Android Studio에 도입되었습니다 나는 그들이 3

2 또는 31의 일부라고 생각한다 나는 정말로 기억하지 않는다 그러나 프로파일 러 탭으로 이동하면, 당신은 CPU의 실시간 그래프를 보게 될 것입니다 응용 프로그램과 추억 사용 [INAUDIBLE] 귀하의 응용 프로그램의

그리고 CPU 그래프를 더블 클릭하면, 당신은 그 견해에 도달 할 것입니다 Trace View와 매우 유사합니다 다시 말하지만 훨씬 빠르며 네이티브 코드 프로파일 링, 인스트루멘털 프로파일 링, 샘플링 프로파일 링 및 심지어 Systrace 이것은 지금부터 사용해야 할 도구입니다 이것이이 그래프의 모습입니다

그래서 우리는 이제 4 개의 그래프를 믿습니다 우리는 CPU 1, 메모리 1, 네트워크 1, 에너지 1 내가 네트워크를 사용하지 않아서 무엇을위한 서버인지는 확실하지만 너희들이 그걸 이해하고 그것을 잘 활용할 것입니다 그리고 그것이 마치 CPU 프로파일 러에 들어갑니다 그래서 당신은 화염 그래프를 얻습니다 데이터를 분석하는 여러 가지 방법이 있습니다

제가 좋아하는 것은 화염 그래프입니다 모든 기능을 채색 할 것입니다 서로 다른 색상의 전화 그들이 얼마나 많은 시간을 들여야하는지 붉은 색이나 진한 오렌지색으로 보이는 것들 애플리케이션 내부의 병목 현상입니다 따라서 응용 프로그램 내에서 드릴 다운하는 아주 쉬운 방법입니다

병목 현상을 식별 할 수 있습니다 이것이 네이티브 프로파일 러입니다 Android 80부터 사용할 수 있으며, 그래서 그것을 실행하려면 오레오 이상이 필요합니다 그리고 나는 새로운 메모리 프로파일 러에 대해 간략하게 언급했다

그래서 우리는 메모리 추적을하기 위해 DDMS라는이 도구를 사용합니다 다시 말하지만, 그것은 독립형 도구였습니다 Eclipse 플랫폼에서 빌드되었습니다 그렇지 않기 때문에 사용하기가 정말 어려웠습니다 신분증의 일부

어떤 시점에서 ID에 다시 추가했습니다 그리고 그것은 거의 유일한 좋은 길이었습니다 당신은 당신이 찾고 있는지 여부를 볼 수 있습니다 잘못된 곳에서의 기억 예를 들어, 드로잉을하고 있는지 여부 또는 레이아웃 또는 터치 처리를하고 있는지 여부를 나타냅니다

이제는 Studio의 일부입니다 그래서 당신이 보여주는이 그래프를 볼 때, 실시간으로, 메모리 사용량, 당신 다른 버킷도 볼 수 있습니다 그래서 당신이 얼마나 많은 기억을하는지 말해 줄거야 Java 힙에서 사용하거나 얼마나 많은 기본 메모리 당신이 사용하고있는 그래픽 메모리의 양 따라서 문제의 출처를 정확히 찾아 낼 수 있습니다

화면에서 보듯이 슬라이스를 만들 수도 있습니다 그 시간 동안 모든 할당을 보여줄 것입니다 스택 추적을 볼 수 있으며 참조를 폴드 할 수 있습니다 가장자리 프로파일을 덤프 할 필요가 없습니다 에지 [INAUDIBLE] 사용

jhat을 실행하고 이러한 끔찍한 모양의 웹을 볼 필요가 없습니다 사용하던 UI 아직 모든 일을 처리하지는 못하기 때문에 때때로 jhat에 가야하지만 아주 좋은 방법입니다 기억력이 있다면 시작할 수 있습니다 애플리케이션 내부의 문제

레이아웃 디자인이 이렇게 사용되었습니다 그것은 기사 디자인입니다 흥미로운 이유는 안드로이드가 나왔을 때, 모두에게 XML 로의 전환을 유도하는 것은 매우 어려웠습니다 많은 분노한 개발자를 기억하십시오 UI를 빌드하는 Java 코드를 작성하려고했습니다

그리고 이제, 우리는 당신에게 이것을주었습니다 따라서 이것은 비주얼 레이아웃 비주얼 에디터입니다 이제 화가 많이 들었습니다 누가 시각 도구가 아닌 XML 만 사용하고 싶어하는지 그래서 우리는 단지 새로운 것을 발명해야만한다고 생각합니다

당신이 이것을 사용하기 시작하게하는 미끼로서 CHASE HAASE : 나는 단지 상수라고 생각한다 엔지니어들이 무엇이든 불만 스러울 것입니다 당신이 그들에게주는 새로운 옵션 로망 가이 : 특히 프랑스 인 경우

그리고 도구의 새로운 기능에 대해 이야기하는 경우, 모션 레이아웃을위한 새로운 도구를 살짝 봤습니다 제약 레이아웃을 사용하여 애니메이션을 만들 수 있습니다 Nicola와 John은 다시 그것을 보여줄 것입니다 생각, 내일 또는 목요일 그러니 그 이야기를 찾아보십시오

그래서 우리는이 비주얼 디자이너가 오직 시작 우리가 할 수있는 일은 훨씬 더 많습니다 우리는 아직 모든 것을 구축 할 시간이 없었습니다 그러나이 새로운 모션 레이아웃 편집기는 다음 단계입니다 시각적 인 피드백을 통한 애니메이션 제작 – 실시간 시각적 피드백 – XML을 사용하는 것보다 훨씬 좋음 런타임 및 언어, Chet

잘 지내세요 그래서 달빅 너무 슬퍼하지 마세요 Dalvik은 굉장 했어 그것은 무엇을하도록 설계 되었는가? 공간에 최적화되어 있었습니까? G1이 나왔을 때, 192 메가 였고, 그 중 48 개가 64 세 – 작은 부분이 응용 프로그램에 액세스 할 수있었습니다 CHET HAASE : 매우 적은 양의 메모리 실제로 응용 프로그램에서 사용할 수있었습니다

그래서 Dalvik은 런타임으로, 자체 또는 모든 힙에 대해 많은 메모리를 차지합니다 그리고 물건을 저장해야하는 곳 따라서 장치가 좋아짐에 따라, 기억이 커지면서 반드시 그런 것은 아니었다 도매 방식으로 최적화 할 수있는 능력을 갖추어야한다 우리가 필요했던 것

어떤 시점에서 그들은 기본적으로 시작되었습니다 우리가 말했던 것처럼 Art 런타임의 처음부터, KitKat에서 나왔고 Lollipop에 기본으로 설치되었습니다 그러나 Dalvik 시대에, 우리는 기본적으로 그로부터 나온 권고안을 가지고 있었다 할당과 같은 것들 때문에 정말 비싸다 힙을 걸 으면서이 물건을 넣을 장소를 찾아야했습니다

그리고 힙은 시간이 지남에 따라 파편화되었다 그것은 비록 그것이 많은 공간을 거기에서 가지고 있었다고해도, 그것은 연속적으로 많은 공간을 가질 필요는 없었습니다 그 물건을 넣을 장소를 찾으러 그리고 컬렉션도 정말 비쌌습니다 결국 당신은 시간이 지남에 따라 물건을 배정 할 것입니다

그리고 나서 결국 기억을 잃을 것입니다 그리고 그렇게 할 때 – 당신이 애니메이션의 중간에있을 때, 당신은 UI 스레드를 사용하고 있습니다 비트 맵을위한 공간을 할당해야합니다 공간을 찾을 수 없으므로 GC를 더 잘 실행하십시오 아마 2 ~ 3 개의 프레임을 잃을 것입니다

Dalvik은 실제로 모든 항목을 수집해야했기 때문에 더 이상 참조없이 그래서 우리가 가진 권고 중 일부는 기본적으로 가능할 때마다 물건을 할당하지 마십시오 그것은 틀림없이 우리가 프레임 워크 안에서 삶을 살아가는 방법입니다 우리는 당신의 내적 루프이기 때문에 응용 프로그램 개발자가 그렇게하는 것이 좋습니다 내가 생각하는 권고 중 하나 지역 사회는 타격을 본 적이있다

열거 형을 사용하지 않았습니까? 열거 형 구조가 밝혀 졌기 때문에 – 클래스 구조체는 int 객체보다 훨씬 큽니다 권리? 그리고 우리는 ints를 온통 사용합니다 메모리 양을 최소화하려고하기 때문에 우리는 또한 시간을 최소화하려고 노력한다 우리는 새로운 객체를 만들고 있습니다 원시 타입을 전달하는 것

우리는 또한 원시 타입이 멋지다고 말했다 침대는 시원하고, 수레는 시원합니다 대문자 I 정수, 그렇게 차갑지 않다 또한 차가운 것이 오토 박싱입니다 표준 콜렉션 클래스를 사용할 때, 이 정보에 많은 정보가 저장되어 있다면 원시 타입과 그것들은 autoboxed in and out되고 있습니다

또는 다른 패턴과 접근 방식을 사용하는 경우 이러한 것들을 객체로 생성하게하고, 너는 우리가 가진 도구에서 볼 수있다 그 시간에, 너는 오토 박싱과 즉석 배정 그리고 결국에는 GC가 시작됩니다 너는 조금 더 싫어한다 현대 세계에서 우리는 이제 예술을 가지고 있습니다

성능에 최적화되어 있습니다 그것은 메모리 최적화를 위해 처음부터 만들어졌지만, 성능을 위해 최적화 할 수 있습니다 그리고 이것은 메서드 호출 항목 측면에서 성능입니다 할당 및 컬렉션에 최적화되어 있습니다 빠른 할당 및 수집 몇 가지 이유가 있습니다

그 중 하나는 대형 물체를 위해 별도로 마련된 것입니다 그래서 모든 것을 같은 힙에 놓는 대신에, 큰 물체를위한 공간을 찾아야 만한다 모든 작은 것들 중에, 그것은 모든 비트 맵을 넣습니다 별도의 힙에 모든 큰 개체가 전체적으로 표시됩니다 큰 오브젝트를위한 공간을 찾는 것이 더 쉽습니다

그러면 작은 개체가 별도의 힙에 들어갑니다 또한, 정말 멋지다, 그것은 조각 모음을 할 수 있습니다 Dalvik은 조각 모음을 할 수 없으므로 시간이 지남에 따라 할당됩니다 결국에는 충분한 공간이 없었습니다 당신이 필요로하는 것을 위해서

그래서 당신은이 애매한 오류 메시지를 얻을 것입니다 그곳에는 메가 바이트가 없기 때문에 단지 48 메가 바이트 무료 당신이 깨닫기 전까지는 많은 의미를 갖지 않습니다 아마도 힙이 조각난 것 같습니다 우리는 그것에 대해 많은 것을 할 수 없습니다

이제 할 수 있습니다 Art에서는 힙을 조각 모음합니다 이전 릴리스에서는 응용 프로그램이 조각 모음을 수행 할 때 조각 모음을 수행했습니다 백그라운드에 있었다 이제 응용 프로그램이 실제로 조각 모음을 수행 할 수 있습니다

뿐만 아니라 전경에 있습니다 그래서 더 좋은 방법 이제 우리가 가진 권고 사항은 필요한 경우 할당하고 할당하십시오 괜찮아 사실 열거 형을 사용하면 걱정하지 않습니다

어서 [CHEERING] 분명히, 당신은 돌보아, 그래서 당신이 그들을 즐기시기 바랍니다 우리는 여전히 원칙적으로 사용하지 않는 경향이 있습니다 많은 프레임 워크 코드와 API에서 로망 가이 : 나는 그것을 사용한다 CHET HAASE : 그들은 때때로 거기에있다

그러나 내가 말했던 것처럼, 우리는 여전히 내부 루프입니다 그래서 우리는 더 보수적 인 경향이 있습니다 반드시 애플리케이션 코드에 있어야합니다 적절한 유형을 사용하십시오 나는 여전히 원시적 인 타입이 정말로 멋지다고 생각한다

하지만 그걸 알아? 오브젝트 유형이있는] 렉션을 사용해야하는 경우에는 정상입니다 그러나이 휴대 전화는 여전히 제약이있는 기기라는 점에 유의하십시오 메모리는 48 또는 64 메가 사용할 수 없습니다, 하지만 다른 모든 것들과 여전히 공유되고 있습니다 사용, 해당 시스템에서 실행 중 또한 배터리는 정말 중요합니다

배터리를 사용하는 것이 중요합니다 가능한 한 오랫동안 언제나 끊임없이 일을하고 있다면 만약 당신이 끊임없이 쓰레기를 만들고 그것을 모으고 있다면, 아트는 훨씬 빠릅니다 그러나 예술은 여전히 ​​실제로 작업을해야합니다 할당하고 수집하고, 모든 것들은 힘을 사용합니다

따라서 배터리가 전력을 사용한다는 것을 기억하는 것이 좋습니다 어쩌면 네가 보수적 인 태도로 너는하려고하는거야 또한 프레임 워크처럼 내부 루프를 인식해야합니다 병목 현상 단단한 루프에서 일을하지 마십시오

성능에 문제가 발생할 수 있습니다 ROMAIN GUY : 안드로이드가 시작되었을 때, 팀은 자바 프로그래밍 언어 응용 프로그램을 만들려면 그 많은 이유가있었습니다 주요한 것은 매우 인기있는 언어였습니다 수백만 명의 개발자가 이 언어를 사용하는 방법을 알고있었습니다 훌륭하고 자유로운 도구가 많이있었습니다

따라서 빠른 채택을 위해 정말 도움이되었습니다 Android 플랫폼의 시간이 지남에 따라, 우리는 때때로, 새 버전의 언어를 채택하는 데 약간의 시간이 걸립니다 우리는 최근 자바 프로그래밍 언어 버전 18 나는 그들이 1

10에 달하고 있다고 생각한다 그러나 그것은 수년 동안 우리를 섬겼습니다 작년에 다행히도 우리는 완전한 지원을 발표했습니다 Kotlin 프로그래밍 언어 용 얼마나 많은 사람들이 지금 그것을 사용하고 있습니까? [CHEERING] 괜찮아

CHASE HAASE : 그들을 지켜라 하나 둘 셋 넷 ROMAIN GUY : 거의 모두 5 번 이상 이었어 로망 가이 : 우리는 몇 가지 슬라이드를 유지할 것입니다

그래서 우리는 작년에 그것을 2017 년에 발표했습니다 우리는 JetBrains와 긴밀히 협력하고 있습니다 우리는 도구가 Kotlin과 잘 작동하는지 확인합니다 우리가 필요한 기능에 액세스 할 수 있는지 확인하십시오 전반적으로, 우리는 그것을 좋아하기 때문에 코드를 읽고 쓰기가 더 즐겁다

우리는 코드를 읽고 쓰는 데 너무 많은 시간을 소비합니다 그건 중요합니다 여기에 몇 가지 예가 있습니다 그들은 읽기가 어려울 것입니다 그러나 여러분 모두가 Kotlin을 작성하는 방법을 알고 있기 때문에 괜찮습니다

이러한 예제는 Kotlin 확장에서 가져온 것입니다 그래서 나는 그들을 정말로 빨리 지나갈 것이다 나는 명명 된 매개 변수를 좋아한다 메소드의 오버로드를 여러 개 만들 필요가 없습니다 또는 빌더 모든 시간

정말 유용한 인라인 함수를 사용할 수 있습니다 확장 프로그램을 만들 때 또는 그래픽을 만들 때도 코드, 예를 들면 우린 그걸 봤어 연산자 운영자에게 과부하가 걸릴 수 있습니다

당신은 그것에 조심해야합니다 이 문제를 상당히 악용 할 수 있습니다 일단 X로 불리는 고정 연산자를 만들었습니다 왜냐하면 그것은 벡터에 대한 교차 곱처럼 보이기 때문입니다 그러지 마

그것은 끔찍한 생각입니다 나는 끔찍한 생각이기 때문에 그것을 GitHub에 넣었습니다 소멸 할당을 할 수 있습니다 따라서 POJO가 있으면 컴포넌트 1, 2, 3 등으로 불리는 메소드 그런 다음 여러 개의 과제를 수행 할 수 있습니다

한 줄의 코드로 이것은 Android KTx의 예입니다 우리는 정수를 파기합니다 따라서 이동 및 마스킹을 수행 할 필요가 없습니다 바이트와 ​​정수의 데이터 클래스가 있습니다

모든 게터와 두 개의 문자열을 만드는 매우 쉬운 방법 같음 및 해시 코드 그래서 당신은 할 필요가 없습니다 IntelliJ에 알려주기 위해 바로 가기를 입력해야합니다 그것은 우리가 저지르는 게으름의 수준입니다 Kotlin에 도달했습니다 그래서 환상적입니다

그리고 마지막으로 그렇습니다 나는 그저 나에게, 내가 할 수있는 일을 부르고 싶었다 너무 매력적 Kotlin은 매우 영리하다 그들이 언어로 내린 의사 결정 그리고 그들 중 하나는, 예를 들면, lambda가 함수의 마지막 매개 변수 일 때, 그들은이 특별한 구문을 사용할 수 있습니다 너는 람다를 통과 할 필요가 없다

함수에 대한 매개 변수로 중괄호를 열 수 있습니다 바로 코드를 입력하십시오 외모와 느낌이 훨씬 자연 스럽습니다 우리가 새로운 것을 디자인 할 때 지금하고있는 일 중 하나입니다

플랫폼의 API – Android P로 시작 – 우리는 Java API가 이러한 규칙으로 가득 차 있음을 확인합니다 단일 추상 메소드 인터페이스가있을 때, 우리는 인터페이스를 사용하는 매개 변수 매개 변수 목록의 끝 부분에있다 Kotlin 개발자가 이익을 얻을 수 있도록 언어의이 특정 기능에서 그리고 우리는 점점 더 많은 것을 할 것입니다 지원 라이브러리 및 향후 API에 대한 정보를 제공합니다 그래서 아직 Kotlin을 사용하지 않는 당신들에게는, 프로젝트에는 Kotlin과 Java가 모두 포함될 수 있습니다

모든 신청서를 Kotlin으로 전환 할 필요는 없습니다 응용 프로그램에 추가하는 다음 클래스는 Kotlin, 또는 기존 클래스를 변환 할 수 있습니다 우리는 1 톤의 린트 수표를 가지고 있습니다 누락 된 것이 있으면 Tor에게 알려주십시오 그것은 당신 앞에서 꽤 많이 쓸 것입니다

그리고 바로 저지하십시오 보푸라기 수표를 쓸 때 일종의 기계입니다 Android 확장 프로그램을 확인하십시오 다시 한번 Jake Wharton의 이야기가 있습니다 나는 목요일 아침에 그것에 대해 생각한다

흥미로운 점에 대해서 이야기 할 것입니다 스타일 가이드도 만들었습니다 그래서 아직 자바 가이드를 사용하고있는 여러분 – 내 말은, 우리는 실제로 하나도 가지지 않았다는 것입니다 하지만 소스 코드를 따르고 있다면, 당신은 아마 당신의 들판에 M의 접두사를 붙일 것입니다 우리가 그렇게하지 않는다는 것을 알면 행복하게 될 것입니다

더 이상 Kotlin 첫째, 우리가 정말로 그것을 좋아하지 않기 때문에, 그리고 네가 정말로 할 수 없기 때문에 어쨌든 Kotlin의 속성 구문 때문입니다 우리는 또한 상호 운용성 가이드가 있습니다 코드를 작성하려고한다면 그것은 두 자바 개발자 모두가 소비하기위한 것이다 및 Kotlin 개발자, [INAUDIBLE] 자바 코드 또는 코 틀린 코드 작성 우리는 당신에게 설명 할 수있는 가이드가 있습니다

API 작성 방법 그래서 그들은 두 언어로 자연스럽게 사용될 수 있습니다 그리고 그것들은 우리가 스스로 따라가는 지침입니다 플랫폼 및 지원 라이브러리에 포함 된 새로운 API CHASE HAASE : API에 대해 이야기 해 봅시다 우선 Android의 레이아웃, 그 (것)들의 낱단이있다, 그러나 이들 사람들이 시간이 지남에 따라 다루는 중요한 것들입니다 우선 AbsoluteLayout이있었습니다

그리고 사용하기 쉽습니다 왜 그렇지 않습니까? 그럼 정확히 어디서 볼 수 있을까요? 너는 그걸 원해, 그렇지? LinearLayout, 당신은 그 것들을 중첩 할 수 있습니다 원하는만큼 깊게 UI를 정확하게 얻을 수 있습니다 너 찾고있어 FrameLayout, 괜찮습니다

당신이 그것을 곁눈질로 본다면, AbsoluteLayout과 같은 것입니다 로망 가이 : 그게 우리가 말할 수있는 가장 좋은 것입니다 괜찮아 GridLayout, 밝혀졌습니다 그것은 사용하기에 조금 복잡합니다

그러나 우리는 그것을 이해할 수 있으며 유연성이 매우 뛰어납니다 그곳에 그리고 RelativeLayout, 우리는 그것이 비싸다고 들었습니다 우리가 사용해야 할 것인가 아닌가? 그래서 현대 세계 다음은 AbsoluteLayout에 대한 우리의 생각입니다

우리는 단지 그것을 분명히하고 싶습니다 [LAUGHTER AND APPLAUSE] CHET HAASE : 이것이 더 이상 사용되지 않는 유일한 이유 하나의 중요한 클래스가 있기 때문입니다 하위 클래스는 – ROMAIN GUY : 아니, 더 이상 사용되지 않습니다 사용되지 않습니다 CHET HAASE : 더 이상 사용되지 않습니다

승인 글쎄, 우리는 그걸 사용하지 않았고, 그 정도면 충분하다 웹보기가 AbsoluteLayout에 있기 때문에 우리가 취할 수있는 것처럼 죄송합니다 사용하지 마십시오

잘하면, 당신은 아니에요 LinearLayout, 여전히 실제로 사용하는 것이 좋습니다 특히 간단한 경우 네가 깊고 깊게 중첩되어 있다면, 그때 당신은 깊고 깊게 틀렸고, 더 나은 해결책이 있습니다 우리는 슬라이드의 맨 아래에 그것을 올릴 것입니다

FrameLayout, 간단한 사용 사례에서도 괜찮습니다 너는 거기에 그 한가지를 넣어야한다 적절한 패딩과 마진을 유지해야합니다 그것은 그곳에있는 일종의 것입니다 ROMAIN GUY : 그리고 FrameLayout의 더러운 비밀 이 경우 AbsoluteLayout이라는 것입니다

여백을 올바르게 사용하면 기본적으로 AbsoluteLayout을 가지고 있지만 그렇게하지 마십시오 그것들을하지 마십시오 그러지 마 GridLayout– 사실은 문제를 제외하고 도구와 함께 사용하도록 의도 된 실제로 도구를 썼다 로레인 가이 : 우리가 잊은 것 같아

아마도 가장 좋은 레이아웃이 아닐 것입니다 당신의 상황을 위해 그 주위에 머리를 감쌌다 승인 거기에 더 나은 해결책이있을 수 있습니다 RelativeLayout– 우리는 ConstraintLayout이, 일반적으로 더 나은 해결책입니다

나는 그것을 능력의 부분 집합으로 생각할 것이다 RelativeLayout 그것은 많은 기능을 가지고 있습니다 아이들의 상대적 위치 선정, 서로에 대해 그러나 그것은 상대적인 위치 지정 방법을 더 많이 가지고 있습니다 가이드 라인 및 그들이 수행 한 새로운 기능 중 일부 ConstraintLayout에서 작업

제가 설명하기를 좋아하는 방식은 ConstraintLayout입니다 작동하는 RelativeLayout입니다 CHET HAASE : 또한 그것에 대해 가장 좋은 점은 도구와 밀접하게 통합되어 있습니까? 그것은 같은 사람들에 의해 직렬로 작성되었습니다 도구를 사용하면 디자인 도구가 실제로 작동 함을 의미합니다 잘 레이아웃, 그 반대, 잘, 그들은 API를 만들었고 도구는 결코 따라 잡지 못했습니다

그건 거기에 해당하지 않습니다 우리는 20을 언급했다 아직 20이 아닙니다

나는 그것이 곧 20이라고 말할 것이다 그래서 20에 등장 할 것을주의 깊게 살펴보십시오 이번 주 존과 니콜라의 이야기 아마도 그 물건들 중 일부는 넘어갈 것입니다

AbsoluteLayout에 대한 최종 생각 로레인 가이 : 그냥 알기 쉽습니다 그래서 UI 툴킷에 클래스가 있습니다 AdapterView는 여러 위젯의 기본 클래스입니다 그래서 ListView, GridView 및 갤러리

그리고 그들은 수년 동안 우리를 잘 봉사했습니다 그들은 몇 가지 문제가있었습니다 그들은 유지하기가 어려웠다 GridView는 사용되지 않았다고 생각합니다 꽤 많은 앱으로 꽤 오래 동안, 어쩌면 응용 프로그램에 대한

갤러리는 수평 ListView와 비슷합니다 오랫동안 사용하지 않을 것이라고 확신합니다 그리고 우리는 잠시 그것을 확실히 보지 못했습니다 어쨌든 내가 너라면 네가 사용하지 않을거야 아마 작동하지 않습니다

여기에 몇 가지 문제가 있습니다 따라서 AdapterView에는 어댑터가 있으며, 어댑터가 데이터 세트간에 인터페이스됩니다 및보기 자체 어댑터에서 할 수있는 일 중 하나 데이터 세트의 변경 사항을 뷰에 알립니다 문제는 당신에게만 알릴 수 있다는 것입니다 거친 변화의 당신이 할 수있는 말은, 어이, 뭔가 바뀌 었습니다

너무 불합리하게도 ListView에서 우리는 변경된 사항을 파악하려고하는 많은 코드가 있습니다 네가 우리에게 말할 수 있다면 좋지 않을까? 너 아마 알고 있기 때문에? 우리에게 말할 수없는 API를 만들었습니다 그래서 그것은 바보 같은 짓입니다 우리는 당신에게이 패턴을 따르라고 말하기도했습니다보기 보유자

그래서 View Holder – 그리고 그것은 하나입니다 내가 많은 사람들을 보았던 것들 중 View Holder에 대한 온라인 미친 제품이기 때문에 당신이 써야 할 번호판 그것은 실제로 매우 중요했습니다 나는 돌아가서 우리의 오래된 회담 중 하나를 들여다 보았다 보기 홀더 패턴을 사용하면 초당 10 프레임 추가 당신은 T-Mobile G1에서 ListView를 스크롤하고있었습니다

그 당시에는 많은 문제가있었습니다 더 이상 필요하지 않습니다 그러나 RecyclerView 덕분에 API의 일부로, 이제 어쨌든 무료로 받으실 수 있습니다 그리고 마지막으로 애니메이션 AdapterView에서는 애니메이션을 사용할 수 있습니다

그래서 예를 들어, ListView 항목이 데이터 세트에서 사라졌습니다 그리고 아이템을 사라지게하고 싶습니다 나머지 항목은 붕괴되어 갭을 닫습니다 ListView를 사용하여이 작업을 수행 할 수 있습니다 이 코드를 약간만 작성하면됩니다

Chet는 몇 년 전에 블로그 포스트를 썼습니다 [웃음] ListView 애니메이션 중 하나였습니다 우리는 당신에게 보여주는 일련의 비디오를 가지고있었습니다 다른 것들을하는 법 ROMAIN GUY : 이것은 코드의 일부입니다

미래 옵저버 만 이해하면됩니다 과도 상태 및 측정 및 메모 및 애니메이션이 포함됩니다 다소 어려웠습니다 그래서 이제 대신 RecyclerView가 있습니다 감사하게도

그래서 이것은 단지 바보 같은 응용 프로그램입니다 처음 RecyclerView를 실제로 사용했을 때 몇 달 전 이었어 그것은 훨씬 쉬웠다 정말 좋았어요 RecyclerView의 다른 버전을 만들 수있었습니다

RecyclerView에 대한 좋은 점 여러 위젯을 사용하는 대신 데이터 세트에 대해 효과적으로 다른 레이아웃입니다 단일 RecyclerView에 대한 레이아웃을 지정할 수 있습니다 이 코드는 레이아웃이 다른 동일한 코드입니다 RecyclerView의 관리자 CHASE HAASE : 나는 또한 그것들 모두가 수직적 이었지만 실제로는 가로 배치

몇 년 동안, 사람들은 우리에게 수평을 어떻게 할 것인지를 물었습니다 오, 쉽습니다 CHASE : 수평 ListView ROMAIN GUY : ListView에서 회전을 설정하기 만하면됩니다 그런 다음 모든 터치 이벤트를 차단해야합니다

그들을 회전 시키십시오 그리고 아마 몇 가지 더 많은 API가 있습니다 무시할 필요가 있기 때문에 어쨌든 그것은 쉽다 그래, 비밀 가장 쉬운 방법은 휴대 전화를 돌리기 만하면됩니다 90도

시스템의 일부로 더 쉽게 사용할 수 있습니다 최신 릴리스의 UI 향상 ROMAIN GUY : 그리고 RecyclerView에 관한 좋은 점 중 하나 – 훨씬 더 나은 방법으로 많은 일을합니다 우리는 페이징을 가지고 있고 우리는 프리 페칭을 가지고있다 API가 더 좋습니다

레이아웃 관리자를 변경할 수 있습니다 자신의 레이아웃 매니저를 작성할 수 있습니다 그러나 애니메이션 또한 무료로 제공됩니다 그래서 우리가 방금 본 코드와 같습니다 특히 RecyclerView를 사용하면 얻을 수있는 것 세밀한 변경입니다

아이템이 있다면 우리에게 말해 줄 수 있어요 제거 된 항목 항목이 추가되면 어떤 항목이 추가됩니까? 변경된 항목의 범위, 아니면 모든 것이 바뀌 었다고 말할 수 있습니다 이것은 당신과 우리에게 훨씬 좋습니다 좋아

좋아 파편 옛날 우리는 그 파편들 정말 복잡했습니다 또한이 문제를 해결할 것입니다 그래서 우리는 반드시 모든 것이 정확하거나 가지고있는 것은 아닙니다

사람들이 필요로하는 모든 API가 있으므로 개선점을 넣으십시오 플랫폼 릴리스로 그런 다음 응용 프로그램은 해당 플랫폼에 장치가 출시되었습니다 따라서 현대적인 조언은 플랫폼 버전을 사용하지 않는 것입니다 우리는 이후 모든 코드를 이식했습니다

지원 라이브러리에있는 모든 수정 사항을 작성하려면, 우리는 이제 더 이상 사용하지 않는 조각들을 사용했습니다 핵심 플랫폼에서 그래서 거기에 사용하지 마십시오 지원 라이브러리 또는 Jetpack 버전 조각을 사용하십시오 우리는 더 많은 선을 거기에두고 있습니다

그래서 그것들을 사용하고, 우리는 계속하고 있습니다 개선하기 이번 주에 파편에 관한 이야기가 있습니다 – 내일 아침에 CHASE HAASE : 내일은 Adam과 Ian으로부터 그러므로 사물에 대한 더 많은 정보를 듣기 위해 그것을 확인하십시오

우리가하는 일과 길 조각을 사용하는 것이 조금 더 쉬워야합니다 그 중 하나가 새로운 탐색 컨트롤러입니다 그래서 체크 아웃하십시오 그것은 파편에 일종의 빌드입니다 그것은 그들에게 의존하지 않습니다

의존성은 없지만 그렇습니다 만들고 탐색 할 수있는 기능을 구축하십시오 응용 프로그램의 화면 사이 활동은 단편과 매우 밀접하게 관련됩니다 예전에는 기본적으로 Android 애플리케이션 여러 활동들로 구성되었습니다

이것이 모든 안드로이드 애플리케이션의 애플리케이션 흐름이었습니다 우리는 개발자가이 작업을 수행 할 것을 기대했으며 개발자는이 작업을 수행했습니다 앱의 한 화면에서 이동하려는 경우 다른 사람에게, 당신이 의도를 시작하면, 당신은 새로운 창을 얻습니다 거기에 당신을 데려 오기위한 창 애니메이션이 있습니다 거기 있네

새로운 접근법은 가능한 한 단일 활동을 사용하는 것입니다 그것은 사용자에게 훨씬 풍부한 경험을 선사합니다 그 창문 애니메이션들 – 음, 그들은 움직이고 있어요 하지만 그들은 재미있는 일을하지 않습니다 사용자를 돕는 아무 것도하지 않습니다

응용 프로그램의 한 상태에서 다른 상태로 전환합니다 대신 기본적으로 완전히 다른 창 너가 실제로 할 수있을 때 볼 수있게된다 단일 활동 방식을 사용하여 동일한 Chrome 유지 응용 프로그램 주위 같은 행동을 할 수도 있습니다 바에서 콘텐츠가 아래로 바뀌면서 또는 더 풍부한 애니메이션을 사용하십시오

핵심 플랫폼 애니메이션 또는 조각으로 가능 애니메이션 그러니 계속해서 활동을하십시오 신청서에 상황이있을 수 있습니다 다른 진입 점이있는 곳, 특히 누군가가 당신의 신청서에 올 수있는 길이가 길다 와

그런 다음 별도의 활동을하는 것이 적절합니다 그것이 그 정보를 폭로하는 방법입니다 하지만 그렇지 않으면 단일 활동을 사용해보십시오 조각은 단일 활동 응용 프로그램에는 필요하지 않지만, 하지만 그들은 이것에 많은 도움을 줄 수 있습니다 특히 최근 개선 된 점이 몇 가지 있습니다

그리고 네비게이션 콘트롤러도 마찬가지다 건축물 여기 오래된 조언이있었습니다 몇 년 전– OK, 2016 년 기본적으로 2 년 전 Dianne Hackborn이 게시했습니다

G +에서 우리는 대개 응용 프로그램 개발자로부터이 질문을받습니다 여기서 우리는 애플리케이션 아키텍처 그들은 그들의 신청서에서 사용해야합니다 그리고 우리의 대답은 항상, 우리는 상관하지 않습니다 우리는 당신이 아닙니다

우리는 귀하의 신청서가 어떻게 작동하는지 알지 못합니다 우리는 최고의 아키텍처를 모릅니다 귀하의 신청서에 대해서는 귀하가 직접 결정하십시오 그리고 보통 다음과 같은 질문이 있습니다 예, 알 겠어

하지만 어떤 아키텍처를 사용해야합니까? 그래서 Dianne은 기본적으로 이렇게 말했습니다 이 모든 것을 한 번 우리는 상관 없어 우리가 가지고있는 구성 요소들 – 콘텐츠 제공자, 활동, 서비스 – 이들은 시스템 수준의 구성 요소입니다 그들은 주변의 건축물이 아닙니다

당신은 당신의 어플리케이션을 빌드합니다 그러므로 적절한 것을 만드십시오 귀하의 응용 프로그램에 대한 새로운 조언은 실제로, 우리는 당신에게 몇 가지 권장 아키텍처를 제공하게되어 기쁩니다 사람들이 적어도 좋아할 것이라고 밝혀 졌기 때문에 말이되는 몇 가지 일반적인 조언, 우리는 지금 우리가 그것을 가지고 있다고 믿습니다

특히, 아키텍처 구성 요소의 경우, 우리는 우리가 많은 의미가 있습니다 우리는 사용하기 쉬운 API를 가지고 있습니다 당신은 그 주위에 구축 할 수 있습니다 우리는 당신이 이것을 사용하도록 요구하지 않습니다 자신에게 맞는 아키텍처를 사용하십시오

하지만 핵심 아키텍처가 있습니다 우리는 일해야한다고 믿습니다 새로운 애플리케이션을 시작하는 경우, 팀에 새로운 개발자가 있다면 말이됩니다 우리가 일한 이유 중 하나 Android 아키텍처 구성 요소 포함 어려운 문제를 해결하는 것이 었습니다 가장 어려운 문제 중 하나는 Android 수명주기였습니다

그리고 우리의 대답은, 당신이해야 할 모든 것입니다 이 도표를 이해하고 암기합니다 그리고 누군가 외부에서 자신의 버전을 만들었습니다 그 다이어그램은 실제로 이렇게 보입니다 당신이 이것을 보았다면 이해하기가 훨씬 쉽습니다

따라서 기본적으로 알아야 할 모든 것이 있습니다 항상 네 머리 속에 문제는 기본적으로 당신의 활동에 많은 방법들을 만들어라 라이프 사이클을 추적하고 관리 할 수 ​​있습니다 당신은 창조와 시작과 멈춤을 다루고 있습니다

다시 시작하고 일시 중지하면 물건을 다룰 것입니다 뿐만 아니라 파괴에서 Create에서 너무 많이 사용하고있을 것입니다 당신은 아마 경주 조건뿐만 아니라 당신의 시작과 당신의 중지에서 누출, 그리고 당신은 아마 일시 중지 및 이력서에서 그 일을하고있을 것입니다 게다가

그리고 당신은 왜 당신이 파괴에 대해 무시하고 있는지 정확히 알지 못합니다 그러나 누군가는 당신이 아마해야한다고 말했습니다 그래서 우리도 그렇게 할 것입니다 그러는 동안 실제로는 수명주기 상태 만 알고 있습니다 당신이 그 방법들을 오버라이드한다면

우리는 당신에게 그 질문을하는 방법을주지 않았습니다 우리는 그것이 내부적으로 무엇인지 압니다 우린 너를 비밀리에 들여 보내지 않을거야 따라서 쿼리 할 API가 없습니다 그래서 모든 메소드를 오버라이드 할 필요가 있습니다

그리고 나서 당신은 거기에 너무 많은 코드를 집어 넣게됩니다 기본적으로 너무 많은 논리가 모든 곳에서 일어나고 있습니다 새로운 접근 방식은 라이프 사이클이라는 객체가 있다는 것입니다 소유자 라이프 사이클 객체를 요청할 수 있습니다

그런 다음 상태를 쿼리하거나 당신이 어떤 라이프 사이클 상태인지 알고 싶다면, 또는 관찰자를 설정할 수 있습니다 그런 다음 해당 메소드에 콜백을 가져올 수 있습니다 이렇게하면 별도의 장소로 추상화 할 수 있습니다 기본적으로 모든 활동 코드를 포기하지는 않습니다 이 정보

하지만 당신은 그것을 어디에 두는 지 귀하의 응용 프로그램에서 감각 다행히도 우리는 lifecycle owner의 하위 클래스를 오버라이드합니다 또는이를 조각과 AppCompat 모두에서 구현하십시오 활동 그래서 지원 라이브러리에서 이것을 사용하십시오

수명주기 소유자입니다 따라서 기본적으로 수명주기를 얻기 위해 쿼리 할 수 ​​있습니다 그런 다음 거기에서 나가십시오 그래서 우리는 당신이 활동할 모델에서 출발했습니다 기본적으로 모든 라이프 사이클 종속 로직이 포함되어 있습니다

활동이 훨씬 더 작을 수있는 모델로, 그 논리를 꺼내 다른 것으로 추상화하십시오 그곳에는 생명주기 관찰자를 설정하고, 원하는 콜백을 얻으십시오 우리는보기와 데이터에서 비슷한 문제를 겪고 있습니다 우리에게는 활동이 있으며, 우리는이 모든 정보를 가지고 있습니다 거기에 대한 견해에 대해

그리고 우리는 그 견해에 대한 자료를 가지고 있습니다, 우리는 데이터가 언제 바뀌는지를 알아야합니다 또한 라이프 사이클을 추적해야합니다 그래서 우리는 잘못된 시간에 물건을 새거나 물건을 부르지 않습니다 그래서 우리는 결국 너무 많은 것을 가지고 끝납니다 이제는 LiveData에 대한 개념이 생겼습니다

배치 할 수있는 ViewModel 그 물건들 당신은 활동에서 그것을 추출 할 수 있습니다 그 모든 정보를 그곳에 넣을 수 있습니다

그걸 관찰해라 이제 활동에서, 당신은 정말로 보기 및 참조 정보 만 제공 ViewModel에 전달합니다 그런 다음 모든 논리를 ViewModel에 넣으십시오 그것은 LiveData 객체를 사용하고 있습니다 자체 라이프 사이클을 처리하므로 사용자는이를 관찰 할 수 있습니다

훨씬 나아 졌어 덜 버기 데이터의 경우, 당신에 대한 우리의 논쟁은 당신 스스로에 달렸습니다 우리는 귀하의 데이터를 관리하지 않습니다 너가 원하는 것을해라

그리고 많은 데이터베이스 솔루션이 있습니다 우리는 플랫폼에 SQLite를 가지고 있습니다 가서 사용하십시오 너 자신을 노크 해 도대체 무엇이

우리는 그 사업을 시작하고 싶지 않습니다 새로운 접근 방식은 실제로 데이터를 위해 뭔가를 제공한다는 것입니다 SQLite를 기반으로 구축되었지만 실제로는 빌드 시간 확인 기능을 제공하므로 사용자는 이러한 쿼리를 전송 한 다음 런타임에 오류가 발생합니다 그러나 빌드 타임과 통합시이 문제를 볼 수 있습니다 우리가 이전에 본 라이브 데이터 (LiveData) 또는 원할 경우 독자적으로 할 수 있습니다

우리는 데이터베이스 솔루션을 인수하려고하지 않습니다 우리는 더 나은 지역 영구 이야기를 단순히 제공하고 있습니다 우리가 이전에했던 것보다 더 쉽게 당신을 위해 전체 다이어그램은 다음과 같습니다 여기서 유일한 새로운 요소는 저장소에 대한이 아이디어입니다

기본적으로 추상화하는 패턴입니다 데이터의 출처 그래서 그것이 지역이나 웹에서 오는 경우, 나머지 국민들에게는 중요하지 않습니다 그것을 쿼리하고 있습니다 거기에서 추상화를하는 것은 좋은 일입니다 데이터 페이징

그래서 우리는이 것을 CursorAdapter라고 불렀습니다 그것에 대해 좋은 요소가있었습니다 그것은 데이터베이스 커서에 대한 지원을했습니다 좋았어 그러나 그것은 ListView에만 국한되었으며, 기본적으로 비효율적 인 문제가있었습니다

페이징 크기, 그런 것들 우리는 AsyncListUtil을 더 유용하게 사용했습니다 그러나 일을하기에는 너무 비효율적이었습니다 웹 거래를 좋아합니다 그래서 우리는 현대 안드로이드에 새로운 모델을 가지고 있습니다

우리는 데이터 페이징을 가지고 있습니다 이번 주 10 페이징 라이브러리, 그것에 대해 좋은 것들이 있습니다 따라서 RecyclerView와 함께 작동합니다 세분화 된 데이터 변경 사항을 처리합니다

훨씬 효율적으로 백그라운드 스레드를 아주 쉽게 사용할 수 있습니다 변경 사항을 관찰 할 수 있으므로 LiveData와 통합됩니다 그러나 다시 한번, 우리는 당신에게이 아키텍처를 강요하지 않습니다 RxJava2를 사용하고 있다면, 매우 쉽게 또한 유연한 데이터 가져 오기 옵션, 그래서 창 크기를 지정할 수 있습니다

그리고 이런 일들을 원할 때 물론, 항상 상충 관계가 있습니다 나는 데이터 페이징에 대해 나쁜 점을 발견했다 그 이름이 지루하다는 것입니다 ROMAIN GUY : 그래픽

그래서 우리가 안드로이드를 시작했을 때 우리는 OpenGL ES 10 만 가지고있었습니다 셰이더도 없었어요 우리는 소프트웨어 렌더링으로 모든 것을하고있었습니다 그것은 몇 년 동안 쟁점이었습니다

초기 장치에는 충분히 빠릅니다 우리가 타블렛 폼 팩터를 치면 문제가되기 시작했다 이전에는 9 개의 패치를 많이 사용했지만, 너의 일부는 고통 받았다고 확신한다 9 개의 패치를 작성함으로써, 또는 더 나쁜 것은 UX 디자이너에게 설명하려고 시도하는 것입니다 그것들을 만드는 법

검은 점들은 어디에 두 시나요? 그들은 어느쪽에 가야합니까? 나는 아직도 모른다 오늘날까지 TextureView 대 SurfaceView, 우리는 미리보기 토크에서 그걸 만졌어 기본적으로 항상이 문제가있었습니다 당신은 통합 할 수있는 덜 효율적인 TextureView를 사용합니까? ListView 및 애니메이션과 같은 다른보기와 더 좋게, 또는 SurfaceView를 사용합니까? 그리고 비트 맵 관리는 어려웠습니다

많은 사람들이 응용 프로그램을 만들었고 나간다 비트 맵을 만들려고했기 때문에 메모리 오류가 발생했습니다 당신은 캐싱을해야하며, 이것은 어렵습니다 그리고 우리의 대답은 근본적으로, 어, c'est la vie이었습니다 그래서 지금

OpenGL 31 및 32가 있습니다 콘텐츠 쉐이더가 있습니다 Vulcan을 사용하면 저급 그래픽 렌더링을 수행 할 수 있습니다

우리는 어디에서나 하드웨어 가속을 수행합니다 VectorDrawables는 기본적으로 대부분의 드로어 블을 대체했습니다 및 응용 프로그램의 비트 맵 우리에게는 작은 응용 프로그램이 있습니다 당신은 지원할 필요가 없습니다 – 여러 밀도를 지원하는 것이 훨씬 쉽습니다

이전과 같이 많은 배치를 필요로하지 않습니다 우리가 지금하고있는 일 우리가 너와 노력하고 있니? 아주 자주, 응용 프로그램 개발자는 솔루션을 찾기 위해 우리를 찾습니다 그러나 공동체가 – 즉, 너 – 우리가 생각하는 놀라운 도서관을 지어왔다 당신이 사용해야하는 것이 맞습니다 예를 들어 글라이드 (Glide) 또는 피카소 (Picasso) 또는 로티 (Lottie) 그들이하는 일에 뛰어납니다

비트 맵을 관리하려는 경우 또는 Lottie와 함께 미친 복잡한 애니메이션을 만들고 싶습니다 당신은 그것들을 사용해야합니다 우리는 뭔가를 재창조하는 데 시간을 낭비하지 않을 것입니다 이미 거기에 존재하고 우리는 생각합니다 그것이하는 일에 아주 능숙합니다

그러니 그 라이브러리를 사용하십시오 다시 한 번, 이것을 알아라 아마도 SurfaceView를 사용해야 할 것입니다 더 이상 TextureView가 아닙니다 시간이 오래되었습니다

마지막으로 우리는 당신의 코드를 프로파일 링하라는 말을 사용했습니다 우리는 가능한 한 작업을하지 말라고 말하곤했습니다 메모리 소비를 최소화 할 수 있습니다 하지만 이제는 더 나은 장치가 있습니다 우리에게는 많은 코어가 있습니다

우리는 많은 RAM을 가지고 있습니다 우리는 더 나은 언어를 가지고 있습니다 더 나은 런타임입니다 따라서 대신 코드 작성에 필요한 작업을 수행해야합니다 가능한 한 작업을 피하고 또한 최소화 메모리 소비

CHET HAASE : 그 장치가 밝혀지기 때문에 여전히 제약이있다 그 점을 명심해야합니다 배터리 수명은 중요하며 대역폭은 귀중합니다 이 모든 것이 사용자 경험에 기여합니다 따라서 사용자가 실제로 아직도 이런 것들에 대해 보수적이다

애플리케이션에 최상의 성능 제공 그게 맞아 우리는 당신에게 감사하고 싶다 그리고 다른 방법이있다 이것을 말하십시오 그리고 우리는 끝났다고 생각합니다

고맙습니다 [박수 갈채] [음악 재생]

How to Kotlin – from the Lead Kotlin Language Designer (Google I/O ’18)

[음악 재생] 제임스 라우 : 고마워요 오늘 아침 여기와 줘서 고마워

제 이름은 James입니다 저는 Google의 Kotlin 팀원입니다 오늘, 나는 매우 기쁜 소식을 전한다 JetBrains의 특별 게스트, 정말로 소개가 필요하지 않습니다 자, 여러분 모두는 코 틀린이 지금 가장 사랑받는 프로그램 중 하나 세계의 언어

Google I / O에서는 Google이 매우 드뭅니다 외부 스피커가 있어야합니다 하지만이 사람은 작년에 여기 있었는데, 우리는 아무도 생각할 수 없기 때문에 그를 초대했습니다 그렇지 않으면 코 틀린을 가르치는 것이 더 낫다 그것을 발명 한 사람들의 리드 언어 디자이너를 환영 해주십시오

코 틀린, 안드레이 브레 슬라브 [박수 갈채] 앤드류 브레 슬라브 : 고마워, 제임스 훌륭한 소개 주셔서 감사합니다 모두들 안녕 나는 너를 여기에서 만나서 매우 기쁩니다

오늘 나는 그것이 무엇이 될 수 있는지 이야기 할 것이다 코 틀린 그리고 저는 실제로 라이브 데모를 할 것입니다 제 데모를 가져 오십시오 슬라이드에이 끔찍한 코드가있는 이유는 우리 모두가 배우고 있고, 우리의 오래된 습관이 때로는 방해가되지

그래서 나는 오늘 어떻게 나가야하는지에 관한 주제를 발표 할 것입니다 귀하의 자바 습관을 배우고 귀하의 코 틀린 습관을 찾으십시오 그래서 우리 모두는 다른 배경에서 왔습니다 그리고 우리 중 많은 사람들이 자바 프로그래밍 언어로 시작했습니다 이를 통해 프로그래밍에 대한 지식을 축적했습니다

그래서 우리는 많은 것을 기억합니다 그리고 그 일은 코 틀린 (Kotlin)이 여러 언어에서 영감을 얻었으며, 자바 프로그래밍 언어도 포함됩니다 따라서 Kotlin에서 많은 Java 구조를 재현 할 수 있습니다 그리고 그것은 효과가있을 것입니다 이런 식으로 일을 할 수 있습니다

그러나 그것은 많은 경우에 극적으로 개선 될 수 있습니다 그래서이 특별한 예제는 클래스 선언에 관한 것입니다 그리고 여기서 내가 왼쪽에 코 틀린 (Kotlin) 수업이 있다는 것을 알 수 있습니다 오른쪽에 Java 클래스가 있습니다 그리고 그들은 매우 비슷해 보입니다

그러나 이것은 분명히 Kotlin 코드를 작성하는 방법이 아닙니다 그래서 당신이 실제로해야 할 일은 무엇입니까? 불필요한 것들을 모두 제거하십시오 여기서 제가 말해야 할 것은 두 가지 속성, 하나의 클래스입니다 그게 맞습니까? 그래서 저는 그것을 손으로 변형 시키려고 노력할 수 있습니다 하지만 실제로 좋은 도구를 과시하고 싶습니다

자바 측에서 코드를 복사하여 붙여 넣기 만하면됩니다 Kotlin 측에, 그래서 그것은 자바를 Kotlin에 사용할 것이다 IDE에 내장 된 변환기를 사용하면됩니다 그래서 붐, 거기있다 실제로 모든 단일 라인 하나의 클래스, 두 개의 속성을 선언하는 데 필요합니다

그게 전부 야 여기에있는 것은 기본 생성자가있는 클래스입니다 그래서 두 개의 매개 변수를 가지며 둘 다 속성입니다 그게 당신이 말하고 싶은 모든 것입니다 그래서 이것은 이것들 중 하나입니다

값싼 선언 클래스가 Kotlin에있는 방법을 보여줍니다 그리고 이것에 결과가 있습니다 이 코드를보십시오 여기서 코드를 작성하는 방법이 분명하지 않습니다 실제로 어떤 언어로든

나는 전체 이름을 이름으로 파싱하고 싶었다 와 성 그리고 그것이 제가 여기서하고있는 일입니다 하지만 결과를 함수에서 제외 시키려면 어떻게 팩하나요? 함수에서 두 가지를 반환하는 방법이 없습니다 나는 하나의 물건을 넣어야한다

그리고 나는 여기에 목록을 남용하고, 어색하게 하나를 꺼내고있다 다른 하나는 이름과 성을 만드는 것입니다 어떤 언어로도 이것을하지 마십시오 그러나 심리적 인 이유가 있습니다 이것을하기 위해서, 적어도 우리의 오래된 습관에서는, 선언 클래스가 비싸니까요, 그렇죠? 새 파일을 만들고 코드를 넣어야합니다

그것은 다소 어색합니다 그러나 Kotlin에서는 이것을 할 필요가 없습니다 말할 필요가있는 것, 수업 시간, 성명, 이름과 성을 속성으로 사용합니다 그리고 나서, 여기서해야 할 일은 단지 그것을 되 찾는 것입니다 그래서 내 이름

여기 간다 이제 지수 대신에 첫 번째와 마지막으로 말할 수 있습니다 이리 그래서 그것이 아이디어입니다 싸구려 클래스가 항상있는 것은 아닙니다

선언 사이트에서 시간을 절약 할 수 있습니다 정신적 노력을 덜어줍니다 여러 수익을 클래스로 나타낼 수 있습니다 그것은 당신에게 아무런 비용도 들지 않습니다 그래서 이걸 실행하면 내 평등이 그게 한 줄짜리 클래스이기 때문에 분명히 작동하지 않습니다

그리고 이제 저는 거기에 동등한 것을 선언하러 갈 것입니다 거기에 해시 코드 등이 있습니다 너무 장황하다 그러나 나는 Kotlin에서 이것을 할 필요가 없다 아마 거기 있다는 것을 알기 때문에 뭔가 데이터 클래스라고합니다

데이터 클래스를 아는 사람은 누구입니까? 많은 사람들, 좋아 그래서 당신은 내가이 키워드 하나를 거기에 넣었다는 것을 알고 있습니다 컴파일러는 나에게 많은 것들을 생성합니다 해시 코드, 문자열에 대한 것, 및 기타 많은 편리한 방법 그게 전부입니다

수업이 얼마나 비싸다는 생각을 바꾸십시오 모든 추상화에서 쉽게 사용할 수 있습니다 그래서 더 많거나 적게 워밍업으로 끝났습니다 다른 것을 보도록하겠습니다 속성

그래서 우리는 수업에 관해 이야기했습니다 속성을 살펴보고 함수로 넘어갑니다 그래서 여기에 당신이 그것을하지 말아야 할 방식으로 행해진 속성이 있습니다 다시 코 틀린에서 그래서 내가 전에 보여 줬던 문제들 게터와 세터 모두가 일종의 단 하나의 라이너였습니다

하찮은 맞춤 설정 도구를 원한다면 그 기능을 정의하지 마십시오 당신은 아마도 당신이 알고있는 것처럼 당신의 커스텀 세터 문법을 가지고 있습니다 데이터 클래스를 알고 있다면 알 수 있습니다 맞춤 설정 도구 안에는 다음과 같은 필드가 있습니다

제출되지 않았지만 현장 – 백엔드 스토리지에 쓸 수는 있지만 그게 전부입니다 다른 이름으로 추가 이름을 입력 할 필요는 없습니다 그래서 간단합니다, 맞죠? 그런 다음이 코드를 살펴보십시오 그래서 여기에 이미 합리적인 논리가 있습니다 두 가지 속성이 있습니다

그 중 하나는 비공개 및 null 가능입니다 및 변경할 수 있습니다 처음 액세스 할 때 그게 null인지 확인하고 있습니다 그런 다음 가치를 계산하고 그것에 글을 씁니다 그리고 출력하고, getter에서 반환합니다

그래서 무엇입니까? 게으른 재산이지, 그렇지? 나는 수십, 수천을 개인적으로 썼다 Java 및 다른 많은 언어의 사람들 중 그래서 나는 그것에 지루해합니다 그래서 Kotlin은 다음과 같은 추상화 메커니즘을 가지고 있습니다 속성 위임 위임 된 속성을 사용하면 이 게으른 논리의 모든 반복

우리가 신경 쓰는 것은이 표현입니다 그럼 그냥 해보 죠 이 모든 것을 단지 게으름으로 구현하십시오 이거 야 그래서 내가 지금하고있는 것, 나는 말하고있다

내 재산은 단순히 무언가에 의해 초기화되지 않습니다 이 게으른 일에 위임되었습니다 그리고 처음 액세스하면이 람다가 실행됩니다 그리고 나머지는 도서관에 보관 될 것입니다 그래서 게으른 것은 언어 구조가 아닙니다

그것은 단지 라이브러리 함수입니다 당신은 당신 자신을 정의 할 수 있습니다 그리고 도서관은 많은 다른 것들을 제공합니다 그래서 여기 테이크 아웃은 당신이 예를 들어 관찰 할 수있는 공통된 종류의 속성을 가지며, 무언가가 수정되었음을 통보 받아야 할 때, 라이브러리를 사용하거나 직접 작성하십시오 그래서 여기에서, delegates

observable이 일을합니다 표준 라이브러리에서 그러나 원한다면 이와 같은 코드를 작성하지 않아도됩니다 하나의 속성이 있고 다른 속성이 있으면, 다른 하나는 똑같은 일을 반복해서 반복합니다 실제로 당신이해야 할 일은 이것뿐입니다

캡슐화하는 단일 클래스를 선언하십시오 일반 getter와 같은 속성의 논리 및 일반 설정자 그리고 그게 다야 이제 여러 속성에서이 클래스를 참조 할 수 있습니다 비즈니스 로직 데이터베이스 액세스, 모든 종류의 유효성 검사

원하는 모든 것을 라이브러리로 추상화 할 수 있습니다 프로젝트 전체에서 다시 사용할 수 있습니다 그것은 의미가 있습니까? 누가 이것을 이미 사용합니까? 나는 모른다 너무 많은 사람들 당신은 실제로해야합니다

나는 당신이 이것으로부터 이익을 얻을 수 있다고 확신합니다 그래서 이것은 속성에 관한 것입니다 이제는 기능에 대해 알아 보겠습니다 기능은 매우 중요합니다 다시 한번 이것은 매우 끔찍한 코드입니다

Kotlin에서 이와 같은 코드를 작성하지 마십시오 이것은 우리의 습관에 매우 영감을 받았습니다 Java 프로그래밍 언어에서, 내가 가지고있을 때 모든 것을 수업에 넣기 그래서 StringUtil– 프로젝트에 자체 StringUtil이 있습니까? 수업? 오, 그렇지 않다면, 그냥 아주 새로운 프로젝트 일세, 그렇지? 그래서 내 프로젝트 중 하나가 있습니다 하지만 문제는 코 틀린에서 조금 다릅니다

수업을 사용할 필요가 없습니다 음, 우선, Kotlin 수업에는 정체감이 없습니다 따라서이 클래스에서 이러한 함수를 사용하려면, StringUtil, 괄호, 새로운 객체를 만듭니다 나는 매번 새로운 물건을 원하지 않는다 나는 이것을 이렇게 원한다

그래서 나는이 클래스를 객체로 만든다 내 정신 이상에 약간의 개선이 있습니다 권리? 그래서 저는 매번 객체를 만들고있었습니다 나는 함수를 호출하고 싶었다 그건 미친 짓이야

하지만 실제로, Kotlin에서, 나는 어떤 용기를 담을 필요가 없다 왜냐하면 나는 최상위 함수를 가지고 있기 때문이다 그래서 이것은 기능처럼 명백하게 보일 수 있습니다, 그것들은 무엇입니까? 그들은 단지 선언 일뿐입니다, 그렇죠? 그러나 일부 언어는 수업 시간과 수업 시간에만 많은 언어를 사용합니다 이것을 배우고 이것에 의지하십시오 그래서 이것은 Kotlin 방법의 훨씬 더 많은 것입니다, 그러나 그것은 측면에서 여전히 크지 않다

당신이 코 틀린과 함께 할 수있는 것의 두 가지 과부하가있다 그래서 getFirstWord는 문자열을 파싱하기로되어 있습니다 첫 번째 공간을 찾고 첫 번째 단어를 가져 와서 그것을 반환하십시오 하지만 구분 기호가 공백이 아닌 쉼표 인 경우에는 어떻게 될까요? 또는 뭔가? 그래서 여기에 더 많은 기능을 갖춘 버전이 있습니다 그리고 나서, 실제로 이것을 호출하는 방법입니다

대부분의 상황에서 그래서 여기에 표현하고자하는 것은 단지 기본값입니다 Java에서 우리는이 작업에 과부하를 사용하는 데 익숙합니다 일부 사용자는 nullable 매개 변수를 사용합니다 pass와 null을 여기에 넣으면 기본값을 줄 것입니다

Kotlin에서하지 마십시오 너는 필요 없어 실제로 필요한 것은 단순히 기본값을 지정하는 것입니다 내 기본값은 공간입니다 그게 전부 야

따라서 기본값을 에뮬레이트 할 필요가 없었습니다 그들은 둘 다 언어에 속합니다 그리고 당신이 많은, 많은 디폴트를 가질 때 매개 변수가 다른 값, 여러개의 부울 (boolean)을 좋아하는 등등 명명 된 매개 변수 구문을 사용하여 매개 변수 구문을 표현할 수 있습니다 당신은 실제로 필요합니다

나머지는 모두 기본적으로 사용됩니다 그래서 이것은 처음부터 기능을 줄였습니다 그리고 훨씬 더 표현력이 좋습니다 승인 기능면에서 좋지, 그렇지? 사실,이 함수는 중간 정도의 종류입니다

Kotlin 스타일과 Java 스타일 사이 실제로 문자열에서 작동하기 때문입니다 이것을 문자열 클래스에 넣는 것이 좋습니다 오, 잠깐, 그렇지 않아 문자열 클래스는 당신에 의해 제어되지 않기 때문에, 모든 것을 문자열 클래스에 넣을 수는 없습니다 그리고 문자열 API를 최소한으로 유지하려고합니다

그래서 내가 뭘하고 싶은지 나는 내 끈을 말할 수있는 이런 식으로, getFirstWord, 그게 전부입니다 그래서 그것은 방법처럼 보입니다 실제로 확장 기능이라고합니다 문자열 클래스에 앉아 있지 않습니다

나는 JDK에 가지 않고 제어 할 수있는 클래스를 변경하지 않았다 그러나 여전히, 그것은 이렇게 작동합니다 이것이 당신이 사용할 수있는 메커니즘입니다 어떻게 작동하는지 수동으로 설명하겠습니다 그래서 나는 string 타입의 리시버를 가지고있다

이제는이 매개 변수가 더 이상 필요하지 않습니다 여기에이 점을 말할 수 있으며 여기에서이 점을 사용하십시오 또는이 모든 것을 왼쪽에서 생략하십시오 이제는이 방법으로 사용할 수 있습니다 이해가 되니? 나는 재산으로도 똑같이 할 수있다

사실, 이렇게하는 것이 매우 좋을 것입니다 그냥 속성 이름으로 첫 단어가 있습니다 확장 속성을 가질 수 있습니다 물론 사용자 정의가 없습니다 구분 기호에 대한,하지만 그렇지 않으면 당신은 좋은거야

네, 여기에 공간을두기 만하면됩니다 그리고 그게 다야 따라서 확장 기능, 확장 속성 – 그것은 실제로 매우 중요한 아이디어입니다 그것은 단지 편리함이 아닙니다 수업을 실제로 최소한으로 유지할 수 있습니다

그러니 Kotlin의 문자열 클래스를보십시오 그것은 단지 5 가지 방법입니다 자바와 비교하면 스크린과 스크린이 될 것입니다 선언 따라서 API를 최소한으로 유지할 수 있습니다

그리고 모든 유틸리티 기능은 확장 기능 일 수 있습니다 다른 라이브러리에 앉아서 모듈화 할 수 있습니다 이는 API를 설계하는 데있어 매우 중요한 도구입니다 질문 있니? 승인 어쨌든 나는 그들을 데려 갈 수 없었다

좋아, 자, 이것 좀 보자 여기, 나는 아주 전형적인 것을하고 있습니다 나는 계층 구조를 가로 지르고있다 그래서 컨테이너와 리프 요소가 있습니다 컨테이너는 서로 중첩 될 수 있습니다

리프 요소가 거기에 있습니다 모든 잎 요소는 텍스트를 포함하고 I 이 계층 구조에서 모든 텍스트를 추출하려고합니다 꽤 직설적 인 그래서 수업은 세 줄의 코드입니다 별로

요소가 있습니다 아이들 목록이있는 컨테이너가 있습니다 텍스트가 있습니다 자, 나는 이것을 가로 지르고있다 그래서 확장 기능을 사용하고 있습니다

내가 말했듯이 나는 모든 최상위 함수를 사용하고 있습니다 그래서 괜찮아요하지만이 코드가 마음에 들지 않아요 왜 내가 그걸 좋아하지 않니? 여기에서 계층 구조를 탐색하려면 재귀가 필요합니다 그래서 문자열 빌더를 스택 아래로 전달해야합니다

내가 나무를 추락 할 때 그것에 덧붙여 라 그렇다면 최상위 함수로 끝납니다 여기 에선 이것 만 필요합니다 그래서이 곳은 어디에도 필요하지 않습니다 그러나이 함수 내부

그래서 제가 정말로하고 싶은 것은 그냥 안에 넣어 두는 것입니다 그냥 여기 가서 로컬 기능으로 만드십시오 다시 한번, 다른 사람이 필요로하지 않는다는 것을 표현하는 것입니다 더 이상 개인 도우미가 필요하지 않습니다 지역 조력자를 찾는다

그리고 이것은 조금 향상시킬 수 있습니다 실제로 클로저를 사용할 수 있습니다 그래서 여기서 문자열 제작자를 만들 수 있습니다 이 모든 것을 제거하십시오 따라서 여기서 매개 변수를 반환하거나 가져갈 필요가 없습니다

여기에 필요한 것은 위에서 선언 한 것을 사용하는 것입니다 그리고 나서 나는 e의 텍스트를 여기에서 추출한다 문자열 작성기를 toString으로 리턴합니다 ExtractText– 아, 죄송합니다 연장 기능이 맞죠? 아뇨, 미안 해요

그래, 그럼 어떻게되는지 알아 보자 무언가를 지역 기능으로 바꾸고 활용할 수 있습니다 폐쇄 그래서이 변수는 내 함수 밖에서 선언됩니다 바깥 바깥에있는 사람들은 접근 할 수 없습니다

그리고 저는 여기서 그것을 사용하고 있습니다 이제는 로컬 함수, 확장 함수, 최상위 함수, 기본 매개 변수를 사용하십시오 그들은 당신의 코드를 더 좋게 만들 것이다 이제는 아직 무엇이 있는지 살펴 보겠습니다 회색 코드가 보이십니까? 회색 코드는 쓸모가 없습니다

IDE와 컴파일러는 무언가가 아니라는 것을 보여줍니다 거기에 필요했고 실제로는 그렇지 않습니다 이 클래스는 여기에서 확인했기 때문에이 클래스는 중복되었습니다 그래서 이것을 제거 할 수 있습니다 그리고 네가 본다면 나는 모른다

오, 예, 당신은 – 텍스트 변수는 녹색으로 변했습니다 녹색 인 이유는 무엇입니까? 컴파일러가 당신을 위해 캐스트를 알아낼 수 있기 때문입니다 실제로는 훨씬 안전합니다 그것은 편리 할뿐만 아니라 나는 그 곳곳에서 내 캐스팅에 정말 화가났다

그래서 나는 그것이 텍스트임을 압니다 왜 몰라? 자, 이제 알았어 실제로이 변수가 필요하지 않습니다 유일한 용도이기 때문입니다 그리고 여기서도 마찬가지입니다

그리고, 제 컨테이너는 인라인이 될 수 있습니다 그래서 여기 있습니다 스마트 캐스트를 사용할 수 있습니다 코드를보다 안전하고 간결하게 만듭니다 그리고 실제로, 그것은 여전히 ​​모든 캐스트를 만듭니다

귀하의 프로그램에 의미가 있습니다 그래서 지금 Kotlin에서 as 연산자를 볼 때, 당신은 그것이 무엇인가를 의미한다는 것을 압니다 그것은 단지 쓸데없는 칭찬이 아닙니다 위의 체크 또한이 일은 내가하고있는 일 때문에 어리 석다

나는 모든 것에 동일한 기능을 적용하고 있습니다 그리고 그것은 하나의 기능입니다 그래서 제가하고 싶은 것은 이것과 같습니다 그것은 조금 더 좋게 보입니다 그리고 우리가 가지고있는 것을 보도록하겠습니다

우리는 계층 구조를 가로 지르고 있습니다 나는 내 나뭇잎이있다 나는 용기를 가지고있다 그게 제가 표현하고 싶은 것입니다, 그렇죠? 나는 다른 경우를 확인하고있다 그래서, when 문을 사용하는 것이 훨씬 더 좋다

유형을 바로 여기에서 전환 할 수 있습니다 그러나 그것에 대해 성가신 일이 있습니다 그리고 그것은 다시 옛날 습관에서 비롯된 것입니다 나는 가까운 계층 구조를 선언하고있다 컨테이너와 텍스트 만 있습니다

나는 다른 것을 가지고 있지 않다 하지만 지금은 여기이 귀찮은 사건이 있습니다 왜? 컴파일러는 아무 생각이 없기 때문에 컨테이너와 텍스트 이외에는 아무것도 없습니다 그것은 단지 추상적 인 클래스이고 거기에 어떤 경우가 있습니다

하지만 실제로 Kotlin에서 이것을 봉인으로 표현할 수 있습니다 봉인 된 클래스를 가질 수 있습니다 모든 하위 클래스가 알려져 있습니다 이 파일 밖에서 파일을 선언 할 수 있습니다 그리고 이렇게하면 IDE와 컴파일러가 이 다른 것이 쓸모 없다는 것을 알아라

그래서 우리는 거의 두 화면의 코드에서 출발했습니다 하나 이하로, 단순히 Kotlin의 숙어를 적용 이 코드에 질문 있니? 죄송 해요 괜찮아 자 이제이 연습을 계속하겠습니다

쓰여진 표현의 몇 가지 예를 살펴보십시오 마음에있는 오래된 습관과 같습니다 그리고 우리는 그것들을 더 나은 것으로 바꾸려고 노력할 것입니다 따라서 여기서 가장 눈에 띄는 것은 var입니다 나는 결코 var를 사용하지 않는다고 말할 수 없다

Vars가 유용합니다 가변 변수는 많은 좋은 것들에 사용될 수 있습니다 그러나 낙담 한 모양입니다 var가 필요한 경우 아주 좋은 이유가 필요합니다 여기 val을 사용하는 것은 당연한 이유가 아닙니다

그런 다음 여기에서이 세 가지를 살펴 보겠습니다 그것은 반복입니다 반복은 추악합니다 반복은 오류가 발생하기 쉽습니다 특히 이것이 하나의 이름은 아니지만 많은 것들이 쇠사슬에 묶여 있다면

그래서 나는이 반복을 없애고 싶다 제가 할 수있는 말은 전 (ex)입니다 누구는 파스칼을 기억합니까? 파스칼, 누구? 오 좋네 좋은 나는 거의 파스칼에서 시작했다

그래서 그것은 이상한 것이 었습니다 그것은 건물 구조였습니다 Kotlin에서 그것은 기능입니다 우리는 그것을 사용할 수 있습니다 그리고 여기, 우리는 모든 전 것들을 제거 할 수 있습니다

여기, 이렇게 그리고 지금은 더 바보처럼 보인다 나는 단지 같은 변수에 할당하고있다 그러지 마 좋아, 이제는 문자열에 뭔가 더한 프린트 라인이있다

문자열과 무언가, 문자열과 무언가 어색해 대부분의 언어는 이제 문자열 보간법을 사용합니다 Kotlin도 그렇게합니다 여기 실제로 필요한 것은 이것입니다

이걸로 끝났어 를 사용하여 범위로 항목을 가져옵니다 문자열 보간법을 사용하면 좋습니다 이제 여기, 나는 옛날 방식으로지도를 만들고 있습니다 이런 식으로 좀 더 좋게 만들 수 있어요

내 연산자를 사용하여,하지만 정말 더 좋네요 빌더 함수를 사용하면됩니다 그래서 제가 여기서 할 수있는 일은 모든지도 것들을 쌍으로 대체하는 것입니다 아, 쌍은 아니지만 쌍 죄송합니다

이야기 할 때 타이핑하기가 어렵습니다 네지도는 쌍으로 만들 수 있습니다 그렇죠? 지도는 키와 값의 쌍으로 이루어진 집합이었습니다 그러나 실제로, 쌍은 이것에서 일종의 중복입니다 그래서 우리는 보통 여기에 함수를 사용하고 있습니다

내장 연산자가 아니라 라이브러리 함수입니다 여기, 그래서 당신이지도를 만드는 방법입니다 그리고 당신이지도를 가로 질러 가고 싶을 때, 당신은 여기에 열쇠와 가치를 말할 수 있습니다 이 같은 변수를 사용하면 for 루프는 훨씬 간결합니다 이 코드 예제는 if 문을 사용하여, Java에서 코드를 정말 싫어하는 것입니다

이 과제는 여기에서 모두 다 떨어지기 때문에, 그래서 나는 Kotlin에서 이런 일을 정말로하고 싶습니다 그래서, 그리고 많은 다른 것들은 실제로 표현입니다 이것은 꽤 익숙하지 않은 무언가이다 C 언어 패밀리 우리는 코드를 문장으로 나눌 때 익숙하다

표현, 맞죠? 문장은 효과가있는 것입니다 표현은 가치가있는 것입니다 따라서 변수에 표현식을 지정하고 명령문을 작성합니다 사물에 물건을 할당하는 것 그래서 코 틀린은이 절차 적 전통의 중간에 있습니다

기능적 전통 너보다 표현이 더 많아 다른 언어로는 익숙하다 그래서 여기서 할 수 있습니다 물론 var를 사용할 필요는 없습니다

다른 라인을 만들 필요가 없습니다 그리고 즉시 할당 할 수 있습니다 그래서 표현이라면 더 좋게 만드십시오 그건 그렇고, 표현의 결과 블록의 마지막 것입니다 그 때도 마찬가지입니다

단순히 스테로이드로 케이스를 전환하지 않는 경우, 그것은 크게 중요하게 표현입니다 그럼 너도 그렇게 할 수 있지, 그렇지? 여기에 많은 반품은 없지만 여기로 돌아 오는 반품은 훨씬 좋네요 물론 자신을 반복하지 않아도됩니다 그리고 당신도 이것을 말할 수 있습니다 그건 그렇고, 뭔가 이상하고 평평한 지 확인하고 싶다면, 나처럼하지 마

데모 용입니다 집에서 이것을 시도하지 마십시오 상처받을거야 그래, 이렇게하면 더 간단해질 수있어 그래서 다시, 당신은 소음을 제거하려고합니다

이런 코드를 보았을 때, 그냥 소음을 없애려고 노력하십시오 소음은 뇌에 해로울 수 있습니다 마지막으로, 무엇에 대한 간단한 데모 null 허용 여부를 결정하십시오 그래서 이러한 물음표는 nullable 유형에 익숙합니다 코 틀린에요? 몇 명? 나는 정말로 빨리 갈 것이다

따라서 nullable 유형을 사용할 수 있습니다 그리고 컴파일러는 이런 일을합니다 그래서 지금 거기에 있습니다 문자열은 null입니다 당신은 역 참조 할 수 있습니다

이 작업을 수행 할 수 있습니다 나를 비유하다 그건 그렇고, 여기서 할 수 있어요 뿐만 아니라 주위에 if를 쓸 필요가 없습니다 그리고 실제로 이렇게 단순화 할 수 있습니다

또 다른 좋은 점은 이런 식으로 엘비스 연산자를 사용하면 if 문을 무언가에 넣습니다 그리고 이것은 분명히 호기심이 생깁니다 표현의 위치에, 맞지? 엘비스는 어떻게 일하는거야? 엘비스는 문자열의 왼쪽에 표현식을 취하고, 너는 정말로 널 멋지다 그리고 만약 그것이 null이라면, 그것은 오른쪽을 평가합니다 그러나 오른쪽은 표현이어야합니다

맞습니까? 기본적으로 기본 설정으로되어 있습니다 그래서 당신이 지금 왼쪽에 있다면, 오른쪽에 기본값을 사용하십시오 그러나 귀하의 불이행은 단지 반환 일 수 있습니다 이는 어떤 값도 계산하지 않는다는 것을 의미합니다 방금 함수에서 뛰어 내린다

그리고 그것은 타입 시스템에서 꽤 흥미로운 것입니다 관점,하지만 난 여기서 강의를하지 않을거야 나는 데모를하고있다 좋습니다, 우리는 표현에 능숙합니다 기능적 스타일을 살펴 보겠습니다

그래서 사람들은 매우 자주 코 틀린을 언급합니다 기능적 언어로서 나는 그것이 사실이라고 생각하지 않는다 나는 Kotlin이 다중 패러다임 언어라고 생각한다 기능 스타일을 지원합니다

당신은 Kotlin에서 기능을 쓸 필요가 없습니다 그러나 종종 그것을하는 것이 매우 좋다 그래서 이것에 대해 살펴 보겠습니다 그래서 자바를 염두에두고 옛날에는 이 코드를 작성했습니다이 코드는 숫자 목록을 처리합니다

16으로 나눌 수있는자를 선택합니다 다음 16 진수로 변환합니다 그럼 필터 맵이 실제로하는 일입니다 맞습니까? 지도는 이쪽, 필터는 이쪽입니다 그래서 내가 할 수있는 것은, 심지어 나의 IDE의 도움으로, 나는 이것을 할 수있다

모든 프로그래밍 언어의 새로운 버전 이런 게있어 확실히 활용할 수 있습니다 따라서이 필터는 함수입니다 이 람다는 함수 값입니다 그건 그렇고, 변수로 선언하지 않아도됩니다

너는 그걸 없애 버릴 수있어 이것이 λ 매개 변수입니다 Kotlin은 훌륭한 반 기능적 일을 가지고 있습니다 코드에서 어디에서나 말할 수있는 것처럼 말할 수 있습니다 너는이 가치를 가지고있다

나에게도 해줘 나를위한이 목록 그리고 나서 당신이하고 있던 일을 계속하십시오 결코 마음에 들지 않는 것처럼, 이것은 단지 디버그 출력이거나 어떤면이다 효과 나는 여기에 삽입하고 싶다

한편으로는 부작용이별로 작용하지 않습니다 반면에 이것은 디버깅에 매우 유용합니다 당신은 당신의 사슬을 분해 할 필요가 없습니다 등등 또한 let을 사용하고, run을 사용하고, 등등을 사용하십시오

기능적 추상화에 대한 한 가지 중요한 점이 있습니다 비 기능 언어로 이런 일을하면 반복 기능이 생깁니다 바로 여기, 그렇지? 그래서 그것이 무엇인지, 그것은 숫자를 필요로합니다 나는 무언가를 반복하고 싶다

그리고 이것은 무엇인가 기능입니다 그건 그렇고, 당신은 자신의 기능을 발명 할 필요가 없습니다 인터페이스를 사용할 때마다 여기에 함수 유형을 사용하십시오 그것은 int를 취하거나 하나의 단위를 취하는 함수입니다 단위 란 당신이 신경 쓰지 않는 어떤 것입니다

그런 다음 간단히 반복합니다 그래서 내가 반복을 말할 때, 나는 언제나 무엇에 대해 아주 많이 의식하고있다 그것은 저를 요하기 위하여려고하고있다 그래서 그것은 기능입니다 매개 변수로 람다를 사용합니다

그래서 실제로는 또 다른 매개 변수입니다 Kotlin 관례는 그것을 괄호 밖에서 쓰는 것입니다 이런 언어 구조와 더 비슷해 보입니다 그런데, OK, 나는 이것을 달리고있다 나는 람다 객체를 생성해야한다

매번 람다 객체를 생성해야한다 이런 식으로하세요 따라서이 추상화에는 비용이 듭니다 좋은 코드예요 나는 물건을 재사용 할 수있다

코드에서 추상화 수준을 높일 수 있습니다 그러나 그것에는 유료 도로가 있습니다 실제로 Kotlin에서, 당신은 매우 자주 제거 할 수 있습니다 녹색 람다의 통행량 중 – 람다 객체 – 인라인 함수 만 사용하면됩니다 내가 인라인이라고 말할 때, 내 코드는 변하지 않습니다

그래서 여기, 내가 볼 수있는 콜 사이트에서 아무 일도 없었습니다 그러나 내가 쇼 코 틀린 바이트 코드를 말하면, 이것을 자바로 디 컴파일하면됩니다 조금 겁 먹을 뿐이에요 지금까지 쉬운 이야기가 많이있었습니다 내가 이것을하면 – 여기에 그것은 간단합니다

내 람다는 어디 갔지? 글쎄, 컴파일러는 단순히 그것을 최적화했다 람다가 필요하지 않습니다 따라서 여기에 루프가 있고 모든 것을 인라인하면, 당신은 루프로 끝납니다 그게 전부 야 사고 방식의 큰 차이 자바 프로그래밍 언어 Kotlin 프로그래밍 언어에 아직도 람다를 사용하고 있지만, 람다 중 일부는 정말 무료입니다

그리고 그런데이 모든 것들도 무료입니다 표준 라이브러리에있는 수많은 람다 자유로운 추상화이다 당신은 그 (것)들을 부를 것을 지불 할 필요 없다 그것은 단지 당신을 위해 생성 된 코드 일뿐입니다 코 틀린에서 기능적 일뿐만 아니라 편리합니다

싼 말하자면 싸구려,이 예제를 살펴 보겠습니다 그래서 여기에서는 병렬 계산을하려고합니다 글쎄, 그건 바보 같은 표본이야 누구도 베어 스레드에서 병렬 계산을 수행하지 않으며, 등등

하지만 한 가지 요점을 설명하고자합니다 그래서 내가 여기서하고있는 것은, 다시, 내 오래된 습관을 염두에두고, 나는 100,000 개의 실을 만들고 있습니다 각각 10 만개의 스레드가 있습니다 사실, 1 초 동안 잠을 자면 숫자가 인쇄됩니다 그리고 나서이 모든 스레드에 참여해야합니다

내 주요 스레드 그럼 내가 이걸 실행하면 – 오, 오, 오, 그건 예외 였어 그게 뭐야? Java lang out of memory 오류입니다 기본적으로 나 한테 말하는거야, 이봐, 너 100,000 개의 스레드를 생성 할 수 없습니다 너 거기서 미치니? 100,000 스택입니다

그것은 기억에 맞지 않습니다 그냥 합리적 이군 그리고 그것은 공평합니다 OS 스레드는 저렴하지 않습니다 스레드에 대한 자원을 할당해야합니다

그래서 당신은 실로 그런 바보 같은 짓을하지 않습니다 그러나 나는이 예를 coroutines를 통해 가지고있다 코 틀린에서 코 루틴에 대해 누가 압니까? 오 좋네 프로덕션에서 누가 그들을 사용합니까? 좋아, 곧 너희 모두는 그것들을 사용할거야 그러니 여기서보세요

그것은 매우 동일한 코드입니다 그래서 여기에 나란히 놓을 것입니다 매우 많은 코드가 있지만 여기의 스레드 대신에, 코 루틴을 사용하는 비동기 작업을 만들고 있습니다 아래에 그래서 저는 여전히 1 초를 기다리고 있습니다

그리고 이걸 실행하면 기억이 없습니다 모든 숫자를 인쇄하고 있습니다 다시 코 틀린은 코 루틴을 도입했습니다 비동기로 만드는 수단으로 더 나은 계산 그게 효과가 있지만 그 비용은 얼마입니까? 그래서 그것의 비용은 적어도 더 싸다

각 계산마다 스레드가있는 것보다 물론, 아무도 그렇게하지 않습니다 그러나 여전히 코 루틴은 매우 싸다 당신은 100,000 개의 코 루틴, 100 만개처럼 스핀 할 수 있습니다 코 루틴 (coroutines)을 사용하면 비용이 거의 들지 않습니다 그 옛날 실처럼

코 루틴이 실제로 무엇인지 설명해 드리겠습니다 여기 좋네 여기에 레거시 인터페이스가 있습니다 나도 몰라 또는 [부적절한] 인터페이스 – 뭐든간에

그래서 우리는 비동기로 만들기 위해 종종해야만하는 일입니다 또는 우리의 의존성을 뒤집는 것과 같은 것을 만들거나, 등등은 콜백입니다 그래서 나에게 무언가를 해달라고 부탁하십시오 내가 너에게 해줄거야 그리고 내가 끝나면 알려주지

그래서 여기에 모의 서비스, 요청 및 콜백이 있습니다 함수가 전달됩니다 따라서 주석의 작업이 완료되면, 콜백을 호출하고 거기에 내 대답을 전달합니다 그래서 괜찮습니다 모두를 위해 일하고 있습니다

맞습니까? 그러나 이것은 코드가 다음과 같은 경우입니다 두 서비스간에 메시지를 교환하고 싶습니다 그래서 기본적으로 두 개의 메시지를 순서대로 보내고 싶습니다 그리고 여기에 내가해야 할 일이 있습니다 먼저 요청하십시오

그럼 콜백 이것은 요청의 결과입니다 나는 그것을 인쇄한다 그 콜백 내에서 다음 요청 그런 다음 안에 인쇄하십시오

그럼 여기 계단이 보이지, 그렇지? 한 걸음 오, 미안 한 단계, 두 단계, 세 단계

그리고 당신은 실제로 꽤 깊어 질 수 있습니다 이 계단을 내려 가면 좋지 않습니다 그래서 내가 정말로하고 싶어하는 것은 조금 더 간단합니다 하지만 이것은 일종의 용인입니다 하지만 만약에

그냥 상상해보십시오 n 통화와 같이해야합니까? 전화 번호를 정하는 것뿐입니다 이것이 제가 생각해 낸 코드입니다

전혀 좋지 않습니다 그래서 분명히 거기에 재귀가 필요합니다 콜백 내에서 콜백을 중첩해야하기 때문에 콜백 내에서, 맞지? 따라서 재귀가 필요합니다 이것은 내가 생각해 낼 수있는 가장 짧은 코드입니다 배열을 복사합니다

그러지 마 기억의 측면에서 낭비입니다 시간 낭비이다 그것은 2 차입니다 하지만 기본적으로, 당신은 올라와야합니다

이런 식으로 – 둥지 콜백처럼 콜백으로 콜백합니다 그래서 당신은 말할 수 없습니다, 좋아, 이것을 5 번 반복하라, 그렇지? 그래서 내가 정말로하고 싶어하는 것은 이 말처럼, 내가 방금 말한대로, OK, 하나의 요청 보내기, 결과를 기다리고 다른 요청을 보냅니다 그리고 내가 뭔가 반복하고 싶다면, for 루프로 반복하면됩니다 그래서이 코드는 실제로 같은 콜백을 사용하고 있습니다 코 루틴 추상화 만이 이것을 배포하고 있습니다

나에게서 따라서 실제로 콜백 기반 API를 사용할 수 있습니다 지금, 이것으로 바꾸세요 똑바로해라 몇 줄의 코드 만 있으면됩니다

내가 보여줄거야 그래서 이것은 동일한 서비스를 호출합니다 내가이 기능을 여기에 가지고 있기 때문에 그래서 내가하고있는 일은 요청을 돌리고 있습니다 이 단순한 구조를 통해 서스펜션 기능으로 내 콜백 서비스의 확장 기능입니다

내가 말하는 첫 번째 것은 내 coroutines를 중지합니다 그래서 나는 코 루틴에 있다고 가정하고 있습니다 나는 그것을 즉시 중단했다, 나는 나의 연속을 얻는다, 나는 나의 요구를한다 그게 전부 야 나는 정지 됐어

나는 요청을 기다리고있다 그래서 거기에 있습니다 그리고 요청이 완료되면, 나는 코 루틴으로 다시 시작한다고 말합니다 그게 전부 야 따라서이 간단한 코드를 사용하면 콜백 기반 API를 사용할 수 있습니다

coroutine API로 변환 할 수 있습니다 죄송합니다이 코드를이 코드로 만듭니다 제 감각으로는 훨씬 더 읽기 쉽습니다 당신이 그것을 좋아합니까 방법? 좋아, 관중석에 고개를 끄덕 거리다

고맙습니다 그래, 사실, 네가 원한다면 여기에 더 신중하게 – 그리고 네가 원한다고 확신 해 캐치 예외가 필요합니다 따라서 예외를 처리하는 것은 매우 중요합니다 그리고 이것만큼 쉽습니다

예외를 잡으십시오 무슨 일이 생기 든 오, 미안해

물론 여기가 아닙니다 귀하의 요청에 따라 어떤 일이 일어나든지, 그냥 잡으려고하고 resumeWithException 그래서 이것은 coroutines를 통해 예외를 전파 할 것입니다 아주 잘 그리고 여러분은 여기에 시도 잡기를 쓸 수 있습니다 – try catch와 함께 이것을 둘러 쌉니다

미안, 뭐든간에 예외를 잡아라 마치 순차적 코드처럼

그러나 밑에는 모두 비동기식입니다 이와 같은 asyncio 파일 시스템과 같은 HTTP 요청을 수행 할 수 있습니다 필요한 모든 것을 백그라운드 스레드로 처리 할 수 ​​있습니다 어떻게 좋지 않니? 그리고 나는 오늘 당신에게 보여줄 마지막 예를 생각합니다 이거 야

코 루틴이 어떻게 당신을 도울 수 있는지에 대한 또 다른 대변입니다 보세요 그래서 내가하고 싶은 것은 무한한 숫자의 흐름 무한한 숫자의 흐름을 좋아하는 사람은 누구입니까? 나는 그들을 아침 식사로 먹는다 그래서 나는 피보나치 시퀀스를 생성하기를 원합니다

그리고 나서, 나는 그들 중 20 명을 취할 수 있습니다 여기, 단지 20의 시퀀스 나는 200, 2,000 걸릴 수있어 필자는 필터링, 맵핑, 슬라이스 할 수 있습니다 이 buildSequence 함수는 라이브러리 함수입니다

Kotlin 표준 라이브러리에 있습니다 그리고 실제로 coroutine과 같은 메커니즘을 기반으로합니다 백그라운드 처리는하지 않습니다 그것은 모두 같은 스레드에 있어요 그것이 무엇인지, 그것은 여기에서 모든 산출량 진술을 취합니다, 그들을 순서대로 놓습니다

그래서 제가 여기서 무언가를 양보하고 싶다면, 그냥 할게요 나는 내 서열에 2를 삽입한다 내가 원한다면– 말하자면, tmp가 10보다 크면, 계속 – 나는 내 논리의 조각들을 건너 뛸 수있다 그래서 그것은 어떤 코 루틴처럼 간단합니다 그것은 당신에게 게으른 순서를 제공합니다

그래서 테이크 어웨이 수업은 저렴합니다 함수는 최상위 또는 로컬입니다 과부하가 없어서 기본값을 에뮬레이션합니다 속성 사용, 위임 된 속성 사용, 코 루틴 사용 좋은 Kotlin을 보내십시오 그리고 저는 오늘 좀 더 많은 활동을 광고하고 싶습니다

그래서 내가 아직 취할 수없는 질문이 있다면, 우리가 근무하는 12시 30 분까지 갈 수 있습니다 샌드 박스 영역으로 이동할 수 있습니다 우리가 코 틀린 부스에있는 C 적어도 하루는 그리고 내 이야기 ​​직후에 Jake Wharton의 Android KDX에 대한 이야기입니다 매우 흥미 롭습니다

2 단계에 있다고 믿습니다 그래서 거기에 오신 것을 환영합니다 주의 해 주셔서 대단히 감사합니다 [박수 갈채] [음악 재생]

Android Jetpack: sweetening Kotlin development with Android KTX (Google I/O ’18)

[음악 재생] JAKE WHARTON : 안녕하세요 제이크는 제이크입니다

코틀 린 물건에 대한 안드로이드 팀에서 일하고 있습니다 오늘은 Android KTX에 대해 이야기 할 것입니다 그리고 난 그냥 가지 않을거야 거기에있는 물건들을 묶어서 나는 그것보다 조금 더 재미있게 만들고 싶다 그래서 나는 약간의 일부터 시작하려고합니다

작년에 Google I / O에서 작년에 여기 있었는데 Android 유형에 대한 확장 기능을 작성할 수 있습니다 이 예와 같이 ViewGroup 내부의 뷰를 반복하는 코드 이 일반 코드를 확장 프로그램으로 가져올 수 있습니다 그리고이 확장이하는 일은 타입을 향상시키는 것입니다 우리가 통제하지 않는 ViewGroup 유형

기본적으로 멤버 함수를 만들 수 있습니다 그건 실제로 멤버 함수가 아닙니다 실제로 바이트 코드에서 정적 함수로 변합니다 우리가 향상시키고 자하는 기능으로 그래서 우리는 원래 코드를 취할 수 있습니다 명시적인 for-loop가 있었고이 새 멤버를 사용합니다

우리가 의도 한 것의보다 간결한 버전을 만들 수 있습니다 실제로 시각적으로 구분됩니다 일반 멤버 함수에서 이탤릭체로 표시됩니다 어두운 황색을 사용하면 실제로 노란색이됩니다 그러나 이것은 회원에게 전화하는 것과 의미 상으로 동일합니다

또는 의의는 의미 상 동등한 느낌을주기위한 것입니다 그리고 자주 시작됩니다 확장 기능에 대해 이야기하고, 당신이 생각하기에, 음, 이것이 아주 유용하다면, 왜 우리는 D 그룹에 직접 기능을 넣지 않습니까? ViewGroup은 왜 for-each와 for-each 인덱스를 제공하지 않는가? 람다를 필요로합니까? 그리고 정말로, 그 이유는 람다 때문입니다 우리가 Java 8이나 Kotlin에서 lambda를 넘길 때, 기본적으로, 그 방법을 먹는 익명의 클래스를 만들어야합니다 클래스 로딩을 유발합니다

그러나 Kotlin은 언어 기능, 우리는 그 람다의 할당을 제거 할 수 있습니다 함수를 인라인으로 표시함으로써, 확장의 본문이 호출 사이트로 복사되고, 우리는 제로 오버 헤드 추상화가 있습니다 다른 예를 살펴 보겠습니다 API 23에서 우리는 시스템 서비스를 얻을 수있었습니다 클래스 유형에 따라 그리고 27

1 개의 지원 도서관에서, ContextCompat 버전은 모든 API 수준에서 작동하도록 추가되었습니다 이것을 인라인 인 확장 프로그램으로 가져올 수도 있습니다 이전과 같지만 람다를 포함하지 않습니다 이게 다른 점은 무엇입니까? reified라고하는 것입니다 자, 이것은 컴파일러 트릭입니다

그 트릭이하는 일은 타입 정보 컴파일 타임에 알려진 일반의, 런타임에 사용 가능하도록 만들 수 있습니다 그래서 이것이 우리가 할 수있는 것입니다 그렇지 않으면 우리는 classjava를 호출 할 것입니다 알림 관리자에서 이제 그 정보를 추상화 할 수 있습니다

이 연장 뒤에 그래서 우리의 호출 코드가 이제는 단순화되었습니다 제네릭을 통과 할 수 있어야합니다 그리고 그것이 구체화 되었기 때문에, 그것의 구현은 classjava를 호출 할 수있는 액세스 권한이 있습니다

따라서 뷰의 패딩을 업데이트하려면 우리는 4 가지 중 2 가지만 지정합니다 매개 변수 -이 경우에는 왼쪽과 오른쪽 모두를 업데이트합니다 우리는 기존 패딩을 꺼내야합니다 안드로이드가 필요하기 때문에 상단과 하단에 대한 당신은 네 가지 모두를 지정해야합니다 이것은 우리가 다시 치료할 수있는 것입니다

확장 기능을 사용합니다 여기서 핵심은 각 인수에 대해 우리가 정의한이 새로운 기능에 대해, 우리는 기본값을 지정하고 있습니다 그리고 그 기본값 해당 인수에 값이 제공되지 않을 때 사용됩니다 그래서 우리는 호출하는 코드를 우리는 4 개 모두를 지정하고 있으며, 이제는 2 개로 지정합니다 하지만 여기서 문제는 우리가 제거한 것입니다

두 가지 주장 그러나 우리는 두 가지를 공급하기 때문에, 코 틀린 (Kotlin)은 이것을 처음 두 가지 의미로 생각합니다 후자의 두 개는 기본값이 사용되는 곳입니다 이것은 우리가 의도 한 바가 아닙니다 우리는 왼쪽과 오른쪽, 그것은 첫 번째와 세 번째입니다

또 다른 언어 기능이 여기에 도움이되는데, 이름이 매개 변수입니다 매개 변수의 이름을 지정함으로써, 우리는 컴파일러에게 두 개의 인수 중 어떤 것을 말할 수 있습니다 우리가 지정하고 그것을 채울 수 있도록 다른 사람의 기본값은 승인 Android API에는 여러 가지 복합 유형이 있습니다 이들은 점, 직사각형, 쌍과 같은 것들입니다

심지어 위치 클래스 이러한 복합 유형은 단지 래퍼 일뿐입니다 작은 개별 데이터 조각 주위 이 경우 사각형이있는 API를 호출합니다 그것은 네 개의 주위를 둘러싼 합성물입니다 – 왼쪽, 위쪽, 오른쪽, 그리고 바닥 – 직사각형의 값

계산을해야하는 경우 이러한 복합 형의 내부의 값에 근거 해, 당신은 그것들을 개별적인 값들 또는 변수들로 끌어 내야 만합니다 그 계산을하기 위해서 그리고 잠재적으로, 그들을 다시 모으십시오 확장의 도움으로이 문제를 피할 수 있습니다 이것은 약간 다릅니다 연산자라는 새로운 키워드가 있습니다

운영자는 Kotlin이 특별한 호출 사이트 구문을 사용할 수있게 해줍니다 그리고 각 연산자 함수는 매우 구체적인 이름을 가지고 있습니다 잘 알려진 이름 당신은 어떤 이름도 만들 수 없습니다 그리고 그 이름은 당신이 어떤 콜 사이트 구문을 정의하는지 창조하려고합니다

이 경우 구성 요소라고합니다 그리고 구성 요소를 사용하면 기능을 사용할 수 있습니다 Kotlin의 파괴라고합니다 그래서 개별적으로 철수해야했던 우리의 원래 코드 네 가지 구성 요소가 이제이 호출 ​​사이트를 사용할 수 있습니다 사각형이 자동으로 작성된 구문 4 개의 값에 압축을 풀고 4 개의 변수에 할당 우리가 선택한 이름으로 이것에 대해 정말 멋진 점은, 나중에 그 사람에 대해 신경 쓰지 않는다면 그 사람을 생략 할 수 있습니다

그리고 당신이 중간에있는 사람들에 관심이 없다면, 그것들을 밑줄로 지정할 수 있습니다 그리고 만약 우리가 단지 두개의 값을 꺼낼 필요가 있다면, 우리는 그것을 매우 간결하게 할 수 있습니다 승인 숙련 된 Kotlin 사용자가 알 수도 있습니다 그게

음, 우린 뒤집혔을거야 슬라이드로 돌아갈 수 있을까요? 승인 이 코드는 어떻게 우리는 문자열에는 숫자 만 포함됩니다 기본적으로 문자를 반복합니다

Kotlin의 for-in 구문을 사용합니다 그것이 자인지 여부를 확인합니다 문자에 대한 확장 함수 사용; 값을 true 또는 false로 설정합니다 그것이 자릿수가 아닌 것을 발견 할 때마다 숙련 된 Kotlin 사용자 인 경우, 당신은 모든 기능에 대해 알고있을 것입니다

string 상에 존재하는데, 그것은 동일한 루핑을 캡슐화한다 술어를 지정할 수있게 해줍니다이 경우, 입니다 실제로는 인라인 함수입니다 그래서 우리가 가지고있는 것과 똑같은 일을 할 수 있습니다

이전 슬라이드에 썼다 그러나 흥미로운 점은 Android는 실제로 이것을위한 내장 함수 그리고 나는 많은 사람들이 실제로 이것이 존재한다는 것을 알지 못한다 그리고 이것은 우리가 실제로 취할 수있는 것입니다 확장으로

그러나 당신은 궁금해하기 시작합니다 연장에있는 그것의 무게? 이 정적 메서드를 사용하면 어떤 가치를 얻을 수 있습니까? 내선 번호로 전화 할 수 있습니까? 글쎄, 하나, 그것은 방법을 변경 우리가 더 자연스럽고 관용적 인 느낌을 갖기 위해 코 틀린에서 – 확실한 그러나 여전히, 우리가 이것에서 추출한 가치가 있습니까? 우리가 이걸로 얻은 것 중 가장 큰 것 IDE에있을 때 문자열이 있습니다 당신은이 질문을하기를 원한다 그것은 숫자 만 포함합니다

TextUtils의 정적 메서드가 있다는 것을 모르는 경우, 당신은 아마 그것을 결코 발견하지 못할 것입니다 확장 기능을 사용할 때 IDE에서 타이핑을 시작하면, 실제로이 확장 기능과 자동 완성 기능을 보여줍니다 다른 곳보다 훨씬 더 쉽게 발견 할 수 있습니다 Enter 키를 누릅니다 그리고 당신은 그것을 얻습니다

괜찮아 그래서 여기에 몇 가지 확장 기능을 설명했습니다 나는 너에게 조금 생각 나게하고 싶었다 이러한 확장의 힘, 사실 우리는 오직 존재하는 언어 기능을 활용하고 있습니다 Kotlin에서는 Java 언어가 아닙니다

실제로,이 예제 중 일부는 우리는 나머지 동안 계속 돌아갈 것입니다 이 이야기 그래서 내가 방금 보았던 모든 확장 기능들 Android KTX 라이브러리에 포함되어있다 2 월 초 발표했습니다 그 이후로 두 번의 발표가있었습니다

화요일 현재, 그것은 제트 팩 (Jetpack)의 일부입니다 Jetpack으로 버전이 지정됩니다 그래서 화요일에 Core-KTX는 10 알파 1이되었습니다 버전이 만들어지고 출시 될 예정입니다

미래의 젯팩 (Jetpack) 도서관이있다 그래서 우리는이 Core-KTX를 출시 할 때 호출했습니다 그것은 이상한 이름의 종류이었다 그것은 말이되지 않았습니다 이것은 프레임 워크에서만 유형의 확장을위한 것입니다

많은 사람들이 도서관 자료를 추가 할 수 있을지 제안했습니다 그리고 우리는 no라고 말하는 것에 대해 매우 단호했습니다 바라건대 지금은 훨씬 더 의미가 있어야합니다 그러나 이것조차도 사실이 아닙니다 Core-KTX가 처음에는 support-compat에 의존했기 때문입니다

Support-compat은 이전 버전과의 호환성을 제공합니다 Android 프레임 워크에있는 것들의 버전 이전에는 ContextCompat로 예제를 보여 줬습니다 이것은 support-compat에서 나온 것입니다 그리고 지금, 제트 팩 브랜드와 안드로이드 X 패키지, support-compat이 핵심이되었습니다

이제 Core-KTX는 Core와 함께합니다 그래서 우리는 우리가 무엇을하고 있는지 알았습니다 우리가 이것을 시작했을 때 그리고 지금, 그것은 단지 갚기 시작했습니다 다른 Jetpack 라이브러리와 함께, 실제로 몇 가지 새로운 KTX 라이브러리가 있습니다

그것으로 시작됩니다 그래서 우리는 fragment, collection, SQLite를 가지고 있습니다 최신 구성 요소, 탐색 및 작업 런타임 용 나중에 조금씩 발견 할 수있는 방법을 알려 드리겠습니다 하지만 범위 지정에 대해 조금 이야기하고 싶습니다

무엇을해야할지 여부를 결정하는 방법에 대해 이 라이브러리들 중 하나에 들어가십시오 괜찮아 그래서 Core-KTX 03에서는 확장 기능을 제공했습니다 그게 그렇게 보였어

서명을 보면 연산자입니다 그리고 그것은 색상으로 작동합니다 이름은 플러스입니다 그래서 이것은 우리가 정상적인 더하기 구문을 사용하여 추가, 함께 두 가지 색상 합성 서명은 확실히 확장입니다

하지만이 몸은 매우 다른 것처럼 보입니다 우리가 본 다른 확장보다 상당한 양의 코드가 여기에 있습니다 당신이 안으로 볼 경우, support-compat, 현재 코어입니다 컬러 유틸리티 클래스가 있습니다 그리고 그 컬러 유틸리티 클래스는 정수 색상에서 작동하는 합성 색상이라고하는 메소드입니다

전경과 배경을 가져갈 수 있습니다 그것들을 하나의 색깔로 바꾸십시오 구현을 배치하기에 적합한 후보입니다 그 확장 기능이 무엇인지 이 클래스에 모든 사람이 사용할 수 있도록 자바 언어에서 사용할 수 있습니다 또는 Kotlin 언어

그래서 Core-KTX 10에서는 실제로 해당 ColorUtils에 위임하기 위해 다시 작성되었습니다 따라서 Java 언어 사용자는 해당 기능을 사용합니다 그러나 Kotlin 사용자는 향상된 구문을 사용합니다 그리고 우리가 얘기 한 확장 기능을 살펴 본다면 지금까지, 그들의 몸, 구현 이 함수들 중, 그들은 모두 사소한 것입니다

그들은 대단히 사소하다 그리고 그것은 의도적으로 설계된 것입니다 그리고 이것은 나를 몇 가지 원리를 다루도록합니다 우리는 KTX 확장이 가져야한다고 정의했습니다 따라서이 첫 번째 기능은 기능을 적용하려는 것입니다

그것은 이미 존재합니다 새로운 기능을 추가하려면 그것들은 업스트림으로 리디렉션되어야합니다 그들은 언어 불가지론 자입니다 두 언어 모두 그들을 이용하십시오 이것의 다른 예 – 몇 가지 HTML compat stuff와 path iterator가있었습니다

이후 Core-KTX에서 처음으로 구현 된 코어로 업스트림으로 이동 가능 두 언어로 사용됩니다 이러한 모든 확장에 공통적 인 또 다른 사항 인라인으로 표시되어 있다는 것입니다 우리가 첫 번째 행을 인라인하는 이유는 맨 위에있는 것 – 람다 할당을 피하기 위해서입니다 두 번째의 경우, 우리가 수정 된 제네릭을 사용하고 있기 때문에, 우리는 실제로 컴파일러에 의해 인라인을 사용해야합니다 세 번째, 구성 요소 1, 맨 아래 1 모두 인라인입니다

네가 쓰지 않는 것에 대한 앨리어스 만 확장 기능이없는 경우 우리가 뭔가를 본다면 Core-KTX에는 인라인이 아닙니다이 반복자 확장자가 있습니다 우리가 Kotlin 's for / in을 사용할 수있게 해주는 ViewGroup에 뷰와 ViewGroup을 반복하는 구문 이것은 매우 구체적인 이유로 인라인되지 않습니다

그리고 그것은이 함수의 구현이 익명 클래스를 정의합니다 만약 우리가 이것을 인라인했다면, 당신이 그것을 사용하면 익명의 클래스가 호출 사이트에 정의됩니다 그래서 갑판의 크기, 방법 수, 및 클래스 로딩 우리는 명시 적으로이를 인라인으로 만들지 않습니다 우리는 단일 구현을 모든 발신자가 다시 사용할 수 있습니다

그래서 우리는 인라인이 아닌 확장 기능을 기본값으로 사용합니다 할당 이유 그리고 나는 이것이 정말로 KTX 스타일 확장 만 가능합니다 일반적인 Kotlin 코드에서 이것은 권장하지 않습니다 인라인 기본 설정을 원하지 않습니다

실제로 가지고있는 잠재력이 있기 때문에 긍정적 인 것보다는 당신의 코드에 부정적인 영향 괜찮아 그래서 우리가이 확장을 보여 주었을 때, 나는 인라인 수식어가 사실과 결합 된 방법에 대해 이야기했다 람다가 있다는 것,이 확장을 허용합니다 제로 오버 헤드 추상화

검증 된 경우, 우리는 능력을 얻습니다 더 많은 선언적 버전을 가짐 지정하지 않고도 호출 사이트에서 조회를 수행 할 수 있습니다 콜론 콜론 classjava 패딩을 업데이트하기 위해 기본값을 사용합니다

각 인수를 지정할 필요가 없기 때문에, 인수의 하위 집합을 지정하는 이름 매개 변수 우리는 실제로 제공하고자합니다 구조 조정의 경우에는 멋진 구문을 사용합니다 이를 통해 우리는 컴포넌트 변수를 분리 할 수 ​​있습니다 합성 오브젝트의 이것은 유용합니다 이것은 우리가 가지고있는 사실에 의해 가능합니다

Kotlin에서 연산자 오버로딩 우리는 또한 우리가 어떻게 더하기 색상을 추가 할 수 있었는지에 대해서도 이야기했습니다 이 경우 정적 메서드 확장의 별칭을 지정합니다 이는 발견 가능성을 높이는 데 도움이됩니다 당신이 그렇지 않으면 몰랐을 내장 헬퍼가 존재합니다

그리고 컬렉션과 유사하지만 그렇지 않은 유형의 경우 실제로 컬렉션, 우리는 능력을 가지고 그들을 가상 컬렉션으로 변환 우리는 언어의 용역을 사용할 수 있습니다 마치 실제 컬렉션 인 것처럼 그래서 이들 각각은 매우 Kotlin 특정 언어를 가지고 있습니다 사용하는 기능 그리고 우리는 이러한 모든 확장 기능이 Kotlin 언어의 일부 기능을 활용하도록 정의 자바 호출자에게는 그렇지 않다

우리는 API를 수정하는 것만으로도 확장 기능을 제공하지만 확장 기능을 제공합니다 레버리지를 사용하여 사용하는 것이 더 즐겁다 이러한 Kotlin 관련 기능 승인 우리가 자주 얻는 제안 중 하나 setOnClickListener와 같은 것을 가져 오는 것입니다

확장을 작성하면 Click 또는 OnClick과 같은 것을 사용하여 호출 할 수 있습니다 이것은 호출 코드를 허용합니다 setOnClickListener를 호출 할 필요없이, 클릭의 단축 버전을 얻습니다 이 언어의 기능을 활용하고 있습니까? 글쎄, 우리는 확장 함수를 사용하고 있지만 실제로는 그렇지 않습니다 우리는 단지 짧은 별명을 만들고 있습니다

이 확장 프로그램에서 얻을 수있는 가치는 무엇입니까? 글쎄, 우리는 몇 가지 적은 문자를 입력하고 있습니다 그러나 실제로, 그것은 어쨌든 자동 완성됩니다 그러나 더 나쁜 것은, 우리가 여기서 선례를 세울 것인가 이 확장 기능을 추가하여? 모든 청취자에게이 작업을 수행 할 예정입니까? 그래서 이것이 뭔가 좋은 예입니다 우리는 명시 적으로 KTX 라이브러리에서하고 싶지 않습니다 당신이 그 용어에 익숙하지 않다면, 우리는이 코드를 골프라고 부릅니다

가능한 한 최단의 코드를 만들려는 욕구를 가지십시오 이것은 우리가하고 싶지 않은 것이다 코드를 더 짧게 만들려고 여기에 온 것은 아닙니다 승인 지금은 또 하나의 제안이 있습니다

그리고 나는 사람들이 사용하는 것을 보았다 Android의 경우 다양한 API 레벨로 인해 우리는 아주 자주 당신을 지원해야합니다 SDK int 주변의 IF 검사를 참조하십시오 그래서 이것을 꺼내는 유혹을받을 수 있습니다 확장 기능으로 이것의 조금 더 많은 선언적 버전

비교를 확장 함수로 옮깁니다 인라인 함수이기 때문에 오버 헤드가 없습니다 람다는 마지막 매개 변수입니다 그래서 우리는 멋진 Kotlin 호출을 얻습니다 사이트 구문

그리고 이것은 우리의 IF 진술을 이것으로 변환합니다 자, 이것 자체만으로는 너무 끔찍하지 않습니다 우리는 실제로 어떤 언어 기능도 활용하지 않습니다 다시 말하지만, 마지막 것과 비슷하지만 여전히 별명입니다 하지만 최소한이 점은 조금 더 논쟁 할 수 있습니다

그것의 공로 때문에 그러나 문제가 있습니다 이 두 문장은 동일하지만, 오, 한가지는 최소한 정적 SDK SDK int, 그리고 나서 그들은 조금 더 가깝습니다 이것이 이것이 덜 타당한 이유 중 하나입니다 하지만 한 가지는 IF 문 프로그래밍 언어의 아주 원시적 인 구조입니다

IF 문은 IF 문이 아니기 때문에, ELSE와 같은 구조가 있습니다 요구 사항이 변경되면 어떻게 될까요? 이 두 가지 행동을 바꿔야한다고 다른 버전? 당신이 작성한이 확장 프로그램을 사용했다면, 이 사건을지지하기 위해 IF 문을 사용하여 다시 변경해야합니다 또는 함수를 수정해야하는 경우, 어쩌면 지금은 두 개의 람다가 필요합니다 한 명은 19 세 이상이고 한 명은 사건입니다 네가 아니야 이 함수에서는 두 개의 람다를 사용하지 않기 때문에, 우리는 특별한 후행 람다 구문을 잃어 버렸습니다

이제 우리는 내부적으로 인수로 전달해야합니다 괄호는 이전에 비해 우리는 그렇지 않았습니다 즉각적으로이 확장은 붕괴되기 시작합니다 다른 조건부 분기를 도입하면 어쩌면 API 전반에서 동작을 다르게해야 할 수도 있습니다 세 가지 다른 방법으로 – 글쎄, 우리가 확장 프로그램이이를 가능하게 할 수 있습니다

이 확장에 대해 다른 점은 IF 문과 비교하면 우리가 가정하고있는 것입니다 확인하고 싶은 조건부 보다 크거나 같음 우리가 람다에서 뛰고 싶은 행동, 우리는 단지 19 플러스에서 뛰고 싶습니다 글쎄, 많은 시간, IF 문 중 일부는 – 다시, SDK int -는 작거나 같을 것입니다 그리고 이제는 순서대로 두 번째 확장이 필요합니다 사용 사례를 지원합니다

그래서 이것은 뭔가의 또 다른 예입니다 우리가하려는 게 아니야 우리는 단 한 번의 사용으로 최적화하고 싶지 않습니다 사례 또는 특정 유스 케이스, 확장 만 한 가지 일을 지원합니다 그리고 나서 좀 더 복잡한 것으로 옮겨야 할 때, 당신은 원래의 행동으로 되돌려 야합니다

확장 프로그램을 통해 당신이 필요로하는 모든 것을 표현하기 그것이 존재하지 않는다면 표현할 수 있습니다 승인 지금까지 우리가 얘기해온 모든 확장 기능 Core-KTX 라이브러리에있는 것들이었습니다 나는 많은 연장을 겪고 싶지 않다 이 다른 도서관에 있습니다

다시 한 번 조금씩 발견 할 수있는 방법을 보여 드리겠습니다 하지만 나는 하나를 만지고 싶다 그래서 KTX 단편에는 확장이 있습니다 트랜잭션을 캡슐화합니다 beginTransaction과 commit 함수를 이동합니다

확장 기능으로 호출합니다 우리는 인라인 함수를 사용할 수 있다는 사실을 사용합니다 및 람다를 다시 0 오버 헤드로 변환합니다 맡은 일 우리의 호출 코드는 조금 더 짧아지고, 이제 우리는 람다 본문과 트랜잭션을 사용합니다

조각을 사용했다면 커밋이 유일한 커밋 기능이 아니라는 것을 알아라 실제로는 여러 가지가 있습니다 그래서 우리는 뭔가를함으로써 이것을 모델링 할 수 있습니다 같은 부울을 제공 할 수 있도록 상태 손실을 허용할지 또는 허용하지 않을지 여부 당신이 저지를 때 이것은 수용하기가 정말로 쉽습니다

그러나 그것은 일종의 무언가에 반대한다 나는 이전에 말했어 오, 우리는 이것을 사용할 수 있도록 콜 사이트를 업데이트 할 수 있습니다 내가 앞서 말한 것에 위배된다 구현의 영향을 최소화하는 방법에 대해 이야기했습니다

이러한 확장의 이것은 인라인 함수이기 때문에, 그리고 나서 우리는 이제 인라인 내부에 조건부를 넣습니다 함수, 그 조건부가 인라인되고있다 모든 콜 사이트로 그래서 모든 콜 사이트가 이제 그 내부에 조건부가 있어야합니다 이것은 실제로 나쁜 것입니까? 글쎄, 우리가 바이트 코드를 보면 호출 사이트에서 생성됩니다

우리가 허용 상태 손실을 true로 지정할 때 – 너는 정말로 이해할 필요가 없다 여기에서 무슨 일이 일어나고 있는지 이해하기위한 바이트 코드 기본적으로 세 가지 함수 호출이 있습니다 첫 번째는 beginTransaction입니다 두 번째는 람다 내부에 있던 교체 작업입니다

세 번째 것은 commitAllowingStateLoss에 대한 호출입니다 IF 문은 없습니다 조건부는 없습니다 그리고 이것은 인라인 함수이기 때문에 인수는 부울이므로, 컴파일러는 실제로 컴파일 타임에 가치 그리고 컴파일 시간에 알고 있기 때문에, 그것은 실제로 죽은 코드 제거를 할 수 있습니다

실행될 수없는 분기를 제거하십시오 그리고 실제로 바이트 코드에서, 당신이 그렇지 않으면 쓰려고했던 것과 동등한 것 실제로 커밋 기능이 많이 있습니다 지금 커밋하고 커밋 할 수있는 방법이 있습니다 따라서 우리는 추가 Boolean을 추가하여이를 지원할 수도 있습니다

그리고 똑같은 일이 여기서 일어납니다 이제 그들은 중첩되어 있지만, 데드 코드 제거 단 하나의 기능 만 있도록 결과 바이트 코드를 호출하십시오 승인 이러한 모든 I / O 릴리스의 노력의 일환으로, 우리가 한 일 중 하나 Kotlin 특정 생성을 시작합니다 Android에서 게시하는 라이브러리보기 프레임 워크 자체

그래서 보시다시피 그 파란색 상자에 참조 문서를 방문 할 때, 네가 원한다면 실제로 너에게 물어볼거야 Kotlin 특정 버전의 플랫폼을 보는 방법 또는 Android X 라이브러리 또한 왼쪽 탐색 창에서 아래로 스크롤하면 맨 아래에는 링크도 있습니다 그리고 이것들은 Kotlin의 이러한 라이브러리에 대한 견해입니다 그래서 여러분이 말하길, 조각을 볼 때 패키지를 사용하면 조각에 대한 확장 프로그램을 볼 수 있습니다

문서 안에 있습니다 더 이상 완전히 분리되지 않습니다 한 가지 당장 실종 됐어 우리가 너에게 실제로 말하지 않는다는거야 이것들이 유래 한 인공물의 좌표

곧 올거야 또한 Core-KTX의 확장, 플랫폼 유형을 확장하고 아직 플랫폼 문서에 표시됩니다 그러나 이것은 우리가 원했던 것이다 나가서 일하고 있다는 것을 보여 주려고 그리고 두 가지가 곧 나올 것으로 기대합니다

괜찮아 나는 안드로이드 KTX에 대해 이야기하기 위해왔다 그러나 Kotlin 확장 기능은 없습니다 Android 관련 정보 우리가하고있는 일은 건물 확장입니다

이 도서관을 좀 더 Kotlin에게 친숙하게 만들기 위해 그리고 그것은 모든 도서관이 할 수있는 것입니다 그래서 저는 그 방법들에 대해서 이야기하고 싶습니다 우리는 도서관을 어떻게 더 많이 만들 수 있을지에 대해 생각합니다 Android 라이브러리 모두에 적용되는 Kotlin에 친숙하고, 당신이 쓰고있는 도서관에도 적용됩니다

또는 당신이 사용하고있을 수도 있습니다 도서관을 만드는 첫 번째 방법은 실제로 Kotlin-friendly입니다 Kotlin에서 모든 것을 다시 쓰는 것입니다 분명히 이것은 모든 도서관에서 가능하지 않다 그러나 그것은 확실히 어떤 사람들에게는 선택 사항입니다

앱 전용 비공개 라이브러리 인 경우 귀하의 저장소에 있거나 귀하의 회사 내부에 있습니다 이미 Kotlin을 사용하고 있습니다이 옵션은 실행 가능합니다 그것은, 말하자면 완전히 실용적 인 것처럼 보이지 않습니다 안드로이드 프레임 워크

그리고 나는 우리가 무대에 있다는 것을 확신하지 못한다 안드로이드 X 라이브러리가이를 수행 할 수 있습니다 아마 미래의 안드로이드 X 라이브러리가 Kotlin에 쓰여질 수 있습니다 그럴 가능성이 높습니다 대부분의 것들로 우리가 선택한 것은 무엇입니까? 우리가 출판하는 것은 형제 유물이다

그래서 메인 도서관은 쓰여지고있다 Java 언어를 사용합니다 그리고 우리는 형제 유물로 Kotlin 언어 기능을 제공합니다 이것에 대해 대단한 점은 당신이하지 않는다는 것입니다 소비자에게 Kotlin 표준 라이브러리 강제 적용 그들이 명시 적으로 그것을 원하지 않는 한

확장 프로그램을 관리 할 수 ​​있습니다 API를 보강하는 데 필요한 것이 정확히 무엇인지, Kotlin 특정 기능을 사용할 수 있습니다 이것에 대해 정말 멋진 점은 확장하려는 라이브러리를 제어 할 필요가 없습니다 그래서 도서관을 이용하고 있다면 당신은 그것의 일부를 더 만들고 싶습니다 Kotlin-friendly, 당신은 그것을 할 수 있습니다

자신의 앱에서 또는 라이브러리에 대한 확장 집합을 게시 할 수 있습니다 다른 누군가가 발행하는 그러나 이들이 유일한 두 가지 옵션입니까? 나는 뭔가를보고 싶다 나는 제 3의 약간 잡종의 옵션으로 이끌 것이다라고 생각한다 그리고이 간단한 별칭 확장으로 돌아갑니다 우리는 자바 언어로 정의 된 정적 메서드를 사용했다 Kotlin 언어로 확장 메소드로 바꿨습니다

Java 측에서이 클래스의 구현을 살펴보면, 첫 줄을 포함 시켰습니다 왜냐하면 우리는 즉시 역 참조하는 것을 볼 수있다 우리가 전달하는 논쟁 문자열을 전달하자마자, 최대 문자 수는 얼마입니까? 내가 반복 할 수있는 순서대로 숫자가 있는지 여부를 확인하려면? 따라서 Java API로 Kotlin을 사용한다면, 이 매개 변수가 다음과 같은 것을 알 수 있습니다 플랫폼 유형이라고 불리는 것으로 노출 될 것입니다

null 허용 여부를 알 수 없습니다 그러나 구현을 통해 우리는이 사실을 즉시 알 수 있습니다 메서드는 null 값을 받아 들일 수 없습니다 우리가이 문제를 해결할 수있는 방법 null이 아닌 주석을 추가하는 것입니다 따라서이 주석은 Kotlin 컴파일러에게 알려주는 것입니다

거기에는 제한이있다 특수한 행동이 있다는 것을 계정을 고려해야합니다 아무도 통과하지 못하도록해야합니다 null 가능성이있는 값, 또는 null를이 메소드에 추가합니다 그래서 이것은 Kotlin의 언어 기능을 가능하게합니다

Java에는 단순히 존재하지 않습니다 이제이 시행을 허용 할 도구를 사용할 수 있습니다 Java에서 작동합니다 그러나 언어 자체가 본질적인 것은 아닙니다 그래서 우리가 무효를 위해서 그런 것을 할 수 있다면 – 이 주석을 nullness에 추가 할 수 있으면 Kotlin 컴파일러에게 필요한 것을 알리기 위해 이 메소드를 호출 할 때 동작을 변경하려면, 우리가 다른 것을 위해 이것을 할 수 있습니까? 말하자면,이 정적 메서드를 사용하려면 첫 번째 인수 정말 수신기입니다

그리고 이것이 실제로 확장 기능이 될 때 Kotlin에서 호출? 그리고 이것이 우리로 하여금 잠재적으로, 이것을 명시 적으로 정의 할 필요성을 제거합니다 확장 이 확장은 호출 규칙을 변경하기 위해서만 존재하며, 컴파일러에게 우리가 당신이 그것을 호출하도록 허용하고 싶다는 것을 알리기 위해 다른 방법으로 그리고 지금은, 우리는 이것 만 남았습니다 Kotlin 컴파일러는 주석, 마치 null이 아닌 주석을 본 것처럼, 그것으로부터 무언가를 유추하고 너는 그걸 더 많이 말하는거야

그 언어에 관용적 인 바이트 코드에서, 우리는 그렇지 않으면 쓰려고했던 것을 얻는다 우리는 여전히 static 메소드를 호출합니다 수신기가 첫 번째 인수가됩니다 이 예제는 어떻습니까? 당신이 알아챈 한 가지는 이 확장의 이름은 setPadding이 아니라 updatePadding입니다

이제이 확장을 setPadding이라고 부를 수 있습니다 그러나 문제는 그것이 단지 인수의 하위 집합에 대한 작업 그래서이 경우, 우리는 단지 어디에 왼쪽 및 오른쪽 값을 전달하면 setPadding을 호출 할 수 있습니다 그리고 그것은 잘 작동합니다 그러나 우리가 왼쪽에서 오른쪽으로, 그리고 나서 맨 아래에서 통과한다면, 우리는 네 가지 주장을 제시 할 것입니다

그리고 Kotlin 컴파일러는 실제 패딩 패딩은 네 개의 인수를 받아들입니다 그리고 그것은 진짜 것을 부르는 것을 선호 할 것입니다 그리고 실제 매개 변수에는 명명 된 매개 변수가 없습니다 컴파일 오류가 발생합니다 그것이 바로이 updatePadding의 이름입니다

우리가 진짜 setpadding을 보면 – 4 개의 정수를 취하는 간단한 방법 – 우리가 Kotlin 컴파일러에게 알릴 수 있다면 어떨까요? 이 매개 변수에는 그와 관련된 이름이 있습니까? 자, 매개 변수 이름에서 이것을 추측하는 것이 좋을 것입니다 중복을 지정하지 않아도됩니다 하지만 나는 그것을 주장한다 주석에있는 이들 이름에 대해 명시 적으로 잘 설명합니다 Java 8 바이트 코드에서 실제로 매개 변수 이름을 유지할 수있는 방법입니다

그래서 Kotlin 컴파일러는 이론적으로 그것들을 사용할 수 있습니다 그러나 한 가지 문제는 모든 것이 든 없든 이 행동을 선택해야합니다 갑자기 모든 매개 변수 이름 귀하의 도서관을 가로 질러 돌로 설정되어 있습니다 반면 특수 효과를 사용하면 점진적으로 마이그레이션 할 수있는 기능 따라서 이것은 명명 부분을 해결할 잠재력을 가지고 있습니다

지금, 우리는 Kotlin에서 진짜 방법을 부를 수 있습니다 우리가 원하는 순서대로 4 개의 인수를 지정하면, 우리가 제공하는 이름을 기반으로합니다 기본 값은 어떻습니까? 코 틀린 표정을 지정할 수 있다면 어떨까요? 컴파일러는 컴파일러가 하나는 당신이 공급하지 않았습니까? 이렇게하면 원래의 확장 호출 규칙이 변경됩니다 확장 기능을 호출하는 것에서 실제로 사용하는 것까지 진짜 방법 그런 다음 바이트 코드에서 우리는 우리가 시작한 것, 우리의 명백한 확장 인라인 할 것이다

하지만 지금은 확장이 존재하지 않아도됩니다 특수 효과 형식으로 추가 한 메타 데이터 Kotlin 컴파일러에게 우리에게 우리의 전화 능력을 향상시키고 자했다 이 기능은 코 틀린 특정 방식으로, Kotlin 기능을 활용합니다 그래서 우리는 그렇게 할 수 있습니다 그래서 Kotlin은 KEEP이라고하는이 과정을 가지고 있습니다

Kotlin 진화 및 향상 프로세스입니다 오늘 아침 우리는 이러한 주석을 제안했습니다 KEEP-110으로 이것이 우리가 제안하는 것입니다 Kotlin 컴파일러에 추가하여 이러한 주석을 이해하십시오 우리는 ExtensionFunction과 ExtensionProperty를 가지고 있습니다

정적 메소드 용; 기본값, 매개 변수에 대한 공급 및 기본값을 허용합니다 KtName을 사용하면 메소드, 필드 또는 매개 변수의 대체 이름을 제공합니다 이제는 매우 빠릅니다 이러한 이름은 변경 될 수 있습니다 의미가 변경 될 수 있습니다

이것은 실제로 받아 들여지지 않을 수도 있습니다 Kotlin 컴파일러에 넣습니다 우리는 JetBrains 팀과 협력 해 왔습니다 이것에 대해 꽤 오랫동안 그리고이 중 일부는 이미 프로토 타입 화되어 있습니다

Kotlin 컴파일러 내부 우리는 이것이 이것이 우리가 향상시킬 수있는 방법이라고 생각합니다 Kotlin 발신자 용 Android 프레임 워크, 실제로 Android를 다시 작성하지 않고도 프레임 워크, 또는 적어도 API, Kotlin에서 실행할 수 있는 그리고 이것이 중요한 선택 임에도 불구하고, 실제로 그것을 Kotlin 컴파일러로 만든다고 가정합니다 모든 문제를 완전히 해결하지는 못한다

기존 확장이 해결되고 있음을 KEEP-110에서 제안한 이러한 주석을 결정했습니다 수많은 오픈 소스 라이브러리를 살펴보고, 우리 자신의 도서관을보고, 우리가 가장 유용한 확장이라고 생각했던 것을 보았습니다 자바 메소드의 패턴이 원하는대로 확장으로 변환 될 수 있습니다 그리고 후자의 두 가지는 실제로 보완 적입니다 특수 효과의 큰 장점 당신이 진리의 유일한 원천을 유지한다는 것입니다

당신은 정말로 Kotlin을 알 필요가 없습니다 빌드 시스템에 Kotlin 컴파일러를 추가 할 필요가 없습니다 형제 유물을 게시 할 필요가 없습니다 순수한 자바 라이브러리 일지라도, 이러한 특수 효과를 추가하고 API를 향상시킬 수 있으므로 Kotlin 호출자는 더 관용적 인 구문을 사용합니다 괜찮아

요약하자면, Core-KTX는 이제 Android Jetpack의 일부입니다 Android Jetpack과 함께 출시 된 Android Jetpack으로 버전이 지정되었습니다 화면에 표시되는 것처럼 몇 가지 새로운 아티팩트가 있습니다 확실히 더 많은 것이 있습니다 우리가 생각하는 주목할만한 것들 조각 및보기 모델입니다

그래서 나는 유물을보고 놀랄 것입니다 앞으로 몇 개월 안에 Kotlin 버전을 확인하십시오 참조 문서의 이것은 매우 빠릅니다 이것은 [? 도카?] 우리가 어떻게 문서를 생산하는지 그래서 우리는 단지 거기에 나가서 당신을 미리보기로 보여주고 싶었습니다

이것은 분명히 적극적으로 노력하고 있습니다 Android 버그에 새로운 구성 요소가 있습니다 안드로이드 KTX에 대한 추적기 Core-KTX와 모든 KTX 라이브러리 진실의 원천 인 제트 팩의 일부가되었습니다 Android 지원 리포지토리로 이동했습니다

GitHub 문제를 GitHub로 마이그레이션 할 것입니다 앞으로 몇 주 안에이 버그 트래커에 프로젝트를 맡기십시오 하지만 우리는 여전히 GitHub 레포에 대한 요청을 받아 들일 것입니다 GitHub 저장소로 다시 동기화합니다 문제가 더 이상 나타나지 않을 것입니다

GitHub에서 진실의 근원 Android 버그 추적기에 표시됩니다 [? KEEP?]이 제안되었습니다 한 시간 전에 풀 요청을 만들었습니다 가서 확인해 봐

이 문서에는 예제에 대해 더 자세히 설명되어 있습니다 그리고 내가 말했듯이, 선택된 주석 우리가 가장 큰 영향을 줄 것이라고 생각하는 것들이었습니다 그러나 문서의 맨 아래에, 당신은 그것을 볼 것입니다, 만약 이와 같은 것이 받아 들여지면, 미래의 더 많은 향상을위한 잠재력이 있습니다 그 링크가 이것이어야합니다 어제 밤 제가 제출하기 전에이 링크를 만들었어요

잘하면, 정확합니다 그리고 그게 다야 고맙습니다 [박수 갈채] [음악 재생]

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 분에 근무 시간이 있습니다

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

Update production devices in the field with the Android Things Console (Google I/O ’18)

[음악 재생] ADAM RODRIGUEZ : 안녕하세요 Android Things에 대한이 이야기에 오신 것을 환영합니다

우리와 함께 계셔서 다행입니다 나는 아담이야 저는 Google의 제품 관리자입니다 AMY JANG : 저는 Amy입니다 Android Things Console 용 엔지니어링을 이끌고 있습니다

ADAM RODRIGUEZ : 오늘 우리는 Android Things 콘솔을 사용하는 방법에 대해 이야기하고 싶습니다 필드에서 생산 장치를 업데이트하십시오 IO에서 몇 가지 다른 회담을 통해 잘 배웠으므로, 안드로이드 것들은 훌륭한 플랫폼입니다 자기 자신을 만들기 위해서 그러나 실제로 둘 이상을 만드는 것에 관해서는 무언가, 어떻게 유지합니까? 그 장치는 평생 동안? 기기를 사용하면 어떻게 지원하나요? 고객의 손에? 그게 오늘 우리가 너와 얘기 할 때 온거야 승인

그럼 정말 빠른 리뷰를 해봅시다 Android Things는 무엇이고 왜 당신이 그것을 원할 수도 있습니다 우선, 그것은 안드로이드의 힘을 가지고 있습니다 당신이 알고 사랑하는 것과 동일한 도구로 개발 된, Android 개발자 인 경우 결국 안드로이드이기 때문에 쉽습니다 둘째, 프로토 타입에서 생산으로 확장됩니다

하드웨어 엔지니어 또는 펌웨어 엔지니어 일 필요는 없습니다 이것을하기 위해 우리는 완벽하게 인증 된 SoM을 제공합니다 Android는 AOSP가 아니기 때문에 우리가 사용하는 것을 사용합니다 당신이 필요로하는이 이야기에 대해 이야기하기

Android Things SoM을 사용합니다 이점은이 SoM 플랫폼 용으로 제작되었습니다 따라서 Android 코드를 작성하면됩니다 저수준 펌웨어에 대해 걱정할 필요가 없습니다 해당 하드웨어를 구동합니다

마지막으로 자동 업데이트로 보안 기능이 내장됩니다 인증 된 SoM으로 개발하고 있으므로, Google에서 기기의 보안을 관리 할 수 ​​있습니다 Google은 업데이트 및 보안 픽스를 제공합니다 평생 동안 구현할 수있는 귀하의 제품의 Android Things의 목표는 사용자가 쉽게 작업 할 수 있도록하는 것입니다

쉽고 안전하며 관리가 쉽습니다 그러나 이것은 질문을 제기합니다 IoT는 왜 그렇게 열심히일까요? 이 문제에 대해 정말로 걱정할 필요가 있습니까? 그래서 그것에 대해 조금 생각해보십시오 몇 천 명이나되는 사람을 배로 데려다 줄거야 IoT 장치를 보호하십시오

건물의 어려운 일을해야 할 것입니다 장치, 하드웨어 설계, 소프트웨어 작성 어렵지만 특별한 소스이기도합니다 그것은 당신의 장치를 독특하게 만듭니다 하지만 그 외에는 다른 것들이 많이 있습니다 당신도해야합니다

다른 엔지니어들과 어떻게 개발을 공유합니까? 장치를 안전하게하려면, 최신 보안 패치를 항상 최신 상태로 유지해야합니다 해당 패치를 발견하면 장치가 해당 패치를 가져올 수있는 방법을 구축해야합니다 그런 다음 어떻게 안전하게 업데이트합니까? 업데이트가 나 빠지면 어떻게 할 수 있습니까? 고객의 기기를 손상시키지 않았는지 확인하십시오 델타 업데이트, 부분 롤아웃, A / B 설계를 상상해보십시오 파티션, 채널 관리

성공적인 IoT를 위해 필요한 모든 것 그러나 모든 인프라를 유지 관리하고 업데이트해야합니다 방대한 직업이다 우리가 앞서 말했던 것처럼, 우리의 목표 Android Things를 사용하면 더 쉽게 사용할 수 있습니다 하드웨어와 소프트웨어 디자인은 여전히 ​​당신에게 달렸습니다

그것이 있어야하는 것처럼 그것은 당신의 제품을 특별하게 만드는 것입니다 그러나 우리는 당신이 Android Studio와 같은 모든 친숙한 도구를 사용할 수 있습니다 그리고 그것을하는 [INAUDIBLE] 그러나 펌웨어 코드를 신경 쓰지 않아도됩니다

Android Things의 SoM 모델을 관리합니다 그런 다음 보안 업데이트와 관련하여, Android 팀 전체를 활용할 수 있습니다 보안 구멍을 찾아 수정하십시오 자동 업데이트와 함께 문자 그대로 0이 붙은 보안 패치 당신과 당신의 관계 마지막 장치를 보내십시오 또한 업데이트를 위해 동일한 기술을 활용하고 있습니다

매일 수백만 개의 장치를 업데이트하는 데 사용되었습니다 강화되고 검증되었으며 최적화되었습니다 따라서 실제로 차별화되는 부분에 집중할 수 있습니다 귀하의 제품 – 작성한 기능 및 응용 프로그램 AMY JANG : 예를 들어 보겠습니다 Android Things가 어떻게 도움이되는지 확인해보십시오

아담과 내가 세탁물 접기를하고 있다고 상상해보십시오 로봇, 솔직히 말하자면, 아무도 양말 접기를 좋아하지 않기 때문에, 권리? 그래서이 로봇은 많은 물체 인식, 비전을 사용합니다 기계 학습, 완벽한 사용법 Android 관련 항목입니다 프로토 타입에서 어떻게 가져 옵니까? 내가 집에서 지어서 모든 사람이 사용할 수있게 만들었습니까? 이것은 우리 콘솔의 마술이 들어오는 곳입니다 Android Things는 의도적으로 설계되었습니다

하드웨어를 쉽게 개발할 수 있도록 그것을 시장에 선적하십시오 그리고 Android Things 콘솔을 사용할 수 있습니다 당신의 모든 필요를 돌보아야합니다 첫 번째 구성 – 장치 관리를 정의합니다 우리가 제품이라고 부르는 그룹과 Android Studio와 같은 편집기를 사용하여 작성한 앱, [INAUDIBLE] 콘솔을 사용하여 앱을 관리 할 수 ​​있습니다

빌드 기능을 사용하면 앱으로 안전한 Android Things 이미지를 만들 수 있습니다 당신이 방금 썼던, 그리고 릴리스 단계에서, 원활한 업데이트를 장치로 푸시 할 수 있습니다 분석을 사용하여 출시가 완료되었는지 확인하십시오 부드럽게 그럼 어떻게 작동하는지 자세히 살펴 보겠습니다

ADAM RODRIGUEZ : 좋습니다 프로토 타입에서 생산에 이르는 첫 번째 단계 제품 콘솔에 세부 정보를 설정하는 것입니다 당신이 지을 계획입니다 세탁 로봇을 구성 해 봅시다 먼저 제품 이름을 설정하고 모델을 만듭니다

몇 가지 SKU가 있다고 상상해보십시오 어쩌면 영국 SKU와 US SKU가 있습니다 모델로 제품을 분해 할 수 있습니다 다른 버전으로 다음으로 SoM 유형을 선택하려고합니다

필요한 기능과 가격을 기반으로 SoM을 선택하십시오 당신이 치고 싶은 지점 SoM을 선택하는 것은 중요합니다 나중에 만들려는 이미지에 대해 많은 것을 제어합니다 하나의 메모

하나의 SoM으로 빌드를 시작한 다음이를 변경하려는 경우, 많은 코드를 다시 작성하지 않고도 쉽습니다 그것은 내가 개인적으로 실제로하는 것들 중 하나입니다 우리가 관리하는 SoM 모델에 대한 사랑 정말 비싼 물건으로 시작할 수 있습니다 일단 생산 단계에서 비용을 절감하려면 다운 그레이드하십시오

아니면 정말 싼 것을 함께 해킹 할 수 있습니다 공연이 당신의 필요를 충족시키지 못한다면, 보다 강력한 SoM으로 업그레이드 할 수 있습니다 마지막으로 제품 공유도 설정하십시오 Amy와 나는이 laundroid를 함께 만들고 있기 때문에, 우리는 콘솔을 통해이 제품에 대한 액세스를 공유합니다 그래서 우리 중 누구도 앱을 업로드하고 빌드를 만들 수 없습니다

제품 구성이 완료되면, 다음 단계는 앱을 작성하는 것입니다 앱은 Android의 핵심이며 Android Android 예외는 아닙니다 그들은 내부의 모든 기능을 정의합니다 Android Things의 Amy가 양말 접기 기능을 작성했을 때, 그녀는 [INAUDIBLE] APK에서 그렇게했습니다 친숙한 모든 도구를 Android로 사용할 수 있습니다

개발자– Android Studio, Kotlin, Google Play 서비스, Firebase 이 모든 것은 단지 다시 작동하기 때문에 결국 안드로이드 일뿐입니다 앱이 작성되면 앱 라이브러리에 업로드합니다 빌드에 추가 할 수 있습니다 여기에서 볼 수 있듯이 4 가지 앱이 있습니다 우리의 세탁 로봇의 기능이 깨졌습니다

또한 앱 라이브러리는 버전 관리, 그래서 새로운 버전의 앱을 가지고있을 때, 도서관은 당신에게 가장 최근의 것을 보여주기 위해주의를 기울입니다 내가 정말 좋아하는 한 곡은 앱 공유입니다 공동 작업자와 제품을 공유 할 수있는 것처럼, 당신도 애플 리케이션을 공유 할 수 있습니다 Android 자체는 앱을 만드는 데 필요한 모든 것입니다 다른 사람들이 사용할 수있는 Android 환경 여기도 예외는 아닙니다

다른 사람들과 귀하의 앱을 공유하십시오 팀 또는 유사한 제품을 만드는 다른 사람들에게 오늘은 아마 너만 갈거야 더 많은 사람들이 빌드하면서 자신이 쓴 앱을 사용하려면 Android 관련 항목에서 앱을 사용하고 있음을 알 수 있습니다 다른 사람들이 유틸리티와 공통 기능에 대해 썼다 AMY JANG : 이제 이미지를 빌드 할 차례입니다

너희들이 쓴 안드로이드 것들 애플 리케이션으로 우리의 경우에는 새로운 양말을 썼습니다 APK 우리 로봇에게 몇 가지 멋진 양말 접기 기능을 제공합니다 Adam이 방금 앱 라이브러리에 업로드했습니다 콘솔에서도 나와 공유했습니다

이제 우리는이 기능을 추가했습니다 그것을 패키지에 담을 때입니다 귀하의 장치에 빌드 및 플래시 그래서 Build는 모든 재료가 모이는 곳입니다 앱, Google Apps, 하드웨어 구성 장치에 맞게 사용자 지정할 수 있습니다

여기에서 선택한 옵션 세트 우리가 빌드 구성이라고 부르는 것입니다 빌드 구성은 비밀스런 소스와 규칙과 같습니다 장치의 내용을 지정하는 구성 영상 그리고 장치 이미지에 따르면, 나는 이미지 기기로 플래시하고 페이로드를 만드는 이미지 over the air update 따라서이 빌드 단계에서 새롭고 많은 것을 만들 수 있습니다

구성을 작성하고 관리하십시오 대부분의 사람들은 방금 구입했을 것입니다 또는이 I / O에서 개발자 키트를받습니다 시작하려면 시작 키트 사용 설정을 선택하고, 모든 빌드 세부 정보가 미리 채워집니다 이 예제에서는 예제를 살펴 보겠습니다

처음부터 시작하는 것 첫째, 가장 중요한 것들 중 하나 Android Things OS 버전을 선택하는 것입니다 최신 버전을 선택하십시오 그 (것)들은 최신 버그가 있기 때문에 편안함 수정 및 보안 업데이트 최신 버전을 사용해야하는 것은 아닙니다

하지만 이런 이유로 추천합니다 다음 단계에서는이 단계에서 앱 목록을 볼 수 있습니다 앱 라이브러리에 업로드 한 빌드에 포함 할 앱을 선택하십시오 Google에서 제공하는 앱을 포함하는 것을 잊지 마십시오 Google Play 서비스와 같은 그리고 왜 Google Play 서비스를 원하십니까? Google Play 서비스를 사용하면 앱 Nearby와 같은 최신 Google API를 활용할 수 있습니다

지도, Firebase, 새로운 [INAUDIBLE] 키트 포함 Google Play 서비스 패키지에 포함되어 있습니다 대화 상자에 표시된 확인란을 클릭하기 만하면됩니다 귀하의 빌드에 포함될 것입니다 ADAM RODRIGUEZ : 좋습니다 그래서 다시 빌드합니다

앱을 선택하고 나면 해당 앱에서 요청하는 권한 그 (것)들과 당신이 좋다는 것을 확인하십시오 사용자가 권한을 선택할 수 없기 때문에 일반 Android와 마찬가지로 자신에게 달려 있습니다 그들을 위해 그것을 할 수 있습니다 스스로 개발 한 앱만 사용하는 경우, 여기에 어떤 놀라움도 있어서는 안됩니다 하지만 다른 사람들이 공유하는 앱을 사용하는 경우, 봐야 할 가치가있어

이것은 당신이 잘못한 일을 막는 데 도움이됩니다 예상하지 못했고, 좋은 보안 조치였습니다 Android Things가 점점 보편화되면서, 다른 사람들이 건물을 지켜 보는 것이 놀랍지 않을 것입니다 다양한 소스의 공유 응용 프로그램이있는 IoT 제품 따라서 권한을 보는 것이 중요합니다 다음 단계는 추가하는 것입니다

빌드에 리소스를 구축하십시오 장치에 디스플레이가있는 경우 여기에서 보는 것처럼 부팅 애니메이션을 추가 할 수 있습니다 Lenovo 스마트 디스플레이 용 사용자 정의 bootanimationzip을 업로드 할 수 있습니다

이 섹션에서는 또한 글꼴을 포함하려는 경우 이 장치들 중에는 디스플레이가 없기 때문에, 우리는 글꼴로 그들을 부담시키고 싶지 않습니다 이 작은 IoT의 이미지 크기를 줄이는 것이 전부입니다 제작품 이제 Android 기기가별로 흥미롭지 않습니다 그것이 바로 SoM 이었다면

하드웨어 구성은 주변 장치를 추가하는 곳이며, GPIO 및 버스 속도를 제어하십시오 스타터 키트는 사전 설정되어 있습니다 시동기 장비에서 제공하는 하드웨어 구성 짓다 그러나 구성을 멋지게 만들 수 있습니다 다르게

이 UI 도구를 사용하여 조정할 수 있습니다 이 도구는 현재 버스 제어에 국한되어 있지만 속도 및 풀 업 저항이 모든 주변 장치를 구성 할 것이며, 디스플레이, 오디오 버스, 스피커와 같은 우리는 또한 여기서 I / O를 제어 할 계획입니다 그래서 당신은 핀 복싱을 할 수 있고, 어떤 핀들이 어떤 기능에 붙어있다 따라서 더 많은 업데이트를 위해이 공간을 조심하십시오 AMY JANG : 자, 이제 최종 빌드 단계에 있습니다

당신이 만든 구성들 총 예상과 함께 표시됩니다 OEM 파티션 크기 요약에서 예상 크기 검토 원하는대로 OEM 파티션의 전체 크기를 설정하십시오 이 파티션이 무엇인지, 그리고 개발자로서 변화시킬 수 있습니까? 그리고 어느 파티션이 무선으로 업데이트 할 수 있습니까? 최신 정보? 그 대답을하기 위해 Android Things 파티션 레이아웃을 살펴 보겠습니다 잠시 동안

왼쪽에는 IMX7D PICO의 간단한 파티션 레이아웃이 있습니다 이것이 개발자 키트에서 얻은 보드입니다 SOC 벤더 사이에는 작은 차이가 있습니다 보드 하지만 예제를 살펴 보겠습니다 코어 안드로이드 것들에 의해 사용되는 파티션 아키텍처는 모든 SoM에서 동일합니다

시스템, 시스템 및 부팅은 읽기 전용 파티션이므로, Android 용으로 생성되어 사용됩니다 플랫폼 부팅은 커널을위한 것이며 램 디스크는 정상 부팅을위한 것입니다 그리고 시스템은 Android Things OS가로드되는 곳입니다 Vbmeta는 읽기 전용 파티션입니다

그리고 이는 검증 된 부팅 메커니즘에 사용됩니다 이름에서 알 수 있듯이, 이것은 확인 된 부팅에 대한 메타 데이터가 기록됩니다 특히 Google에서 생성 한 단일 해시입니다 부트, 시스템 및 벤더에 대한 정보를 사용하여, Google에 저장된 보안 키로 서명했습니다 장치의 모든 부팅 순서에 대해, 부트 로더가 코드가 진짜임을 확인합니다

알려진 보안 결함이 없었습니다 이 정보를 사용하여 발견되었습니다 임의의 조작이 발견되면 장치가 부팅되지 않습니다 따라서이 파티션으로 주위를 어지럽히고 싶지는 않습니다 공급 업체는 읽기 전용 파티션이기도합니다

이 파티션에서는 SOC 공급 업체의 바이너리 이미지 로드됩니다 SOC 관련 드라이버 라이브러리와 같은 것들 보통 여기에 넣습니다 OEM과 OEM 부트 로더는 Android 용 파티션입니다 개발자, 그게 당신입니다 그것이 생성 된 후에 그것은 의미에서 읽기만합니다, 내가 방금 보안상의 이유로 훼손 될 수는 없어

얘기 했어 그러나 OEM은 콘텐츠가 콘솔을 통해 지정한 빌드 구성 에 기록됩니다 그래서 그 의미에서 재기록이 가능합니다 Android Things 개발자가 콘솔을 통해 관리합니다 이 OEM 파티션도 새로 생성됩니다

구성 4에서 새 빌드를 만들 때 오타에 그리고 OEM 부트 로더는 파티션입니다 어떤 하드웨어 구성을 선택했는지 그 빌드도 작성되었습니다 Android 개발자 인 경우 이 파티션, 사용자 데이터에 익숙 할 수 있습니다 시스템 및 앱이 사용자를 작성하는 곳입니다

런타임시 데이터 그 외에도 ADB 설치를 통해 설치하는 APK, 또는 Android Studio의 재생 버튼 또한이 파티션에 기록됩니다 그래서 이것은 실제로 질문을 제기합니다 패키지 이름은 앱의 고유 식별자입니다 동일한 패키지 이름이 사용자 데이터와 OEM에 모두있는 경우, Android 패키지 관리자는 어떻게했을까요? 어떤 앱을 사용해야하는지 알고 있습니까? OEM은 생성 된 후에 만 ​​읽을 수 있습니다

이미 거기에 쓰여진 APK 있는 그대로 존재해야합니다 당신이 개발할 때, 당신은 ADB 설치를 통해 APK가 변경 될 가능성이 큽니다 이 개발 흐름을 존중하기 위해 ADB 사용자 데이터에 설치된 APK는 항상 OEM 제품보다 영예 롭습니다 이것이 의미하는 바는 APK가있는 경우 사용자 데이터와 OEM 모두에서 APK가 OEM을로드하고 사용자 데이터에서 APK를 삭제합니다 설치시 ADB에 의해

Misc는 플랫폼에서 사용되는 또 다른 읽기 전용 파티션입니다 부트 로더와 같은 기타 요구 사항에 적합합니다 기능에 대한 우리의 시스템 공장과 그 부트 로더 파티션 모든 장치 별 구성을 위해 예약되어 있으며, 같은 일련 번호, 공장에서 작성된 것입니다 이는 서비스 센터에서 나중에 수행 할 수도 있습니다

이 파티션은 개발자와 공장에서 쓰기 가능하며, 배송 된 후에야 읽을 수 있습니다 따라서이 파티션에 쓰기 위해서는 특별한 도구와 권한을 제공합니다 그래서 지금까지 모든 파티션을 살펴 보았습니다 안드로이드 것들 코어 아키텍처가 사용하는 이 테이블의 파티션을 보셨을 것입니다

a와 b의 두 섹션으로 중복됩니다 그게 무슨 뜻이야? 이것은 OTA가 공중 갱신에 오는 곳이다 OTA는 AB 파티션 메커니즘으로 작동하며, 동일한 파티션 종류가 두 개의 중복 메모리에 존재하는 경우 공백 이 아키텍처는 사용자에게 끊김없는 업데이트를 제공합니다 장치는 여전히 활성 파티션에서 활성 상태 일 수 있습니다 업데이트가 다운로드 및 설치되는 위치 비활성 파티션 A에 B

그래서 모든 일이 끝난 후, 보안 부팅 메커니즘으로 재부팅 한 후, 장치가 파티션으로 깨어납니다 업데이트가 설치된 위치 또한 모든 읽기 전용 Android 항목 파티션은 특정 크기로 고정됩니다 그리고 아시다시피, 보드 메모리도 고정되어 있습니다 이것이 의미하는 바는 나머지 고정 된 OEM 파티션과 사용자 데이터간에 분할 될 메모리 분할

그리고 당신은 분할이 둘 사이에 무엇인지 결정할 것입니다 그럼 예제를 살펴 보겠습니다 그래서 LTS OS, 몇 가지 앱을 선택했다고 가정 해보십시오 Google Play 서비스, 맞춤 하드웨어 설정 이 콘솔의 [INAUDIBLE]보기에서, 당신이 마지막 빌드 단계에서 본, 우리는 모든 핵심적인 세부 사항을 없앴습니다

지금까지 본 시스템 파티션 중 따라서 마지막 슬라이드에서주의를 기울이지 않았다면, 괜찮아 당신이 알아야 할 것은 시스템 파티션 고정 크기입니다 따라서 OEM 파티션 크기 입력은 입력을 요청합니다 단일 OEM 파티션의 크기가 될 것입니다 이것이 의미하는 바는 OEM의 크기를 늘리면 100 분할, 사용자 데이터 파티션 200에서 뺍니다

파티션에 대한 가장 중요한 메시지는 다음과 같습니다 이 이야기에서 벗어나야합니다 적합한 OEM 파티션 크기 선택 제작 이미지를 만들 때 중요합니다 장치가 선택된 크기로 구워지면, 그들은 크기 레이아웃으로 고정되어있다 그들이 reflashed 때까지

AB와 OTA 메커니즘의 특성 때문입니다 우리는 방금 이야기했습니다 따라서 이러한 기기는 OTA 업데이트 만 수신합니다 동일한 파티션 크기로 빌드하십시오 크기를 설정할 때 한 가지 권장 사항 미래 성장을위한 완충 공간을 남겨 두는 것입니다

APK에 새로운 기능을 추가하고자 할 수 있습니다 새로운 멋진 부팅 애니메이션처럼 더 추가 할 수도 있습니다 더 많은 메모리가 필요할 수 있습니다 미래에 대한 계획과 예상 앱 성장과 데이터의 차이 성장 다시 말하지만 아직 계획 할 필요가 없습니다

프로토 타이핑 및 개발 단계에있을 때, 올바른 크기를 찾는 것에 대해 걱정할 필요가 없습니다 언제든지 장치를 다시 칠할 수 있기 때문입니다 이 값을 예측하고 마무리해야합니다 당신이 생산 이미지를 만들 때 이제 올바른 크기를 선택하고 빌드를 만들고, 빌드 구성을 작성하면, 두 가지 이미지 옵션 중 하나를 선택할 수 있습니다

개발 및 생산 개발 빌드는 디버깅 기능을 제공합니다 ADB와 마찬가지로 최종 사용자가 안전하고 사용하기를 원한다 디버깅을 제공하지 않습니다 장치가 프로덕션 이미지로 플래시되면, 보안상의 이유로 훼손 될 수 없습니다

따라서 디버깅이 가능하도록 복구해야합니다 다운로드를 클릭하면 이미지가 생성됩니다 브라우저를 통해 다운로드가 시작됩니다 이제 이미지 파일을 다운로드했습니다 파일에서 내 장치로 어떻게 가져 옵니까? 우리는이 모든 슈퍼를 만들기 위해 플래시 스크립트 도구를 제공합니다

쉽고 간단합니다 도구 섹션으로 이동하기 만하면됩니다 스크립트를 다운로드하십시오 스크립트의 지시 사항을 따르십시오 그리고 그것은 모두 꽤 간단해야합니다

기기를 바로 사용할 수 있습니다 스크립트 대신 빠른 부팅을 사용할 수도 있습니다 네가 원한다면 그래서, 우리는 건물을 완성하고 다운로드를합니다 Android Things 기기 준비하기 ADAM RODRIGUEZ : 맞아

이 시점까지는 빌딩에 관한 것이 전부였습니다 기능을 Android Things 기기에 추가 할 수 있습니다 Android Things 덕분에 개발이 쉬워 지지만, 당신은 아마 같은 일을했을 수도 있습니다 거기에 다른 플랫폼이 많이 있습니다 그러나 릴리스는 상황이 실제로 달라지는 곳입니다

새 기능 업데이트, 지원, 푸시, 귀하의 기기뿐만 아니라 수천 개의 기기로 해당 영역에서 이것은 Android Things가 실제로 빛나기 시작하는 곳입니다 나는 왜 두 가지 이유가 있다고 말하고 싶다 운영 체제로 Android Things를 선택할 수 있습니다 첫째, 당신은 안드로이드의 힘을 좋아합니다

당신은 그것에 익숙하고 익숙합니다 또는 두 가지, 하나 이상의 것을 만들 계획입니다 에이미와 나는이 세탁 로봇을 가지고있다 그녀는 양말을 접는 방법을 알고있는 세탁 로봇을 가지고 있습니다 하지만 내 집에있는 빨래 로봇은 양말을 접는 방법을 모른다

우리가 로봇에 얹혀있는 빌드를 어떻게 얻습니까? 안드로이드 것들로 아주 쉽게 먼저 채널을 사용하여 기기 인구를 분산시킵니다 고객이 소유 한 장치가 몇 개있을 수 있습니다 테스터들이 소유 한 몇 가지 다른 것들 그리고 당신은 그들 모두가 동일한 빌드를 얻는 것을 원하지 않습니다

따라서 채널을 논리적으로 구분할 수 있도록 채널에 배치하십시오 또한 맞춤 채널을 만들고, 품질 보증 (QA) 채널을 말하고, 또는 파란색을 좋아하는 사람들을위한 채널 사물을 더 나눕니다 채널을 통해 원하는대로 할 수 있습니다 그러나 당신이 약간의 지침서를 원한다면, 카나리아 일반적으로 빌드를 가져 오는 첫 번째 장치입니다 탄광 관용구의 카나리아에 대한 언급입니다

새로운 빌드에 문제가 있다면, 카나리아 장치가 먼저 그것에 대해 알려줍니다 Dev는 일반적으로 개발자 기기가 앉아있는 곳입니다 많은 새로운 기능, 많은 버그, 하지만 적어도 그들은 부팅 베타는 테스터를위한 것입니다 이들은 실제 사용자입니다

약간의 피드백을줌으로써 새로운 기능을 얻는다 출시되지 않은 소프트웨어에 대해 그리고 사용자의 대량 구매가 안정적입니다 이러한 빌드는 많은 테스트를 거쳤으며 모든 것이 작동합니다 마지막으로, 사용자 정의는 원하는대로 할 수 있습니다

개발자의 미리보기에서 우리는 많은 피드백을 얻었습니다 사람들은 많은 채널을 원했습니다 여러 가지 방법으로 기기 인구를 나눌 수 있습니다 그래서 우리는 그들을 위해 맞춤 채널을 만들었습니다 좋아, 이제 너는이 채널들을 가지고 있고, 어떻게 이러한 채널에 기기를 가져 옵니까? 처음부터? 장치는 안정 채널로 기본 설정됩니다

그러나 채널을 변경하려면 API를 통해 설정하거나 기기를 연결할 수 있습니다 여기에 보이는 것처럼 ADB를 플래시하십시오 명심할 것은 한 가지입니다 에이미가 석방에 대해 어떻게 이야기했는지 기억해 개발 이미지 vs

새로운 채널로 기기를 플래시 할 수 있습니다 그것이 개발 이미지를 실행하고 있다면 하지만 공개 이미지를 실행중인 경우, 깜박이고 ADB가 차단됩니다 따라서 채널을 변경할 수도 없습니다 최종 사용자가 실행되지 않도록하기 위해 원치 않는 코드 또는 악의적 인 코드가 포함될 수 있습니다

승인 이제 채널을 할당 했으므로, 업데이트를 푸시 할 수 있습니다 우리는 이전에 만든 빌드를 가져옵니다 그들로부터 업데이트를 생성 한 다음 장치에 배달됩니다 업데이트는 기본적으로 새로운 기능, 버그 수정 또는 변경

이러한 기기로 푸시하는 것을 OTA라고합니다 또는 over the air 업데이트 장치는이 업데이트를 다운로드하여 B 파티션에로드합니다 재부팅되면 B 파티션으로 부팅됩니다 그러나 문제가있는 경우 다시 A 파티션으로 돌아갑니다

나는 이것을 좋아한다 그것이 즉시 업데이트 느낌을 의미하기 때문에, 하지만 그들은 또한 내결함성이 있습니다 Android Things의 모든 사용자가이를 활용합니다 OTA를위한 옵션 중 하나는 부분 업데이트 (fractional update)라고합니다 채널의 업데이트를 100 %로 푸는 대신, 점차적으로 롤아웃 할 수 있습니다

나쁜 일이 생기면 동시에 모든 사용자에게 영향을 미치지는 않습니다 부분 업데이트 사용을 적극 권장합니다 OTA 접근을 위험에 빠뜨릴 수 있습니다 앞서 말했듯이 거의 모든 기술 동일한 인프라를 사용하고 있습니다 현장에서 수백만 개의 장치를 업데이트하기 위해 매일 사용하십시오

AB 업데이트, 델타 업데이트, 부분 업데이트 같은 것들 이것들은 모두 어렵지만 결정적으로 중요합니다 기기의 안정적인 업데이트를 원한다면 중요합니다 세계적인 AMY JANG : 아담이 언급 한 것처럼, Android Things 기기는 동일한 OTA 아키텍처를 따릅니다

Google이 사용하는 기능이므로 작동 할 것이라고 확신 할 수 있습니다 하지만 궁금해 할 것 같은데, 오타 후드 아래서 일하니? 그것은 꽤 간단한 흐름입니다 Android Things를 통해 지정하면 콘솔에서 정보를 저장하도록 OTA 서버를 업데이트합니다 제품 및 업데이트 채널에 대해 장치가 OTA 서버에보고합니다 5 시간마다 빌드 정보를 제공합니다

그러면 OTA 서버는 장치가 그것을 데리러 업데이 트가 있습니다 기기가 새 업데이트를 다운로드하고 설치합니다 우리가 얘기했던 비활성 AB 파티션을 구축하십시오 사용자는 여전히 기기를 사용할 수 있습니다 이 과정에서

Update Manager API를 사용하면 모든 권한을 가질 수 있습니다 업데이트 정책 (예 : 업데이트주기) 장치가 업데이트 확인을 위해 핑 (ping)하도록 하시겠습니까? 또한 듣는 방법으로 장치 동작을 사용자 정의 할 수 있습니다 이벤트를 업데이트합니다 일반적인 업데이트의 예를 살펴 보겠습니다 시퀀스, 장치 내부에서 발생하는 [INAUDIBLE] 다음과 같은 업데이트 상태 이벤트가 발생합니다

해당 앱 리스너에 게시됩니다 업데이트 엔진이 OTA를 서버에 확인합니다 OTA는 업데이트 엔진 클라이언트가 거기에 있음을 알리게합니다 그것을 데리러 새로운 업데이 트입니다 그러면 업데이트 다운로드가 시작됩니다

이 흐름도에서 볼 수 있듯이, 해당 업데이트 이벤트가 앱 수신기에 게시됩니다 그리고 그것은 당신의 앱입니다 설정 한 정책에 따라 앱 다음과 같은 경우 장치 재부팅을 트리거 할 수 있습니다 당신은 그것이 적절하다고 생각합니다 장치가 부팅되면 업데이트가 기록 될 새 파티션으로 시작하십시오

다시 부팅하면 업데이트를 다시 확인합니다 이미 업데이트되었으므로 다음 업데이트 때까지 유휴 상태로 돌아갑니다 수표가 발행됩니다 따라서 API를 사용하여 정책을 설정하는 방법입니다 관리자 인스턴스를 업데이트 할 수 있습니다

원하는 정책을 설정하십시오 적용 정책 만 사용하여 업데이트 관리자 업데이트를 다운로드하고 설치합니다 새 업데이트가 제공 될 때마다 업데이트 간격을 변경할 수 있습니다 이 API를 사용하는 빈도 – 예를 들어 이틀이라고 해 그러나 전체 흐름을 제어하려고한다고 가정 해보십시오

그런 다음 검사 전용 정책을 사용할 수 있습니다 모든 업데이트 이벤트를 듣고 전체 업데이트를 제어합니다 방법 업데이트 사용 가능 상태를 수신하면, 다운로드를 시작하기 좋은지 여부를 결정할 수 있습니다 설치하십시오

그리고 좋은 시간이라고 생각할 때, 지금 업데이트를 실행할 수 있습니다 메서드를 호출합니다 그리고 완료되면 업데이트 된 요구 사항을 다시 부팅하게됩니다 지위 그리고 또한 좋은 시간이라고 생각할 때, 장치를 다시 시작하도록 트리거 할 수 있습니다

그리고 그것은 모두 당신의 통제하에 있습니다 기기가 제로 데이 업데이트가 필요합니다 어떤 선반 시간 후에 고객이 제품을 구입하면, 이미 새 소프트웨어를 업그레이드했을 수도 있습니다 다음 가장 시원한 것 그리고 당신은 그것들을 시작하기를 원합니다, 그렇죠? 사용자가 몇 기가 바이트를 다운로드하는 것을 원하지 않습니다

새로운 소프트웨어가 귀하의 제품을 사용하기 전에 델타 업데이트는이 페이로드 업데이트가 가능한 한 작다는 것을 의미합니다 기본적으로 공장 이미지 옵션에 따라, 이전 OTA가 푸시하면 Android Things 콘솔 돌보아주고 자동으로 생성합니다 빌드 사이의 델타 페이로드, 그래서 장치는 더 작은 페이로드 패킷을 수신 할 수 있습니다 그들의 현재 빌드와 새로운 가장 멋진 것 사이 당신의 친구가 크리스마스 선물을 풀 었다고 상상해보십시오 그리고 그들은 최신 버전을 다운로드하기 위해 20 분을 기다려야했습니다

정말 끔찍한 경험 이었죠? 델타 업데이트를 통해 훨씬 개선되었습니다 ADAM RODRIGUEZ :이 시점에서 우리는 아마 조금 지출해야한다 보안에 대해 이야기하는 시간 XKCD가 매우 우아하게 지적했듯이, 단순히 안전한 장치를 만드십시오 안전한 IoT를 유지한다는 것은 지속적으로 유지된다는 것을 의미합니다

업데이트 및 취약성 찾기, 제품 수명주기 동안 변화를 추진합니다 우리는 Android Things가 얼마나 훌륭한 지에 대해 많이 이야기했습니다 많은 것을 만들고 싶을 때 그러나 당신이 무언가를 많이 만들 때, 너는 정말로 밀고하는 책임이 있니? 해당 제품의 평생 동안 새로운 업데이트가 있습니까? 에이미와 나는 이제 멋진 세탁 로봇을 가지고있다 하지만 몇 년 후에 우리는 다른 일을 계속합니다

어쩌면 우리는 다른 일자리를 얻을 수 있습니다 그 다음엔? 새로운 취약점에 대해 알게되었을 때, 커널 및 라이브러리 픽스를 조사합니까? 어쩌면 우리는 모든 엔지니어들과 다시 만날 수 있습니다 새 빌드를 컴파일하여 사용자에게 제공 할 수 있습니까? 아니 그게 무슨 일이 아니야 실제로 이러한 고아 장비, 그들은 인터넷에 연결되어 있습니다

아마 사용되지 않았을 것입니다 하지만 정말 취약합니다 고맙게도 Android Things를 사용하여 우리는이 문제에 대한 해결책을 가지고 있습니다 자동 갱신 플래그 Google의 SoM 전략 덕분에 Google은 자신있게 SoM을 실행하는 모든 IoT 장치에 보안 수정 사항을 적용하고, 세탁 접이식 로봇 또는 웹 캠 일 수 있습니다

채널에서이 깃발을 뒤집기 만하면됩니다 모든 장치가 정기적 인 보안 업데이트를 받게됩니다 귀하의 개입없이 Google로부터 메모하는 것이 중요합니다 이 깃발을 뒤집기 위해 필요합니다 자동 업데이트를 활성화하지 않은 경우, Google은 여전히 ​​보안 문제를 해결할 것입니다 그러나 언제 어떻게 구현할 것인지 선택할 수 있습니다

그것은 당신에게 달려 있습니다 Google에서 귀하의 업데이트 또는 관리를 관리하게하십시오 그들이 너 자신을 굴릴 때 Android Things 업데이트 방법에 대해 조금 이야기 해 보겠습니다 및 버전 관리 작업

대략 Android 버전의 주요 버전 일반 Android의 디저트 출시에 해당합니다 이들은 장기간 지원되는 대형 릴리즈입니다 Android API 프레임 워크 변경 사항을 나타냅니다 해당 채널의 자동 업데이트 플래그 주요 버전에서 업데이트되지 않습니다 따라서 메이저 버전 1에서 시작한다면, 주요 버전 2가 출시 되더라도, 주요 버전을 기반으로 보안 업데이트를 계속받을 수 있습니다

1을 선택하면됩니다 두 번째 숫자는 부 버전입니다 이들은 상대적으로 위험도가 낮은 업데이트입니다 그들은 안드로이드 API 프레임 워크의 변경이 없으며, 하지만 Android Things API가 추가되었습니다 자동 업데이트 플래그를 반전하면 당신은 새로운 주요 버전에 걸쳐 업데이트를 얻을 것으로 기대할 수 있습니다

따라서 12에서 시작하면 다음 부 버전이 나올 때, 13으로 마이그레이션 할 것입니다 마지막 번호는 보안 업데이트입니다 대략 매달 착륙 할 것으로 예상됩니다

API를 변경할 필요가 없습니다 그리고 이러한 업데이트는 자동 업데이트로 확실히 증가합니다 에 플래그 주요 버전 업데이트는 선택 사항이지만 교환하는 동안 Google을 통해 무료 업데이트를 얻으려면, 우리는 당신이 당신의 버전을 업데이트 할 것을 기대한다 각 부 버전 및 보안 패치에 걸쳐

그러나 당신이하는 일은 당신에게 달려 있습니다 자동 업데이트 플래그를 뒤집거나, 또는 직접 업데이트를 푸시하십시오 Android Things를 가장 쉽고 재미있게 만드는 것이 우리의 목표입니다 밖에 IoT 플랫폼을 확보하십시오 – 빌드가 가장 쉽고, 평생 동안 가장 안전하고 최신입니다 귀하의 제품의

그렇다면 SoM 및 주요 버전에서 어떻게 작동합니까? 그리고 년? 각 SoM은 Google에서 최소 3 년 동안 지원합니다 처음 사용 가능하게 된 때부터 모든 주요 버전에서 그래서 당신이 IMX8 SoM을 구입한다면 주요 버전 1에서 건물 시작 향후 3 년 동안 업데이트를 기대할 수 있습니다 모두 주요 버전 1에 남아 있습니다 주 버전을 업데이트 할 필요가 없습니다

2 전체 지원 시간을 얻으십시오 물론, 우리는 많은 장치들이 3 년보다 훨씬 더 많은 지원이 필요할 것입니다 따라서 SoM에서 지원하는 경우 다음 주 버전으로 업데이트하고 더 긴 지원을 받으십시오 창문 당신은 물론 항상 자신의 업데이트를 푸시 할 수 있습니다

전체 평생 동안 기기에서 사용할 수 있습니다 마지막으로, 더 긴 지원을 원한다면 시간, 확장 된 지원을위한 몇 가지 옵션에 대해 이야기 해주십시오 AMY JANG : 좋습니다 그래서 우리는 업데이트를 추진했습니다 우리의 로봇은 이제 양말을 접을 수 있습니다

마지막으로해야 할 일은 뒤로 물러서는 것입니다 우리 로봇이 현장에서 어떻게하고 있는지 모니터링하십시오 얼마나 많은 사용자가 있는지 확인하고 싶을 것입니다 그들은 매일 내 장치를 사용하고 있습니까? 그들이 방금 들었던 업데이트를 받고 있습니까? 아니면 미국의 로봇이 한국의 로봇과 비교하면 어떨까요? Android Things 콘솔이 제공합니다 엔드 투 엔드 솔루션을 통해 장치 분석에 이르기까지 다양한 솔루션을 제공합니다

매일 활성화 및 활성 그래프, 제품 전반에서 장치가 작동하는 방식을 모니터링 할 수 있습니다 시간 범위와 필터를 사용하여보다 심층적 인 분석을 수행 할 수 있습니다 IP 국가별로 기기를 필터링 할 수 있으며, ID를 만들고 채널을 업데이트하는 등의 작업을 수행합니다 당신이 콘솔을 통해 OTA를 밀고 나서 한 시간 안에, 이 모니터 화면으로 올 수 있습니다 업데이트가 어떻게 진행되고 있는지, 오류가 있는지, 귀하의 기기는 어떤 단계에 있습니다

그리고 우리가 제공하는 세분성은 매 순간까지입니다 업데이트 확인과 같은 다양한 업데이트 이벤트를 모니터링 할 수 있습니다 다양한 다운로드 상태 이벤트, 마지막으로 재부팅 이벤트, 장치가 새 파티션으로 재부팅되었음을 알립니다 여기에 표시되는 상태 이벤트에 매핑 된 이러한 이벤트 이전에 Update Manager API에서 보았습니다 그리고 업데이트에 오류가있는 경우, 당신은 업데이트 오류 그래프를 모니터링 할 수 있습니다

업데이트 오류를 ​​드릴 다운합니다 코드를보고 무슨 일이 일어나는지 확인하십시오 이것은 내가 OTA를 강요 한 직후에 굉장합니다 이 그래프를보고 장치가 잘 작동하는지 확인할 수 있습니다 내가 푸시 한 릴리스가 부드럽게 끝나면 ADAM RODRIGUEZ : 좋습니다

따라서 제작을 업데이트하는 방법을 안내해 드렸습니다 필드에있는 장치 그러나 왜 당신이 신경 써야하는지에 대해 정말로 재촉 해 봅시다 Android 작업으로 IoT를 쉽고 안전하게 만드는 것이 우리의 목표입니다 우리는이 일에 많은 시간을 할애 할 필요가 없습니다

우리는 당신이 중요하게 생각하는 것들에 집중하기를 바랍니다 당신의 하드웨어와 소프트웨어, 그 것 귀하의 제품을 차별화합니다 그리고 펌웨어, 보안 패치에 대해 우리를 의지 할 수 있습니다 업데이트 인프라 Android Things를 사용하면 일반 Android를 사용할 수 있습니다

개발자는 물론 Kotlin 및 Android와 같은 친숙한 도구를 사용할 수 있습니다 사진관 동일한 기술을 활용하게됩니다 수백만 대의 장치를 업데이트하는 데 사용하는 매일 현장에서 델타 업데이트, 부분 업데이트, AB 파티션 및 향상된 모니터링

이 모든 것을 스스로 구축하는 것을 상상할 수 있습니까? 네가 할 수있을거야 하지만 무언가는 당신이 오히려 발전하고 있다고 말할 수 있습니다 업데이트 재 작성보다 새로운 기능 및 기능 하부 구조 중요한 보안 업데이트도 있습니다 Google의 제품 유지를위한 이상적인 방법입니다

당신의 개입없이 안전하게 지키십시오 몇 년 동안 길을 결국 우리는 정말로 업데이트가 가능한 안전한 IoT를 쉽게 구축 할 수 있습니다 신제품에 대한 많은 기회가 있다고 생각하십시오 이 공간에서의 아이디어

AMY JANG : 그리고 그걸로 우리는 당신에게 감사의 말을 전하고 싶습니다 프로덕션 업데이트 방법에 대한 우리의 강연에 참석 한 분 Android Things 콘솔이있는 현장의 기기 전에 말했듯이, 거기에는 많은 옵션이 있습니다 IoT의 경우 어떤 OS 및 하드웨어를 선택할 수 있습니다 하지만 안드로이드 코드 작성에 익숙하다면, Android 환경을 사용하면 쉽게 시작할 수 있습니다

많은 장치를 만들고 판매하려는 경우, 보안에 관심이 있다면, 필요한대로, 그리고 원하는 생산 장치를 쉽게 관리 할 수 ​​있으며, Android는 당신을위한 훌륭한 솔루션입니다 고맙습니다 [음악 재생]

What’s new with Android TV (Google I/O ’18)

[음악 재생] 안녕, 모두들 와우

[박수 갈채] 아무 것도하지 않았어 이미 박수 갈채를했습니다 그것은 꽤 좋은 출발입니다 관객 : [INAUDIBLE] 사샤 프로 커터 : [웃음] 나는 친숙한 얼굴이 많이 보인다 그러나 매년 무대가 커지고 있습니다

그래서, 제 이름은 Sascha Prueter입니다 Android TV 제품 팀에 있습니다 BENJAMIN BAXTER : 저는 Android TV 용 DevRel 인 Benjamin Baxter입니다 SASCHA PRUETER : Android TV에 가입 해 주셔서 감사합니다 Google I / O의 세션 이 세션은 What 's New라고 불리며, 그러나 우리는 또한 조금 이야기하고 있습니다

작년에 일어났습니다 가입 해 주셔서 감사합니다 그리고 그래, 가자 그래서 우리가 얘기 한 대부분의 시간은 작년에 Google I / O에서 이루어졌습니다 그 이후 Android TV 생태계 크게 성장했습니다

그리고 우리는 그것에 대해 분명히 행복합니다 이제 100 개 이상의 파트너가 있습니다 Android TV 기기에서 Google과 협력하고 있습니다 보시다시피, 우리는 지금까지 두 배로 늘리고 있습니다 매년

보시다시피 성장이 이루어집니다 여러 장치 및 장치 범주에서 우리는 아마도 올해 초 CES에서 들었을 것입니다 아주 다른 똑똑한 텔레비젼 가격에있는 새로운 협동 자의 낱단 Android TV 기기를 실행하는 카테고리 그래서 우리는 매우 운이 좋은 위치에 있습니다 더 이상 하나의 슬라이드에 모든 파트너를 표시 할 수는 없습니다 그래서 네가 여기 있다면, 네가 일하고 있다면 Android TV 기기에서 우리와 함께하고 로고는 여기에 없습니다

죄송합니다 우리는 공간이 부족합니다 그러나 셋톱 박스 공간에서도, 특히 TV 사업자에게 요금을 지불 할 때, 우리는 상당한 성장을 볼 수 있습니다 그리고 우리는 그것에 대해 매우 행복합니다 그래서 우리는 이미 전 세계 30 여개의 파트너가 있습니다

그래서 유료 방송 사업자, 케이블, 위성, IPTV, 배송 상자 Android TV에서 그리고 우리에게는 50 가지 이상의 추가 기능이 있습니다 그래서 우리는 정말로 행복합니다 그리고 우리는 거기에서 좋은 성장을 봅니다 그러나 하드웨어뿐 아니라, 그것은 또한 소프트웨어에 관한 것입니다 그래서 TV 앱 생태계가 또한 크게 성장했다

그리고 저는 이것이 제가 크게 말한 다섯 번째 시간이라고 생각합니다 그래서 나는 그 일을 그만 둘 것이다 하지만 여러분 모두가 앱에 기여하고 있습니다 지난 몇 년 동안 I / O에 개발자를두고 있습니다 실제로 Android TV를 들고 멋진 미디어 경험을 구축하고, 게임이나 우리가 생각하지 않은 완전히 새로운 것들, 정말로 굉장합니다

TV Play 스토어를 시작했을 때, 저는 2014 년에 25 개의 앱이 있다고 생각합니다 이제 우리는 4,000에 접근하고 있습니다 그리고 여기에는 많은 앱 개발자가 있기 때문에, 우리는 언급하기를 원했기 때문에 레이더 밑에서 조금, 우리는 또한 Android TV에서 DCB를 시작했습니다 많은 사람들, 모바일 용으로 개발하는 경우, 이동 통신사에서 직접 이동 통신사 결제를 이미 알고 있습니다 따라서 누군가가 앱을 구입 한 경우 누군가가 인앱 구매를 수행하는 경우 게임에서 차가운 새 차를 사거나, 당신은 많은 경우에 귀하의 모바일 청구서에 청구 할 수 있으며, 신용 카드가 없거나 신용 카드가없는 경우 신용 카드를 사용하고 싶습니다

그리고 같은 개념이 마지막 Google 이후에 시작되었습니다 Android TV에서의 입출력 우리는 점점 더 많은 파트너와 함께 일하고 있으며, TV 운영자에게 비용을 지불합니다 Play 스토어에서 청구 할 수있는 파트너 또는 재생 생태계 전반을 케이블에 연결하거나, 또는 위성, 또는 TV 가입 청구서 그러나 또한 우리가하는 일 중 하나 더 중점을두기 시작했다 Google Assistant입니다

작년에 우리가 간략하게 이야기하는 걸 들었 잖아요 이에 대한 Google I / O에서 그 이후로 생태계와 서비스 Google Assistant가 Android TV에 제공하는 기능은 다음과 같습니다 Android TV뿐 아니라 일반적인 기기에도 적용됩니다 성장했습니다 그래서 우리는 TV에서 Assistant의 많은 사용을 봅니다

우리는 이것이 훌륭한 추가 도구라고 생각합니다 미디어 서비스 및 앱을 사용하고 소비하는 방법 목소리와의 상호 작용만으로 TV에서 훨씬 쉬워졌습니다 단순히 TV와 대화하여 콘텐츠를 찾고, 매우 자연스러운 인터페이스를 가지고 있으며, 기억할 필요가 없습니다 그 검색어가 또 뭐야? 그냥 자연 그리고 그것은 쉽고 효과적입니다

그러나 콘텐츠를 찾는 것뿐만 아니라, 질문에 대한 답변을 찾는 것입니다 관심이있을 수도 있습니다 그 배우가 누구 일지 모릅니다 또는 집안의 다른 장치를 제어 할 수도 있습니다 Android TV의 Assistant는 모든 것을 제공합니다

그래서 우리는 그것이 매우 중요하다고 생각하기 때문에, 우리는 올해에 많은 우선 순위를두고 있습니다 길잡이를 더 많은 국가로 데려 가기 우리는 우리가 그것을 올바르게하고 있는지 확인하기를 원합니다 그래서 우리는 무엇이든을 서두르고 싶지 않습니다 그러나 우리가 2017 년 말 미국에서 시작한 이후, 우리는 [? 데려다 줄까?] 올해 볼 수 있듯이, 길잡이가 많은 나라들 Android TV의 생태계

하지만 아직 나라가 아닌 언어 나 언어를 사용하는 경우에도 어시스턴트가 활성화되어 있고 조금 기다려야합니다 우리는 음성 검색 경험을 새롭게합니다 심지어 그 나라들에서도 그래서 나는 이전에 우리가 모든 앱과 점점 더 많은 앱에 대해 정말 행복합니다 Play 스토어에서 작년 Google I / O에서 우리는 새로운 Android TV 홈을 조금만 들여다 보았습니다

경험, 시스템 UI 및 앱이이를 통합 할 수 있습니다 그 당시에는 몰래 들여다 보았습니다 미리보기 였어 그것은 안드로이드 오레오로 시작했습니다 이제 우리는 많은 파트너가이 작업을 시작했습니다

Android TV 기기로 그래서 우리는 그것이 좋은 기회라고 생각했습니다 앱이 실제로 어떻게 작동하는지 자세히 설명합니다 이 콘텐츠 첫 경험을 활용하십시오 Android TV를 통해 우리가 이루고자하는 목표입니다 그리고 벤은 조금 이야기 할 것입니다

실제로 콘텐츠 첫 번째 앱을 가지고 있다는 의미입니다 BENJAMIN BAXTER : 고마워요, Sascha 그래서 우리는이 경험을 재정의하고 싶었습니다 매우 콘텐츠 우선, 콘텐츠 중심이되고 싶었습니다 이전 스크린에 익숙하다면, 우리는 추천을 위해 한 줄을, 두 줄을 가지고 있습니다

앱의 경우 게임의 두 줄 분명히 알 수 있듯이이를 변경했습니다 따라서 앱은 여전히 ​​중요합니다 우리는 하나의 행을 가지고 있습니다 그것은 단지 당신이 가장 좋아하는 응용 프로그램입니다

사용자는이 행을 사용자 정의하고 앱을 추가 할 수 있습니다 사용자의 재량에 달려 있습니다 Android N 이하의 권장 행 우리는 그것을 몇 가지 다른 책임으로 나눴습니다 그래서 우리는 당신이 컨텐츠를 추가 할 수있는 Play Next 행을 가지고 있습니다 그리고 나중에 이것에 대해 더 이야기 할 것입니다

다시 선택하고 참여시킬 콘텐츠를 추가 할 수 있습니다 사용자와 나중에 우리가 한 다음 일은 우리가 나간 것입니다 각 앱은 자체 채널을 가질 수 있습니다 그들은 홈 화면에 자신의 표면을 가질 수 있습니다

우리는이 콘텐츠를 처음으로 디자인하려고 시도하고 있습니다 모든 앱이 모든 앱에 기여할 수 있습니다 Sascha가 Assistant와 앞서 언급했듯이, 길잡이도 홈 화면에 있습니다 Android O 또는 Android P에만 해당되는 것은 아닙니다 실제로 Android M 이상에서 지원됩니다

검색을 강화하고 계속 밀고 나가기위한 것입니다 그 내용 첫 디자인 승인 나는 내용을 먼저 말하고있다 갑자기 내 좋아하는 구절과 같습니다

하지만 정말 좋은 예제를 살펴 보겠습니다 무엇에 대한 기술적 세부 사항을 다루기 전에 콘텐츠 첫 디자인을 만듭니다 여기에 Google Play 무비가 있습니다 그리고 이것은 홈 화면에서 나온 것입니다 그리고 당신은 그들의 세부 사항에 대한 모든 것을 볼 수 있습니다

마치 영화 세부 화면과 같습니다 빌드하고 참여하도록 홈 화면에 바로 있습니다 경험 이것은 사용자에게 유용합니다 그들은 앱에 들어가서 뒤로 물러 설 필요가 없습니다

그들은 홈 화면에서 바로 결정을 내릴 수 있습니다 우리가 한걸음 더 나아간다면 비디오 미리보기가 있습니다 그래서 당신은 영화, 예고편 훌륭한 비디오 미리보기를 만듭니다 오디오 앱의 경우 10 초짜리 클립 훌륭한 오디오 미리보기입니다 미리보기가있는 것으로 나타났습니다

사용자와 참여도를 높이고 참여도를 높이기 귀하의 앱에 Play Next 행에 대해 이전에 말씀 드렸습니다 추가 할 수있는 좋은 장소입니다 사용자를 다시 불러들이는 콘텐츠 정말로 긴 영화를보고 있다면, 당신은 약간의 추가 메타 데이터를 추가합니다 더 많은 문맥을 추가하기 위해 아름다운 진행 표시기를 만들 것입니다 그리고 사용자는 앱으로 돌아갈 수 있습니다

그리고 나는 채널을 말했다 홈 화면의 작은 행 하나에 국한되지 않고, 당신은 당신이 원하는만큼 많은 채널을 가질 수 있습니다 여기를 살펴보면 추천 채널, 최고 무료 이들은 신선한 채널이 될 것입니다 이것들은 매일, 심지어 매시간 업데이트되는 표시를 가지고 있습니다

승인 이제 우리는 무엇에 관한 좋은 컨텍스트를 갖게되었습니다 홈 화면에서 어떻게 할 수 있는지 잠수 해 봅시다 이 경험을 쌓아 라 채널이란 무엇입니까? 채널은 단지 로고와 이름입니다

그것이 전부입니다 프로그램을위한 컨테이너입니다 이것은 당신이 주제가 될 것입니다 귀하의 콘텐츠와 더 깊은 모든 것을 맞춤 설정하십시오 프로그램에서

채널을 구축하기 위해 지원 라이브러리가 있습니다 단지 빌더 패턴을 사용합니다 슈퍼 쉽고 슈퍼 편리합니다 홈 화면의 모든 항목을 클릭 할 수 있어야합니다 따라서 로고를 클릭하면 앱으로 다시 열립니다

그래서 App Link URI를 설정하면됩니다 홈 화면에서 앱을 열 수 있습니다 중요한 것은 내부 공급자 ID입니다 앱의 홈 화면에 알릴 ID입니다 이걸 추적 해

나는이 신분증이 무엇인지 압니다 나중에 내 채널을 쿼리 할 때 내 채널을 홈 화면이 알고있는 것과 동기화 할 수 있습니다 내 앱에 대해서 그리고 그게 다야 그것은 콘텐츠 제공자를 사용합니다

그리고 우리에게는 편리한 방법이 있습니다 콘텐츠 제공 업체의 즐거움을 아는 사람들에게, 보일러 플레이트 코드가있을 수 있습니다 우리는이 모든 것을 지원 라이브러리에 추상화했습니다 또한 콘텐츠 제공 업체를 쉽게 구축 할 수 있습니다 API

콘텐츠 제공자에게도 익숙한 사람들 URIs는 지루하고 성가신 일이라는 것을 알아라 관리 할 수 ​​있습니다 지원 라이브러리가 모든 것을 관리합니다 그것은 단지 간단한 삽입 문장 일뿐입니다 채널 ID를 다시 얻습니다

이전에 내부 공급자 ID로 말했듯이, 채널 ID와 내부 공급자를 사용할 수 있습니다 ID를 사용하여 동기화 할 때 확인하십시오 나중에 채널을 업데이트하면 필요한 모든 열쇠를 가져라 좋아요, 채널은 말했듯이, 그들은 단지 한 줄의 껍질입니다 프로그램은 정말로 중요한 문제입니다

이제 프로그램의 예를 살펴 보겠습니다 이 프로그램에서는 많은 일들이 일어나고 있습니다 미리보기 이미지가 있습니다 제목, 설명이 있습니다 이 프로그램에 대해 알고있는 다른 것 을 홈 화면에 추가 할 수 있습니다

더 많은 메타 데이터를 추가할수록 더 풍부한 경험, 사용자 참여가 더 좋습니다 귀하의 세부 정보 페이지에있는 내용, 홈 스크린에 두는 것은 당연한 일입니다 다시 빌더 패턴 이번에는 프로그램에서 채널 ID를 설정하려고합니다 그래서 홈 스크린은 홈 스크린에 어디에 놓을 것인지를 안다

그리고 만약 당신의 프로그램이 하나 이상의 채널을 가지고 있다면, 고유 식별자를 추가하십시오 홈 화면은이 식별자를보고 말합니다 우리는이 채널에서이 프로그램에 대해 이미 알고 있습니다 그리고이 채널에도 있습니다 우리는 사용자가 중복 된 것을 보지 않고보다 깨끗하고 매끄러운 환경을 제공합니다

또한 유형을 설정하려고합니다 이 예에서는 유형을 MOVIE로 설정합니다 하지만이 유형을 사용하면 홈 화면에 표시됩니다 그리고 이전에 Red Bull에서 비디오 미리보기를 보여주었습니다 URI를 추가하는 것만 큼 간단합니다

그래서, 그냥 내 비디오 미리보기가 https // wwwmyvideocom 홈 화면에서 동영상이 재생됩니다 ExoPlayer를 사용합니다

ExoPlayer에서 지원되는 모든 비디오 포맷은 귀하를 위해 즉시 지원됩니다 DRM이 있거나 조금 더 복잡한 유스 케이스가있는 경우, 우리는 당신이 할 수있는 솔루션을 지원합니다 비디오를 표면에 그리십시오 내일 사무실 시간에 우리를 만나러와, 우리는 그것에 대해 더 깊이 들어갈 수 있습니다 이것은 채널과 매우 유사합니다

콘텐츠 값으로 변환합니다 그런 다음 콘텐츠 값에서 URI가 필요합니다 URI는 동적입니다 특정 채널에 프로그램을 삽입하려면, 그래서 지원 라이브러리를 사용하십시오 삽입하면 프로그램 ID가 반환됩니다

이제 프로그램이 채널에 있습니다 프로그램 ID가 있고 채널 ID가있는 경우 동기화, 업데이트 및 업데이트에 필요한 모든 도구가 있습니다 콘텐츠를 업데이트하려고하면 나중에 삭제할 수 있습니다 좋아, 내가 채널을 만드는 방법을 말해 줬어 빌더 패턴을 사용하여 컨텐츠 제공자에게 추가하십시오

그러나 언제 그것을 만들 수 있습니까? 언제 아주 중요합니다 우리는 많은 시간을 알아 내려고 노력했다 시작하는 법 그래서 우리는 새로운 의도로 끝을 맺었습니다 그래서 트리거 될 INITIALIZE_PROGRAMS가 있습니다

그리고 이것은 앱보다 먼저 발생할 수 있습니다 시작합니다 이것은 나쁜 생각이 아닙니다 앱이 TV로 다운로드되거나 업데이트됩니다 갑자기 홈 화면에 콘텐츠가 있습니다

사용자가 앱에 들어가는 훌륭한 방법 이 INITIALIZE_PROGRAMS을 (를) 들어보세요 채널을 설정하고 프로세스를 시작하십시오 좋아요, 우리가 마지막으로 이야기 한 것은 Google Assistant였습니다 Google Assistant는 꽤 환상적인 경험이라고 생각합니다

그것은 그 내용을 먼저 접근합니다 Google 길잡이 통합을 위해 할 수있는 일 검색 구현, 딥 링크 지원, 재생 컨트롤을 처리합니다 그럼 더 살펴 보겠습니다 Google Assistant를 사용하여 검색을 수행하면, Google Assistant는이 콘텐츠를 처음 디자인으로 유지합니다 내가 좋아하는 영화 "Big Buck Bunny"검색

그것이 당신의 마음에 드는 사람이기를 바랍니다 그리고 당신은 정보의 낱단을 볼 것이다 – 엄지 손톱, 설명, 제목 앱이 일치하는 경우, 제목, 기간, 연도와 일치하는 경우 최소, 메타 데이터가 반환되면 표시됩니다 사용 가능한 앱 목록에 표시됩니다 어떻게 이걸로 맞습니까? 커버 아래에서 어떤 일이 발생합니까? 우리는 더 많은 콘텐츠 제공자를 사용합니다

이번에는 앱이 Google Assistant에 데이터를 제공하고 있습니다 Google Assistant는 URI를 전달합니다 검색을 수행 할 수 있습니다 이 콘텐츠 제공 업체에서는 원하는 모든 것을 할 수 있습니다 로컬 데이터베이스 호출, 네트워크 호출

검색을 수행하기 위해해야 ​​할 일은 무엇이든, 넌 할 수있어 이 URI는 원시 검색 문자열을 포함합니다 Google Assistant에서 삭제되지만 위생 처리됩니다 그래서 당신이 "Big Buck Bunny"와 같은 말을한다면, 너에게 "Big Buck Bunny"를 보낼거야 Play가 명령이라는 것을 깨달으십시오

그래서 당신이 얻는 URI가 당신이 검색해야 할 열쇠가 될 것입니다 좋아, 재생 제어 – 너희들이라면 Media Session에 익숙하다면 아무 것도 할 필요가 없습니다 앱에서 이미 지원합니다 그러나 우리는 더 자세히 살펴볼 것입니다 Google 길잡이를 지원하려면 쇼를보고있는 동안 다른 명령을하십시오, 예를 들면, 안녕하세요, Google, 영화, 앱에서 일시 중지, 당신은 방금 미디어 세션을 구현합니다

OnPlay 또는 onPlay에서이 함수를 사용하여 콜백을 제공하십시오 그리고 Google Assistant가 미디어 세션을 통해 onPause, onPlay– 예, 일시 중지 / 재생 버튼을 누르기 만하면됩니다 리모컨에 아마 가장 유용한 기능은 아니지만 거기에 있습니다

그리고 실제로는 정말 멋진 경험입니다 내가 제일 좋아하는 것이 있습니다 당신은 단지, 안녕, 구글, 5 분 빨리 감는다 Google Assistant는 실제로 수학을 수행합니다 안녕하세요

귀하의 미디어 세션에 상태가 있습니다 나는 그 상태의 현재 위치를 안다 5 분 빨리 감기라고 했잖아 그게 300 초 야 그래서 나는 새로운 위치를 보낼거야

귀하의 앱에 미디어 세션에 익숙하다면, 당신은 onRewind와 onFastForward가 있다는 것을 압니다 여전히 이러한 메소드를 구현해야합니다 하지만 Google Assistant는 이미 수학을 계산하기 때문에 사용자를 보낼 위치 다음은 오디오 앱에 더 유용합니다

비디오 앱보다 그러나 당신이 말하는 경우에, 어이, Google는 다음 노래를한다, 또는 OK Google을 선택하고 이전 노래로 돌아가서 재생 한 다음, onSkipToNext 구현 만하면됩니다 및 onSkipToPrevious 요점을 되짚어보기 위해 가정에서의 모범 사례는 무엇입니까? 화면? INITIALIZE_PROGRAMS에 귀 기울여야합니다 이것은 프로그램 작성을위한 게이트웨이입니다

홈 화면에서 그 경험을 구축 할 수 있습니다 메타 데이터에 관해서는 충분할 수 없습니다 추가하는 메타 데이터가 많을수록 더 풍부 해집니다 경험, 사용자의 참여도가 높습니다 참여의 그 주제를 유지하면서 미리보기를 추가하십시오

실제로 참여를 유도하고 구축 할 것입니다 사용자에게 좋은 경험 콘텐츠를 최신 상태로 유지 – 오래된 콘텐츠가있는 경우, 사용자에게 신뢰를 잃을 수 있습니다 홈 화면에 채널이있는 경우 그리고 당신은 1 년 후에 그것을 업데이트하지 않았습니다 알다시피, 일단 사용자가 모든 프로그램을 시청하면, 그들은 다시 돌아갈 이유가 너무 많지 않습니다

그래서 당신은 그 내용을 신선하게 유지하고 싶습니다 그리고 그것은 당신의 앱에 달려 있습니다 YouTube 또는 Haystack과 같은 앱의 경우 당신은 사용자가 큐레이터 화 된 콘텐츠를 가지고 있습니다 어쩌면 몇 시간마다 업데이트 할 수 있습니다 Google Play 영화와 같은 앱의 경우 콘텐츠가 이미 통제 된 곳에서 하루에 한 번 또는 일주일에 두 번 업데이트 할 수 있습니다

목표는 콘텐츠를 신선한 상태로 유지하여 사용자가 무언가를 얻도록하는 것입니다 매일 같이 참여할 수 있습니다 그리고 조수에게 올 때, 미디어 세션은 당신의 친구입니다 Google Assistant를 사용하여 원하는 모든 작업, 미디어 세션이 핵심입니다 좋은 소식은,이 모든 것들이 오늘 할 수 있다는 것입니다

Android O에서 생방송입니다 Sascha로 돌려서 물건에 대해 이야기하기 너희들은 장래에 할 수있다 고맙습니다 [박수 갈채] 감사합니다

감사합니다 고마워, 벤 다양한 반응을 보는 것도 흥미 롭습니다 청중의 경우, 메모를 쓰는 사람과 사진, 코드 슬라이드 토론, 그리고 다른 사람들은, 친구처럼, 그냥 몇 가지 장치를 시작하십시오 그래서 우리는 새로운 것에 대해 조금 더 이야기 할 것입니다

오늘 아침에 데이브 버크 (Dave Burke)와 다른 사람들로부터 이미 들었습니까? Android P의 새로운 기능은 무엇입니까? 물론, 안드로이드 TV는 안드로이드 P에서도 몇 가지 새로운 기능을 추가 할 예정이다 그래서 우리가 투자하고있는 몇 가지 영역에 대해서만 강조 할 것입니다 하나는 확실히 성능입니다 Android P에서 많은 작업을 수행했습니다 실제로 Android TV의 성능, 속도 및 성능 향상 엔트리 레벨 하드웨어

따라서 매우 저렴한 스마트 TV 중 일부에서도 본 적이 있거나 셋톱 박스를 가지고 있다면, 우리는 모든 것이 기진 맥진하다는 것을 확인하십시오 그리고 우리는 Android P에서 많은 투자를했습니다 그리고 개발자로서 몇 가지 살펴 봅니다 앱과 앱의 행동에 대해 생각하는 것입니다 어쩌면 어떤 애니메이션, 일부 기능, 낮은 메모리 장치를 비활성화하거나 조정할 수 있습니까? 우리는 이것이 일부 앱에서 가장 일반적인 문제 중 하나임을 알 수 있습니다

엔트리 레벨 하드웨어 따라서 isLowRamDevice를 살펴보십시오 앱 동작을 조정 해보세요 그것으로 조금 놀아 라 어쩌면 애니메이션에 약간의 비틀기가있을 수 있습니다

또는 특정 기기에서 사용 중지 애니메이션을 보거나 특정 기능을 살펴보십시오 또한 메모리 프로필러를 사용하여 앱 프로필을 실제로 확인하십시오 병목 현상이 발생할 수있는 곳을 확인하고, 우리는 아직도 그 중 일부가 가장 많이 보임을 알기 때문에 앱이 갑자기 FPS에서 떨어지는 일반적인 행동 또한 Android Vitals를 사용합니다 응용 프로그램의 성능을 모니터링합니다

하지만 다시 한 번 Android TV 기기에서 Android P가 표시되어야합니다 훨씬 더 빨리, 훨씬 더 잘 수행하십시오 하드웨어가 줄어들어 더 많은 장치가 보입니다 봉투 그러나 우리는 분명히 사용자를 위해 몇 가지 사항을 업데이트하려고했습니다

완전히 설정 한 Android TV를 사용하기가 더 쉬워집니다 경험 내 말은, 솔직 해지자 모든 사람들이 새로운 장치를 반드시 설치해야하는 것은 아닙니다 그리고 우리는 전체 경험을하고 싶었습니다

모든 장치를 쉽게 설치할 수 있도록 장치를 푸는 것에서 훨씬 쉽고 빠르다 그리고 당신은 그것으로 많은 것을 다룰 필요가 없습니다 Android P에서는 전체 설정 과정이 더 간소화되었습니다 나는 우리가 전체 시간을 단축했다고 생각한다 거의 3 분의 1이 지나면 거기로 가야합니다

그리고 우리는 거기에 몇 가지 추가 단서를 가지고 있습니다 전화 통합이 더 좋은 곳 Android 휴대 전화를 가지고 있다면 설정 알림을 받게되므로 계정 세부 사항을 이전 할 수 있습니다 예를 들어 Google 계정, TV로 쉽게 전송할 수 있습니다 또한 브라우저 로그인을 개선했습니다

비 Android 기기의 경우 그래서 iOS 장치 또는 랩톱 덕분에 우리는 많은 것을 향상 시켰습니다 훨씬 빠릅니다 훨씬 쉽습니다 따라서 설치 과정을 훨씬 쉽게 할 수 있습니다 하지만 그것은 단지 귀하의 계정으로 장치를 설정하는 것입니다

모든 설정이 제대로 작동하는지 확인하십시오 스마트 TV 나 OTT 상자에서도 원하는 것은 무엇입니까? 당신도 모든 앱을 원합니다 맞습니까? 당신은 모든 내용을 원합니다 따라서 설정 프로세스의 일부로 차세대 Play 자동 설치 그리고 우리는 이미 당신에게 애플 리케이션을 추천합니다

다른 Android TV 기기에 설치 한 동영상, 과거 Android TV 기기 또는 휴대 전화에서 해당 TV 앱이있는 경우 그래서 우리는 자동으로 당신에게 제안합니다 설정 흐름의 일부로 그리고 당신은 거기에서 선택할 수 있습니다, 예, 나는이 모든 애플 리케이션을 원합니다 또는 어쩌면, 오, 나는 그 중 단지 몇 가지를 원한다 단지 몇 번의 클릭, 체크 박스, 모든 것이 다운로드되고 설치되고있다 자동으로 Play에서 더 이상 수동 검색이 필요 없습니다

새 장치를 설치 한 후에 저장하십시오 하지만 앱 다운로드 및 설치 우리가 최적화하고 싶었던 한 부분 일뿐입니다 훌륭한 경험이 앱에 적용되지 않는 것은 무엇입니까? 그런 다음 사용자 이름으로 로그인해야한다는 것을 알게됩니다 그리고 패스워드와 어색하게 들어갈 필요가있다 리모컨으로

그래서 자동 완성 기능을 도입했습니다 Android TV에서 Google과 그래서 당신이 신임장을 입력했다면 다른 Android 기기의 앱 중 하나에서 우리는 당신에게 자동으로 제안하고 있습니다 예, 예라고 말하면 모든 로그인 자격 증명이 추가됩니다 사용자 이름을 입력하지 않고 자동으로 로그인합니다 또는 암호

그래서 그것은 설정입니다 그러나 또한 많은 사용자를 본 영역 중 하나 물건을 찾는 데 많은 시간을 할애하고, 분명히, 진짜로 그것을 즐기지 않고, 설정, 맞죠? 때때로, 당신은 물건을 팅겨보고, 또는 설정시 특정 설정 단계를 건너 뜁니다 새 장치 또는 오디오 설정을 변경하려는 경우, 다른 계정을 추가하거나 이와 같은 것을 추가 할 수 있습니다 Android TV에서 설정을 변경했습니다 훨씬 더 유선형이고 훨씬 덜 어지럽 힙니다

그리고 우리는 자동으로 당신에게 설정을 제안합니다 우리는 당신이 찾고 있다고 생각합니다 예를 들어 계정 로그인을 건너 뛴 경우, 우리는 여기 애니메이션에서 보았 듯이, 이미 강조 표시됩니다 또는 몇 가지 앱으로 주위를 비웃는 것을 보았을 때, 그리고 뭔가 옳지 않았고, 당신은 설정으로 들어가고, 우리는 아마도 당신을 위해 앱 설정을 강조 할 것입니다 우리는 신속하게 얻을 수 있도록하고 싶습니다 당신이 필요로하는 것을 쥐어 짜내고, 다시 나가십시오

그래서 Android P에 대한 정보가 많이있었습니다 Android P 미리보기 SDK TV 에뮬레이터로도 놀 수 있습니다 그것을 밖으로 시도하십시오 거기에 몇 가지 다른 깔끔한 것들이 있습니다, 예 : 외부 카메라 지원

따라서 TV 용 카메라 앱을 작성할 수 있습니다 네가 원한다면 그래서 당신은 그것을 가지고 놀 수 있습니다 우리는 더 많은 문서를 발표 할 예정입니다 가까운 장래에 TV 앱의 성능 측면을 중심으로, 그러나 우리는 두 가지 더 많은 것을 말하고 싶었습니다

우리는 지금까지 소프트웨어에 대해 많이 이야기했습니다 그러나 우리는 멋진 하드웨어 경험이 무엇인지에 대해서도 생각했습니다 확장 할 수있는 멋진 기기 란 무엇인가요? 거실에서의 경험? 그리고 우리가 스스로에게 묻는 질문들 중 하나 진짜 시원한 거실은 어때? 장치가 중심이되는 경험, 허브 어시스턴트가 통합 된 거실의 사용하기 쉽고 모든 다른 장치를 제어하며, 내 TV 화면에 최고의 Android TV 경험을 선사합니다 어떻게 생겼을 까? 그리고 그 결과, 그 대답 이런 식 이었어 [비디오 재생] [음악 재생] – 안녕, 구글

티비를 켜라 – 안녕, 구글 ESPN에서 Clemson 축구 경기를 즐겨보세요 좋아 다시 전화 한거야? 호기심? 기회? – 안녕, 구글

새로운 "Star Trek"쇼는 무엇입니까? – 여기에 "Star Trek, Discovery"에 대한 정보가 있습니다 – 발견 – 안녕, 구글 YouTube Kids에 감자 배터리 동영상을 보여주세요 – 괜찮아

YouTube 키즈에 감자 배터리 동영상이 있습니다 [CHEERING] – 안녕, 구글 대학 축구는 얼마 동안 연장 되었습니까? – Wikipedia에 따르면, 일반적으로 10 분입니다 – 좋았어 – 이거 정말 맛있어

– 안녕, 구글 케틀 옥수수를 더 구입하십시오 – Google Express에서 찾은 내용은 다음과 같습니다 – 나는 그 쇼를 의미했다 – 알아

– 기다려 안녕, 구글 조명을 어둡게하고 TV를 끄고 Pandora에서 음악을 재생하십시오 [음악 재생] – 우 [끝내기] [박수 갈채] SASCHA PRUETER : 이미 보셨 듯이, 어제 일부 언론 매체에서 시작, 우리는 파트너 인 JBL과 함께, 안드로이드 TV로 구동되는 JBL Link Bar

멋진 사운드 바입니다 Google Assistant가 통합되어 있습니다 우리는 파 필드 마이크를 장치에 넣기 때문에, 리모콘을 집어 올 필요가 없습니다 당신은 소파에 앉아 장치에 말을 걸고, 전체 경험을 제어 할 수 있습니다 그것은 정말 멋진 사운드를 가지고 있습니다

선택 품목 인 서브 우퍼가있을 것입니다 너는 그것으로 또한 주문할 수 있는다 그리고 정말 멋진 기능이라고 생각합니다 3 개의 HDMI 입력 단자가 있습니다 그리고 당신은 생각할지도 모릅니다

글쎄, 왜 그렇게 멋진가? 너는 진짜로 너의 전체 가정 오락을 통제 할 수 있는다 이 경험 많은 사람들이 실제로 글쎄, 당신은 플레이 스테이션이나 엑스 박스를 가지고 있을지도 모릅니다 또는 여전히 블루 레이 플레이어가있을 수 있습니다 또는 무엇이든간에 케이블 셋톱 당신이 아직도 좋아하는 상자 따라서 모든 장치를 JBL Link Bar에 연결할 수 있습니다 Assistant를 사용하여 제어 할 수 있습니다

예를 들어, 당신이 플레이 스테이션으로 전환하고 싶다면, 그리고 그것은 단지 마술처럼 일어납니다 그리고 또한, 만약 당신이 놀고 있다고 가정 해 봅시다 플레이 스테이션 게임, 그리고 당신 조수에게 질문이있어 그냥 길잡이에게 물어 보면 길잡이가 대답 할 수 있습니다 현재 HDMI 입력에 대한 응답 카드를 보여줄 수 있습니다

따라서 단순한 HDMI는 아닙니다 이것은 활성 입력입니다 그리고 그것은 정말로 당신에게 권력을 보여줍니다 어시스턴트와 안드로이드 TV를 거실 플랫폼으로 그리고 다른 멋진 점은 우리가 이것을 스피커 전용 모드로 만들기 위해 노력하고 있습니다 때로는 TV 화면이 필요하지 않기 때문에 그렇습니까? 오디오를 듣거나, 음악을 듣거나, 어쩌면 뭔가 물어볼 수도 있습니다

정말로, 이것을 매우 낮은 핵심 스마트 스피커로 바꾸는 것 멋지다 그래서이 장치는 모든 것을 할 수 있습니다 그리고 어쩌면 당신이 원할 때도 있습니다 블루투스 또는 전송 된 오디오를 통해 장치로 음악을 전송할 수 있습니다 잘 작동합니다

거실을위한 원 스톱 상점입니다 모든 것을 제어 할 수 있습니다 그것은 아주 쉽다 또한 리모컨도 함께 제공됩니다 그러나 당신이 목소리로 그것을 사용하는 것을 선호한다면, 음, 정말 쉽습니다

그것을 확인해야합니다 우리는 안드로이드 TV 샌드 박스에 샌드 박스 C를 가지고 있습니다 그리고 팀의 사람들 중 일부에게 데모를달라고하십시오 그거 정말 멋지다 좋은 소리

2018 년 가을에 출시 될 예정입니다 그래서 두 가지 더 말했지, 그렇지? 그래서 또 하나 우리는 이전에 Android P에 대해 많이 이야기했습니다 그리고 개발자로서, 당신은 모든 것을 벤 그냥 따라 가고 싶습니다 너에게 말했다

그리고 네가 물었다 Android P SDK, 미리보기 SDK 및 다운로드 할 수 있습니다 에뮬레이터와 함께,하지만 난 정말 이를 위해 실제 하드웨어를 갖고 싶어합니다 그래서 네가 누구인지 알지 못해 Moscone Center의 Google I / O 2014에서 손이 많이 듭니다

승인 여러분 중 일부는 이미 2014 년 모스 콘에있었습니다 그리고 그들은 우리가 그 당시에 장치를 출시 한 것을 기억할 것입니다 Android TV를 소개합니다 그것은 ADT-1이라고 불 렸습니다

[박수 갈채] 그래서 우리는 생각 했어 네가 원한다면 너는 박수 갈채를 보낼 수있어 그러나 우리는 그것이 다른 개발자 장치를위한 시간이라고 생각했습니다 그래서 우리는 ADT-2를 소개하고 있습니다 [박수 갈채] 따라서 가입 양식 링크를 적어 두는 것이 좋습니다

당신이 실제로 이것을보고 처음으로 이것에 가입 할 수 있습니다 모든 스마트 폰 실제로 Google 렌즈에 대한 꽤 좋은 테스트입니다 실제로는 – BENJAMIN BAXTER : 오, 그래 SASCHA PRUETER : 어쨌든

BENJAMIN BAXTER : 샌드 박스에 가면 나중에 사운드 바를 체크 아웃하고 [INAUDIBLE] ,, 이 링크와 함께 이메일도 받게됩니다 SASCHA PRUETER : 네 좋은 지적

그래서 이것은 깔끔한 작은 HDMI 동글입니다 그것은 BTLE 가능하게 될 것입니다 – 죄송합니다 음성 지원 원격 제어 장치입니다 따라서 모든 Assistant 통합 팁을 시험해 볼 수 있습니다 벤이 방금 말한 거에요

Android P 개발자 미리보기 릴리스가 실행됩니다 기기 업데이트가 전송됩니다 그건 그렇고, 우리는 또한 사운드 바에 업데이트를 보내고 있습니다 Google, Android TV 팀에서 시스템 업데이트를 전송합니다 새로운 안드로이드 버전을 제공합니다

그래서이 장치를 사용하여 모든 멋진 것들을 시험해 볼 수 있습니다 그것은 한정판 장치이기 때문에 먼저 그것에 대해 알고 있습니다 가입하십시오 우리는 이번 여름에 실제로 이것을 보냅니다 그리고 그것은 깔끔한 작은 장치입니다

우리는 실제로 그것에 대해 정말로 흥분하고 있습니다 가입하십시오 멋진 앱을 만들 수 있습니다 그것은 이미 그것의 종류입니다 나는 두 가지 더 말했다

두 가지가 더 있습니다 BENJAMIN BAXTER : 맞아 SASCHA PRUETER : 우리는 – 앱에서 작업하는 경우 좀 더 흥미로운 사건들 관심이있을 수 있습니다 벤, 네가 언급하고 싶은지 모르겠다

BENJAMIN BAXTER : 네 영업 시간에 방문하십시오 우리는 Office Hours에서 back-to-back 앱 리뷰를 보유하고 있습니다 우리는 길을 약간 지나갈 것입니다 사무실 시간 텐트가있는 곳

질문이 있으면 가져 오십시오 지루하고 여전히 TV를하고 싶다면, 코드 랩 섹션에는 두 개의 새로운 코드 랩이 있습니다 하나는 Play Next 행에 초점을 맞 춥니 다 다른 하나는 전체 주택에 대한 개요에 초점을 맞추고 있습니다 화면

우리는 당신을 만나고 거기에 질문을하기를 기대합니다 SASCHA PRUETER : 네 그리고 질문에 대해 말하자면, 분명히, 우리는 당신의 피드백을 원합니다 또한 질문이있는 경우 그 마이크들을 봤니? 타이밍 때문에 사용하지 않습니다 우리는 곧 여기 밖으로 셔플 될 것입니다

하지만 안드로이드에서이 이야기를 한 후에 벤과 나는 끝날 것이다 TV 샌드 박스 이리와, 우리에게 말하고, 우리에게 질문 해 그리고 저는 벤에게 그 질문에 답할 가능성이 높습니다 고맙습니다

멋진 TV 앱을 제작하십시오 내년에 다시 보길 바랍니다 BENJAMIN BAXTER : 고맙습니다 [박수 갈채] [음악 재생]

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가 의미하는 건 뭐죠 이런 시간이 다 됐네요 감사합니다

Android Apps for Chromebooks and Large Screen Devices (Google I/O ’17)

안녕하세요, 여러분 내 이름은 샤 히드 야

저는 Chrome OS의 제품 관리자입니다 오늘 세션에 참석해 주셔서 대단히 감사합니다 나는 너에게 몇 명 말할 기회가 있었어 당신이 우리와 함께있는 것을 정말 기뻐합니다 그래서 오늘 우리는 조금 이야기 할 것입니다

크롬 북용 Android 앱 최적화에 관한 도움말 대형 스크린 장치 그래서 내가 그것을 시작하기 바로 전에, 나는 손을 보여주기 위해 Chrome OS를 사용했습니다 정말 끝내주는 군 여기에 현재 Chrome OS 기기가있는 사용자가 있습니다 네가 가진다면 그걸 붙잡아 둘 수 있니? 좋아, 좋아

알았어, 고마워 따라서 Chrome OS 팀은 Googleplex의 실시간 스트림에 있습니다 그들은이 모든 것을보고 있습니다 그래서 우리는 항상 Chrome OS를 사용하는 사람들을 보게되어 정말 기쁩니다 그렇게 해줘서 고마워

Chrome OS에 노출 된 사용자의 경우 전에, 전에 그것을 가로 질러왔다, 전에 우리 한테 말 했잖아, 너 아마 이 세 가지 아이디어에 매우 익숙합니다 Google은 Chrome OS의 아이디어에 대해 매우 일관성있게 작업 해 왔습니다 우리가 시작한 이래로 Chrome OS를 빠르게 사용하기를 원합니다 빠른 시작, 빠른 사용

우리는 그것을 쉽게 원합니다 우리는 사용하기 쉽기를 바랍니다 그것은 도구입니다 우리가 생각하는 방식은 Chrome OS를 방해하지 않으려면 그래서 당신은 가고 싶은 곳에 갈 수 있습니다 우리는 드라이버 업데이트를 발표하는 팝업을 표시하고 싶지 않습니다

생산성 소프트웨어를 판매합니다 당신은 가고 싶은 곳으로 가야합니다 보안은 Chrome OS 이후로 우리에게 최고였습니다 시작되었다 그래서 그것은 우리에게 큰 순간을 가져 왔습니다

지난 몇 년 동안 그래서 작년 I / O에서 Chromebook 출하를 발표했습니다 미국에서 맥을 따라 잡았다 자, 그것은 부분적으로 edu에서의 우리의 강점 때문입니다 크롬 북은 다른 모든 기기를 결합하여 판매합니다 그러나 그것은 소매업에서도 마찬가지입니다

따라서 우리는 연중 최대 20 %의 성장률을 보였습니다 최대 50 % 성장 따라서 Chrome OS는 정말 강력하고 지속적으로 성장하고 있습니다 그러나 최적화에 대해 오늘 이야기 할 때, Chrome OS에서만 유용하지 않습니다 삼성 갤럭시 같은 휴대폰 데스크탑 투영 모드를 사용하는 S8은 윈도우 시스템을 사용하며, 우리는 많은 최적화 작업을 수행했습니다 오늘에 대해 이야기하면 도움이 될 것입니다

노트북 형식의 장치도 있습니다 Lenovo Yoga Book 및 A12와 같이 Android를 실행하십시오 그들은 키보드를 사용합니다 그들은 터치 패드 입력을 사용합니다 Chrome OS를 최적화하는 방법에 대해 생각해보세요

이 폼 팩터에도 도움이 될 것입니다 이제 데스크톱 응용 프로그램에 대해 조금 이야기 해 보겠습니다 모바일 폼 팩터와 어떻게 다른지 살펴보십시오 그래서 모바일 앱, 나 자신을 위해 나는 경향이있다 짧은 파열로, 아마도 몇 분 안에 그들을 사용하려면, 한 번에 20 분 정도

그리고 모바일 앱을 구입할 생각이라면, 그것은 약간 달러를 요할 수있는 무언가이다 데스크톱 앱, 나 그리고 어쩌면 많은 사람들이 여러 시간 동안 그 앱을 사용합니다 하루 중 한 번에 그리고 그 중 하나를 사세요 몇 백 달러를 위해 그것을 사는 것은 부당하지 않습니다

폼 팩터에서의 이러한 간단한 변화, 더 큰 화면, 마우스와 키보드로 더 빨라진 입력 정말 다른 종류의 사용을 유도하십시오 그리고 우리가 생각할 수있는 가장 먼저 Android 개발자는 현재 앱을 어떻게 확장합니까? 데스크톱 플랫폼에 통합 한 다음 계속해서 우리는 다른 기회를 생각할지도 모른다 데스크톱 플랫폼에서 매우 다른 것을 할 수 있습니다 그래서 다른 유형의 사용법은 우리 자신의 분석에 반영되었습니다 몰입 형 앱을 사용하는 사용자가 메시징, 게임, 생산성과 같은 Chromebook에서 해당 앱에 더 많은 시간을 할애하세요

모바일 장치에서보다 AutoCAD가 그 예입니다 그래서 몇 명의 개발자를 만났습니다 오늘 우리와 함께있는 사람들 와줘서 고마워 그들은 저희와 노력하고 최적화하기 위해 노력해 왔습니다

Chrome OS 기기에서 사용 된 몇 가지 사용법 훨씬 더 강해졌습니다 그래도 일부에 대해서는 조금 얘기를 해봅시다 최적화를 위해 할 수있는 일에 대한 구체적인 내용 Chrome OS 및이 대형 화면 용 및 다른 유형의 장치를 포함 할 수있다 첫째, 크롬 북은 다른 Android 기기와 동일하게 작동합니다 따라서 Google Play 스토어에 앱이있는 경우, 아마 이미 Chrome OS에서 작동합니다

많은 개발자들이 모바일에 대해서만 테스트합니다 완전히 이해할 수 있습니다 Chrome OS에서 처음 실행되는 앱보기 아마 그 필요성을 설명 할 것이다 최적화 작업을 할 수 있습니다 이러한 최적화는 일반적으로 발생합니다

모바일과 데스크톱의 네 가지 차이점 첫 번째는 더 넓은 화면입니다 아마도 가장 일반적인 문제 일 것입니다 물론 모바일 장치 이 넓은 화면이 있습니다 랩톱 장치에는 이와 같은 화면이 있습니다 그리고 일부 앱은 스크린 부동산을 사용하지 않습니다

그들이해야하는 것처럼 이는 타사 앱 뿐만이 아닙니다 이것은 우리가해야 할 일입니다 따라서이 기능은 '둘러보기'에서 실행되는지도의 예입니다 당신 "크롬 OS에서 볼 수 있습니다

그리고 중간에 내용이 좁은 것을 볼 수 있습니다 콘텐츠가 제대로 리플 로우되지 않습니다 화면 측면의 틈을 차지합니다 이것은 또 다른 예입니다 이것은 Google 행 아웃의 대화입니다

보시다시피, 각 참가자의 각 메시지 왼쪽 및 오른쪽으로 하드 정렬됩니다 따라서 아래쪽을 읽기가 어렵습니다 눈은 좌우로 점프해야합니다 대화의 요지를 얻기 위해서 두 번째 항목 인 휴대 전화는 기본 세로 형식이며, 노트북은 기본 환경입니다

그래서 이것은 하나의 예입니다 이것은 Android 게임 인 Storm 4 : Balur의 부상입니다 Chrome OS는 앱을 세로로 고정하는 설정을 존중합니다 그래서 가로 화면에서 화면은 – 보기는 여전히 초상화입니다 이렇게하면 많은 화면이 비어있게됩니다

여기에서 볼 수 있듯이 풍부한 그래픽 이 스트립의 화면 중앙에 잠겨 있습니다 세 번째 항목은 윈도우 잉입니다 많은 앱은 디스플레이 크기 창 크기와 동일하며 항상 그렇지는 않습니다 케이스, 안드로이드에서도 데스크톱의 가치 중 일부는 멀티 태스킹을 통해 다양한 윈도우를 볼 수 있습니다

및 동시에 실행되는 앱 그래서 종종 창 크기가 맞지 않습니다 표시 크기와 같습니다 앱에서이를 이해해야합니다 예를 들어, 그들은 정확하게 스타일러스의 입력을 이해하고, 예를 들어, 올바른 위치에 잉크를 그립니다

오프셋 오류가 없습니다 마지막으로 키보드, 포인터 및 스타일러스 입력 그래서 여기에 일반적인 상태가 많이 있습니다 모바일에서는 드문 경우입니다 예를 들어 마우스를 가져 가면 상태가 표시됩니다

같은 도구 팁 아이콘 위로 마우스를 이동하면 도구 설명이 나타납니다 모바일에서이 작업을 수행하는 것은 정말 이상한 일입니다 그리고 그 반대도 마찬가지입니다 따라서 모바일에서 흔히 볼 수있는 주와 행동 데스크톱에서 덜 일반적 일 수 있습니다

예를 들어, 예를 들어, 목록에서 이메일이나 항목을 쉽게 찾을 수 있습니다 모바일에서 매우 직관적입니다 바로 거기에 손길이있어 반면 데스크톱에서는 마우스로 좀 특이합니다 우리가 말하는 그 종류의 업데이트 매우 간단 할 수 있습니다

그래서 내가 한 가지 예를 들어 보겠습니다 그래서 우리는 Slack의 팀과 긴밀히 협력 해 왔습니다 따라서 Chrome OS에서 실행되는 슬랙 앱의 예입니다 슬랙을 사용하는 사람들은 아마도 익숙한 것은 오른쪽 하단에 여기에 다음 메시지를 입력 할 수있는 큰 상자가 있습니다 팀에 보냅니다

그래서 그걸 입력하고 Enter 키를 누르면, 원래 방금 캐리지 리턴을 보냈습니다 모바일 장치가 키보드 입력을 보는데 익숙하지 않았기 때문입니다 그래서 그것은 테스트되지 않았고 이해할 만했습니다 그러나 Slack 팀은 우리가 약간의 일을하도록 도왔습니다 이를 최적화하고 Enter를 치면 메시지를 보냅니다

그래서 당신이 기대하는 것처럼 작동합니다 그래서 이것은 최상위 레벨의 빠른 요약입니다 앱이 당신처럼 작동하는 데 도움이되는 항목 데스크톱에서 기대하고 더 행복한 사용자를 얻으십시오 그래서 저는 스테판을 소개하고 싶습니다 Chrome OS에서 창 관리를 담당하는 기술 담당자 [박수 갈채] 안녕, 모두들

와 주셔서 감사합니다 귀하의 신청서를 개선하는 방법에 대해 이야기하기 위해 왔습니다 데스크톱 세계에서 사용하기 위해 Chromebook 또는 대형 화면 장치를 의미합니다 응용 프로그램에서 할 수있는 가장 중요한 작업 데스크톱 세계를 최대한 활용하려면 적어도 API 수준 24로 이동합니다 API 레벨 24로 모든 제한 사항을 제거 할 수 있기 때문에 창 크기와 이것 저것의 우리는 실제로 [? 더 오래된?] 응용 프로그램

당신이 정말로해야 할 다음 큰 일은 당신이해야 할 일입니다 – 두 방향을 모두 사용해야합니다 그래서 이전에 보았 듯이, 요즘 대부분의 응용 프로그램이 전화 크기로오고 있습니다 그것이 초상화 인 것을 의미합니다 그리고 그 것만으로도 초상화가 혼자예요, 예, 전화에 좋았습니다 하지만 데스크톱에는 좋지 않습니다

따라서 동시에 풍경을 보임으로써, 당신은 당신의 어플리케이션의 사용을 향상시키고 있습니다 데스크톱 장치에서 그 다음 일은 음, 만약 네가 가능하다면 오직 하나의 오리엔테이션에만 의존해야한다 당신은 실제로 그것을 지정할 수 있습니다 그리고 명시 해주십시오 우리는 이것이 사실이라는 것을 압니다 당신이해야 할 다음 일은, 음, 거기에 있습니다

화면의 크기가 다릅니다 당신은 실제로 10 인치 인 것을 가지고 있을지도 모릅니다 그러나 당신은 실제로 40 인치 인 무언가가 있을지도 모릅니다 아니면 그런 식으로 거실에 누가 그걸 가지고 있는지 모릅니다

하지만 좋을거야, 그렇지? 그래서 그걸로 당신은 확실히 원합니다 물론 더 많은 콘텐츠를 보여줄 수 있습니다 따라서 표준 메커니즘을 사용하여 이미 안드로이드에, 다중 레이아웃과 그 밖의 것들, 당신은 이런 모든 종류의 일을 할 수 있습니다 예, 마우스와 키보드가 있습니다 마우스와 키보드가 뭔가있는 동안 그것은 노트북에서, 그러나 전화로는 전적으로 유용합니다

당신은 아마 그것을 좋은 이유와 함께 사용하지 않았을 것입니다 그래서 다음은 실제로해야합니다 접근성을 위해 물건을 추가하십시오 (예 : 콘텐츠 설명을 추가하여 사용자가 실제로 당신이하는 일을 들어라 그럼 물론, 거기에, 모든 일반적인 용의자는, 예를 들면, 이 모든 오래된 API는 이미 그 어느 때보 다 이미 존재합니다 끌어서 놓기 지원

이전에 들었던 마우스 오버 API와 같습니다 그리고 이런 모든 종류의 것들 그렇게함으로써, 당신은 완벽한 직업을 얻고 있습니다 좋은 데스크톱 경험으로 그리고 이러한 API의 대부분은 이미 있습니다 정말 새로운 것은 없습니다

그리고 그렇게함으로써 훨씬 더 나은 시민을 얻게됩니다 전화 세계에서 Chrome OS에서 창 관리를 시작합니다 그래서 우리는 작년의 교훈을 배웠습니다 그래서 우리 작년에, 우리는, 음, M에 세워진 우리의 최초 화신, 그리고, 네, 많은 문제가 있습니다

베타 버전이고 베타 버전입니다 수백만 개의 응용 프로그램이 있습니다 다양한 API가 있습니다 그럼, 그때는 24 살이었고, 지금은 26 살이에요 온라인에 접속하면 예를 들어 알아내는 방법을 검색하려고합니다

화면의 크기는 얼마입니까? 글쎄, 당신은 30 가지 버전의 방법을 얻을 것이다 당신은 그 이상을 할 수 있습니다 그리고 모든 것이 업로드 될 것입니다 글쎄, 뭔가 잘못 될지 알려주지 음, 잘못 갈 수 있습니다, 그것은 틀리게 잘못 될 것입니다

거기에는 의문의 여지가 없습니다 그래서 오리엔테이션의 문제가있었습니다 예를 들어, 당신은 응용 프로그램을 시작하고 있습니다 가로로 시작한 다음 세로로 변경됩니다 그리고 그것은 주위에 뛰어 오른다

그리고 이것은 물론 사용자를 완전히 짜증나게합니다 그리고 우리는 좋은 아이디어를 염두에 두었습니다 실제로 거기에 특별한 버튼을 추가하는 오리엔테이션을 바꿀 수있게했다 어느 시점에서든 그게

잘 생각했는데 하지만 문제는 응용 프로그램이 어느 시점에서든, 이봐, 나는 정말로 초상화가되고 싶다 갑자기 버튼이 사라지고 사라졌습니다 물론 이것은 사용자에게 매우 혼란 스럽습니다

그래서 예기치 않게 응용 프로그램을 다시 시작했습니다 예를 들어, 창 크기가 바뀌고, 그것의 상태를 잃어 버렸고, 사용자는 실제로 게임을 처음부터 다시 시작해야했습니다 물론, 완전히 성가시다 이 모든 종류의 일들은 꽤 나빴습니다 그래서 결국 우리는 물론, 문제는 창문, 그들은 정말로하지 않았다

로 시작하는 창이 세계에있을 것으로 기대, 그것은 또 다른 문제였다 그럼 우리 다음 일로 데려다 줄거야 그래서 이거 [? app?] 새 창 관리자에서 우리가 지원하는 특별한 윈도우 모드입니다 따라서 기본적으로 사전 밀도 인식 응용 프로그램을 사용합니다 이들은 항상 전체 화면으로 표시됩니다

그래서 네가하지 않기를 정말로 바란다 이러한 종류의 응용 프로그램 프로그래밍 더 이상 갖고 싶지 않으면 더 이상 세계의 버튼 좋은 일 이겠지만 아마도 그걸 원하지 않을 것입니다 그래서 다음 것은 pre-N, pre-N입니다 그 사이에 뭔가가 있습니다

그것은 마시멜로를 포함합니다 글쎄, 우리는 거기 밖으로 응용 프로그램의 대부분을 알아 냈어, 그들은 잘 작동하고 있습니다 그래서 그들은 합리적으로 잘 작동하고 있습니다 그러나 문제는 그렇지 않은 응용 프로그램이 많다는 것입니다 그래서 우리는 많은 베타 피드백을 받고있었습니다

그래서이 문제를 해결하기 위해, 우리는 그것들을 모두 창문에 넣었습니다 그래서 그들은 지금 정적입니다 그들은 항상 같은 크기입니다 전화 크기가 올라간 것 같습니다 그래서 그것은 풍경이나 초상화가 될 수 있습니다

사용자는 그가 실제로 말할 수있는 옵션을 가지고 있습니다 헤이, 나는 가능한 한 큰 것을 갖고 싶다 가로 화면에 세로 크기의 창, 당신이 할 수있는 가장 큰 일입니다 그리고 회전하면 화면 전체가 채워지지 않습니다 하지만 그것은 사전 N입니다

네가 이미 N —- 내가 너에게 말했던 것, 그렇게하는 것이 좋습니다 그러면 크기를 조정할 수있는 완전한 자유가 생깁니다 실제로는 전체 화면이 될 수 있습니다 창을 그릴 수 있습니다 N에서 크기를 조정하기를 원하지 않는다면, 당신은 말할 수 있습니다, 나는 unresizable되고 싶다, 기본적으로 사용자를 전체 데스크톱으로 안내합니다

그리고 마지막으로 실제로 본질적으로 지시하는 응용 프로그램을 가지고 있습니다 이 크기와이 위치에 있고 싶고 우리는 그것을 존중합니다 이전 버전의 큰 변화 우리에게 새로운 규칙이 있다는 것이 었습니다 그 루트 활동 규칙은 본질적으로 루트 활동이 글쎄, 너는 여러가지 활동을하고있어 이들은 [INAUDIBLE] 작업을 구성합니다

그리고 최고의 활동은 당신이 보는 것입니다 가장 밑에있는 것은 루트 활동입니다 예를 들어 근본 활동이 풍경이라면, 크기를 조정할 수 있습니다 즉, 상단에 간다 조경 및 크기 조정이 가능합니다 좀 이상하게 들리는군요, 그렇죠? 그게, 그건 의미 할거야

만약 당신이 초상화가되고 어쩌면 수리 할 수 ​​없다는 의미 였고, 갑자기 크기를 조정할 수 있고 풍경이 될 수 있습니다 그 자체로는 모순입니다, 그렇죠? 글쎄요, 당신이 전화로보고 있다면 우선, 당신은 사이드 바이 사이드 모드를 가지고 있습니다 거기에서도 똑같은 일이 일어나고 있습니다 두 번째로 가장 중요한 것은 하나의 모드에 정말로 고정되어있는 응용 프로그램 게임입니다 그래서 게임과 게임은 보통 레이아웃과 겹침을 사용하지 않습니다

그러므로 그들은 정말로이 치료가 필요합니다 하지만 일단 레이아웃과 표준 프레임 워크를 사용하면, 이 모든 것을 당신에게줍니다 그것은 정말로 당신의 형태를 유지할 수 있습니다 – 당신 물건 그렇게해서 여전히 사용할 수 있습니다 그리고 이것으로, 당신은 창을 뛰어 넘지 않습니다 모든 것이 사용자에게 훨씬 깨끗해 보입니다

정말 좋은 경험입니다 그래서 그리고 거기에, 글쎄, 당신은 아마도 이미 Chromebook을 보았습니다 크롬 북은 다음과 같습니다 그러나 당신이 그것을 보지 않았다면, 당신은 또한 그것을 변환 할 수 있습니다 태블릿 폼 팩터로 그럼 태블릿 형태로 들어가면 어떻게 될까요? 인자? 이 경우 실제로 크기를 강제합니다

M 애플리케이션이라면 크기가 실제로 적용됩니다 이전의 모든 것에 국한되어야한다 그러나 오리엔테이션은 정확하게 갈 수 있습니다 당신이 전화로하고있는 것처럼, 그것은, 루트 액티비티에는 그 어떤 영향도 미치지 않습니다 더 이상

오리엔테이션에서 이미 언급했듯이 음, 두 방향이 있습니다 초상화와 풍경입니다 하나는 휴대 전화에 좋은 반면, 하나는 좋은 것입니다 음, 정제 및 노트북 그리고 그곳에는 불특정 다수가 있습니다

불특정이란 둘 다 할 수 있다는 것을 의미합니다 그게 최선이기 때문에 우리는 당신이 그렇게하도록 적극 권장합니다 그래서, 만약 당신이 정말로 이러한 것들 중 하나를 사용해야한다면, 매니페스트 파일에 지정하십시오 너는 조경이되어야한다는 것을 명심해라 우리가 실제로 무엇을 원하거나 원하지 않을지 짐작하지 마십시오

왜냐하면 우리는 그것을 추측 할 수 없기 때문입니다 따라서, 만약 당신이 피하고 싶다면 점프 또는 어떤 종류의 별난 시나리오, 거기에 넣어주세요 그래서 오, 저것 좀 봐 따라서 오리엔테이션을 지정하는 경우, 당신은 분명히 또한 [? 감지기 ?] 문제는 제가 게임이나 다른 것을 할 때이기 때문에, 또는 Android를 사용하고 있으며이 모드에서 갈 것입니다 매우 자연스러운이 모드로, 맞아, 거꾸로있어 그리고 다른 하나는 카메라가 여기에 있습니다

만나다? 여기 있습니다 전화와 같은 것이 아닙니다 그래서 실제로 말하기에는 이치에 맞지 않습니다 헤이, 카메라가 꼭 필요합니다 실제로는 아닙니다

어쨌든 [INAUDIBLE] 상단에 있습니다 그리고 할 수있는 최악의 경우, 그것은 매니페스트 파일로 들어가고 귀하의 풍경, 그리고 나중에 전화, 설정 요청한 오리엔테이션과 다른 오리엔테이션 그것은 정말로 모든 것을 던지고 있습니다 제발 그러지 마세요 그래서 크기를 시작하면 다양한 가능성이 있습니다

실제로 특정 크기의 특정 창을 가져옵니다 그래서 첫 번째 힌트가 있습니다 이것은 우리가 가지고있는 새로운 것입니다 특히 데스크톱을 의미하는 폼 팩터의 경우에 특히 그렇습니다 특히 힌트를 줄 수 있습니다

데스크톱 환경에서 무엇을보고 싶습니까? 너는 작은 창, 큰 창을 갖고 싶어? 그것은 풍경이어야 하는가? 그것은 초상화일까요? 이러한 종류의 것을 지정함으로써, 실제로 올바른 크기로 넣어야합니다 정확히 어떤 크기의 변화없이 그리고 다음은 실제로 특수 옵션 명령으로 의도를 시작하십시오 N 이후 이미 거기에있다 그리고 세트 발사 경계, 당신은 다음 창을 이동할 수 있습니다 특정 크기와 위치로 그리고 마지막 가능성은 모든 의도에 대한 것입니다

레이아웃 명령을 지정할 수도 있습니다 최소 크기, 기본값 크기 및 실제 적용 범위 화면에 배치해야합니다 왼쪽, 오른쪽, 위쪽 등등에 있어야합니다 그래서 우리는 어떤 종류의 창 모드를 알고 있습니까? 음, 우리는 물론, 우리가 데스크톱에서 실행 중입니다 이 경우,이 모드에서 실행중인 경우, 너는 실제로 달릴거야, 내 생각 엔, 화면에 5 배 크기의 스크린이 있습니다

그래서 그것은 초상화에있다 최대화하면 실제로 상단의 캡션 또는 응용 프로그램 제어 막대를보고, 창은 항상 전체 화면을 덮습니다

그래서 당신이 단지 초상화 일지라도, 나머지는 검게 칠해집니다 그리고이 모드에 있다면, 그러면 응용 프로그램이 전체 화면으로 요청할 수 있습니다 실제로 표준 작업을 수행 할 수 있습니다 Android에서도 항상 공통적 인 간단히 말해서, 나는 시스템 UI를 대신하고 싶다 나는 풀 스크린이되고 싶다

우리는 당신의 길과 자막에서 벗어날 것입니다 선반뿐만 아니라 선반이 숨겨집니다 네 더 많은 공간을 적절하게 사용하는 가장 중요한 방법 더 큰 크기의 레이아웃을 추가합니다 그래서 당신은 실제로

음, 더 많은 것은 너는 가지고있는 크기가 더 좋다 더 큰 크기 음, 일부 응용 프로그램이있는 경우 다시 시작하지 마십시오

레이아웃 시스템을 사용하지 않는 경우, 당신은 크기 조정을 피하려고 노력해야한다 레이아웃 변경 명령을 직접 수행하십시오 그렇게하면 실제로 원활한 경험을하십시오 우리는 나중에 그걸 보게됩니다 그러나 항상 [? 안전하지 않은?] 인스턴스 인스턴스를 복원하면 해당 인스턴스가 Android 월드뿐만 아니라 Chromebook에서도 사용할 수 있습니다

복원 기능이 더 좋으므로 그것은 사용자를위한 것입니다 전화에있는 유일한 것은 당신이 정말로하지 않는다는 것입니다 그렇게 많이 알아 차리지 만 창문이 있다면 갑자기 내용이 사라지고 다른 것을 본다 처음부터 그것은 꽤 성가시다 그러니까

오, 그래 창 크기를 조정하는 경우 확실히 확인해야합니다 화면에 몇 가지 요소가 있으면 액세스 및 그들은 단순히 사라지고, 액세스하려고하지 마십시오

우리는 그 때문에 일부 응용 프로그램이 충돌하는 것을 보았습니다 물론 그것은 우리에 의해 고칠 수 없습니다 큰 화면 레이아웃을위한 좋은 예입니다 그리고 당신은 아마 그것을 알고 있습니다 그리고 당신은 몇 년 전부터 그것을 보았습니다, 그러나 항상 다시 보여주는 것이 좋습니다

따라서 인물 사진 응용 프로그램이 있습니다 글쎄, 초상화는 한 줄만 보여준다 그리고 너는 조경판을 가지고있다 어디서나 화면의 다른 부분을 얻을 수 있습니다 그래서 여러분은 파편들로 보았던 어떤 것입니다

이미 오랜 시간을 보냈습니다 다음은 Netflix 사용자, 전체 화면입니다 효율적으로 제목의 이미지, 시놉시스, 사용자의 상황에 맞는 정보를 제공하는 에피소드 목록 놀이를 치기 전에 그래서 한 가지, 내가 이전에 언급했던 것 불행히도 캡션 또는 창 컨트롤이 있습니까? 바 이 문제는 불행히도 적어도 지금은 창 부분이기 때문에 뷰 계층 구조 내에 있습니다

이제 뷰의 루트에 무언가를 넣는다면 계층 구조를 사용하면 실제로 뭔가를 엉망으로 만들 수 있습니다 당분간, 우리는 정말로 당신이 이런 종류의 일을하지 않도록 격려하십시오 그리고 프레임 워크 팀에 따르면, 이것은 어쨌든 그것을해서는 안되는 것이므로, 그러므로 시도하십시오 가능한 경우이를 피하십시오 다음은 실제로 항상해야한다는 것입니다

창 왼쪽 상단 모서리에 있다고 가정하지 마십시오 0, 0에있다 처음에는 캡션이 있기 때문에 가장 확실하지 않습니다 그런 다음 귀하의 콘텐츠를 제공합니다 그래서 항상 좌표를 얻으려고 노력하십시오

콘텐츠 원점을 기준으로 그리고 애플리케이션의 창 크기가 있다면, 캡션을 포함하여 실제로 창 크기가 표시됩니다 그래서 본질적으로 콘텐츠가 진짜 전체 창보다 조금 작습니다 불행히도 창 크기 조정에는 많은 장애물이 있습니다 그래서 앞에서 언급했듯이, 실제로 저장 및 복원 기능이 있어야합니다 그리고, 다시 한번,이 것은 당신을 도울 수있는 무언가입니다

안드로이드 세계에서 이는 Chromebook을위한 것이 아닙니다 어쨌든, 어쨌든해야합니다 따라서 구성 변경시 사용하는 경우 동적 레이아웃 작업을 수행하고 있습니다 거기에 추가하십시오

크기를 조정하지 않으려면 실제로 넣을 수 있습니다 크기를 조정할 수있는 활동 [? 양식,?] 이것은 대부분 사실입니다 크기를 조정할 수있는 [부적절한] 경우가 있습니다 그러나 대개 이것은 사실입니다 그리고 창 크기는 확실히 표시 크기가 아닙니다

따라서 항상 getActivity, getResources, getConfiguration, 화면 너비 및 높이 및 [? dp?] 창 크기가 실제 크기인지 알아 내기 위해 오 예 그러면 다음 단계는 현재 구성을 얻는 것입니다 행렬과 모든 것, 당신은 getResources, getConfiguration, 이미 그 계획에 어느 정도있었습니다 따라서 창 균형은 어느 시점에서든 바뀔 수 있습니다 그러니 그걸로 알아 두세요

당신이 정말로 화면 또는 창 크기를 미적으로 캐싱 어딘가에 우리는 단순히 일부 응용 프로그램에서도이를 보았습니다 그들이 처음 달릴 때, 그들은 그때 크기를 얻는다 그들은 화면의 어느 곳에서나 자신의 데이터를 저장하고, 그들은 다시는 그것을 보지 않습니다 그들은 모든 것을 확장하고 이후에 창 크기를 조정하면 모든 것이 재미있어합니다

정말로, 그것도 피하려고 노력하십시오 따라서 레이아웃 시스템을 사용하고 있다면, 모든 것이 자동으로 수행됩니다 그렇지 않으면 스스로 처리해야합니다 OpenGL을 통해이 작업을 수행 할 수 있습니다 꽤 정중하게 크기를 조정했지만 그래

따라서 네이티브 응용 프로그램이있는 경우, 실제로 시작 크기를 얻어야합니다 M 개의 마지막 콘텐츠를보고 XY [INAUDIBLE] 너비와 높이 실제로 당신은 또한 당신의 컨텐트를 사용할 수 있습니다, 그리고 당신은 확실히 모든 변화를 경청해야합니다 청취자를 통해 파이프를 내려오고 있습니다 따라서 어떤 종류의 변화라도 확실히보십시오 레이아웃 및 / 또는 창 크기에 발생할 수 있습니다 그래서 그걸로 마가렛의 짧은 시범을 보여 드리죠 크기 조정에 대한 장

MARGARET CHANG : 좋아요 고마워, 모두들 내 이름은 마가렛이고 오늘은 꽤 멋진 일들을 보여줄거야 Android 앱이 Chrome OS에서 수행 할 수있는 작업 사실, 저는 여기에 최신 크롬 북 중 하나 인 삼성 Chromebook Pro, 곧 출시 될 예정입니다 누가 (Nougat) [? rebase?]를 클릭합니다

시작하겠습니다 화면에서 꽤 작아 보입니다 그래서 이곳에서 볼 때 매우 어렵습니다 계속해서 앱의 크기를 조정하겠습니다 그리고 다시, 나는 그것을 일반적으로 할 수 있었다

이 작은 최대화 단추 또는 전체 화면 키를 눌러서 하지만 실제로 개발자 옵션을 사용하도록 설정했습니다 드래그하여 자유형 크기 조절을 수행 할 수있게 해줍니다 창 테두리 그러니? 콘텐츠는 실제로 훌륭하고 매우 아름답게 확장됩니다 또한 콘텐츠는 동적으로 업데이트됩니다

그래서 당신이 이런 일을 할 수 있다면 앱에 사용자가 더 많은 제어 권한을 부여하게됩니다 자신의 데스크톱 부동산 그리고 그걸로 다시 보내 드리겠습니다 Stefan에게이 개발자를 어떻게 활성화시킬 수 있는지 이야기 해주세요 옵션을 사용하면 앱에서도이 옵션을 사용할 수 있습니다

Sweet 고마워, 마가렛 따라서 개발자 옵션을 얻으려면 할 일만 있으면됩니다 먼저 Chrome 창에 들어가야합니다 설정으로 들어가서 Android를 입력합니다

그런 다음 강조 표시된 Android 섹션이 표시됩니다 Android 설정을 클릭합니다 사이드 팁, 당신은 실제로 선반에 들어가야합니다 마우스 오른쪽 버튼으로 클릭하고 선반에 고정하십시오 필요한 경우 나중에 더 빨리 액세스 할 수 있습니다

그리고 그로 인해 현재 두 가지 개발자 옵션이 있습니다 당신에 대한 관심 첫 번째는 동적 크기 조정 옵션입니다 따라서 확실히 켜고 시도해야합니다 귀하의 응용 프로그램을 테스트하십시오

그것은 실제로 처음으로 동적 인 것을 보아라 유동적으로 크기를 조정합니다 그러므로 유동적으로 크기를 조정하지 않으면 어떻게해야합니까? 실제로 활성화를 조사해야합니다 따라서 동적으로 수행하지 않는 경우, 그리고 당신은 레이아웃 시스템을 사용하고 있습니다 당신이 다시 시작하면 실제로 모든 자원을 당신이 사용하고 있다면, 그들은 캐쉬됩니다

다시 할당하지 않으려 고합니다 그게 시간이 걸리고 그 결과로 모든 과정이 이루어지기 때문입니다 훨씬 더 까다 롭고 좋아 보이지 않습니다 여러분이 우리 시위에서 보았던 것처럼, 정말 부드럽습니다 따라서 더 매끄럽고 멋지게 나옵니다

그리고 다음으로, 음, 앞서 말했듯이 우리는 이런 종류의 루트를 가지고 있습니다 [? 규칙 ?] 그리고 당신은 당신의 창문이 무엇인지 정확히 알지 못합니다 하기 그리고 혹시 그 점에 도달했다면 당신이 정말로 무엇을 보는지 확실하지 않은 곳, 당신은 항상 이걸로 두 번째 옵션을 켤 수 있습니다 내용을 표시하려면 – 창 상태 관리자는 창 제목 표시 줄에 표시됩니다

여기서 볼 수 있듯이, 예를 들어, 크기 조정이 가능한 N 개의 LU가 있습니다 그게 국가라는 뜻이야 U는 둘 다 할 수 있음을 의미합니다 현재 풍경입니다 크기를 조정할 수있는 N 개의 응용 프로그램입니다

일어날 수있는 가장 좋은 일 그래서 두 번째 옵션 – 아니 사실 나는 농담을하고 있었다 세 번째 옵션이 있습니다 그래서 이미 테스트를 원한다면 또 다른 테스트가 있습니다

최대화하면 실제로 옵션을 설정할 수 있습니다 기본 크기 및 방향, yada, 야다, 야다 그리고 너는 그걸 전화에 넣는다 크기가 지정된 창과 기본 세로 방향 세로 전용 응용 프로그램을 최대화 할 수 있습니다 따라서 그 것을 선택하면 초상화를 최대화 할 수 있습니다

응용 프로그램 내가 말했던 것처럼, 당신에게 그때 컨트롤 바를 줄 것입니다 그래서 우리는 기본적으로 그것을 돌리지 않았습니다 그러나 그것은 조만간 올 것이다 그러므로 이미 시도해 볼 수 있습니다

그래서 카메라를 사용한다면, 당신은 이미 뭔가를 본 것 같습니다 우리의 이전 실험에서 M 그게 당신이 응용 프로그램을 시작한 것이 었습니다 갑자기 모든 것이 어떻게 든되었다 회전, 정말 그렇게 좋지는 않았다

그래서 문제는 어떻게 이런 종류의 것들을 고칠 수 있는가하는 것입니다 글쎄, 우리가 너에게하고 싶은 첫 번째 일은 네가 적어도 N으로 이동하면 그리고 창 크기를 조절할 수있게 해드립니다 그래서, 우리는 모든 것을 일하게 만들 수 있어야합니다 너를 위해서 하지만, 불행히도, 당신은 실제로 작동하지 않는 몇 가지 엣지 케이스에 실제로 충돌 할 수 있습니다

따라서 간단히 그렇게하면 모든 것을 해결할 것입니다 그래서 창 관리자에서부터 입력 관련 주제에 이르기까지 이전에 말했던 것처럼, 전화는 조금 다릅니다 그리고 아마 네가 사용하지 않았을거야 키보드 또는 마우스를 휴대 전화와 함께 사용 하시겠습니까? 그래, 나도 마찬가지야

그래서 당신이해야 할 첫 번째 일은 화면에 입력 포커스 요소가 있습니까? 그래서 그 순간이 바로 Android입니다 당신이 실제로 무엇을할지 짐작하려고합니다 갖고 싶다 실제로 어떻게 지내고 있니? 그것을 통해 탐색 데스크톱에서는 그 이상을 기대합니다

예를 들어 탭 키를 사용하여 당신은 실제로 그것들을 두들겨보고 싶어합니다 방향키를 사용하고 싶습니다 그리고 이것은 안드로이드 (Android)입니다 그러나, 그것이 아닌 것처럼 키보드가 사용되지 않았기 때문에 실제로 많이 사용했습니다 그래서 당신이 그것을 사용하고 싶다면, 당신은 단순히 그것을 추가 할 수 있습니다

지적한대로 매니페스트 파일에 내 생각 엔, API 수준, 나도 몰라, 12 뭔가 아주 예쁘다 따라서 온라인으로 가서 확인하십시오 그것은하기 쉽고, 많은 사람들을 돕습니다 특히 접근성 등을 위해 키보드 동작을 처리하려면 다음 단계를 수행해야합니다

당신은 키 이벤트와 콜백 핸들러를 사용할 수 있습니다 따라서이 기능을 사용하면 실제로 모든 키보드를 가져올 수 있습니다 사건을 직접적으로 처리하고, 예를 들어, 게임에서 수정 자도 사용할 수 있습니다 예를 들어 Shift 키가 눌러 졌는지 체크 아웃 또는 뭔가, 그리고 당신은 그 다음에 특별한 행동을 할 수 있습니다

당신은 실제로 다시 구현할 필요가 없습니다 물론, 텍스트 편집 필드 그것은 이미 있습니다 그러나 텍스트를 편집하고 싶다면, 실제로 [? onkeydown,?] [? onkeylongpress,?] 및 [? onkeyapp?] 텍스트를 수행하려면 발각 [사용하지 마십시오? onkey?] [? preime?] 정말로 그렇지 않으면 전체 IME를 구현하려고합니다

당신은 그렇게하고 싶지 않습니다 이것을 우리에게 남겨두고 [?] 키만 사용하십시오 안돼?] [? 손질 ?] 그리고 우리의 텍스트 입력을 위해 Margaret을 떠났습니다 데모

MARGARET CHANG : 고마워요, 스테판 좋습니다 Adobe는 다음 단계로 나아가는 개발자입니다 Android에 키보드 단축키 구현 일반적으로 장벽을 깨는 앱 기존 모바일 사용자와 데스크톱 사용자간에 좋아, 여기 내가 가서 보여 줄거야 Adobe에서 구현 한 몇 가지 바로 가기가 있습니다

Lightroom 앱에 저장합니다 다음은 몇 장의 사진 모음입니다 나는 이미 내 도서관에있다 그리고 제가 할 일은 각 사진을 검토하고 0 ~ 5 개의 별을 평가하려고합니다 키패드에서 해당 숫자를 눌러서

시작하겠습니다 나는 이것이 놀라운 식사라는 것을 기억한다, 그래서 3 아름다운 장소, 아름다운 그림, 그래서 5 맛있는 식사,하지만 집에서 만든 4, 등등 당신은 내가 또한 횡단 할 수 있었다는 것을 여기서 볼 수 있습니다

탐색 화살표 키를 사용하여 사진을 살펴보십시오 좋아요, 그럼 이제 내가 만들고 싶다고 해봅시다 음식 사진 모음 나는 그것을 거부하기 위해 X를 누르고, P를 선택하고, 그리고 언제든지 이것을 되돌리려면 U를 클릭하면됩니다 내가 얼마나 쉽게 통과하고 구성 할 수 있었는지 알 수 있습니다

내 사진들 당신이 또한 구현할 수 있다면 앱에 대한 이러한 단축키 중 일부는 또한 사용자 생산성 워크 플로우를 향상시킬 수 있습니다 게다가 그래서 그걸로 스테판에게 돌려 줄거야 다른 하드웨어를 활용하는 방법에 대해 더 많이 이야기하기

마우스 및 스타일러스와 같은 기능 고마워, 마가렛 이제 모든 Chromeware 지원으로 이미 본 것처럼 스타일러스 모든 최신 버전이 포함되어 있습니다 음, 저기 나는 그것을 발견 할 수 없다 오, 거기에 없어요 큰 좋아요, 그래서 당신이 어떤 종류의 상관 없으면 입력 관련 일들, 예를 들어 어떤 장치인지, 글쎄, 너 끝났어 아무 것도 할 필요가 없습니다

이미 모션 이벤트를 사용하고 있다면, 그게 다 괜찮아 반면에, 당신이 관심이 있다면, 예를 들어, 펜 입력, 그럼, 실제로 모션 이벤트를 호출해야합니다 [? 얻을?] [? 두 종류?] 유형, 정확히 종류를 제공합니다 사용중인 기기의 그러면 압력과 기울기를 얻을 수 있습니다 그래서, 그러나, 물론, 당신입니다

이 이벤트 중 하나만 받고있다 프레임 당, 이는 다음과 같은 것을 의미합니다 우리가 당신에게 줄 수있는 모든 정밀함을 놓치고 있습니다 그래서 모든 것을 얻으려면 정밀한 움직임을 원한다 그리고 그것 때문에, 당신은 실제로 getHistorical, XY, 압력 및 축 값 당신에게 다음 전체 패스를 제공합니다

그래서 우리가 가지고있는 다른 것은 매우 정교한 손바닥입니다 거부 할 때도 마찬가지입니다 당신은 화면에서 손바닥을 사용하고 있습니다 그것은 실제로 어떤 종류의 그림으로 등록하지 않을 것입니다 하지만 문제는 먼저 당신이 이미 어떤 종류의 사건이 일어나고 있습니다

그래서 모든 것을 작동 시키려면, 당신은 [INAUDIBLE]을 먼저 얻고 펜은 내려 간다 또는 손가락이 내려갑니다 그리고 나서 당신은 아마도 약간 움직이고 있습니다 그런 다음 취소 통화가 발생합니다 이는 본질적으로 전체 패스 취소, 제거 할 수있는 신호입니다

전부 마가렛은 지금 우리에게 멋진 데모를 보여줄 것이다 MARGARET CHANG : 고마워 좋아요 실제로 앱이있는 앱을 살펴 보겠습니다

스타일러스 입력을 잘 활용하고 구현 일부 특정 스타일러스 기능 먼저 크롬 북을 넣으십시오 쓰기가 훨씬 쉬워서 태블릿 모드로 전환 할 수 있습니다 괜찮아 그러면 나는 앞으로 나아가서 신뢰할 수있는 스타일러스를 꺼내게 될 것입니다

기기를 시작하고 시작하겠습니다 오케이는 그리기 쉽고 스케치 할 수있는 앱입니다 그리고 당신은 내가 스크린을 가로 질러 나의 손바닥을 뒀던 것에 따라 여기에서 볼 수있다, 거기에는 흔적이 없습니다 동시에, 나는 손바닥으로 화면에 쓸 수있다 내 손바닥에서 그런 흔적은 없습니다

시스템이 손바닥을 감지하고 있기 때문입니다 및 이벤트 경로를 중단합니다 그런 다음 앱이이를 선택하고 실행 취소합니다 내 손바닥에서 지금까지 그려진 선 그래서 오징어가 한 가지는 그들은 압력 감도 기능을 구현했습니다

당신은 여기에서 볼 수 있습니다 그래서 그것이하는 것은 그것이 나를 허용합니다 내가 누르는 힘을 토대로 더 밝거나 어둡게하는 선을 만들기 위해 화면에 이것은 더 가벼운 라인은 더 가벼운 압력을 의미합니다 어두운 선은 더 무거운 압력 때문입니다

그래서 그걸로 너를 다시 보낼거야 스테판에게 입력을 감쌌다 고마워, 마가렛 다음은 입력 호환성 모드입니다 그래서 호환성있는 것 음, 아주 간단합니다

마우스를 아직 사용하고있는 사람은 아무도 없습니다 따라서 스크롤 휠에는 특별한 입력이 있습니다 Android는 이제까지 정의되었지만 누구도 사용하지 않습니다 크롬 북의 경우 이는 물론 불만입니다 예를 들어 마우스를 사용하는 경우, 스크롤하려고 할 때 아무 것도 움직이지 않을 것입니다

이 문제를 해결하기 위해 호환성 모드가 있습니다 그래서 우리가하는 일은 우리가 그 일을 바라 보는 것입니다 자동으로 변환 중입니다 터치 스크롤 이벤트에서 그리고 그것은 보통 당신을위한 두건의 밑에 행해진 다

당신이 이런 종류의 것들에 관심이 없다면, 모든 것이 간단하게 작동합니다 그러나 이런 종류의 일들에 관심이 있다면 및 기타 특수 입력 [? 퀼트,?] 실제로 매니페스트의 사용자 섹션에서 지정할 수 있습니다 파일, Android 하드웨어 유형 PC 네가 그렇게한다면 – 그렇지 않으면 거짓으로 사용하십시오 크롬 북에서만 실행 – 그럼 당신은 모든 다른 입력의 전체 폭을 얻을 것입니다 가능한 이벤트

그리고 예, 우리는 조금 짧게 달리고 있기 때문에, 나는 이것을 조금 더 빨리하려고 노력할 것이다 그러니까, 당신은 실제로 그때 얻고 있습니다 적절한 스크롤 이벤트가 발생하면 체크 아웃하십시오 두 손가락 터치 패드를 구별 할 수 있습니다 터치 스크린 스크롤링에서 스크롤링 getSource를보고 그리고 드래그 작업을 구별 할 수 있습니다

터치 패드 컬렉션에서 드래그 앤 드롭 작업 그래서 이것은 마지막 단락으로 나를 데려옵니다 긍정적 인 사용자를 보장하기 위해 응용 프로그램을 테스트하는 방법 경험 그래서 먼저, 당신은 분명히해야합니다 모든 매니페스트 파일이 순서대로 있는지 확인하십시오

그래서 당신이 지정하고 있다는 것을 의미합니다 사용할 방향, 사용하려는 크기, [INAUDIBLE] 사용하려는 경우 체크 아웃하십시오 그 최소 너비, 최대 너비, 그리고 이러한 모든 종류의 것들, 실제로 제대로 지정됩니다 특별 행사에 관심이 있다면, Android 하드웨어 유형 PC를 사용하십시오 모든 사건을 알려줘

그런 다음 반드시 창의 크기 조정을 테스트해야합니다 그래서 정말 길게 만드십시오 가능한 한 창의 크기를 조정하십시오 개발자 옵션을 사용하고 있는지 확인하십시오 모든 것이 부드럽고 부서지는 것이 아닙니다

그런 다음 태블릿에서 노트북 형식으로 장치를 변경하십시오 모든 것이 잘 작동하는지 확인하십시오 또한 캡션, 창 컨트롤 막대, 일종의 분수로 입력 이벤트를 상쇄하지 않습니다 화면의 안전하고 복원이 작동하는지 확인하십시오

제대로, 당신이 제대로 복원하고있다, 모든 것이 잘 작동한다는 것입니다 네 곧 우리는 당신을위한 에뮬레이터를 갖게 될 것입니다 실제로 휴대 전화를 꺼내야합니다 실제로이 스크린 샷을 만들어야합니다

아무도 매우 흥미 진진한 지름길을 기억할 수 없기 때문에, googl/Q8ptkZ 우리의 가상 머신에 가입하려면, 당신은 실제로 그것을 할 수 있습니다 그리고 우리는 실제로 당신을 보냅니다 준비가 완료되면 바로 미리보기가 가능하며 이는 곧 이루어져야합니다

그래서 그것으로, 당신은 실제로 지역적으로 모든 것을 개발할 수 있어야한다 Chromebook을 사용할 필요가 없습니다 더 구체적인 질문이 있으시면, 개발자 사이트로 이동하십시오 developerandroid

com/topic/arc에서 이 페이지를 업데이트 할 것입니다 지금까지는 업데이트해야하지만 더 많은 내용을 추가 할 것입니다 시간이 지남에 따라서 세션을 요약하고 마무리하겠습니다 나는 지금 매우 빠르게하고있다

따라서 테이크 어웨이는 이미 귀하의 신청서가 작동 중입니다 모든 것이 좋습니다 당신은 정말로 걱정해서는 안됩니다 음, 아마도 걱정해야 할 것 같아 당신은 확실히 그것을 시도해야합니다

반드시 API로 이동해야합니다 레벨 24는 작은 창문에 집착하지 않으려는 경우입니다 거대한 스크린을 계획하십시오 매우 중요합니다 응용 프로그램의 크기를 조정할 수 있습니다

매니페스트에 공급 업체 요구 사항을 지정해야합니다 파일, 이전에 언급했다 창 방향과 일관성을 유지하십시오 모든 멋진 데스크톱 기능을 추가하십시오 데스크톱을 데스크톱으로 만들고 있습니다

[음악 재생]

Developer Keynote (Google I/O ’18)

안녕하세요, 여러분 저는 제이슨입니다 연례 개발자 회의에 다시 서게 되어 기쁩니다 오전에는 수십억명의 사용자들을 위해 우리가 하고 있는 일을 얘기했습니다 이제 저는 아주 훌륭하게 매일의 문제들을 해결하기 위해 노력하고 계시는 여러분, 개발자들을 위해 우리가 하는 일에 대해 말씀드리고자 합니다 여기 쇼라인 시어터에 오신 분들이나 생방송으로 보고 계신 분들, 500여개의 추가 행사에서 보고 계시는 분들 모두 환영합니다 제 일을 사랑하는 이유 중 하나는 전 세계 개발자들을 만나고 그들의 계획이나 고민을 들을 수 있다는 점입니다 개발자들의 이야기를 들으면서 우리 구글이 어떻게 개발자들을 도울 수 있을지 우리 상품을 더 훌륭하게 만들지 생각해봅니다 라고스, 바르샤바 그리고 자카르타에서 제가 분명하게 깨달은 한 가지는 서로 도우며 문제를 해결하기 위해서는 폭 넓은 개발 커뮤니티의 역할이 매우 중요하다는 것입니다 이런 선행을 나누는 문화는 이 업계에서 일하면서 가장 좋은 점 중 하나입니다 구글의 개발자 그룹과 전문가들이 이뤄낸 것들에 대한 이야기에 저는 언제나 감동받습니다 오늘 이 자리에도 자리해 주셨군요 매년 그들의 도움으로 140개 국가에 사는 백만명 이상의 개발자들을 직접 만납니다 우리의 여성 기술자 프로그램을 통해서 매년 10만명 이상의 여성이 커리어 개발을 할 수 있도록 합니다 우리 개발자 커뮤니티는 우리에게 정말 중요합니다 개발자 여러분의 노력 없이는 이 모든 것이 불가능했을 것입니다 또한 지난 2년 동안 구글 개발자 수가 두 배로 늘어났습니다 라얀 자하브같은 대단한 사람들이죠 라얀은 지역 구글 개발자 그룹과 레바논 여성 기술자 그룹을 만들었습니다 또한, 레바논과 시리아의 난민 소녀들을 위한 웹 개발 트레이닝 프로그램을 시작했죠 사물인터넷과 안드로이드 전문가인 요하네스버그의 레베카도 있습니다 문화보존을 향한 열정으로 아이들이 아프리카어로 책을 읽을 수 있는 오픈 소스 어플을 만들고 있습니다 이 두 분이나 여러분과 같은 개발자들이 없었다면 오늘날의 구글이 존재하지 않았을 겁니다 감사합니다 오전에 순다가 말했듯이 인공지능 혁신 속도는 놀랍습니다 완전히 새로운 능력이 우리가 하는 모든 일을 바꾸어 놓을 것입니다 정말 기쁜 것은 우리가 그 변곡점에 있다는 것이죠 한 분야의 전문가만이 쓸 수 있었던 인공지능이 이제는 누구나 사용할 수 있게 되었습니다 좀 더 이해하기 쉽게 말해볼까요 저는 완전히 평범한 고등학생이라고 제 자신을 소개하고 싶습니다 친구들과 놀거나 영화 보고 네일 아트 받는 걸 좋아해요 요즘은 콘볼루션 신경망을 활용한 기계 학습에 빠져있어요 왜 웃는지 모르겠네요 어렸을 때부터 궁금한게 많던 아이에요 왜죠? 어째서요? 어떻게 이렇게 되나요? 늘 알고 싶어하고 움직이고 싶어하고 다양한 것들을 하고 싶어했어요 처음부터 컴퓨터 과학을 좋아한 건 아니에요 저희 엄마가 마당에 장미를 기르셨는데 계절마다 꽃이 병들었어요 어떤 병인지 진단을 내려야 했죠 샤자는 방법을 찾고 싶어 했어요 손 선생님과 연구 수업을 해야겠다는 생각을 갖고 있었어요 여름 방학에 앉아서 기계에게 식물의 질병을 구별하도록 가르치고 싶은 사람이 어디 있겠어요? 그런데 이 아이는 그러고 싶어했죠 전 사람들이 사진만 가지고 식물의 질병을 진단할 수 있는 방법을 찾고 싶었어요 그래서 텐서플로우를 배우기 시작했죠 매일 밤 동영상을 보고 블로그를 읽었어요 샤자는 필요한 모든 배경지식을 독학하고 자신에게 묻기 시작했죠 이제 이걸로 뭘 할 수 있을까? PlantMD는 식물 사진을 찍으면 어떤 식물인지 식물의 건강상태는 어떤지 알려줘요 병에 걸렸다면 어떤 병인지도요 제 첫 번째 질문은 "이게 니 휴대폰에만 있는 앱이니?"였죠 아니라고 하더군요 누군가 앱을 다운로드해서 쓰고 있다고 했어요 정말 놀라웠어요 너무 자랑스러웠죠 코딩을 하기 위해서 엄청난 천재여야 할 필요는 없어요 아이디어와 끈기가 있다면 누구나 할 수 있죠 오픈 소스 기술과 인터넷에 있는 풍부한 정보가 우리 세대에 엄청난 힘을 줬어요 제가 생각한 게 무엇이든지 할 수 있다는 걸 알고 있어요 저뿐만 아니라 누구든 그럴 수 있다는 것도요 멋지지 않나요? 영광스럽게도 샤자와 샤자의 가족이 오늘 이 자리에 오셨습니다 바로 이것이 텐서플로우나 ML키트 같은 기술을 제공하는 이유입니다 개발자로서 각자의 앱에 모듈을 놓고 코드 몇 줄 더해서 새로운 능력을 불어넣어 줄 수 있죠 이는 무한한 기회의 시작일 뿐입니다 기업으로서 우리는 최신 기술을 활용해 개발자들이 중요한 것들을 만드는데 도움이 되고자 합니다 그래서 오늘 보여드릴 것은 여러분들이 하는 일을 더 쉽게 만들기 위해 우리가 하고 있는 것들입니다 이제 한 시간 동안 저희가 공개하는 새로운 능력과 여러분이 매일 사용하시는 플랫폼과 툴의 개선사항에 대해서 발표하겠습니다 그럼 첫 번째로 최신 버전의 안드로이드를 소개할 스텝입니다 안드로이드는 전세계적으로 성장하고 있습니다 수십억개의 기기에 사용되고 매달 수십억개의 앱을 다운받으면서요 이에 따라서 우리 개발자 커뮤니티도 빠르게 성장하고 있습니다 중국, 인도, 브라질에서 IDE를 사용하는 개발자의 숫자가 2년 사이에 거의 3배가 되었습니다 놀라운 성장을 바라보면서 이 거대한 생태계에 대한 막중한 책임감을 느낍니다 여러분이 주시는 피드백으로 매년 여기서 발표하는 것들이 생겨난다고 느끼신다면 맞습니다 작년의 코틀린처럼요 완전히 지원 가능한 언어로 만들었기 때문에 안드로이드에서 사용할 수 있는 더 많은 지원들이 출시되었습니다 이미 프로 개발자의 35%가 코틀린을 사용하고 있습니다 매달 이 숫자는 증가하고 있죠 코틀린 사용자의 95%가 만족하고 있습니다 점점 더 많은 안드로이드 개발이 코틀린을 향하고 있습니다 저희는 장기적인 노력을 할 계획입니다 아직 써보지 않으셨다면 써보세요! 여러분의 피드백으로 플레이 콘솔, 안드로이드 스튜디오, 그리고 코틀린에 대한 우리의 투자가 결정된 것처럼 올해도 여러분의 피드백이 우리의 결정을 만들 겁니다 오늘 제가 할 이야기는 세 가지입니다 첫 번째는 배포입니다 앱을 아주 작게 만들어서 더 많이 설치할 수 있게 하는 거죠 두 번째는 개발입니다 더 좋은 API를 가지고 더 빨리 만들 수 있도록 하는 거죠 세 번째는 참여입니다 더 많은 사용자들이 참여하게 하는 거죠 그럼 바로 설치에 대해 이야기 해볼게요 안드로이드가 성장하고 있습니다 이건 좋은 일이죠 앱 크기 또한 커지고 있는데 이건 좋은 일이 아니죠 앱이 점점 더 많은 사람과 국가를 대상으로 만들어지고 있습니다 즉, APK에 더 많은 언어와 기능이 추가된다는 말이죠 앱이 커질수록 설치율은 줄어듭니다 대부분 이게 신흥 시장에서나 발생하는 문제라고 생각하지만 모두에게 일어나는 현상이죠 그럼 어떻게 하면 더 쉽게 크기가 작은 앱을 만들 수 있을까요? 제일 좋은 방법은 너무 힘든 방법이었습니다 앱 서빙 스택 전체를 바꿔야 했어요 하지만 그게 옳은 방법이었죠 오늘 안드로이드를 위한 새로운 앱 모델을 소개하게 되어 기쁩니다 안드로이드 앱 번들은 새로운 퍼블리싱 포맷으로 앱 크기를 엄청나게 줄일 수 있습니다 앱이 모든 기기에서 작동이 되려면 많은 리소스가 필요합니다 이 번들은 모든 리소스를 탑재했지만 모듈화되어 있습니다 구글 플레이의 새로운 다이나믹 딜리버리는 다운로드를 할 때 특정 기기가 필요로 하는 리소스와 코드만을 전달합니다 많은 개발자들과 테스트를 해봤고 엄청나게 공간을 절약할 수 있었죠 링크드인의 크기는 23% 줄었고 트위터의 크기는 35% 줄었어요 조모는 50%나 줄었죠 그렇다면 얼마나 많은 기기에서 사용 가능할까요? 답은 99%입니다 스플릿츠와 멀티APK처럼 오래된 플랫폼 컨셉으로 만들어졌기 때문입니다 여러분이 사용할 때도 아주 쉽게 만들고자 했습니다 그래서 여러 개발팀과 아주 중요한 역할을 한 어떤 분의 데모 버전을 보여드리고자 합니다 톨을 환영해주세요 고마워요 스텝 저는 지금 안드로이드 스튜디오에서 앱을 만들고 있습니다 이걸 좀 더 작게 만들고 싶어요 APK 분석기를 열어보겠습니다 보시다시피 리소스가 용량을 많이 차지하죠 밀도가 다른 큰 이미지 폴더도 몇 개 있네요 새로운 다이나믹 딜리버리 플랫폼으로 이런 앱이 혜택을 볼 수 있어요 단 한 줄의 코드도 바꿀 필요가 없어요 앱 번들로 다시 만들기만 하면 돼요 그럼 APK 생성 다이얼로그를 호출해 볼게요 안드로이드 앱 번들 옵션이 새로 생긴 거 보이시죠 다음은 제 키 스토어를 입력합니다 구글 플레이의 암호 키를 내보내게 할 수도 있습니다 플레이 스토어에서 제 앱을 분해해서 다시 작은 버전으로 재결합시키기 위한 거예요 그리고 만들기를 실행합니다 다 되면 번들 파일이 생성된게 보입니다 여러분이 이미 알고 계시고 좋아하는 APK 파일과 똑같아 보이죠 하지만 추가적인 메타 데이터가 있어요 플레이 스토어의 마법과 같은 거죠 좀 더 효율적으로 제가 이미 플레이 콘솔에 저의 앱 번들과 로그인 키를 업로드했다고 가정해봅시다 그럼 이렇게 되는데요 플레이 콘솔에 앱 번들 익스폴로어라는 새로운 페이지가 있습니다 오른쪽에 있는 큰 숫자를 보세요 제가 이 업데이트를 하면 사용자들이 약 29%의 용량을 줄일 수 있다는 뜻이죠 이 페이지는 그게 어떻게 가능한 건지를 보여줍니다 결국 스튜디오로 안드로이드 앱 번들을 만드는 것은 아주 쉽고 여러분 모두가 시도해 보시고 여러분과 여러분의 사용자를 위한 비슷한 결과물을 얻으시길 바랍니다 이 모든 것들은 지금 사용가능합니다 앱 번들과 다이나믹 딜리버리는 바로 오늘 배포되었습니다 또 다른 방법으로 설치율을 늘려보려고 합니다 구글 플레이 인스턴트가 게임 개발자 회의에서 공개되었습니다 게임을 설치할 필요 없이 실행할 수 있게 하죠 이 기능을 적용한 게임의 플레이어 수는 20% 증가했습니다 오늘 여기서 모든 게임 개발자들에게 이 기능을 사용할 수 있음을 알려드립니다 지금 당장 확인하고 싶으시다면 캔디 크러쉬 사가를 실행해 보세요 오늘 적용된 기능이니까요 또한 개발을 더 쉽게 하기 위해 유니티 플러그인과 코코스 통합을 공개하겠습니다 앱 개발을 더 쉽게 만들어 줄 두 번째 테마로 넘어가볼까요? 안드로이드의 API도 더 쉬워질 수 있습니다 어떤 사람은 말하길 안드로이드에서 무엇이든 할 수 있는 6가지 방법이 있다고 합니다 아키텍쳐 컴퍼넌트가 작년에 출시됐었죠 새로운 아이디어를 위한 시험대였습니다 라이프 사이클이나 데이터 같은 여러분이 표시한 인기 분야에서 시작되죠 오늘날 많은 인기 앱이 실제로 이 기능을 사용합니다 여러분들의 반 이상이 이미 사용 중이거나 내년에 사용할 계획이라고 답했습니다 오늘 안드로이드 개발 촉진을 위한 차세대 안드로이드 API인 안드로이드 제트팩을 소개합니다 제트팩은 라이브러리와 툴 세트입니다 서포트 라이브러리와 아키텍쳐 컴포넌트를 포함시켜 기본 DNA를 설정했습니다 제트팩은 이들을 유지하고 모든 분야에서 더 많은 라이브러리와 작업 관리, 네비게이션, 페이징, 슬라이스, 코틀린 확장을 가능하게 합니다 모든 라이브러리는 이전 버전과 호환이 가능합니다 95%의 기기에서 사용 가능한거죠 백그라운드 작업을 계획하는 것이 굉장히 힘들었습니다 이제 워크 매니저를 이용해서 어디서나 이용 가능한 단일 API를 편리하게 쓰실 수 있습니다 제트팩은 간소화된 API 그 자체입니다 이미 써 보신 분들은 코드의 양이 3분의 1로 줄었다고 말합니다 제트팩과 코틀린은 상호 협력하도록 만들어졌습니다 리딩과 라이팅을 위해 필요한 코드만을 사용하도록 만들어졌죠 Rxjava나 매터리얼 디자인과 같은 안드로이드 개발을 통해 얻은 훌륭한 경험이 있었기 때문에 제트팩은 시간을 절약할 수 있습니다 또한 제트팩의 API는 IDE와 통합되었습니다 예를 들어 안드로이드 스튜디오는 이제 네비게이션 에디터를 포함합니다 라이브러리와 함께 사용 가능하죠 그러므로 칠판에 적듯이 앱 플로우를 시각화할 수 있습니다 새로운 스크린을 추가하거나 플로우에 놓을 수도 있습니다 여러분의 작업 도중에 저희가 내부적으로 백 스택과 조건적 플로우 관리를 도울 수도 있습니다 전반적으로 IDE툴은 개발을 빠르게 하기 위한 좋은 도구가 될 것입니다 그래서 제트팩을 사용하는 번들에는 스튜디오 지원이 이루어 질 예정입니다 일상적인 업무를 빠르게 하기 위한 작업 역시 하고 있습니다 에뮬레이터 부팅 시간에 대해 의견을 주신 분들이 있는데요 지금 그 결과를 보여드리겠습니다 우선 저희 에뮬레이터가 얼마나 빨리 시작하는지 보여드리겠습니다 제자리에, 준비, 시작! 보시다시피 거의 순식간입니다 속임수 쓰는 거 아니고요 백그라운드에서 실행 중이지도 않았고요 이렇게 빨라진 것은 스냅샷을 지원하기 때문입니다 바로 빠르게 로딩할 수 있는 파일에 에뮬레이터의 완전한 상태를 저장하는 것입니다 여러분도 이 스냅샷을 직접 만드실 수 있어요 오픈GL 3D 스트레스 테스트 중에 만든 스냅샷을 가져와 보겠습니다 제자리에, 준비, 시작 약 2초 걸렸죠? 잘 구동되고 있습니다 속도가 정말 빨라졌어요 에너지 프로파일러를 추가하고 향상된 시스템 트레이스와 통합했습니다 이제 C++ 프로파일러가 있어요 우리 안드로이드 플랫폼에서 직접 테스트 해보고 D8 컴파일러를 안정적으로 만들었어요 초기 설정부터 더 작고 빠른 바이너리를 쓸 수 있습니다 ADB 커넥션 어시스턴트를 추가하고 나서 '왜 이걸 저 기기에 직접 연결하지 않지?'라고 생각했어요 이렇게 안드로이드 개발이 이루어졌고 더 빠르고 쉬워지기까지 했죠 여러분도 안드로이드 스튜디오와 제트팩 프리뷰를 오늘 써 보시길 바래요 아직 시작하는 단계이긴 하지만 새로운 라이브러리도 써 보세요 제트팩은 이제 시작에 불과합니다 더 많은 새로운 아이디어를 테스트해보는 중이고 몇 달 내에 출시할 수 있기를 바라고 있습니다 일단 앱을 만들어서 설치가 되면 사용자들이 돌아와 주기를 원하죠 데이브가 보여줬던 슬라이스는 사용자들의 재참여를 장려하는 새롭고 좋은 방법입니다 우리는 만들기 쉽기를 바랍니다 그래서 여러분에게 기능이 많고 바꾸기 쉬운 템플렛을 제공해 여러분이 만들기 쉽게 해 드릴 겁니다 줄과 그리드 몇 개처럼 아주 간단한 것부터 시작해서 그 다음 텍스트와 이미지같은 컨텐츠를 더하는 거죠 정적인 컨텐츠 뿐만 아니라 실시간 데이터와 풍부한 컨트롤 또한 사용할 수 있습니다 이렇게 잘 조합을 해서 세팅을 완성하고 나면 각 슬라이스가 교류할 수 있도록 코드를 더할 수 있습니다 음악을 잠깐 멈추거나 다음 음악을 재생하는 것 처럼요 그럼 여러분의 앱에 이렇게 멋진 미니 스니펫을 갖출 수 있게 됩니다 제트팩을 사용했기 때문에 95%의 기기에서 작동되죠 제트팩이 만들어 갈 세상에서 새로운 기능을 만드는 힘을 알 수 있죠 오늘 오신 모든 분들이 직접 해 보실 수 있게 준비되었습니다 이번 여름부터 여러분의 슬라이스가 써치에서 보일 겁니다 P 런칭, 어시스턴트와 함께 올해 소개될 것입니다 안드로이드의 상위 투자 분야에 대해 짧게나마 설명을 드렸고요 여러분의 피드백이 어떻게 반영되어 결과가 만들어졌는지 보여드렸습니다 그럼 이제 멋진 기기들로 이야기의 주제를 바꿔보겠습니다 올해 국제전자제품박람회에서 레노버, 하만, LG, iHome이 안드로이드 씽즈를 활용한 상품을 제작 중이라고 발표했습니다 안드로이드 씽즈는 사물인터넷 상품을 개발하는 강력한 플랫폼입니다 이번 주에 안드로이드 씽즈는 개발자 시연회에서 1

0단계로 이관되어 누구나 상업기기를 만드는 데 사용할 수 있게 준비 중입니다 오늘 여기 오신 모든 분들은 안드로이드 씽즈 개발자 키트를 무료로 받으실 수 있습니다 빨리 받고 싶으시면 보물찾기에 참여해 주세요 참여하지 않으셔도 내일까지는 모두 받으실 수 있습니다 더 많은 기기로 확장을 계속해 나가면서 우리 팀과 어시스턴트 팀은 함께 일해왔습니다 브래드 아브라함스씨가 자세히 이야기 해주실 겁니다 좋아요 고마워요 스텝 오전에는 어시스턴트가 얼마나 대화형이고 시각화되었는지 또 어떻게 사용자들이 작업을 하고 시간을 절약하고 사용을 쉽게 하도록 도왔는지 들으셨죠? 여러분과 같은 개발자들이 이 성과에 큰 도움이 되어주셨습니다 어시스턴트가 5억개가 넘는 기기에서 더 유용해 질 수 있게 했습니다 도어대시, 피트비트, 투두이스트, 스타벅스, 디즈니 그 외에도 많은 곳에서 액션즈를 만들어 사용자들의 참여를 이끌어내고 있습니다 GE, 알로, 샤오미, 로지테크와 같은 스마트홈 제조사들은 어시스터트를 활용한 기기를 5천여대 이상 만들었습니다 제가 하고 싶은 말은 구글 어시스턴트는 준비가 됐습니다 구글과 여러분이 만들어낸 총 백만개가 넘는 액션즈를 활용할 준비가 됐습니다 이 플랫폼의 상승 속도는 매일같이 가속도가 붙고 있습니다 현재 총 16개의 언어로 사용 가능하고 휴대폰, 스마트 스피커, TV, 자동차, 시계,헤드폰과 같은 다양한 기기에서 쓸 수 있습니다 완전히 새로운 기기인 스마트 디스플레이에서도 올해 7월부터 사용 가능합니다 새로운 대화형 컴퓨팅의 시대에 많은 분들이 관심을 가져주셔서 정말 기쁩니다 사실상 50만명이 넘는 개발자들이 우리의 대화형 개발 툴인 다이얼로그플로우를 공부하고 사용하고 있습니다 오늘 앱 개발자들과 웹 개발자들이 구글 어시스턴트를 더 쉽게 이용할 수 있다는 점을 여러분께 알려드릴 수 있어서 매우 기분이 좋습니다 어시스턴트 액션을 동반자처럼 여겨주시면 좋을 것 같습니다 스마트 스피커나 차에서도 사용할 수 있습니다 휴대폰이나 랩탑을 사용할 수 없는 어느 곳에서든 주요 자산에 접속할 수 있죠 사용자들을 위해 액션을 개인화시키고 싶으시다면 계정 연결을 통해서 앱과 액션의 상태를 쉽게 공유할 수 있습니다 이제 디지털 구독만으로 어시스턴트 액션에 직접적으로 연결된 여러분의 안드로이드 앱을 통해 사용자들이 구매한 컨텐츠와 디지털 상품을 아무 무리 없이 즐길 수 있게 된 것입니다 이코노미스트 앱을 예로 들어볼게요 저는 이코노미스트의 프리미엄 구독자이기 때문에 어느 어시스턴트 실행 가능 기기에서나 프리미엄 컨텐츠에 대한 접근 권한이 있습니다 당연히 참여 액션을 만드는 데 있어서 단지 디지털 구독이 다는 아닙니다 오늘 오전에 데모를 통해 보신 것처럼 어시스턴트는 휴대폰이나 스마트 디스플레이 같은 기타 기기에서 풍부한 시각적 상호 작용을 포함한 대화를 가능하게 해 주는 캔버스가 되고 있습니다 오늘부터는 여러분이 액션의 모양을 커스터마이징하실 수 있습니다 오늘 테이스티와 스타벅스의 데모 버전을 통해서 무엇이 가능한지 알아차리셨을텐데요 제가 또 다른 예를 보여드리겠습니다 스마트 디스플레이에 있는 킹 포 어 데이라는 게임입니다 여기서 보든 휴대폰이나 티비로 보든 아주 멋있습니다 어시스턴트 액션을 만들면 당연히 많은 사람들이 참여해서 경험하기를 원하게 되겠죠? 그와 관련하여 제가 말하고 싶은 것은 세 가지입니다 첫 번째, 저희는 액션 링크스라는 새로운 기능을 활용해서 여러분의 액션을 홍보하기 더 쉽도록 만들고 있습니다 여러분의 액션에 직접적으로 연결되는 어떤 포인트에서든 이용하실 수 있는 하이퍼링크입니다 예들 들어 드리겠습니다 헤드스페이스는 구글 어시스턴트를 활용해 사람들의 명상을 도울 수 있는 훌륭한 서비스를 만들었습니다 새로운 컨텐츠가 생기면 이에 대한 블로그 포스팅이 있을 겁니다 이 포스트 하단에 보시면 액션 링크가 있습니다 이 링크를 누르면 바로 구글 어시스턴트와 연결된 헤드스페이스 액션이 작동합니다 이미 액션을 만들었고 전세계에 홍보를 하고 싶다면 오늘 시작하세요 액션 콘솔에 방문해서 공유 가능한 액션 링크를 찾아보세요 그러면 이제 새로운 사용자들이 생기고 여러분은 이 사용자들이 참여하기를 원하겠죠 그 기능이 바로 액션 노티피케이션입니다 액션 노티피케이션에 사용자들이 동의하면 새로운 기능과 컨텐츠에 대해 연락할 수 있는 방법이 생기는 거죠 사용자들이 여러분의 안드로이드 앱을 설치하고 있지 않더라도 이 알람은 작동합니다 이제 어시스턴트에 범 서피스 알림이 생기면서 스피커나 스마트 디스플레이, 기타 어시스턴트 사용 가능 기기에서 사용자들의 재참여를 높일 수 있습니다 하지만 지속적으로 재참여율을 높이려면 사용자들의 일상에 자리잡아야 합니다 이런 이유로 어시스턴트에는 일상 생활을 지원하는 기능이 있습니다 아침에 일어나는 것, 출근하는 것 같은 다양한 일상 업무들에 대해 하나의 명령어를 통해서 다양한 액션을 실행할 수 있습니다 이제 루틴 제안을 사용해서 누군가 여러분의 액션에 참여하면 몇 번의 두드림만으로 그들의 일상 생활에 그 Action을 추가할 수 있도록 홍보할 수 있습니다 예를 들어, 제가 출근할 때 어시스턴트가 교통체증에 걸리지 않게 길을 안내해주고 스타벅스에서 아메리카노를 주문해 주기도 합니다 액션 링크스와 액션 노티피케이션, 루틴 제시를 통해 여러분들이 어떻게 참여를 유도할 지 기대가 됩니다 사람들에게 맞는 액션을 연결시켜 주는 방대한 도전은 웹의 초창기 시절에 대한 추억을 불러 일으킵니다 지난 20년 동안 우리는 사람들이 바른 정보와 서비스, 컨텐츠를 접할 수 있도록 하는 많은 시도를 해 왔습니다 그를 통해 얻은 전문성을 구글 어시스턴트에 탑재한 거죠 예를 들어, 누군가 "구글, 지도 문제 내 봐"라고 하면 어시스턴트는 즉시 관련 게임을 제안해야 합니다 이것이 가능하려면 우리는 사용자의 기본 의도가 무엇인지 파악해야 합니다 이것이 어려운 이유는 사용자가 게임을 제안하는 방식이 수천개가 넘기 때문이죠 이런 복잡성을 다루기 위해서 사용자가 제안하는 모든 방식을 내장된 의도 분류에 그려놓습니다 오늘 그 의도 분류를 처음으로 공개해 보겠습니다 여러분의 액션이 하는 일을 이해하기 쉬워지실 겁니다 몇 달 내에 수 백개의 내장된 의도분류가 공개될 겁니다 이를 가지고 여러분이 어떻게 사용자들을 위해서 구글 어시스턴트 경험을 확대하고 풍부하고 현실감 있는 교류를 만들고 지속적인 참여를 이끌어 낼 지 많은 기대를 하고 있습니다 더 알고 싶거나 바로 액션을 만들어보고 싶다면 actionsgooglecom에 방문해 주세요 이제 웹 플랫폼을 안내해 줄 탈을 소개하겠습니다 감사합니다 브래드 고마워요 정보의 자유로운 이동을 보장한다는 점에서 웹이 전 세계에서 가장 중요한 자원이라고 해도 과언이 아니라고 생각합니다 웹은 근본적으로 독립적인 공개 플랫폼입니다 그러므로 개발자들은 웹을 통해서 어느 기기에서나 전 세계의 모든 사용자들에게 연결될 수 있습니다 사용자들은 웹을 통해서 실제로 접촉하지 않고도 경험을 쌓을 수 있습니다 링크를 누르면 페이지가 열립니다 이러한 특징은 웹을 엄청난 규모로 성장하게 했고 매달 50억개 이상의 기기가 웹에 접속하고 있습니다 페이지 랭크의 초기 단계부터 직접 우리의 브라우저를 만들기까지 구글은 웹의 지속적인 성장과 접근성에 많은 투자를 해왔습니다 그리고 그 안에서 우리는 두 가지의 목표를 가지고 있습니다 첫 번째는 웹 플랫폼 자체를 더 강력하고 유용하게 만드는 것입니다 두 번째는 이 기능을 여러분이 쉽게 활용하도록 돕는 툴을 만드는 것입니다 지난 몇 년간 다른 브라우저와 더불어 크롬의 플랫폼에 기능을 추가하고 프로그레시브 웹 앱 혹은 PWA라고 불리는 새로운 웹 서비스를 지원해 왔습니다 PWA는 사용자가 오프라인에서도 작업할 수 있고, 푸시 알림을 보내고 사용자의 홈스크린에 바로 추가도 할 수 있게 하는 현대의 웹 플랫폼 API를 가장 잘 활용할 수 있는 웹사이트입니다 보편적으로 PWA를 만든 기업들은 엄청난 성과를 얻었습니다 인스타그램을 예로 들어 볼게요 인스타그램은 작년에 저가기기 사용자들에게도 접근성을 제공하기 위해서 PWA를 공개했습니다 그 결과 웹 사용자 보유율을 두 배로 늘릴 수 있었습니다 타임스 인터넷 또한 상품 전체에 PWA를 도입하고 '이코노믹 타임스'PWA에 사용자가 머무는 시간이 87% 상승했습니다 스타벅스는 PWA를 출시하고 웹사이트의 일별, 월별 활성화 사용자가 두 배로 늘었습니다 웹이 다른 기기나 플랫폼에서도 상관 없이 작동하기 때문에 모바일 PWA는 데스크탑 웹에서도 잘 적응할 수 있었습니다 사실 데스크탑 버전에서 받은 주문량이 모바일 버전 주문량과 거의 같을 만큼 많아졌습니다 단지 이 기업들 뿐만이 아닙니다 구글에서 광고하는 사이트들이 PWA로 사이트를 전환했을 때 평균 모바일 환산율이 20% 증가하는 것을 확인했습니다 구글에서도 PWA로 많은 상품을 만듭니다 구글 지도도 빠르게 데이터 중심의 기능을 제공하기 위해 새로운 모바일 PWA를 출시했습니다 구글 홈페이지도 PWA입니다 네트워크에서 50% 더 적은 자바스크립트 로딩을 하고 오프라인에서 검색어 재시도같은 기능을 지원합니다 요즘의 PWA에 대한 투자는 그 어느 때보다 활발합니다 크롬 OS는 PWA에서 네이티브 서포트를 제공하고 독자적인 윈도우에서도 설치, 운영, 통합이 가능하게 했습니다 또한 PWA의 새로운 기반 API인 서비스 워커는 윈도우의 엣지나 데스크탑, 모바일용 사파리를 포함해서 모든 주요 브라우저에서 지원이 됩니다 아마 이런 발전이 지난 10년간을 돌아봤을 때 가장 중요한 도약이 아닌가 합니다 PWA는 웹에서의 우리의 활동을 근본적으로 바꿔놓았습니다 하지만 이게 다가 아니죠 웹어셈블리를 통해서 웹사이트의 고성능 운영이 가능하고 C언어나 C++언어로 쓰여진 저급 언어 코드로도 운영 가능하며 브라우저와 기기 전반에 폭넓은 지원을 합니다 이 코드는 모든 웹 API에 접근 가능하기 때문에 웹어셈블리가 새로운 종류의 컨텐츠를 활용해 웹 플랫폼을 운영할 수 있도록 만들어줍니다 하나 예를 들자면, 오토CAD팀에서 35년 된 코드베이스를 가져 왔는데, 참고로 35년이면 웹 자체보다 오래된 거죠 웹어셈블리를 사용해서 브라우저 내에서 직접적으로 이 코드베이스가 운영 되는 것을 확인할 수 있었습니다 그래서 이제 오토CAD의 모든 기능은 링크 하나만으로 사용가능하죠 웹 플랫폼에 새로운 기능이 모두 추가되었어요 하지만 저희가 원하는 건 여러분이 이 기능을 잘 활용할 수 있게 만드는 것입니다 그래서 도움을 줄 수 있는 툴을 만들어 왔어요 라이트하우스는 크롬에 내장된 개발툴의 기능입니다 사이트를 분석하고 사용자 경험을 향상시키기 위한 명확한 가이드라인을 제공합니다 50만명의 개발자가 자신들의 사이트 혹은 지속적인 통합 과정에서 수행 능력이 퇴행되지 않게 하기 위해서 경쟁에서 뒤쳐지지 않기 위해서 라이트하우스를 운영하고 있습니다 라이트하우스의 수행 지표를 더 정확하게 만들고 좀 더 실행 가능한 지침을 만들기 위해 오늘 라이트하우스 30을 선보입니다 라이트하우스는 여러분에게 좀 더 쉬운 사이트 업그레이드와 단순한 조언만 제공하는 게 아닙니다 어떤 사이트를 만들든 초기값부터 고품질로 만들 수 있는 툴을 제공하고자 합니다 저희는 2년 전, 웹페이지를 빠르고 쉽게 만들기 위해 AMP 프로젝트를 시작했습니다 AMP의 엄청난 발전에 매우 기쁩니다 저희는 AMP로 할 수 있는 것들을 점점 더 확대해나가고 있습니다 AMP를 통한 전자상거래의 주요 특징을 지원하기 위해서 많은 기능을 추가했습니다 예를 들면, 검색어 자동완성이나 완전한 날짜 고르기 기능 등이 있고 곧 무한대 목록 스크롤 기능이 지원될 예정입니다 기업들은 이로 인한 혜택을 얻고 있습니다 예를 들어볼까요 오버스탁은 AMP 페이지에서 36%의 수익 상승을 봤습니다 모바일 웹에서 몰입형 스토리를 만드는 데 사용하기 쉬운 포맷인 AMP 스토리즈를 공개했습니다 이제 모든 AMP 컨텐츠는 빠르고 무료이면서 페이지 로딩을 최적화 해주는 사생활 보호 캐시의 혜택을 볼 수 있습니다 하지만 모두 구글 URL을 가지고 있었잖아요 그래서 이제 새로운 기준인 웹패키징을 이용해보려 합니다 우리의 궁극적인 목표인 즉각적으로 반응하는 웹 컨텐츠가 AMP의 모든 혜택을 활용하도록 하는 첫 걸음과도 같습니다 그리고 오늘 저희는 이 모든 툴을 활용할 수 있는 새로운 방법을 소개하려고 합니다 크롬 OS가 공개된 게 약 7년 전이었죠 최고의 웹을 소개함으로써 모두가 접근할 수 있는 컴퓨터를 만들기 위함이었죠 크롬북스의 판매량과 28일 이상 활성 사용자 수는 작년에 50% 성장했습니다 이제 우리는 관심사를 태블릿과 연결기기로 확대했습니다 기술 접근성뿐 아니라 기술을 만들 수 있게 하는 접근성이기도 하죠 크롬 OS를 확장하는 이유는 개발자에게 크롬 OS에서 리눅스 앱을 지원하기 위해서입니다 여러분이 좋아하시는 툴, 에디터, IDE의 대부분이 이제 크롬북스에서도 작동된다는 뜻이죠 픽셀북스의 데브 채널부터 시작해서 이제 여러분은 웹에 만들어진 플랫폼에서 웹을 위한 개발을 할 수 있습니다 곧 안드로이드 스튜디오에서도 크롬 OS 운영이 가능하게 될 것입니다 여러모로 웹 개발자들에게 행복한 때가 아닌가 싶네요 프로그레시브 웹 앱을 만들면서 웹에 많은 투자를 지속한 전세계 기업들은 계속해서 상당한 이익을 보고 있습니다 PWA는 현재 많은 곳으로 확장되고 있으며 주요 브라우저 전반에서 지원되고 있습니다 라이트하우스나 AMP, 이 외에도 컨퍼런스에서 소개될 웹 개발자 상품들을 이용함으로써 웹을 만들기가 그 어느 때보다 좋은 환경입니다 구글의 초창기와 비교해서 웹 플랫폼은 엄청나게 발전했습니다 웹 플랫폼은 우리 과제의 중심입니다 오늘날의 모던 웹을 통해 만들어진 새로운 케이스도 소개하고 싶습니다 궁금하시다면 웹 플랫폼에 대한 발표를 들어주세요 이제 리치가 나와서 매터리얼 디자인의 업데이트에 대해 설명해 줄 겁니다 환영해주세요 고마워요, 탈 저는 오늘 매터리얼 디자인으로 앱을 커스터마이징하는 새로운 접근법에 대해 이야기하고 새로 만든 툴과 리소스를 공개하려고 합니다 2014년에 출시된 매터리얼 디자인은 플랫폼 전반에 화려하고 아름다우며 일관된 디지털 상품을 만들기 위한 시스템으로 고안되었죠 여러분과 전 세계 개발자들이 명확한 디자인 지침과 사용자의 더 나은 경험을 위한 조언을 요청했고 저희는 그런 여러분의 열정에 응답해왔습니다 매터리얼은 모든 구글 상품의 디자인 기반이 되었습니다 매터리얼을 사용해 수백만개의 앱이 만들어졌죠 하지만 저희 상품팀과 개발자들이 수백개의 디자인 후기를 보고 두 가지의 문제점을 발견했습니다 첫 번째는 매터리얼이 항상 유연하게 작동되는 것은 아니며 각기 다른 브랜드의 상품들이 모두 너무 비슷해 보인다는 것입니다 두번째는 디자인 비전을 보기 쉽도록 매터리얼의 엔지니어링 지원이 더 강화되어야 한다는 것입니다 저희는 늘 디자인 청사진 이상의 것을 제공하는 것을 목표로 해왔습니다 리소스, 툴, 엔지니어링 컴포넌트를 잘 전달하기 위해 힘써왔고, 상품팀이 상호 협력하여 기획에서 개발까지 일하기 쉽게 했으며 사용자들에게 커스터마이즈 된 경험을 전달하고자 했습니다 그래서 오늘 자랑스럽게도 매터리얼 디자인의 주요한 업데이트인 매터리얼 테마를 소개합니다 매터리얼 테마는 하나로 통일되었지만 각색 가능한 디자인 시스템입니다 색깔, 종류, 모양을 여러분의 상품 전반에 일괄적으로 적용 시켜서 브랜드의 특징을 표현할 수 있습니다 매터리얼 테마는 매터리얼의 지침을 그대로 유지하고 또한 확장하여 적용시켰습니다 같이 볼까요? 더 나은 설계와 개발이 가능해져서 여러분의 아이디어가 종이 위가 아니라 시스템에서 발전하면 어떨까요? 매터리얼이 제공하는 다양한 색상으로 매번 색을 입힐 때마다 디자인의 특징이 강화될 수 있습니다 타이포그래피도 쓸 수 있으므로 스타일이나 가독성을 맞춤화해서 더 많은 표현을 할 수 있죠 기기와 플랫폼을 모두 아우르는 즉각적인 반응 기술을 체험해보세요 툴과 오픈 소스 코드의 조합을 간소화하고 여러분의 브랜드의 특징을 더 쉽게 표현해보세요 사소한 디테일까지 형식과 기능의 균형을 잘 맞춰 보세요 매터리얼 디자인은 그저 스타일이 아닙니다 종이와 잉크에서 영감을 받아서 만들어졌고 수정이 쉬운 시스템을 통해 아름다우면서 사용할 수 있는 상품을 만들 수 있게 했습니다 무엇을 만드시겠어요? 매터리얼 테마에서는 여러분이 완전한 책임자입니다 색상이나 종류와 같은 몇 가지 결정만 내려 주시면 저희가 여러분의 디자인 전체에 이것들을 적용시킵니다 디자인 가이드라인에서 맞춤 옵션도 찾으실 수 있습니다 수백개의 예시들을 추가해놨습니다 매터리얼과 같지만 더 다양한 상품과 스타일이 반영되어 있습니다 마음에 드는 것을 고르신 후 레드라인 뷰어를 사용해서 편하게 면적이나 충전재, 심지어 헥스값까지 확인 하실 수 있습니다 디자인에서 실행까지 더 빠른 작업을 도와 줄 두 개의 새로운 툴을 오늘 공개합니다 첫 번째는 매터리얼 테마 에디터입니다 유명한 스케치 앱과 플러그인하여 디자이너들이 독특한 매터리얼 테마를 만들고 맞춤화할 수 있게 해줍니다 하나의 테마 값을 바꾸면 디자인 전체에 적용이 됩니다 매터리얼 갤러리를 사용해서 쉽게 공유할 수도 있습니다 저희 구글의 상품팀에서 디자인 반복을 검토하거나 설명할 때 사용하는 툴로 이제는 모두가 사용 가능합니다 만들기 시작하면 자동으로 생성되는 레드라인을 보실 수 있습니다 어떤 요소를 사용 중인지 어떻게 맞춤화되는지 정확하게 볼 수 있습니다 하지만 디자인만을 쉽게 할 뿐 아니라 코드로 실현시키는 것도 쉽게 만들어야 합니다 그래서 안드로이드, iOS, 웹, 플러터용 오픈 소스 매터리얼 디자인 컴포넌트가 모두 매터리얼 테마와 더불어 오늘부터 이용가능합니다 구글에서 앱을 만드는 데 사용하는 컴포넌트와 동일한 것입니다 웹을 위한 새로운 G메일을 봐도 알 수 있듯이 구글은 우리 브랜드를 가장 잘 보여줄 수 있는 맞춤형 매터리얼 테마를 상품에 적용시킵니다 여러분도 구글과 같은 컴포넌트를 사용해서 각자에게 맞는 경험과 테마를 만들 수 있습니다 앞으로 더 많은 매터리얼 컴포넌트와 매터리얼 테마 맞춤화 기능이 출시될 예정이니 기대해주세요 주기적으로 출시될 계획입니다 계속해서 여러분의 의견을 듣고자 하니 피드백도 계속 보내주십시오 오픈 소스 컴포넌트, 새로운 툴 그리고 디자인 지침을 사용해서 여러분의 맞춤형 앱을 만들 수 있는 새로운 접근법인 매터리얼 테마가 오늘부터 이용 가능합니다 여러분만의 매터리얼을 만들고싶다면 materialio에서 시작해보세요 다음으로는 지아가 인공지능에 대해서 이야기 해주시겠습니다 리치 고마워요 안녕하세요 구글에서는 개발자들이 인공지능을 이용하여 실제 삶에 영향을 만들고 있다고 믿습니다 얼마나 복잡한 일인지는 잘 압니다 머신 러닝은 어느 환경에서나 어려운 과제입니다 하지만 요즘의 개발자들은 다양한 플랫폼과 기기를 목표로 합니다 처리 능력이나 광대역, 지연성, 배터리 수명과 같은 문제들 또한 다루어야 합니다 그래서 저희는 인공지능이 어느 플랫폼에서든 더 쉽게 사용될 수 있도록 노력합니다 이런 노력은 클라우드부터 시작됩니다 클라우드는 모든 산업의 소비자들이 머신 러닝을 이용할 수 있도록 하죠 인공지능의 성공은 여러분이 갖춘 기초시설이 아닌 상상력으로 결정되어야 합니다 저희는 구글의 상품을 위한 최고의 기술에 투자하고 있습니다 구글 클라우드로 인해 모두 리소스를 사용할 수 있는 것입니다 예를 들어, 클라우드 TPU는 대부분의 일반 베타 버전에서 이용 가능하므로 머신러닝 비용이 그 어느 때보다도 합리적이 되었습니다 얼마 전까지만 해도 이미지넷 데이터 세트를 이용해서 높은 정확성을 보이는 모델을 갖추려면 수천 달러가 필요했습니다 하지만 스탠포드 벤치마크 대회에서 우리 TPU의 가격이 50달러 밑으로 내려갔습니다 클라우드 TPU는 이제 모두가 이용가능하고 아주 간단하게 이 링크만 누르면 바로 시작할 수 있습니다 오늘 아침에 3세대 TPU를 소개해드렸습니다 또한 인공지능 하드웨어에 지속적인 투자를 하는 것도 보여드렸죠 우리는 클라우드에서 다양한 종류의 머신 러닝 API를 통해 최고의 기술을 공유할 수 있습니다 최근의 기술로는 클라우드의 음성변환 기능이 있습니다 구글 어시스턴트의 음성인식과 같은 기술인 딥마인드의 웨이브넷에 기반해 다양한 언어와 사투리로 32개의 음성지원을 제공합니다 코드 몇 줄만 있으면 다양한 플랫폼과 기기에서 여러분의 앱이 실제로 사용자들과 이야기 할 수 있게 됩니다 사용자와 더 높은 수준의 교류를 원한다면 음성변환과 다이얼로그플로우 기업 에디션을 함께 쓸 수 있습니다 다이얼로그플로우를 사용하면 대화형 어플을 만들기 쉽습니다 경험이 없는 사람도 가능하죠 옷 쇼핑을 하거나 자전거 수리를 예약할 때 사용자의 의도나 맥락을 파악하여 정확한 응답을 할 수 있습니다 마지막으로 클라우드 AI는 항상 개발자들에게 더 많은 기능을 제공할 새로운 방법을 연구합니다 클라우드 오토ML에는 이런 노력이 담겨 있습니다 클라우드 오토ML은 머신 러닝 모델을 자동으로 생산합니다 오토ML 비젼이 가장 먼저 상용화될 예정입니다 오토ML 비전은 코드를 쓰지 않아도 여러분의 직업에 잘 맞는이미지를 인식할 수 있습니다 여러분이 샘플을 제공하면 나머지는 오토ML이 알아서 합니다 알파 버전 사용자들은 이미 오토ML로 독거미를 구별하거나 시각장애인의 이미지 이해를 돕는 등 수많은 성과를 냈습니다 하지만 비전은 이제 시작일 뿐입니다 곧 더 많은 러신머닝 기능이 오토ML에 추가될 것입니다 오토ML의 초기 도입을 포함한 모든 클라우드 AI 상품에 대해 궁금한 사항이 있으시면 저희 사이트를 방문해주세요 저희가 새로운 방향으로 개발하고 있는 것은 클라우드 AI 기술 뿐만이 아닙니다 텐서플로우는 머신러닝의 기준이 되었습니다 저희가 2년 전에 오픈 소싱을 한 이래로 다운로드 수가 1300만 건을 기록했습니다 이제 새로운 플랫폼에서도 이용 가능하도록 노력 중입니다 최근 텐서플로우

js를 출시했습니다 자바스크립트를 통해 전 세계 수백만명의 웹 개발자들이 러신머닝을 이용할 수 있게 하죠 그 브라우저에서 직접 혹은 노드js를 통해 새로운 모델을 만들 수 있습니다 오프라인에서 훈련된 모델을 들여오거나 웹 GL 가속화와 함께 운영할 수도 있습니다 물론 브라우저 밖에는 더 큰 세상이 있습니다 작년에는 안드로이드와 iOS 휴대폰을 포함한 엣지 기기에서도 머신 러닝을 사용할 수 있는 텐서플로우 라이트를 출시했습니다 저지연성으로 오프라인 프로세싱이 가능하고 민감한 정보가 기기 밖으로 유출되지 않게 해 줍니다 텐서플로우 라이트는 라즈베리 파이같은 하드웨어에서도 지원이 되므로 AIY 프로젝트 비전이나 보이스 키트같은 스마트 기기로도 사용할 수 있습니다 데이브가 오늘 아침에 말했듯이 저희는 ML 키트의 베타 버전을 공개했습니다 파이어베이스를 통해 모바일 개발자들이 구글의 머신 러닝 기능을 쓸 수 있도록 해주는 소프트웨어 개발 키트입니다 구글 번역의 문자 인식이나 G메일의 스마트 리플라이와 같은 구글의 상품에서 사용된 것과 동일한 기술 또한 여러분이 사용할 수 있도록 공개될 것입니다 구글의 인공지능 비전은 최신 기술을 이용해 모두가 더 나은 삶을 살 수 있게 하는 상품을 만드는 것입니다 하지만 여러분과 같은 창의적인 개발자들 없이는 할 수 없습니다 우리가 함께라면 인공지능을 상용화시킬 수 있습니다 그럼 구글이 어떻게 모바일 개발을 지원하고 있는지에 대해서 프란시스 마께서 발표해 주시겠습니다 감사합니다 지아 고마워요 우리의 파이어베이스 미션은 전반적인 앱의 주요 문제를 해결하는 데 도움이 되는 플랫폼을 제공해서 모바일 앱 팀들이 성공할 수 있도록 만드는 것입니다 앱을 만드는 것을 도울 뿐만 아니라 앱의 품질을 향상시키고 사업 확장까지 이어지도록 하는 것이죠 2년 전 파이어베이스를 실시간 데이터베이스에서 폭넓은 앱 개발 플랫폼으로 확장한 이후 우리는 계속해서 발전해 왔습니다 또한 판도라, 핀터레스트, 플립 카트와 같은 많은 안드로이드와 iOS의 인기 앱과 그 밖에도 120만개가 넘는 앱이 파이어베이스를 활성화시키며 매달 사용하는 것을 보면 정말 기쁩니다 개인 개발자부터 큰 팀에 소속된 개발자까지 저희를 믿어 주신 모든 분들께 정말 감사드립니다 기업의 규모와 상관없이 모든 기업의 개발자가 성공할 수 있도록 돕겠습니다 저희의 주요 목표 중 하나는 앱 개발에서 중요하지만 어려운 부분을 관리하는 데 도움을 줌으로써 여러분이 사용자 관리와 더 멋진 상품 개발에 집중하실 수 있도록 만드는 것입니다 한 예로 저희는 여러분의 컴플라이언스 요구를 사생활 보호 기준과 보안 기준, 곧 시행될 유럽정보보호법령에 맞출 수 있도록 하기 위해 많은 노력을 했습니다 또한 플랫폼을 계속해서 확장하여 개발자들이 매일 겪는 난제를 더 간소화하기 위해 노력하고 있습니다 약 1년 전 패브릭 팀이 우리와 협업하여 최고의 플랫폼을 한 데 모았습니다 그 이후로 많은 발전이 있었습니다 지난 몇 달간 우리는 패브릭의 주요한 충돌 보고체계인 크래시리틱스를 파이어베이스로 가져왔습니다 이를 구글 애널리틱스와 통합시켜 기능을 향상시켰고 그 결과로 여러분은 사용자들이 여러분의 앱에서 어떤 활동을 해서 충돌이 일어났는지 훨씬 쉽게 볼 수 있게 된 것입니다 크래시리틱스, 성능 모니터링과 구글 애널리틱스의 통합으로 파이어베이스는 단지 앱의 기초를 만들기 위한 플랫폼이 아니라 본인의 앱을 잘 이해하고 성능을 향상시키는 역할도 하게 됐습니다 작년에 이뤄낸 주요 성과 중 하나는 파이어베이스 플랫폼에서 머신 러닝을 결합시킨 것입니다 몇 달 전에는 첫 걸음으로써 파이어베이스 프레딕션을 출시했습니다 프레딕션은 ML을 분석 데이터에 적용하고 사용자의 미래 행동을 예측합니다 그래서 앱을 최적화하기 위한 선제 조치를 취할 수 있는 거죠 예를 들어, 게임을 더 이상 하지 않을 것 같은 사용자를 위해서는 게임의 난이도를 낮출 수 있고 돈을 쓸 것 같은 사용자에게는 특별 할인 메세지를 보내는 것이죠 또한 다른 셋업으로 에이비 테스팅을 진행해서 어떤 것이 가장 잘 작동하는지 확인할 수도 있습니다 프레딕션은 구글의 ML을 이용할 수 있는 첫 번째 단계였습니다 오늘은 두 번째 단계인 ML 키트의 일반 베타 버전을 공개합니다 구글의 전반적인 머신러닝 기술을 합해 안드로이드나 iOS에서 작업하는 모든 모바일 개발자들이 사용할 수 있도록 만든 것이 ML 키트입니다 ML 키트는 이미지 표시나 문자 인식과 같은 다섯 개의 API를 제공합니다 이 API들는 지연성이 낮아 기기에서 작동이 가능하고 정확성이 높아 클라우드에서 작동이 가능합니다 더 구체적인 필요 사항이 있다면 맞춤형 텐서플로우 라이트를 사용할 수도 있죠 ML 키트를 어떻게 앱에서 사용하는지 이야기 해봅시다 저는 두 아이의 아빠인데요 제 어린 아이들은 주변 세상에 대해서 늘 궁금해합니다 그래서 사진을 찍고 그 안에 있는 사물을 구별하는 앱을 만들어 보면 재미있을 것 같다고 생각했습니다 ML 키트의 기기내 이미지 표시 API를 사용하면 사물 구별을 위해 아주 쉽게 ML을 적용시킬 수 있습니다 개, 나무, 다리 같은 거죠 많은 분들이 아시다시피 모바일에서 앱을 만드는 데 가장 큰 도전과제는 저지연 응답과 오프라인에서의 작동 가능성입니다 ML 키트의 기기내 API를 사용하면 제가 외딴 곳에 등산을 가서 네트워크와 연결될 수 없어도 이미지 표시가 작동한다고 확신할 수 있습니다 기기내 API는 저지연 프로세싱에 좋지만 최대한의 정확성을 갖고 최적화를 시키고 싶을 때도 있습니다 예를 들어 랜드마크를 구별할 때 저는 이게 그냥 다리가 아닌 금문교라는 것을 우리 아이가 알았으면 합니다 ML 키트의 클라우드 API라면 가능합니다 정확성이 훨씬 높고 앱 클라이언트 코드에 바로 통합이 가능합니다 이런 API가 할 수 있는 것 외에도 다른 특별한 요구사항이 있을 때가 있는데요 이럴 때는 여러분의 맞춤형 ML 모델을 가져올 수 있습니다 모바일 개발자로서 앱의 바이너리를 작게 유지하고 빠르게 반복 가능하게 하는 것이 얼마나 중요한지 잘 알고 있습니다 ML 키트에 텐서 플로우 라이트 모델을 업로드 할 수 있고 구글의 글로벌 인프라를 통해서 사용할 수 있습니다 여러분의 앱으로 이 모델을 다양하게 검색할 수 있고 기기 내에서 평가가 가능합니다 즉, 앱 바이너리로 모델에 묶을 필요가 없고 앱을 통째로 재배포하지 않고도 업데이트가 가능합니다 ML 키트는 파이어베이스를 통해 이용가능하므로 더 다양한 파이어베이스 플랫폼을 활용할 수 있습니다 예를 들어 에이비테스팅을 통해 여러가지 ML모델을 써보거나 클라우드 파이어스토어를 이용해서 이미지 라벨을 보관하거나 성능 모니터링을 통해 프로세싱 지연성을 측정하거나 구글 애널리틱스를 통해 사용자 참여 효과를 확인할 수 있습니다 여러분의 놀라운 성장이나 더 훌륭한 사용자 경험 개발처럼 기계학습이 가져올 미래에 대해 큰 기대를 갖고 있습니다 여러분의 앱 개발과 향상을 위해 구글의 기술을 많이 이용해주시길 바랍니다 그럼 이제 나단이 모바일 컴퓨팅 즉, 증강현실의 흥미로운 발전에 대해서 이야기 해주시겠습니다 감사합니다 안녕하세요 오늘 이 곳에 오게 되어 정말 기쁩니다 저는 오늘날 증강현실이 모바일 컴퓨팅에 있어서 가장 흥미로운 발전이라고 생각합니다 우리가 세상을 보고 느끼는 것처럼 기기도 같은 경험을 할 수 있게 한 증강현실은 가장 유용하고 접근 가능한 방식으로 실제 세상에서 디지털 컨텐츠와 정보가 우리와 교류할 수 있게 했습니다 이제 우리의 휴대폰도 새로운 방식으로 세상을 볼 수 있으므로 개발자들이 새로운 종류의 사용자 경험을 만들어낼 수 있다는 가능성을 열었습니다 약 3개월 전 저희는 증강현실 경험을 만드는 플랫폼인 AR코어를 출시했고 여러분은 이 엄청난 새로운 기술을 활용할 수 있게 되었습니다 그리고 이미 아주 멋진 앱들을 볼 수 있습니다 예를 들어 이제 집을 돌아다니기만 해도 평면도를 만들 수 있습니다 또한 실제 크기로 인간 신경계의 복잡성을 시각화할 수 있습니다 여러분의 식탁에서 가상 애완동물을 키울 수도 있습니다 여러분들이 개발하시는 동안 저희는 여러분의 피드백에 귀를 기울여 왔습니다 오늘 여러분이 더 풍부한 몰입형, 대화형 경험을 만드는 데 도움을 줄 AR코어의 주요 업데이트를 공개합니다 3D 앱을 만드는 것이 어려운 일이라는 것을 잘 압니다 특히 오픈GL 같은 저급의 API를 사용해서 만들려면 더 어렵겠죠 그래서 저희가 완전히 새로운 3D프레임워크인 신폼을 만들었습니다 자바 개발자들이 AR코어 앱을 만들기 더 쉬워진 것이죠 중요한 것은 신폼이 단순히 스크래치에서 앱을 만드는 사람들만을 위한 것은 아니라는 겁니다 이미 출시한 앱에도 AR코어 기능을 추가하기 쉽도록 만들어졌습니다 핵심은 신폼 소프트웨어 개발 키트에는 표현 API와 강력한 물리적 기반의 렌더러와 안드로이드의 3D 자산에 대한 지원이 모두 포함되어 있습니다 가장 좋은 건 신폼이 모바일에 최적화됐다는 거죠 처음부터 성능, 메모리 및 바이너리 크기를 고려하여 만들어졌습니다 우리는 개발자로서 종종 실제 세상에서 특정 사물에 대해 반응할 수 있는 증강현실 앱을 만들고자 할 때도 있습니다 그래서 오늘 AR코어의 새로운 기능인 증강 이미지를 소개합니다 증강현실의 컨텐츠와 경험을 현실의 실제 이미지에 결합시킬 수 있는 기능입니다 증강 이미지는 사진의 존재를 인식할 뿐만 아니라 실시간으로 정확한 3D 오리엔테이션을 연산할 수 있습니다 증강 이미지를 이용해서 교과서에 숨을 불어넣고 새로운 형태의 예술작품도 만들 수 있습니다 심지어는 장난감 박스를 열기 전에 안에 뭐가 들었는지 볼 수 있습니다 마지막으로 진정으로 컴퓨터가 우리처럼 작동하기를 바란다면 우리 세상의 사물만이 아니라 사람들 역시 포함해야 합니다 근본적으로 우리는 가족과 친구, 동료들과 우리의 시간을 보냅니다 우리는 협력하고 창조하고 서로 경험을 공유합니다 그래서 우리는 증강현실에서 여러분이 혼자서 할 수 있는 아주 멋진 일들을 다른 사람과 함께 할 수도 있을 것이라고 믿습니다 휴대폰이 어떻게 세상을 바라보고 이해하는지에 대해 알게 해 주는 중요한 다음 단계를 발표하게 되어 매우 자랑스럽습니다 AR코어의 새로운 기능입니다 바로 클라우드 앵커입니다 클라우드 앵커는 다양한 기기들이 세상에 대한 이해를 공유하고 동기화되게 해 줍니다 여러 휴대폰이 같은 장소에서 동시에 같은 디지털 컨텐츠를 가지고 교류할 수 있게 되는 것이죠 그로 인해 여기 계신 개발자분들이 서로 협력하는 창의적인 멀티유저와 멀티플레이어 앱을 만들 수 있게 되는 것입니다 여러분의 이해를 돕기 위해 클라우드 앵커 기능을 실험용 오픈 소스 증강현실 앱인 '저스트 어 라인'에 통합시켜 보았습니다 함께 보시죠 감사합니다 저희는 클라우드 앵커가 많은 새로운 종류의 증강현실 경험을 가능하게 할 것이라고 생각합니다 기기와 창의력, 여러분 주변의 사람들이 모여서 만드는 증강현실 경험인 것이죠 이런 경험은 큰 힘이 될 수 있으므로 어떤 휴대폰을 가지고 있더라도 동등하게 접근할 수 있는 권한이 있어야 한다고 생각했습니다 그래서 저희는 안드로이드와 iOS 기기 모두에서 AR코어의 클라우드 앵커를 사용할 수 있도록 만들었습니다 정말 멋지죠 제가 오늘 이야기 했던 신폼이나 증강 이미지, 클라우드 앵커는 모두 당장 사용 가능합니다 developersgooglecom/ar에 방문해보세요 AR코어를 직접 배워보시고 개발을 시작해보세요 그럼 이제 제이슨이 마무리를 해주시겠습니다 시간 내주셔서 감사합니다 나단, 고마워요 오늘 저희의 발표를 통해서 여러분이 어디에 있든지 어떤 플랫폼을 사용하든지 여러분이 있는 그 곳에서 머신러닝부터 증강현실까지 가장 혁신적인 기술을 활용할 수 있게 도와드리고자 한 우리의 마음이 전달되었기를 바랍니다 오늘 다루어진 주제들은 대부분 클라우드 기술로 만들어졌습니다 클라우드 기술은 머신러닝이나 빅쿼리의 스마트 데이터 분석같은 강력한 API와 저지연성과 고신뢰성에 대한 투자를 포함하고 있습니다 저희 상품이 산업 전반에서 폭넓게 사용되고 진화할 수 있도록 쿠버네티스나 텐서플로우같이 최대한 오픈소스를 유지하려고 합니다 클라우드 기술과 함께 대규모 소프트웨어를 만들면서 배웠던 것들을 여러분에게도 전해드리고자 합니다 올해 개발자 컨퍼런스는 역대 최대 규모로 개최되었습니다 앞으로 며칠간 훌륭한 컨텐츠가 준비되어 있습니다 올해부터 시작되는 이벤트도 있는데요 바로 영감에 관한 토론입니다 여러분이 만드는 기술이 어떻게 우리의 삶에 영향을 미치는지 넓은 시각으로 보는 토론입니다 주제는 더 나은 기술과 삶의 균형, 컴퓨팅의 미래, 인공지능을 활용한 건강관리입니다 우리는 우리의 창작물과 그 사용자에 대해 책임을 가지고 있습니다 그러므로 이번 토론에 참여해보시고 다시 한 번 확인해보시길 바랍니다 구글 캠퍼스 근처에서 개발자 컨퍼런스를 해서 가장 좋은 점 중 하나는 바로 이 상품들을 만든 2천명이 넘는 구글 직원들과 함께할 수 있다는 점입니다 직원들은 여러분들을 도와줄 뿐 아니라 우리가 더 나아가기 위해서 여러분의 피드백을 듣고자 이 자리에 나와있습니다 이 컨퍼런스를 통해서 여러분 모두가 이전에는 할 수 없었던 무언가를 이제 할 수 있을 거라는 생각을 갖고 그 생각을 의미 있는 것을 만드는 데 사용해주시길 바랍니다 감사합니다 즐거운 컨퍼런스 되십시오

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가 다운받아집니다

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