Google I/O 2013 – Broadcast Yourself!: Using the YouTube Live APIs to Stream to the World

SATYAJEET SALGAR : 좋습니다 여러분 좋은 오후입니다

여기에 와서 온라인을 시청 해 주셔서 감사합니다 내 이름은 Satyajeet Salgar 다 나는 이브라힘과 함께있다 YouTube Live 플랫폼에 대해 이야기하고 있습니다 YouTube 라이브 API 플랫폼에 대해 조금 이야기 할 것입니다

제작자가하고 있습니다 이브라힘 (Ibrahim)은 API에 대한 세부 정보를 제공하고 너 데모 야 그리고 우리는 질문을 위해 약간의 시간을 절약 할 것입니다 그거 괜찮은가요? 우리는 또한 라이브로부터 질문을 취할 것입니다 Google 포럼 포럼에서 잠재 고객을 스트리밍 온라인을 참조하십시오

그래서 우리는 당신의 질문을 기다리고 있습니다 괜찮아 라이브 스트리밍 데모로 라이브 스트리밍 토크입니다 라이브 스트리밍되지만, 우리는 더 깊이 갈 수 있습니다 누군가 살아있는 우리가

그래서 가능합니다 YouTube 얼마나 많은 사람들이 YouTube를 보았습니까? 지난 달 비디오? 당신은 10 억 인구의 일부입니다 인터넷에 지금있는 사람들 그들은 매달 60 억 시간을 지켜보고 있습니다

플랫폼 전반에 걸쳐 따라서 전세계에서 우리의 의견 중 25 %가 모바일 장치에 있습니다 YouTube는 전 세계에서 가장 큰 검색 엔진이기도합니다 YouTube와 동영상은 YouTube와 참여를 유도하고 위대하게 창출하십시오 귀하의 청중을위한 경험 우리는 특히 라이브를 생각합니다

그래서 YouTube에서의 라이브에 대해 조금 이야기 할 것입니다 얼마나 많은 사람들이이 이미지를 인식합니까? 거의 모든 사람 그러니 10 월 14 일에 펠릭스 바움 가르트 너 (Felix Baumgartner)의 이름으로 오스트리아 신사가 들어 섰다 그 우주 캡슐은 우주로 24 마일 올라가서 내려다 보았다 뉴 멕시코를 넘어서서 뛰어 올랐다

점프는 약 10 분이었고 그는 자유 낙하했습니다 약 4 분 이것은 우리가 인터넷 트래픽을 본 것입니다 그 기간 네

언젠가는 저처럼 두 사람이 언론에 남았습니다 회의 그러나 이것이 최고였습니다 그리고 그 절정에, 82 백만명의 사람들이 조정되었습니다

그리고 5200 만 건의 재생이 있습니다 그것은 라이브 이벤트의 규모와 흥분의 종류입니다 YouTube에서 생성 할 수 있습니다 그건 그렇고, 재미있는 퀴즈 조각, 그 시점에서 – 그 4 분 – 모든 인터넷의 약 8 % 트래픽이 그 비디오였습니다 다행히도, 당신은 공간을 뛰어 넘어 창조 할 필요가 없습니다

멋진 라이브 엔터테인먼트 우리는 톤과 수 많은 파트너가 오늘은 유튜브에 왼쪽 상단에 왼쪽, 축구 강국 때마다 러시아 스파르타 크 모스크바에서 활약하며 라이브 트래픽 러시아 스파이크에서 라이브 스포츠는에 대한 엔터테인먼트를 구축하는 좋은 방법입니다 YouTube, 인도 크리켓 또는 메이저 리그 생중계하는 야구는 국제적으로 게임을 스트리밍합니다

NBA 발달 리그 아니면 누구나 쉽게 찾을 수있는 스포츠입니다 세계 어디서나 찾을 수 있습니다 예를 들어, 호주에서 서핑, 소년 고등학교 인도네시아 축구, 배드민턴, 현지 하키 인도 -이 모든 것 경험은 YouTube에 게시됩니다 잠재 고객이이를 찾고 채널이 YouTube에 잠재 고객을 구축합니다

그러나 스포츠에 대한 우리의 비전은 단순한 게임이 아닙니다 우리는 게임 주변에 수많은 라이브 자료가 있다고 생각합니다 너가 강당에 들어갈 때 터널 캠이야 그 후에 인터뷰인지 여부 이것들은 모두 라이브 스포츠 경험의 일부입니다

얼마나 많은 사람들이 유벤투스가 누구인지 압니까? 그다지 많은 사람들이 좋아, 몇 사람 그래서 유벤투스는 이탈리아 축구 클럽입니다

그들은 리그에서 우승했습니다 클럽이 함께 할 때 생방송입니다 온 마을이 승리를 축하했다 수만명의 사람들이 들어 봤고 그들의 글로벌 팬들도 참여할 수 있습니다 우리는이 톤과 톤의 차원에서 일어나는 것을 봅니다

음악은 또 다른 훌륭한 음악입니다 울트라 뮤직 마이애미 축제, 일본의 코 첼라, AKB48, 또는 그의 새 앨범을 데뷔 한 신사 (PSY)는 YouTube의 실시간 스트리밍 우리는 모든 종류의 아티스트가 YouTube에 온 것을보고 있습니다 잠재 고객에게 멋진 라이브 경험을 제공합니다 그리고 우리는 이것이 시작에 불과하다고 생각합니다 우리는 이것이 모든 종류의 독립 예술가

그리고 나는 예술가들이 음악가 그 이상을 의미한다고 말합니다 물론 우리는 게임이 게임의 큰 부분이 될 것이라고 생각합니다 YouTube에 생방송 우리는 이미 많은 것을 가지고 이것을 보게됩니다 플랫폼에서 나오는 e-sports 토너먼트

라이드 게임은 예를 들어, 리그 오브 레전드 (Legends of Legends) 토너먼트 우리는 톤수를 더보고 있습니다 Google은 최근 Call of Duty와의 API 통합을 수행했으며, Black Ops II : 실제로 스트림을 라이브 스트리밍 할 수 있습니다 멀티 플레이어 게임 플레이 자, 우리 모두는 누군가를 보는 것의 가치를 이해합니다

누가 정말 좋은 연극이지, 그렇지? 그러나 그것은 그 이상으로 확장됩니다 예를 들어, 몇 주 전, 의무 선반에 전화하자 놀고있는 누군가에게 비틀 거린다 그리고 몇 초 안에 꽤 명확 해졌습니다 이 사람은 실제로 좋지 않았다고

하지만 갑자기, 그녀는 일시 중지하고 실제로 채팅을 시작했습니다 청중이 말하는, 이봐, 고마워 나는 놀고있는 걸 보았습니다 나는 내가 그렇게 위대하지 않다는 것을 알고 있지만, 나는 훨씬 나아지고있다 그리고 이것이 제가 최근에 한 일입니다

이제 그녀를 지켜보고 있던 두 세명의 행동 그녀의 경험을 더 좋게 만들었습니다 그것은 그녀를위한 단순한 게임 그 이상의 것이되었습니다 이것이 라이브 스트리밍과 연결의 힘입니다 YouTube에서 매일 보는 시청자 그리고 그것은 모든 종류의 엔터테인먼트로 확장되며, 제품 출시 여부와 정확히 일치하는 회의 이것, 또는 매우 정교한 에이프릴 바보 장난

사람들은 YouTube April Fools의 장난을 인정합니다 오른쪽 상단? 몇 사람? 네, 12 시간 동안 진행된 실시간 스트림이었습니다 이 매우 용감한 앵커들이 실제로 제목을 읽고 기본적으로 수십만 개의 YouTube 동영상 아니면 레드 카펫 첫날 같은 무언가 우리가 뭘 더 잘할 수 있을까요? 상단의 멀티캠을 확인하십시오

다른 곳에서는 이것을 할 수 없습니다 그래서 우리는 단지 하나의 특정한 견해를 스트리밍하는 것이 아닙니다 그러나 우리는 청중들에게 그들은 가고 싶었다 우리는 장르 전반에 걸쳐이를 수행 할 수 있습니다 예를 들어 최근 PGA 라이브 타이거 우즈가 나왔다

그래서 타이거 우즈를 따라 가려면 토너먼트에서 실제로 그렇게 할 수 있습니다 물론 이것은 훨씬 더 많이 확장됩니다 또한 뉴스와 시사 문제도 다루고 있습니다 우리는 YouTube에 교황이 있었다 YouTube에서 대통령 토론회를 가졌습니다

미국 대통령 토론 오른쪽 상단에서 보신 것은 최초입니다 케냐의 대통령 토론 케냐에서는 교통량이 급증했습니다 그것이 무엇인지 궁금합니다 그리고 그것은이 사건으로 밝혀졌습니다

수많은 국제 뉴스 채널 YouTube에서 실시간 방송 그리고 물론, 우리는 많은 주제를 다루고 있습니다 이제 우리는 제작자가하는 모든 것에 정말 흥분하고 있습니다 커뮤니티가 YouTube에서하고 있습니다 그러나 이것을 가능하게하는 것은 무엇입니까? 우리가 정말로 흥분하는 것은 강력한 솔루션입니다

우리가 만든 것 YouTube 엔지니어링 팀이 마지막으로 열심히 노력했습니다 해결책을 구축하기 위해 2 년 나는 기분이 좋았다 시청자에게 최고의 스트림 품질을 제공합니다 우리는 적응 비트율과 같은 것을 제공합니다

따라서 이동하면서 대역폭이 변경되면 스트림 품질에 손실이 발생하지 않습니다 스트림에서 앞뒤로 건너 뛸 수 있도록했습니다 그리고 우리는 여러 장치를 통해 작업합니다 그래서 당신이 당신의 데스크탑에서나 당신의 전화, 그냥 작동합니다 비교할 수없는 규모와 품질

광고 작성자는 광고를 쉽게 삽입 할 수있는 기능을 제공하며, 우리에게 단 하나의 고품질 스트림을 보내려면 모두 클라우드에서 실시간으로 트랜스 코딩하고, 필요한 모든 장치와 해상도 우리는 당신에게 여러 카메라 각도를 제공합니다 광고 삽입을 허용합니다 우리는 당신이 슬레이트를하도록합니다 닫힌 캡션을 삽입하는 것이 정말 쉽습니다

훨씬 더 많은 것이 있습니다 우리는 지금 막 시작하고 있습니다 우리는이 플랫폼을 계속 구축 할 것입니다 우리의 제작자 커뮤니티와 개발자 우리는 라이브 API를 출시하여 파트너 및 개발자 믿어지지 않는 것들을 지어 라

모든 베타 파트너에게 감사드립니다 너는 방에있다 이 API를 성장시키는 데 도움을 주셨습니다 그리고 우리는이 일로 더 많은 것을 알고 있습니다 마지막으로, 우리가 정말로 흥분하는 사실은 우리는이 플랫폼을 제작자가보다 쉽게 ​​이용할 수 있도록 만들고 있습니다

어제 YouTube에서 YouTube를 통해 1,000 명의 가입자가 실시간으로 스트리밍 할 수 있습니다 우리는 이것이이 플랫폼을 더욱 가치있게 만들 것이라고 생각합니다 를 위해 개발하십시오 그리고 우리는 제작자가 커뮤니티는 당신이 어떻게 활용할 수 있는지도 알고 있습니다 개발자로서

이를 통해 Ibrahim에게 API에 대해 알려주시겠습니까? 이브라힘 울루 카야 : 물론입니다 그래서 저는 Ibrahim Ulukaya, 개발자입니다 YouTube의 프로그램 엔지니어 오늘은 API 자체에 대한 개요를 실제로 제공하겠습니다 그런 다음 설정을 제안하려고합니다

라이브 스트리밍을 위해 그리고 우리는 자바 샘플 코드를 조금씩 살펴 보겠습니다 결국에는 Android 데모가 실제로 표시됩니다 우리가 살기 시작한 이래로 우리는 그것을 보게 될 것입니다 시작하자

YouTube 라이브 스트리밍 API 실시간 스트리밍 API를 사용하면 실제로 일정을 잡을 수 있습니다 YouTube에서 실시간 이벤트를 업데이트하고 관리합니다 나만의 스트림을 인스턴스화하고이를 발생시킬 수 있습니다 이러한 이벤트 내부

YouTube 콘텐츠 파트너 인 경우 광고 지금은 개념에 대해 조금 이야기하고 싶습니다 오늘 제가 이야기하고 싶은 첫 번째 개념은 방송입니다 캘린더 일정처럼 방송을 생각해보십시오 뉴스 같은 쇼

일정 시간 동안 예정되어 있으며 이벤트 컨테이너처럼 YouTube / 라이브로 이동하면 이 사진 지금 일어나고있는 사건을 볼 수 있습니다 또는 미래의 일정을 계획하고 있습니다 두 번째 개념은 스트림입니다

스트림이란 YouTube에 전송하는 스트림입니다 이러한 이벤트의 시작점입니다 그래서 저는이 두 가지를 구별하고 싶습니다 방송은 사건입니다 – 특정 시간에 예정된 일정 스트림은 나만의 콘텐츠입니다

YouTube 진입 점 그래서 실제로 이것들을 다루고 있습니다 방송은 이벤트였습니다 이벤트 메타 데이터, 스트림이 실시간 귀하의 콘텐츠를 스트리밍 우리가 헤어질 수 있었던 이유는 유연성을 제공하여 여러 스트림을 보유 할 수 있습니다

해당 스트림에 대해 해당 스트림을 전환 할 수 없습니다 브로드 캐스트 이벤트 자체 그리고 만약 당신이 아마 당신의 스트림을 가지고 있다면, 당신은 그 스트림, 같은 스트림을 사용하고 싶을 수도 있습니다 처리 설정을 다른 이벤트로 보냅니다 그래서 우리는 융통성있게 만들어서이 둘을 분리했습니다

마지막으로 큐 포인트입니다 Cuepoint는 인스 트림 광고입니다 파트너 API를 기반으로합니다 YouTube 콘텐츠 파트너 인 경우 광고 삽입 그럼 어떻게 서로 놀 수 있죠? 내가 말했듯이, 방송은 사건입니다

그리고 당신이 당신의 시내를 원할 때 – 귀하의 콘텐츠가 이벤트에 나타나면 그냥 바인딩하는 것입니다 함께 광고를 삽입하려면 광고를 이벤트에 삽입하는 것 이 스트림을 브로드 캐스트, 스트림 이 방송에있을거야 이 이벤트 내부로 스트리밍됩니다

다른 스트림을 원하면 연결할 수 없습니다 항상 일대일 매핑이 있습니다 맞아, 이제 나는이 개념들에 대해 깊이 생각하고 싶다 그래서 브로드 캐스트는 메타 데이터입니다 제목, 설명, 예정 시간이 있습니다

비공개 또는 공개 이벤트로 만들 수 있습니다 새로운 플랫폼을 사용하면 실제로 녹음을 사용할 수 있습니다 따라서 사용자가 실시간 스트리밍을 보지 못하면 사용자가 갈 수도 있습니다 나중에 YouTube에서 동영상을 볼 수 있습니다 그리고 DVR 설정을 사용하도록 설정할 수 있습니다

동영상 내에서 앞뒤로 이동할 수 있습니다 이것은 이벤트 일정을 계획하고있었습니다 그리고 이벤트 라이브 사이클을 관리하는 것은 어떻습니까? 따라서 처음 이벤트를 만들면 시작됩니다 창조적 인 슬레이트로 그리고 그들을 묶어서 준비가되면 시작, 우리는 준비 상태에 있습니다

따라서 사용자는 곧 이벤트가 시작된다는 것을 알게됩니다 옵션 상태로 미리보기로 이동할 수 있습니다 그래서 이것은 실제로 좋은 상태입니다 이벤트가 진행되면 스트림을 모니터링 할 수 있습니다 우리는 거기에 갈 수있는 또 다른 모니터 URL을 보내고 공개되기 전에 스트림을 볼 수 있습니다

그리고 갈 준비가되면 마법이 일어납니다 그것은 스트리트 라이브갑니다 그리고 모든 좋은 일은 어느 시점에서 끝나야합니다 이걸 끝내고 싶으면 그냥 사이클을 완료하십시오 그 개울은 어쩌고? 스트림이 진입 점이었습니다

YouTube에서 스트리머와 이야기하는 곳입니다 그래서이 진입 점을 만듭니다 기억할 수 있도록 자신의 이름을 설정했습니다 그런 다음 지원하려는 가장 높은 비트 전송률을 설정합니다 지원하려는 가장 높은 해상도를 설정합니다

스트림에 대해 정말로 중요한 한 가지는 항목입니다 포인트를 만들면 실제로 RTMP URL 및 스트림 이름을 사용하면 어디에서 너는 이것들에 접근하기 위해 말할 것이다 스트림, 당신의 깃발을 보내십시오 그리고 최근의 것이 큐 포인트입니다 설명했듯이 인스 트림 광고였습니다

인스 트림 광고를 시작하고 오래있을 것입니다 그들이 어떻게 상호 작용하는지 기억합시다 다시 서로 스트림이 방송에 바인딩되어 스트림이이 이벤트에 발생합니다 한 번 광고를 삽입하려면 콘텐츠 파트너 인 경우 삽입물을 사용하고 있습니다

그래서 얼마나 많은 사람들이 라이브 스트리밍을 사용 했나요? 전에 어떤 채널에서? 좋아, 나는 약간을 본다 그리고 얼마나 많은 사람들이 인코딩과 디코딩을 사용할지, 아마도 실시간 스트리밍이 아닌가요? 승인 나는 몇 가지 더 많이 본다 그리고 아마도 지금 궁금해하실 것입니다 개념 및 API를 제공하지만 최고의 실시간 스트리밍은 어떨까요? YouTube 설정 지금 당장이 새로운 플랫폼으로 모든 표준 비트 전송률 지원, 모든 표준 해상도는 240p에서 최대 1080p입니다

이 제품의 가장 큰 특징은 이 모든 다른 비트 전송률을 보내십시오 YouTube에 대한 결의안 원하는 가장 높은 비트 전송률을 보내고 싶습니다 지원, 가장 높은 지원하려는 해상도 그리고 거기에서, 실시간으로, 우리는 그것을 모두에게 낮은 자질

그래서 대역폭을 절약하고 있습니다 처리 능력을 저장하고 있습니다 그리고 우리는 당신을 위해 전체 무거운 것을 할 것입니다 엔코더는 어떻습니까? 현재 RTMP 플래시 스트리밍을 지원하고 있습니다 그리고 당신은 H

264 비디오를 사용하고 싶습니다 구형 코덱의 경우 AAC를 지원하고 있습니다 앞에서 설명했던 것과 유사하게 코드 변환 된 낮은 비트 전송률, 다른 코드로 변환 콘테이너 및 다른 자질 그래서 사람들 iOS, Android 및 Google TV에서 제공되는 뿐만 아니라 스트림 따라서 당신은 당신이 어떻게 변할 것인지 생각할 필요가 없습니다 다른 설정으로 스트리밍하십시오

우리는 당신을 위해 이것을 할 것입니다 그래서 이것은 첫 번째 스트리밍이었습니다 설정 및 API 개요 그리고 당신이 실제로 가질 수있는 것처럼 – 이 플랫폼에 개발자가 있다는 것을 알고 있습니다 우리의 다른 견본과 이야기하십시오

오늘 내가 말할 모든 샘플, 그들은 열려있다 YouTube API 샘플에 따라 제공됩니다 그래서 한 가지를 놓치거나 둘, 흥분하지 마라 그들은 모두 오픈 소스입니다 거기에 가서 여전히 액세스 할 수 있습니다

그리고 오늘 저는 Java 샘플에 대해서 이야기 할 것입니다 그러나 우리는 파이썬에서 모든 클라이언트 라이브러리를 지원합니다 PHPnet에서 Objective-C로, 많은 사람들이 그리고 우리가 지원하는 다른 클라이언트 라이브러리를 볼 수 있습니다

그리고 그것은 완전히 RESTful 한 API입니다 클라이언트 라이브러리를 사용하지 않으려는 경우에도 REST API 만 사용할 수 있습니다 첫 번째 예를 들어 보겠습니다 방송을 만듭니다 오늘 저는 세 가지 일을하고 싶습니다

방송 제작을 시작한 다음 스트림을 만들고 함께 연결하십시오 그래서 나는 살아갈 준비가되어있는 어떤 것을 갖게 될 것입니다 브로드 캐스트 만들기를 시작합니다 메타 데이터를 입력 한 다음 상태를 설정합니다 그리고이 둘을 사용하여 브로드 캐스트 객체를 만듭니다

이제 YouTube에서이 방송 객체를 만들고 싶습니다 삽입 요청을 작성하고 실행합니다 그래서 나는 방송에서 시작하겠다 스 니펫, 메타 데이터 나는 그것을 설정하고 제목을 만들었습니다

나는 예정된 시간을 정했다 그리고 기억해야 할 한 가지는, 오늘은 필수 매개 변수 앞서 설명한 다른 매개 변수가 있지만 단지 최소한의 일을하는 것뿐입니다 그리고 두 번째는 지위였습니다 상태와 함께, 이것 때문에 예를 들어, 비공개로 설정했습니다

이전 버전을 사용하여 스 니펫과 상태를 설정 했으므로 브로드 캐스트 객체를 생성합니다 이제이 브로드 캐스트 객체를 YouTube에 삽입하려고합니다 그것은 YouTube에도 나타날 것입니다 그래서 그 삽입 요청을 만듭니다 그리고 클라이언트 라이브러리를 사용하여 라이브 방송을했습니다

요청을 삽입하고, 클래스를 삽입하십시오 그리고 만든 브로드 캐스트 객체를 래핑합니다 이 요청 앞부분 그리고 나는 그것을 실행했다 그리고 RESTful API라고 설명했습니다

모든 것이 클라이언트 라이브러리에 의해 성공적으로 수행되면 JSON이 전달되고 리턴 브로드 캐스트가 표시됩니다 방송은 실제로 YouTube 내부에 삽입되었습니다 그래서 그때부터, 내가 한 모든 일을 확인할 수 있습니다 성공 여부 따라서 방송을 만든 후 두 번째 단계는 스트림

그 시내는 – 나는 비슷한 나무를 할 것이다 메타 데이터부터 시작하겠습니다 내 섭취 설정을 지정합니다 그리고 스트림 객체를 생성합니다 마지막에는 YouTube에 삽입하겠습니다

그래서 스 니펫으로 시작합니다 메타 데이터이기 때문에 제목을 설정합니다 그런 다음 섭취 설정을 살펴 보겠습니다 처리 설정에서 내가 설명했듯이 지금 RTMP를 지원하십시오 이 예제를 위해 1080p로 설정했습니다

이것이 제가 지원하고자하는 최대 해상도입니다 지금 스트림 객체를 생성하고 스 니펫 및 방금 만든 섭취 설정 이제 YouTube에 삽입 할 차례입니다 그래서 다시 삽입 개체를 만듭니다 이번에는 라이브 스트림 삽입 객체입니다 그리고 나는 그 안에 물줄기를 담았다

일단 내가 그것을 실행하면, 나는 창조 된 시내가이다 돌려 보낸다 YouTube에서 기억해야 할 것이 있습니다 앞에서 설명했듯이, 이것은 여러분의 진입 점입니다 YouTube의 스트림 엔트리 포인트 따라서 일단이 스트림을 만들면 실제로 처리 주소, RTMP URL 가져 오기 및 스트림 명 따라서 동일한 API를 사용하여 실제로이를 해결합니다

처리 주소, 스트림 이름, 그래서 우리는 어디에서 알 수 있습니까? 스팀, 어디로 우리의 깃발을 보낼 수 있습니다 그래서 우리도 스트림을 만듭니다 지금까지 우리는 이벤트를 만들고 스트림을 만들었습니다 무언가가 빠졌어 나는 그것이 연결이라고 생각한다

그래서 우리는이 사건 안에서 시내가 일어나도록하고 싶습니다 따라서 우리는 바인드 요청을 생성 할 것입니다 내부에 브로드 캐스트 ID를 설정합니다 설정된 스트림 ID를 설정합니다 일단 실행하면 성공하면 방송

이제 바인딩이 성공했는지 여부를 확인할 수 있습니다 그래서 이것은 자바 샘플 이었지만, 나는 그것을 실행하고 싶다 컴퓨터에서 YouTube로 연결된다는 것을 알게됩니다 그래서 방금 전에 보여준 예제를 사용하고 있습니다 브로드 캐스트 예제

나는 그것을 실행할 것이다 OAuth 20 메소드를 사용하여이 작업을 수행합니다 스트림 만들기,이 예제, 내 스트림을 만듭니다 내 대신에 그래서 나는 접근을 허용 할 것이다

액세스가 허용되면 데모를 사용하기 시작합니다 따라서 "I / O"라는 제목의 스트림 브로드 캐스트 이벤트 '13 이벤트 "확인 그래서 나는 사건이 일어난 것을 봅니다 방금 게시되었습니다

나는 실제적인 시내를 창조 할 것이다 그래서 저는 스트림을 만들뿐입니다 이전에 설명했듯이 일단 스트림을 만들면 처리 주소가 있습니다 그리고 내 스트림 이름 – 내 고유 한 스트림 이름이 있습니다 그래서이 두 가지를 사용하여 데이터를 어디에 스트리밍할지 알 수 있습니다

그리고 마지막으로, 내가 설명했듯이, 이제 나는 그들을 하나로 묶는다 따라서 내가 만든 브로드 캐스트 ID와 내가 만든 스트림 ID는 내 사건이 알 수 있도록 그들을 묶어 라 방송 할 스트림 한 단계 아래로 가서 YouTube 웹 사이트로 이동하십시오 내 계정에서 라이브를 사용할 수 있으므로 내 계정에 있습니다

그래서 나는 여기서 라이브 이벤트를 볼 수 있습니다 방금 만든 이벤트, "I / O '13 이벤트" 그리고 클릭하자 이번 행사 그리고 내가 설명했듯이 그것이 사적이라는 것을 알았습니다

그것은 미리 예정되어 있습니다 섭취 설정으로 이동합니다 그리고 방금 만든 이벤트 인 "I / O Stream 이벤트 "가 여기에 있습니다 방금 설명한대로 1080p입니다 그래서 이것은 자바의 데모였습니다

그리고 저는 한 단계 더 나아가고 싶습니다 그리고 내가 시도 할 작은 스트리밍 앱을 만들었습니다 여기에서 시내로 어디 보자 그래서 나는 처음부터 – 내가 이걸 돌려 보자

승인 먼저 로그인부터 시작하겠습니다 Google Play 계정 관리자를 사용합니다 그래서 여기에서 내 계정이 있습니다 나는 내 계좌를 고를 것이다

이제는 이벤트를 승인 할 것입니다 그리고 나는 나의 이벤트를 만들 것이다 그래서 지금 무슨 일이 일어나고 나는 이벤트를 만들었습니다 나만의 독특한 증기를 만든 다음, 나는 그들을 함께 연결한다 그리고 내가 라이브 이벤트에 참석했을 때, 나는 단지 그것들을 나열합니다

보시다시피, 전에 만들었던 "I / O '13" 저기에있다 방금 만든 동영상 중 라이브 스트리밍입니다 여기 이벤트 그래서 나는 이것을보고있다 그리고 나는 지금 스트리밍을 시작할 것이다

스트리밍을 시작한 것처럼 보입니다 YouTube 웹 사이트에서 살펴 보겠습니다 그리고 내 라이브 스트림 이벤트 나는 실제로 스트리밍으로 가서 무엇이 보이는지 보게 될 것이다 지금 당장 일어나고있어

네 내 스트리밍이 여기서 시작되었습니다 내 API에서 스트리밍을 시작하기 위해 이미 클릭했습니다 API에서 그래서 나는 이미 클릭 했으므로 클릭 할 필요가 없었습니다

나는 시내를 시작하도록 요청했다 그리고 지금 당장은 서버가 트랜스 코딩하고 있습니다 그리고 몇 초 만에 우리는 살게 될 것입니다 그래서 그것을 보자 나는 나의 사건에 나의 계정 등을 맞댄 갈 것이다

이번에는 클릭 만하면됩니다 그리고 내 사건이 시작됩니다 몇 초만 기다려주세요 SATYAJEET SALGAR : 몇 초주세요 오늘 데모 신이 호의적 인 것처럼 보입니다

우리는 네트워크를 비난 할 수 있습니까? 이브라힘 울루 카야 : 죄송합니다 SATYAJEET SALGAR : 우리는 네트워크를 비난 할 수 있습니까? IBRAHIM ULUKAYA : 네, 물론, 왜 안됩니까? SATYAJEET SALGAR : 왜 안돼? 괜찮아 몇 초만주세요 관객 : [INAUDIBLE]? 이브라힘 울루 카야 : 아닙니다 질문은 내가 I / O '13에 스트리밍하거나 이번 행사

실제로, 내가 방금 한 것처럼, 나는 실제로 라이브를하는 것처럼 보입니다 스트리밍 이벤트 I / O '13은 Java Eclipse에서 사용한 것입니다 그래서 오늘은 Eclipse를 보여 줬습니다 그러나 원하는 언어를 자유롭게 사용할 수 있습니다

뭐 무슨 일이 일어나고 있어요 그리고 그래, 우리는 살아있다 SATYAJEET SALGAR : 그래, 우리가 간다

[박수 갈채] SATYAJEET SALGAR : 우리는 청중을 끌어들이 야합니다 IBRAHIM ULUKAYA : 오디오를 보내고 싶지 않았습니다 오늘 그것이 저의 데모에 관한 것입니다 나는 당신이 그것을 창조하는 것이 쉬웠다는 것을 당신이보기를 원했습니다 라이브 이벤트 및 라이브

그리고 이제부터는 질문을 시작할 수 있습니다 SATYAJEET SALGAR : 우리는 질문을 기쁘게 생각합니다 이브라힘 울루 카야 : 질문이 있으시면, 마이크로폰 그리고 우리가 취할 것 인 것처럼 생생한 질문을합니다 중재자 링크의 질문 SATYAJEET SALGAR : 운영자 링크에 관한 유일한 질문 "이브라힘은 왜 그렇게 대단하니?" 그리고 나 내가 그렇게 부탁했다고 생각해

그래, 제발 관객 : 그래서 아주 좋습니다 iOS에서는 아마도 HLS를 프로토콜로 사용하고있을 것입니다 HTTP 라이브 스트리밍, 맞나요? SATYAJEET SALGAR : 예 IBRAHIM ULUKAYA : 우리는 RTMP를 사용하고 있습니다

관객 : 이제 안드로이드에서 안드로이드는 훨씬 더 많은 것을 가지고 있습니다 실행의 고문 된 역사 멀티미디어 프로토콜 SATYAJEET SALGAR : 죄송합니다 네가 여기서 말한 것을 놓쳤다 관객 : 안드로이드에서

Android의 경우 HLS를 사용하고 있습니까? Chrome 브라우저가 표시되거나 다른 브라우저를 사용 중입니다 프로토콜을 Android로 스트리밍하려면 어떻게해야합니까? IBRAHIM ULUKAYA : 문제는 우리가 HLS 또는 다른 프로토콜 관객 : 안드로이드에서 IBRAHIM ULUKAYA : Android의 경우 실제로 사용하고 있습니다 지금 RTMP

SATYAJEET SALGAR : 당신은 재생 또는 제작자 측의 스트리밍 청중 : 재생 SATYAJEET SALGAR : 재생 재생, HLS 관객 : 안드로이드에 HLS? SATYAJEET SALGAR : 그렇게 믿습니다 재렉? 네

JAREK WILKIEWICZ : 예 내 생각에 그것은 안드로이드 버전까지입니다 그래서 우리는 [INAUDIBLE] 코드 변환을합니다 이브라힘 울루 카야 : 죄송합니다 SATYAJEET SALGAR : 오, 미안

JAREK WILKIEWICZ :이 플랫폼의 핵심 기능 중 하나는 다양한 형식으로 트랜스 코딩합니다 [알아들을 수 없는] SATYAJEET SALGAR : 예, 일어나요 오, 그런데 대답은, 대부분의 사람들은 그렇지 않았습니다 그것을 듣고, 우리는 다양한 포맷으로 코드 변환 했습니까? 대부분의 안드로이드 버전에서는 HLS입니다

일부에서는 다른 것입니다 네 고객 : API는 누구에게나 공개되어 있으며 일부는 공개되어 있습니까? 조직? SATYAJEET SALGAR : API는 누구에게나 열려 있습니다 관객 : 누구? SATYAJEET SALGAR : 공개되어 있고, 예, 공개되어 현재 열리고 있습니다 관객 : 네

따라서 누군가에게 모바일 앱을 만들어 로그인해야하는 경우 그들에게 [INAUDIBLE]을 허락하는 그들의 계좌? SATYAJEET SALGAR : 그렇습니다 그래서 누구나 개발할 수 있습니다 라이브 API를 사용합니다 우리가 지금 가지고있는 제약은 최소한 1,000 가입자가 귀하의 계정으로 스트리밍 할 수 있습니다 그것은 우리가 작업하고있는 것입니다

우리는 실시간 액세스를 확대하기 위해 노력하고 있습니다 그러나 지금 제약 조건은 자신의 계정 당신은 스트리밍을 통해 특정 수의 YouTube 계정으로 양호한 상태를 유지해야합니다 관객 : 좋아, 그럼 그게 내 다음 질문이야 그렇다면 API를 사용하기위한 한계는 무엇입니까? SATYAJEET SALGAR : 죄송합니다 관객 : API를 사용하기위한 한계는 무엇입니까? SATYAJEET SALGAR : 누구나 API를 사용할 수 있습니다

따라서 YouTube에 실시간 스트리밍 할 수있는 도구를 개발중인 경우 API는 공개입니다 개발자 키 이외에는 없습니다 IBRAHIM ULUKAYA : 아니오, API는 선적 서류 비치 우리가 제약을받는 유일한 것은 채널로 스트리밍됩니다 따라서 테스트 채널이 있거나 하나의 채널을 사용하여 API를 사용하면 항상 API를 사용할 수 있습니다

그러나 일단 라이브 스티 밍을 시작하면 결국, 귀하가 귀하의 제품과 귀하의 제품을 개발할 때 준비가되면 제품을 사용할 사람들은 실제로 라이브를 보낼 채널 안으로 들어간다 관객 : 오, 알겠습니다 그들은 채널이 필요합니다 그러나 실시간 스트림의 콘텐츠를 어떻게 화면에 나타 냅니까? SATYAJEET SALGAR : 그렇다면 우리는 어떻게 컨텐츠를 관리합니까? 관객 : 예를 들어, 공개하지 말고 어떻게 감지합니까? 어떻게 그걸 막아? SATYAJEET SALGAR : 아하, 당신은 스팸 걱정이있어 관객 : 네

SATYAJEET SALGAR : 그래서 우리는 이것은 우리가 해낸 것입니다 YouTube에서 많은 시간과 노력을 들였습니다

YouTube의 콘텐츠를 보호하는 모든 메커니즘 동영상 일반은 실시간 스트림에도 적용됩니다 그래서 사람들은 시내에 깃발을 꽂을 수 있으며, 그것은 내려갑니다 콘텐츠 ID라는 도구가 있습니다 저작권을 침해하는 콘텐츠 라이브 스트림에 대해서도 실행됩니다

다른 건 없니? 괜찮아 수줍어하는 청중입니다 우리의 이야기를 듣고 대단히 감사합니다 온라인으로 청취 해 주셔서 감사합니다 이브라힘 울루 카야 : 고마워요

SATYAJEET SALGAR : 이브라힘과 나는 여기서 놀고있다 와서 질문 해보십시오 IBRAHIM ULUKAYA : 다른 질문이 있으시면 하루 종일 샌드 박스 영역에있을뿐만 아니라 다른 영역에도 있어야합니다 YouTube 전문가 그래서 언제든지 와서 다른 질문을 할 수 있습니다

우리는 모든 것을 후속 조치 할 것입니다 감사 SATYAJEET SALGAR : 고마워

Google I/O 2014 – Material science: Developing Android applications with material design

CHET HAASE : 안녕하세요, Material Science에 오신 것을 환영합니다 아니, 아니, 아니, 아니

다시 해봅시다 Android 개발자를위한 자료 디자인 이 세션의 요점은 다음과 같습니다 기술적 세부 사항 중 일부에 들어가기 실제로 그것이 무엇인지에 대한 개요 엔지니어의 관점처럼 보입니다 이번 주에는 많은 디자인 세션이 있습니다

이 세션 바로 전에 하나를 포함하여 그들은 재료 디자인의 아이디어에 대해 이야기합니다 우리가하고 싶었던 것은 이는 우리가 노출하고있는 실제 API의 관점에서 의미합니다 또는 Android 개발자로서이 제품에 연결하는 곳 재료 디자인 응용 프로그램을 만들 수 있습니다 그 일을하고 싶다면 해시 태그가 있습니다 피드백 URL이 있습니다

절대적으로 충격적이고 빛나는 의견이있는 경우 세션에 대해 언제든지 저에게 가십시오 우리가 어떻게 생겼는지 알고 싶다면, 당신은 실제로 무대를 바라 볼 수 있습니다 또는 우리의 그림이 Chet Haase입니다 ADAM POWELL : 저는 Adam Powell입니다 CHET HAASE : 둘 다 Android UI Toolkit 팀에 있습니다

이것은 기본적으로 UI Toolkit 위젯을 처리하는 팀입니다 애니메이션으로 렌더링하는 그래픽을 통해 그것들을 움직이고 GPU에서 침을 뱉는 실제로 모든 하드웨어 가속 명령 가능한 빨리 화면에 표시하십시오 그것이 팀이하는 일입니다 우리가 물질을 위해 구현해야하는 모든 것들 디자인 또한 정말로 빠르게 실행해야합니다 같은 팀이 다음과 같은 기능을 처리하기 때문에 흥미로운 거래 인 성과 측면으로 떨어져서

ADAM POWELL : 첫 번째 질문입니다 네가 물어볼 수도있는 이유는, 왜? 그래서 우리는 이미 기조 연설을 보았습니다 우리는 많은 화려한 효과를 봅니다 우리는 고집 센 디자인을 본다 성능 문제가 있습니다

그리고 UI를 실제로 팽창시키는 방법을 발견합니다 그래서 우리는 실제로 가지고 싶지 않습니다 그 부정적인 견해 우리는 이것이 무엇인지 확인하기를 원합니다 이는 사용자에게 중요한 문제입니다

그리고 모든 소재 디자인에서 하나의 큰 테이크 아웃이 있다면 하루 종일 보게 될 자료 아마 L 릴리스까지 여기 모두가 자신의 앱을 준비하기 시작하면서, 그 모션 문제입니다 무브먼트는 사용자에게 무엇이 할 수 있는지 가르쳐 줄 수 있습니다 그리고 그것이 어디에서 왔는지 UI에서 본 적이 있다면 아무데도 튀어 나와 뭔가 손가락 아래에서 밖으로 사라집니다 그것은 정말 초조 한 경험입니다

따라서 모션을 사용하여 우리는 계속해서 사용자를 가르 칠 수 있습니다 시스템이 어떻게 행동하고 무엇을 하는가? 그 시스템에서 기대할 수 있습니다 그래서 이것은 단서입니다 우리는 감동되고 움직일 수있는 것에 대해 단서를 줄 수 있습니다 실체처럼 보이게 만듭니다

이것은 카드가 실제로 우리에게주는 것들 중 하나입니다 그리고 이런 종류의 가상 객체들 몰핑하고 움직일 수없는 실제 객체를 시뮬레이트하고, 그 실체를 여전히 암시 할 수 있습니다 이것들은 당신의 카드, 종이 및 잉크입니다 지금까지 비디오에서 본 모든 것들 따라서 테이크 어웨이는 모션 플러스 유형 성이 동일합니다

사용자에게 더 이해하기 쉬운 UI 나는 너에게 줄 것을 원했어 이 석방과이 과정에 대한 간단한 정신 모델 실제로 재료 디자인을 구현하는 것은 나에게 달렸다 사실, 우리 팀 안에서이 일을하는 것은, 물건 가져 오기, 실제로 픽셀 디자인을 나타내는 화면에 나타납니다 프로세스는 기본적으로 아이디어를 취합니다 그 UX는 – 디자인 팀이 – 어디에서 그들은이 위대한 아이디어이고 패러다임이 있습니다

시스템이 있고 언어가 있습니다 그리고 그들이 생각해내는 멋진 것들이 모두 있습니다 실제로 기술 세부 정보로 변환합니다 엔지니어가 실제로 사용하는 기능 제공 할 응용 프로그램을 작성해야합니다 그래서 제가 사진을 찍는 방법은 – 그래서 우리는이 거대한 디자인 팀을 가졌습니다

그래서 우리는 위대한 예술가들에게 접근 할 수 있습니다 우리는 그들에게 이것을 나타내는 예술을 생각해 낼 것을 요청할 수 있습니다 아니면 실제로 직접 그릴 수 있습니다 이것은 분명히 그의 손을 맹렬히 흔들고있는 예술가이다 아름다운 무지개와 멋진 것들이 떠오른다

아티스트라고 말할 수 있습니다 베레모는 그 또는 그들의 프랑스어 중 하나를 포함 그래서 우리는 디자인 아이디어를 취합니다 그들은 공중에 떠있었습니다 엔지니어가 방에 들어가있을 때 매우 모호합니다

그들의 얼굴에 정말 당혹 스럽네요 이 모든 것이 무엇인지 궁금합니다 그들이 응용의 맥락에서 언어를 말할 때 그것은 말이되지 않습니다 그럼– ADAM POWELL : 자바라는 뜻인가요? 나는 그렇게 생각한다 자바 프로그래밍 언어라고 생각합니다

우리는 이것 이후에 미국 팀과 대화를하고 그걸 털어 놓을 것입니다 그러나 실제로 아이디어는 구체적인 요소를 취하는 것입니다 그들이 실제로 무엇을 계산하는지 그들이 떠 다니는 것에 대해 이야기 할 때 손을 흔드는 것을 의미합니다 그들이 잉크와 종이에 대해 말할 때 액션 버튼 실제로 그것을 특정 요소들로 번역한다 플랫폼에 필요한 기능을 제공하기 위해 필요한 플랫폼입니다

내가 생각하는 방식은 나는 생각한다 그것은 Nyquist Sampling 정리와 같습니다

커브를 샘플링 할 수있는 빈도 그러면 원래 곡선을 재구성 할 수 있습니다 그리고 나는 기술적 세부 사항에 들어 가지 않을 것이다 나는 그들을 이해하지 못하기 때문에 그러나 여기 같은 생각입니다 UX가이 아름답고 공간적인 곡선을 만들면 디자인 언어와 그들이 올 계획의 패턴을 그리고 당신이하고 싶은 것은 실제로 사용할 수있는 충분한 기능 그들이 어려움을 겪었음에도 불구하고 원하는 것을 얻으십시오

당신이 필요로하는 바삭 바삭한 요소의 관점에서 그래서 우리가 툴킷 팀에서 한 일 그것을 기능과 기능으로 변환하는 것이 었습니다 우리는 이러한 능력을 폭로해야했습니다 그리고 이것은 특징으로 끓었습니다 우리는 앞으로 몇 분 안에 얘기 할 것입니다

우리는 실시간 그림자를 할 수 있습니다 공유 영웅 요소를 사용한 활동 전환이 있습니다 우리는 순환적인 계시를 가지고 있습니다 디자인 회담에서 그 중 일부를 보았습니다 플로팅 액션 버튼은 더 큰 형태의 내용으로 드러납니다

우리는 더욱 생생하고 풍부한 목록을위한 RecyclerView 위젯을 가지고 있습니다 기능, 터치 피드백 UI에서 진행중인 작업에 대한 지속적인 피드백 그들이 그것과 상호 작용할 때 그리고 나서 우리는 항상 성능에 대해 연구하고 있습니다 게다가 ADAM POWELL :이 모든 것에서, 실제로 소재 앱을 어떻게 작성합니까? 음, 첫 번째 단계는 무언가입니다

이미 서면으로 익숙한 Android 앱이 내 활동의 테마입니다 그래서 themematerial이 첫 번째 단계입니다 이것을 선택하십시오 그것으로부터 상속받습니다

다른 요소를 사용하고있는 맞춤 테마가 있습니다 그리고 한번보세요 이 간단한 스위치 플립으로 앱을 어떻게 보이나요? 그리고 여러분은 그것에 대한 몇 가지 문제점을 수정해야 할 것입니다 거의 모든 주요 앱은이 시점에서 중요하지 않습니다 둘 중 하나와 일치시키려는 많은 작업을 수행했습니다

속이 빈 테마 또는 사용자 정의 테마 그것은 과거에 구현되었습니다 그리고 업데이트해야 할 것입니다 당신이가는 그 개별 요소 따라서 디자인을 구현하고 구현하는 것이 좋습니다 지침

그래서 이것은 새로운 거래 방법이 될 것입니다 레이아웃 및 색상, 새 측정 항목, 새 측정 값, 그리드 사용 거기에서, 그것은 정말로 대부분 표준 안드로이드 프로그래밍입니다 당신은 많은 도구를 사용하게 될 것입니다 너는 이미 거기에 익숙해 져있다 지원할 새로운 API가 있습니다

화면상의 특정 요소의 동작 및 정렬 당신은 전통적으로 많은 통제력을 갖지 못했다 과거와 같은 일들 액션 바에 위치합니다 그리고 필요에 따라 지원 라이브러리를 사용할 수 있습니다 여러분 중 대부분은 이미 이것에 익숙합니다 우리는 DrawerLayouts, ViewPager, 개발자 인 모든 위젯 이 시점에서 알고 있고 사랑하십시오

우리는 더 많은 것을 추가하고 있습니다 우리는 RecyclerView를 가지고 있습니다 조금 더 얘기하자면, 기본적으로 마무리되는 카드보기 L의 새로운 기능 중 일부는 그리고 당신에게 특별한 사용을위한 멋진 가을을 돌려 준다 기존 플랫폼 버전의 경우 그러면 필요에 따라 진행할 수 있습니다

새로운 플랫폼을위한 독점적 인 L API를 사용하십시오 버전뿐만 아니라 이것은 최신 그래픽 API와 같은 것입니다 그림자 주변 및 클리핑,보기에 대한 고도 설정 그래서 그들은 우주로 튀어 나올 수 있습니다 터치 피드백 잉크 잔물결이 있습니다 지금까지 동영상에서 보았던 것입니다

아이콘과 다른 드로어 블이 있습니다 상태 변경 사항을 애니메이션으로 만들 수 있습니다 이미 국가를 누르고 초점을 맞추는 데 익숙하다면 국가 등등 애니메이션 전환을 정의 할 수 있습니다 그 주들 사이에 그리고 일반적인 애니메이션의 경우 우리는 시각적으로 드러납니다

우리는 애니메이션 커브를 다루는 새로운 방법을 가지고 있습니다 그리고 물론, 당신이 본 활동 전환 그래서이 시점에서, 여러분 대부분은, 호환성은 어떨까요? 아무도 타겟팅 할 수 없기 때문에 L 이상 이 때 일부 사용자가 있어야하는 경우 물건 배송 따라서 이전 릴리스의 앱에서는 app compat 테마를 사용하십시오

이미 익숙 할 수도 있습니다 지원에서 호환성 작업 표시 줄 사용에서 도서관 우리는 이것을 밖으로 확장 할 것입니다 L에서 재질 디자인 요소를 커버 할 수 있습니다 물론 새로운 지원 라이브러리를 사용하십시오

상관없이 위젯, RecyclerView, CardView, 그리고 당신이 알고 사랑하는 다른 것들 CHASE HAASE : 이제 새로운 API에 대해 이야기 해 보겠습니다 UI 툴킷에서 공개 한 기능을 제공합니다 Adam이 이야기하고있는 중요한 요점 중 하나 당신은 디자인의 많은 기능을 얻을 수 있습니까? 표준 Android를 통해 이미 API라는 의미의 프로그래밍 사용 – 표준 레이아웃 및 측정 물건, 표준 드로잉 물건 새로운 API를 추가했습니다

그들이 사용하는 이유의 대부분은 실제로 우리 내부 용입니다 따라서 우리는보기를 팝업 할 수있는 능력을 가지고 있습니다 뷰 계층 구조 평면 위에 표고를 둡니다 그러나 우리는 이것을 표준 위젯의 일부에 사용합니다 반드시 응용 프로그램에 사용할 필요는 없습니다

그러나 당신이 원한다면 그들은 당신의 사용을 위해 거기에 있습니다 그래서 그 중 하나는 실제로 위젯은 새로운 L API가 아닙니다 그것은 실제로 그것보다 좋습니다 새로운 지원 웹 API입니다 ADAM POWELL : 맞아

다시 API 7의 모든 것에서이 기능에 액세스 할 수 있습니다 위에서 우리는 RecyclerView CardView를 사용할 수 있습니다 미리보기 초기에 살펴보십시오 RecyclerView는 무엇입니까? 당신은 이것에 대해 지금 많이 들었습니다 새로운 어댑터 지원 뷰의 기본 클래스입니다

기본적으로 원격으로 아무 것도 시도하지 않은 사람 이 시점에서 목록보기로 재미 있거나 복잡한 많은 벽에 머리를 두드렸다 매달린 광선, 날카로운 물건, 뭐든간에 당신은 그것을위한 은유로 사용하고 싶을지도 모른다 기본적으로 목록보기가 설정됩니다 완전하고 완전하게 통제하다 원하는 항목을 언제든지 배치 할 수 있습니다 그래서 재미있게 보시고 모든 것이 중계됩니다

모든 애니메이션이 손실됩니다 애니메이션의 중간 지점에 있었던 조회수 이제 화면 중간에서 벗어나 다른 데이터 항목에 바인딩됩니다 그리고 시도하고 사용하는 개발자로서 정말 실망 스럽습니다 어떤 종류의 정말로 풍부한 경험을 얻으 려합니다 복잡성 예산보다 훨씬 뛰어납니다

많은 방법으로 따라서 RecyclerView는보다 유연한보기를 제공합니다 기존의 대형 데이터 세트를 에 대한 ListView를 사용하십시오 이미 기능을 내장했습니다 어댑터가 어댑터가 위젯에 대해 항목이 구체적으로 추가 될 때 데이터 세트로 계속 진행 또는 항목의 범위가 제거되거나 제거 될 때 특별히 추가되거나 제거됩니다

그냥 말하기보다는 헤이, 내 데이터 세트가 바뀌었다 뭐가 바뀌 었어? 나는 모른다 너 알아 낸거야 그래서 이런 식으로 우리는 당신에게 줄 수 있습니다 항목이있을 때의 애니메이션과 같은 몇 가지 사항이 자동으로 추가됩니다

세트에 추가되거나 제거됩니다 CHOT HAASE : 튜토리얼을 하나 더 만드는 것을 피할 수 있다면 어댑터보기에서 무언가를 애니메이트하는 방법, 난 행복해질 꺼야 ADAM POWELL : 이것이 바로 여기의 아이디어입니다 따라서 사용자 정의 레이아웃을 수행 할 수도 있습니다 이 프레임 워크에서

많은 분들이 말씀하셨습니다 음, ListView는 훌륭하지만 가로로 스크롤하고 싶다면? 분배기가 작동하도록하려면 어떻게해야합니까? 조금 달라요? 만약 내가 비틀 거리는 그리드를 원한다면 특정 라인을 따라 줄 지어다? 그래서 우리는 그것을 제공합니다 우리는 다 방향 스크롤 기능을 제공합니다 기본적으로 개발자는 자신 만의 레이아웃을 플러그인 할 수 있습니다 관리자가 항목보기를 배치하는 방법을 정의 할 수 있습니다

이것은 RecyclerView의 일반적인 주제를 말하며, ListView가 실제로 모든 방식으로 확장 가능하도록 아니었다 CardView도 있습니다 이제 CardView는 조금 다른 접근 방식을 취합니다 RecyclerView에서 RecyclerView는 매우 일반화 된 구성 요소입니다

당신은 계속 나아갈 수 있습니다 CardView는 무엇인가 될 예정입니다 이 방법은 매우 특별한 유스 케이스를 해결합니다 호환 가능하며 최선의 근사치를 제공합니다 서로 다른 플랫폼 버전에서 의도 된 디자인의 따라서이 경우 표준 일관성있는 외관을 제공합니다

진짜 부드러운 그림자와 사용자 정의 된 둥근 뷰를 얻을 수 있습니다 당신의 둥근 모서리 등을 클리핑하고 L, 우리는 최선을 다해 가짜 버전을 제공 할 것입니다 그리고 모양 배경 pre L하지만 슬라이드에서 볼 수 있듯이 여기까지, 이것들은 실제로 꽤 유사하게 보인다 당신에게 디자인의 일반적인 의도를 부여합니다

이런 종류의 도구는 일종의 것입니다 당신이 표현할 수 있도록 더 많이 제공하고 싶습니다 구형 플랫폼의 재질 설계 CHASE HAASE : 그럼 이제 상대방에 대해서 이야기 해 봅시다 API 및 기능 사실 L 플랫폼에 있습니다 이전 자료는 지원 라이브러리에있었습니다

어디에서든 자유롭게 사용하십시오 귀하의 응용 프로그램에 대한 감각 특정 기능을 타겟팅하는 경우 당신의 적용을 위해, 특히 L, 우리가 소개 한 새로운 API에 액세스 할 수 있습니다 먼저, 그림자에 대해 이야기 해 봅시다 UX 그룹의 초기 비디오가 있습니다

그들이 원하는 공간을 탐험하면서 그 그림자는 실제로 같을 것입니다 그래서 우리는 이것을 볼 수 있습니다 그것이 실행되는지 보자 그래서 우리는 광원을 가지고 있습니다 그것이 지역 광원 인 것에 주목하십시오

우리는 카메라에 대한 직교 투영법을 사용합니다 똑바로보고 그리고 나서 우리는 복잡한 일을하는 카드를 가지고 있습니다 이러한 멋진 실시간 그림자를 주조합니다 그리고 책임있는 모든 엔지니어 60 프레임에서 이와 같은 것을 구현하기위한 심장 발작을 일으켰다

ADAM POWELL : 때때로 웃었다 CHET HAASE : 좋아하는 비디오 모의물이 여기에 있습니다 전체 출시 중 디자인 팀에서 나왔습니다 두 사람의 엔지니어는 그림자의 초기 프로토 타입 작업, 디자인 팀과 이야기를 나눴습니다 그리고 그들이 요구 사항에 관해 그들과 이야기하고있을 때 이 영역 광원을 가지고 있기 때문에 아마도 반올림해야합니다

아마도 직사각형이어야합니다 우리는 둥근 모서리를 확실히 원합니다 부드러운 그림자와이 모든 것들 분명히 60 프레임에서 두 번째 속도로 수행해야합니다 백그라운드에서 하이 엔드 워크 스테이션이 실행 중이었습니다

하이 엔드 애니메이션 소프트웨어는 이것을 렌더링합니다 단일 프레임은 30 초 만에 60 프레임을 초당 싶었습니다 전화로 그것은 너무 괴롭습니다 그림자가 어디에 있는지도 알 수 있습니다

그리고 그걸 렌더링하는 데 아직 오래 걸렸습니다 그리고 우리는 실시간으로 실제로 어떻게하는지 궁금합니다 그리고 나서 우리가 알아 낸 것 같아요 그래서 그림자 뒤의 아이디어는 당신은 당신의 견해를 높이고, 그 견해들을 그 견해 위에 올려 놓기 위해 계층 구조 평면 따라서 L에 살기 전에 모든 것을 생각할 수 있습니다

당신이 원한다면, 모든 것이 z에 있다는 것을 제외하고는 0이됩니다 모든 것이 같은 비행기에 있습니다 그것은 기본적으로 안드로이드의 평평한 땅입니다 음, L 버전에서 우리는 당신을 허용합니다 당신의 선택에 따라 그러한 견해 중 일부를 향상시킬 수 있습니다

해발 고도 또는 번역 z 값 또는 az 값 그들을 모두의 비행기 위에 올려 놓는 az 값 그 평평한 땅에 그러면 자동으로 캐스팅 할 수 있습니다 공중 광원으로부터의 그림자 우리는 그 세계보다 국지적으로 위치했습니다 이런 식으로하는 또 하나의 이점은, 알아내는 대신에, OK 자, 어떻게이 그림자 이미지를 빨리 그릴 수 있을까요? 이 일의 뒤에 대략 보이게하십시오? 뷰 볼륨에서 올바르게 수행하는 한 가지 이점 접근 방식은보기가 컨테이너 외부로 그릴 수 있다는 것입니다

범위 너가보기를 그리려고 노력했는지 나는 모른다 그림자를 던지거나보기를 확대하는 것처럼, 갑자기 비늘이 생기거나 밖으로 캐스팅됩니다 그 포함 관계 계층 구조의, 그때 그것은 잘립니다 그런 다음이 API를 사용하여 놀아야합니다

setClipChildren (false) 그리고 일종의 것들은 당신이 기대 한대로 가지 않습니다 그리고 그것은 모두 끔찍한 해킹입니다 따라서 해킹을하는 대신 실제로 육체적으로 정확하게하는 것 우리는이 3D 볼륨을 만듭니다

당신은 그곳의보기를 향상시킬 수 있습니다 그들이 원하는 볼륨으로 그릴 수 있습니다 z에서 올바른 순서로 정렬됩니다 그들은 올바른 순서로 그립니다 그림자는 그 아래에서 올바른 순서로 그려집니다

뷰 계층 자체 위에 ADAM POWELL : 그 외에도 많은 아마 당신이 정말로 당신의 견해에 맞는 z 순서를 원한다 스태킹을 시작할 때 과거에는 자식 순서를 재정의해야했습니다 그리기를위한 매개 변수

과거에는 학대를 당했을 수도 있습니다 뷰 그룹 내에서의 일반적인 아이의 순서 지정 바람직한 효과를 달성하기 위해, 이렇게하면 모든 번거 로움을 피할 수있는 아주 쉬운 방법이됩니다 CHASE HAASE : 그래서 우리는 몇 가지를 볼 수 있습니다 이 작업과 관련된 API의 기본적으로 입면 특성이 있습니다 이것은 그 물건이 사는 곳입니다

이것을 영구적 인 z 위치라고 생각할 수 있습니다 그리고 우리는 몇 가지 다른 속성을 가지고 있습니다 이는 번역 x 및 번역 y와 유사합니다 속성 비록 이것들이 애니메이션에서 더 많이 사용되지만, 일시적인 포스트 레이아웃 상태 당신은 다른 z 값으로 애니메이트하고 있습니다

그래서 예를 들어, 당신이 당신이 팝업하고 싶은 전망을 가지고 있다면, 당신은 그것이 언론 국가에있을 때 그 그림자를 확대하기를 원합니다 번역 z 속성에 애니메이션을 적용하면 긍정적 인 고도 값을 가졌는지 여부 다른 API도 있습니다 클리핑에 대 한 슬라이드에 표시합니다 그래서 그림자 자체의 모양을 설정할 수 있습니다

따라서 플로팅 액션 버튼을 생각해 볼 수 있습니다 이 원형 모양으로 음, 원형 그림자를 드리 우고 싶습니다 그렇지 않으면 환상이 무너집니다 따라서 API를 사용하여 모양을 설정할 수 있습니다

그림자를 던져 버린다 개요를 설정할 수있는 API도 있습니다 실제로 잘라내 진 것입니다 이 중 일부는 필연적으로 제약 조건이 주어집니다 우리가 운영하는 곳은 매우 제한되어 있습니다

임의의 경로 모양으로 잘라낼 수 없으므로 일부 세부 정보 SDK 문서에 있습니다 또한 클리핑 및 특히 API를 중심으로 우리가 풀 릴리스로 갈 때 아마 변화하기 쉽다 미리보기에서 우리가있는 곳을 볼 수 있습니다 그동안 석방하라 데모를 실행 해 봅시다

어떻게 작동하는지 볼 수 있습니다 데모로 전환 할 수 있다면 여기에 있습니다 당신은 내 아주 빨간 손가락 옆에, 나는이 카드를 끌 수 있습니다 실제로 틸트를 사용할 수 있습니다 이 일에 미묘한 차이를 느낄 수 있습니다

나는 약간의 음영이 있다고 생각한다 아마도이 프로젝터에 대해서는 너무 미묘 할 것입니다 그래서 당신은 이것이 실제로 예술가의 렌더링이 아니라는 것을 알 수 있습니다 그리고 그것은 30 초 프레임을 복용하지 않습니다 그래서 우리는 초당 60 프레임을 받았습니다

이것은 넥서스 5입니다 사실 많은 초기 작업이있었습니다 오래되고 느린 장치에서 수행됩니다 원래 Nexus 7이 프로토 타입 장치로 사용 된 것 같습니다 상황이 실제로 충분히 빠를 것입니다

그리고 다시 이것은 지역 광원입니다 실내의 그래픽 괴짜들, source local 당신이 할 수있는 많은 가정들이 있습니다 그것이 포인트 소스이고 그것이 무한했다면 그리고 우리는 여기서 그러한 가정을하지 않습니다

우리는 실제로 이러한 메쉬를 실시간으로 생성합니다 부드러운 경계가있는 그림자를 드리 우기 위해, 그것이 그들이 원하는 결과이기 때문입니다 그래서 합리적으로 잘 작동합니다 내가 보여줄 또 하나가 있습니다 Shadow Card Stack을 봅시다

따라서 이러한 스태킹 요소를 볼 수 있습니다 그들은 다른 z 값을 나타냅니다 그리고 그들은 더 크거나 더 작은 그림자를 던집니다 이 육체적으로 정확한 볼륨에서 기대하는 것처럼 ADAM POWELL :이 데모는 실제로 보여줍니다

네가 할 수있는 다른 사실들 기조 연설 중 본 또한 요소를 가질 수 있습니다 동일한 병합 된 평면의 일부이며, 3 차원 성격을 더 나누고 더 많이 차지하라 당신이 그들과 상호 작용할 때 CHASE HAASE : 우리가 슬라이드로 다시 전환 할 수 있다면 거기는

네 터치 피드백에 대해 이야기 해 보겠습니다 확실한 잔물결에 대해 이야기 해 봅시다 그래서 우리가 원했던 것 중 하나 일반적으로 UI에서 할 수 있습니다 – 사실, 우리는 엔지니어링 공간에서 그것에 대해 생각하고있었습니다

우리가 전반적인 디자인 언어에 직면하기 전에 재료 디자인의 변화 – 능력 무슨 일이 일어나고 있는지 더 많은 것을 사용자에게 알리기 위해 그들의 UI 상호 작용 특히, 버튼을 누를 때, 즉각적인 원자 상호 작용이 있습니다 눌려진 상태에서 눌려 지므로 상태 색상이 눌려집니다 좋았어 우리가 할 수 있다면 좋지 않을까? 변경 사항 중 일부를 애니메이션으로 만들어 정보를 얻으십시오

변화하는 국가들, 국가의 시간 기반 변화의 일종 그 주 실제 위치에 대한 자세한 정보는 물론 변경 되었습니까? 그래서 물결이 그렇게합니다 표준 위젯에 대한 터치 피드백 상호 작용 사용자 정의 위젯에서 사용하도록 선택한 경우, 눌린 상태에 대한 피드백을 제공합니다 일어나거나 일어나는 다른 주, 그래서 잔물결은 일종의 발산 물이 될 것입니다 뿐만 아니라 선택적으로 발산합니다 접촉 지점에서

그래서 당신은 실제로 리플을 얻을 수 있습니다 손가락을 밟은 곳부터 시작됩니다 훨씬 많은 상호 작용 정보 사용자가 실제로 무슨 일이 일어나고 있는지 이해할 수 있습니다 ADAM POWELL : 다시 한 번 말씀 드리겠습니다 모션의 원리와 그것이 실제로 어떻게 UI 이해에 도움이되는 일종의 이렇게하면 많은 방해 요소가 제거됩니다

당신이 오늘 UI에서 보는 깜박임 터치 영역 조명의 전체 파손 너가 조금이라도 만지 자마자 매우 가혹하게 위로 그것의 모퉁이 이렇게하면 사용자에게 조금 더 부드럽게됩니다 CHASE HAASE : 새로운 수업이 있습니다 이것을 가능하게하는 RippleDrawable이라고 불린다 그리고 이것은 기본적으로 내용을 래핑합니다

당신이 그 내용을 보여주고 그 다음에 드러내고 싶어하는 리플로 시간이 지남에 따라 당신은 선택적으로 당신이 리플의 특성을 변경하기 위해 설정할 수도 있습니다 이것은 자동으로 내장됩니다 버튼과 같은 많은 표준 도구로 이 기능은 활성화 된 응용 프로그램에서 볼 수 있습니다 머티리얼 디자인이 이미 있거나 RippleDrawable을 사용할 수 있습니다 코드에서 직접 인스턴스화 할 수도 있고, XML 리소스 또는이를 수행하는 쉬운 방법으로이 작업을 수행 할 수 있습니다

뭔가의 전경이나 배경을 설정할 수 있습니까? 선택 가능한 항목 배경으로, 그 선택을 자동으로 리플합니다 상호 작용 그래서 우리는 아이콘을 약간 변경했습니다 우리는 새로운 것을 추가했습니다 이 두 가지가있었습니다

하나는 상태 애니메이션 드로어 블이었고, 이것은 다른 PNG를 통해 실제로 애니메이션을 적용하는 기능입니다 이것을 키 프레임 애니메이션으로 생각할 수 있습니다 우리는 다른 이미지를 뒤집을뿐입니다 도중에 체크 박스와 라디오 버튼은 내가 생각하기에, L 미리보기에서 이것을 나타냅니다

그래서 지금까지의 데모를 본 적이 있다면 요 시스템 이미지를 실제로 플래싱하려면, 이 위젯이이를 통해 상호 작용하는 것을 볼 수 있습니다 기본적으로 상태에서 상태로 애니메이션을 적용하는 방법입니다 도중에 일련의 이미지를 통해 그리고 다른 하나는 상태가없는 애니메이터였습니다 이 위젯이 갈 때 말할 수있는 능력, OK

이 상태에서 그 상태로 이 임의의 애니메이션을 실행하고 싶습니다 일반적으로 객체 애니메이터 애니메이션을 제공합니다 여기 보이는 것처럼, 우리는 세 가지를 쌓아 올리고 있습니다 애니메이터 세트에서 우리는 말하고 있습니다

좋아, 나는 움직이기를 원해 내 객체의 다음 속성 나는 압박에서 압박에 이르기까지 상태, 그리고 앞뒤로 다른 상태 조합 훨씬 유연한 표현 방식 이죠 여기 있습니다 이 위젯이 통과하기를 바라는 행동 그것은 a 상태에서 b 상태로 진행됩니다

ADAM POWELL : 예를 들어 보겠습니다 누군가가 그것을 사용할 수있는 곳? CHASE HAASE : 예를 들어, 버튼을 터뜨릴 수 있습니다 클릭 할 때의 프레스 상태를 원한다면 버튼에 – 통조림 질문처럼 들렸습니다 그렇지 않았습니다 네가 그걸 물어볼 것이라고 기대하지는 않았다

너 왜 내가 여기서 생각하게 만드는거야? 따라서 버튼에 고도 속성을 설정할 때 누군가 그것을 눌러, 그럼 당신은 할 수 그것을하기위한 애니메이션을 설정하십시오 그래서 그것이 언론 국가에 들어갈 때 그것은, 나는 언론 국가에 갈거야 실행해야하는 애니메이션은 다음과 같습니다 번역 z 속성에 애니메이션을 적용하면 0에서 20까지

그런 다음 기본 상태로 돌아 가면 당신은 20에서 0으로 움직일 것입니다 생기 애니메이션에 대해 이야기 해 봅시다 그래서 다양한 것들이 소개되었습니다 미리보기 버전에서 완전히 다른 분야에서 보아라

그리고 우리는 가장 큰 것을 만들 것입니다 플로팅 액션 중 일부에서 본 공개 애니메이션 예를 들어 이전 대화에서 버튼 데모, 뿐만 아니라 당신에게 달려있는 다른 상호 작용 당신의 어플리케이션에서 확장 모양을 정의하는 그것 밑에 내용을 드러내고, 원형 공개처럼, 또는 결합 할 수 있습니다 이 원형, 더 둥근이 원형 애니메이션 보기를 복잡한 모양으로 정렬 둥근 난파 효과 나 뭐든간에 기본적으로이 애니메이션을 만들라고 말합니다 그것은 원형 공개입니다

여기에 집중 될 것입니다 반경 이 값에서 그 값으로 움직일 것입니다 그런 다음 애니메이션을 시작하면됩니다 매우 간단한 방법으로 애니메이터를 만들 수 있습니다 이것은 불투명 한 인터페이스입니다

거기에는 유연성이별로 없습니다 다시 말하지만, 우리가 실제로 겪고있는 제약 조건을 감안할 때 하드웨어의 종류에 따라 성능을 향상 시키십시오 우리가 가지고있는 이러한 기능을 특정 사용 사례로 제한합니다 우리가 찾는 것이 중요합니다

그래서 당신은 당신이 필요로하는 것을 할 수 있습니다 현재이 기능 집합으로 제한 될 것입니다 그래도 실현해야 할 중요한 것 이 중 일부는 비쌀 수 있습니다 그래서 우리가하고 싶었던 것들 중 하나 당신이 만들 수있는 슈퍼를 쉽게 만들 수는 없습니다 너의 모양에이 임의의 클립 항상 거기에 두십시오

엄청나게 비싸다 우리가 GPU를 통해 이러한 것들을 구현하는 방법 사소하지 않습니다 그래서 우리는 시간이 지남에 따라 애니메이션을 돌릴 것입니다 그리고 나서 그것은 끝날 것입니다, 그리고 우리는 단지 할 수 있습니다 솔직히 더 쉽기 때문에 사각형보기로 돌아가십시오

그래서 비싸다 우리는 당신이 매우 일시적인 상황에서 이것을 사용할 것을 기대합니다 너 어디서 움직이는거야? 그런 다음 애니메이션에서 다시 나옵니다 이전 릴리스에서도 비슷한 효과를 얻을 수 있습니다 Nexus 5에서 검색을 사용한 경우 – KitKat 릴리스가이 작업을 수행했습니다

그들은 보여줄 원형 공개가 있었다 일부 검색 결과 이것을 이미 할 수있는 방법이 있습니다 다시 말하지만, 거기에 성능 문제가 있습니다 당신은 실제로 그것이 귀하의 신청서와 귀하의 상황에 적합한 것입니다 하지만 이미 그림을 그릴 수 있습니다

비트 맵 쉐이더 애니메이션 커브 따라서 디자이너 중 한 명은 이 릴리스에서 원하는 엔지니어뿐만 아니라 더 임의적 인 시간 보간을 할 수있는 능력이었다 그래서 우리는 이미 능력을 가지고 있습니다 사실, 모든 애니메이션의 기본 동작 쉽게 쉽게 사용할 수 있습니다

그래서 우리에게는 미묘한 가속이 있습니다 그런 다음 미묘한 감속을합니다 그리고 그 효과가 얼마나 확대되었는지 미세 조정할 수 있습니다 그리고 가속화 할 수있는 다른 것들이 있습니다 당신은 모든 출구를 감속시킬 수 있습니다

그러나 일단 당신이 그것들을 지나면 그것은 그 것입니다 그리고 디자이너들은 정말로 생각하기를 좋아합니다 대신 커브의 관점에서 사물의, 2 차 및 3 차 베 지어 곡선과 능력 매개 변수를 조정하여 정확히 얻으려면 그들이 필요한시기 적절한 행동 이것이 우리가 플랫폼에서 구현 한 것입니다 특히 세 가지 애니메이션 타이밍 곡선이 있습니다

재료 디자인의 일부로 추천합니다 그리고 당신은 이것들을 여기에서 볼 수 있습니다 그들은 특정 곡선 매개 변수로 이들을 정의합니다 파일 이름을 맨 아래쪽에 붙였습니다 그래서 이것들은 당신이 단순히 애니메이션의 보간법을 참조하십시오

또는 실제로 매개 변수를 임의로 설정할 수 있습니다 그래서 당신은 그것을 여기에서 볼 수 있습니다 이 작업을 수행하기 위해 정의 할 수있는 XML 리소스가 있습니다 또는 코드에 직접 액세스 할 수 있습니다 당신은 기본적으로 단위 광장을 가지고 일하고 있습니다

이것은 전통적인 애니메이션 및 그래픽 방식의 일종입니다 사물을 정의하는 것 0 제로에서 1 제곱까지의 단위 제곱을가집니다 제어점을 생각할 수 있습니다 그 사각형의 두 구석에

그것들은 앵커 포인트입니다, 미안 해요 그런 다음 컨트롤 포인트의 위치를 ​​정의합니다 길을 따라 커브를 변화시키는 것입니다 사실, 당신은 훨씬 더 임의적 인 경로를 가질 수 있습니다 왜냐하면 우리는 실제로 거기에서 길을 가득 메우고 있기 때문입니다

그것은 단지 하나의 곡선이 아닙니다 복잡한 경로를 정의 할 수 있습니다 왜 그랬는지는 모르겠지만 그렇게 할 수는 있습니다 우리는 또한 현재 운동을 억제 할 수있는 능력을 가지고 있습니다 당신은 이미 이것을 할 수 있습니다

나는 2 ~ 3 년 전 블로그 포스트를 썼다 잘 모르겠다 유형 평가기를 사용하여 사물을 움직이는 방법에 대해 이야기하기 공간적 곡선을 따라서 쉬운 일이 아니 었습니다

그래서 나는 주변에 블로그 게시물을 썼습니다 설명했다 그리고 당신은 여전히 ​​그 접근 방식을 사용할 수 있습니다 그러나 우리는 또한 더 쉬운 방법을 원했다 API를 통해이를 수행하십시오

이제 할 수 있습니다 Object Animator에 새로운 생성자가 있습니다 원하는 경로를 지정할 수 있습니다 x와 y를 움직이는 데 따라 움직일 때 따라야 할 객체 같은 애니메이션의 일부 API 데모에는 경로 애니메이션 데모가 있습니다

SDK를 체크 아웃하면 해당 데모를 확인하십시오 그리고 그 주제에 대한 다양한 변형을 보여줍니다 활동 전환 그래서 이것은 상당히 큰 노력이었습니다 KitKat을 도입 한 전환 API를 기반으로합니다

전환 뒤의 아이디어는 애니메이션을 만드는 것입니다 훨씬 더 쉽고 자동적입니다 그들은 여전히 ​​사용자 정의 할 수 있습니다 그러나 큰 아이디어는 내 UI가 어떤 상태인지 알고 싶습니다 그리고 나는 어떤 상태가 될지 알고 싶습니다

대신에 모든 것을 애니메이션으로 적용 해주세요 모든 것을 위해 맞춤 애니메이션을 만드는 나 따라서 상황이 어디에 있는지 스냅 샷을 작성한 다음 레이아웃을 실행합니다 그리고 그것이 물건을 끄기 바로 전에, 당신은 사물이 어디에있게 될지 알아 낸다 그리고 나서 모든 것을 되 돌린다

그 변화를 대신 애니메이션으로 나타냅니다 그것은 전환이 작동하는 방식입니다 KitKat에서 나온 API입니다 그리고 이것이 지금 활동 전환이되는 방식입니다 잘 작동한다

동일한 모델을 기반으로하지만 너는 똑같은 방법을 지정해야한다 활동 간 애니메이션 그리고 그것뿐만 아니라, 알아낼뿐만 아니라 어떻게 시작에서 이러한 것들을 애니메이션으로, 출시 액티비티 및 아이템 애니메이션 방법 시작된 활동에 대해 알아볼 수도 있지만 공유 된 QUrl 요소 세트를 지정한다 기본적으로 와이어를 통해 던져집니다 그리고 알았어,이 이미지가 여기에 있었다

그리고 지금 거기에있을 것입니다 그리고 그것은이 다른 크기가 될 것입니다 변경 사항을 자동으로 애니메이션으로 나타낼 수 있습니다 그래서 정의하기위한 프로토콜을 생각해 냈습니다 좋습니다

여기 있습니다 우리가 이걸 정의하고있는 이름 그 다음 상대방 활동, 그 이름이 켄인지 알면 같은 요소 인 것에 대해 몇 가지 가정을하십시오 해당 요소는 자동으로 공유되고 자동으로 애니메이션됩니다 활동 전환을 통해 ADAM POWELL : 그 요약은 근본적입니다

이제는 이것이 당신에게 서로 다른 활동 사이의 프로토콜 동일한 응용 프로그램의 일부이거나 아닐 수도 있습니다 전환에서 특정 요소를 공유하기 하나에서 다른 하나까지 그럼 이미 할 수있어 당신 자신의 응용 프로그램에서 하위 활동이있다 세부 사항을 말한다

일부 미리보기 이미지보기 이렇게하기위한 기술이 이미 있습니다 우리가하는 일은 해킹을 적게하는 것입니다 프레임 워크에서 더 많은 코드화 API로 더 많은 것을 할 수 있습니다 쉽게 응용 프로그램 내부

그뿐 아니라 프로토콜을 통해 우리는 공유 영웅 요소의 이름으로 설립했습니다, 프로세스 전반에서 실제로 그렇게 할 수 있습니다 다른 사람의 활동을 시작하게 될 수도 있습니다 그리고 만일 그들이 그 공유 영웅 요소와 함께 무엇을해야하는지 안다면, 그런 다음 해당 활동 전환 애니메이션에 참여할 수 있습니다 이전 릴리스에서이 작업을 수행하는 방법을 알고 싶다면, 당신이 이것을 모든 곳에서하려고한다면, 거기에 고객 활동 애니메이션이라고 불리는 개발자가 있습니다 그리고 당신은 그 기술에 대해 생각할 수 있습니다

기본적으로 프레임 워크에 더 많이 구워진 것으로 사용됩니다 진짜를 위해 그것을하는 방법의 일등 시민으로 ADAM POWELL : 맞아 그리고 이것은 정말로 까다로운 많은 것들을 처리 할 것입니다 활동주기 자체를 둘러싼 다

활동이 다시 시작되면 다른 인트로 전환을 재생하고 있지 않다는 것을 다시는보고 싶지 않은 애니메이션 등등 CHET HAASE : 여기 코드 중 일부가 있습니다 실제로 코드가 포함 된 것보다 훨씬 많은 API가 있습니다 특히 사용자 정의 작업을 시작할 때 특히 그렇습니다 하지만 소개하기 만하면됩니다

당신이 어떻게 이러한 것들을 가능케하고 어떻게 실제로 이 애니메이션을 시작하십시오 이 항목을 테마에 넣으면 이 창 콘텐츠를 사용하도록 설정하라는 스타일을 정의하십시오 전환이나 코드에서 할 수 있습니다 – 매우 유사합니다 그리고 나서 기본 애니메이션을 사용할 수 있습니다 당신은 활동들 사이에서 희미해질 것입니다

간단한 페이드 아웃 페이드 인 또는 당신 사용자 지정 전환을 설정할 수 있습니다 사용자 정의 전환은 정의한 전환, 플랫폼이 제공하는 것, 내가 폭발의 전환을 원한다 모든면을 위쪽과 아래쪽으로 밀어 낸다 화면의 그래서 기존 활동에 대해 이러한 관습을 설정할 수 있습니다

뿐만 아니라 진입 활동 마지막으로 공유 요소가 무엇인지 정의 할 수 있습니다 세트는 당신이 전선을 지나가고 있다는 것입니다, 이름을 지정하고 전달한 다음 정의하십시오 이러한 요소에서 발생하는 전환 애니메이션 게다가 데모가 있습니다

마지막으로, 나는 새로운 전환이 있음을 언급하고자한다 이 작품의 일부로 쓰여졌다 이들은 일반적으로 전환에 사용할 수 있습니다 이미지 이동 기능이 있습니다 훨씬 더 유연합니다

이미지보기가 좀 괴팍하게 될 수 있습니다 길을 따라 크기를 조정하려고 할 때 이것에는 당신이 일을 할 수있게 해주는 능력이 있습니다 당신이 원하는대로, 스케일링 또는 이동중인 경우 이러한 장면 전환의 일부로 화면의 이미지를 슬라이딩 효과는 물건을 오른쪽에서 안팎으로 밀어내는 것입니다 그리고 왼쪽 폭발은이 비틀 거리는 지연으로 아이템을 폭발시키고 있습니다

그래서 당신은 멋진 효과적인 것들을 점차적으로 사라집니다 화면과 몇 가지 다른 장면 전환도 포함됩니다 그러나 간단한 데모를 살펴 보겠습니다 우리가 데모 장치로 전환 할 수 있다면 여기서 나가

그래서 이것은 API 데모입니다 이것은 몇 가지 방법을 보여주는 간단한 데모 일뿐입니다 분명히 내가 클릭하고있는 아이템들입니다 끝까지 실행되는 미리보기 이미지입니다 당신이 들어갈이 다른 활동

공유 요소로 공유합니다 다른 이미지를 애니메이션으로 볼 수 있습니다 그런 다음 목록 항목,에서 움직이는 텍스트 다른 활동 그리고 나서 이것은 데모입니다 다른 이야기의 일부로 쓰여졌습니다

2시 방향에 세부 정보가 추가됩니다 그리고 이러한 그래픽 기능 중 일부는 그리고 다시, 당신은 우리가이 일을 압박하는 것을 볼 수 있습니다 이 다른 활동을 시작합니다 그리고 우리는 두 번째 활동으로 들어갑니다 미리보기 이미지 공유, 해당 비트 맵 이미지 공유 그것은 공유 영웅 요소를 위해 넘어 가고 있습니다

우리가 슬라이드로 돌아 가면 멀리 가져 멀리 가져 ADAM POWELL : 그래서이 이야기를위한 테이크 아웃 우리가 당신에게 제공 할 것입니다 모두를위한 소재의 느낌과 느낌 프레임 워크의 기본 부분, 모두 버튼과 체크 박스, 그 밖의 모든 것

우리는 당신에게 이것들을 테마로하는 능력을 줄 것입니다 따라서 브랜드에 브랜드 색상을 적용 할 수 있습니다 많은 여분의 자산을 자동으로 생성 할 필요없이 귀하의 응용 프로그램 내에서 그러나 그것은 충분하지 않습니다 당신이 정말로해야 할 일은 디자이너와 함께 일하는 것입니다

디자인 가이드 그 자체로 작업하십시오 그리고 당신은 여전히 ​​글쓰기를 할 것입니다 응용 프로그램에 많은 사용자 정의 코드가 있습니다 응용 프로그램을 실제로 만드는 파트가 우리가 쓸 수없는 부분이 두드러지며 서로 다르다 너 아니면 다른 사람들을 위해 그들은 똑같은 것들이 될거야

다른 모든 응용 프로그램이 수행합니다 우리가하고 싶은 것은 당신이 도구를 순서대로 사용할 수있게해라 사용자에게 정말 독특한 경험을 선사합니다 CHASE HAASE : 자원 언급 할 가치가있는 리소스가 거의 없습니다

이미 이걸 보셨을 것입니다 디자인 사양이 있습니다 거기 있니? dandroidcom의 링크가 묶여 있습니다

이 정보 그리고 미리보기 사이트 자체를 확인하고 싶을 것입니다 SDK를 얻으십시오 그것을 막아라 장치 이미지가 시스템에 표시됩니다

그것으로 놀아 라 관심이 있으시면 제안 해 드리겠습니다 특히 우리가 말한 것에 대한 그래픽과 애니메이션 부분에서, 오후 2시에 우연히 나 한테 얘기 할 수있어 다시 [무관심]으로 무대에 올라 섰습니다 그리고 우리 모두에 들어가는 방법에 대한 기술적 인 세부 사항이 있습니다

이 물건들 중 일부가 작동하고 어떻게 될지 이러한 종류의 응용 프로그램을 만드는 데 사용됩니다 마지막으로, 피드백 URL이 또 있습니다 그리고 우리는 실제로 질문을 할 시간이 있습니다 그래서 몇 가지 마이크가 있습니다 마이크를 찾아 내고 질문을 해주십시오

아담 파웰 : 이리와 예 관객 : 그래서 빠른 질문입니다 우리가 어떻게 될지 알고 싶다 이전 버전의 Android에서이 기능에 액세스 할 수 있습니다

나는 분명히 그것을 볼 수 있다는 것을 안다 하지만이게 얼마나 많은지 알고 싶습니다 지원 라이브러리에서 지원됩니다 지원 라이브러리 버전 ADAM POWELL : 새 버전의 지원 라이브러리가 있습니다

Preview SDK로 지금 바로 나가기 그 중 일부는 사용할 수있게 될 것입니다 하지만 실제로 미리보기 SDK에 대한 자세한 내용은 자연 서식지에 새로운 API 몇 가지를 보여줍니다 그리고 다른 많은 이유 때문에 아마 일부 애플 리케이션을 연결시키지 않을 것이다 미리보기 SDK에 대해 야생으로, 관련이 있기 때문에 다른 많은 사전 출시 API 즉, 일단 최종 SDK 버전 사용할 수있는 앱 컴팩트 라이브러리 및 기타가 표시됩니다

시각적 인 스타일의 약간의 뒤의 항구의 약간을 가질 것이다 사용할 수 있습니다 그리고 우리는 물건을 계속 제공 할 것입니다 매우 구체적인 사용 사례를 수행하기 위해 CardView 라인을 따라, 그런 다음 RecyclerView와 같은 것들 그것은 당신이 모든 종류의 움직임을 모든 곳으로 가져올 수있게 해줍니다 이제 활동 전환과 같은 것들 쳇이 잠깐 얘기를 나눴 어 아마 당신은 사용할 수 없을거야 그래서 우리는 아마 앞으로 나아갈 것입니다

당신이 이미 알고 있고 사랑하는 몇 가지 단순한 fall backs 그곳에 CHET HAASE : 메모하는 것도 중요합니다 이야기의 초기에 나왔다 우리가 말하고있는 많은 것들 디자인에 대한 접근 방식으로 표준 Android 프로그래밍을 사용합니다 일부 새로운 애니메이션 기능, 이전 플랫폼의 API에 포함되지 않은 경우, 당신은 그들을 사용할 수 없습니다

그러나 달성 할 수있는 다른 방법이 있습니다 많은 경우에 그러한 종류의 효과 그리고 측정, 레이아웃, 색상, 그 물건, 당신은 매우 유사하게 보일 물건을 얻을 수 있습니다 어떤 사람들에게는 약간 다른 접근 방식이 될 것입니다 특히 새로운 애니메이션 기능을 제공합니다

ADAM POWELL : 맞습니다 뒤쪽의 마이크 관객 : 내 말 들리니? 예 예 ADAM POWELL : 네

관객 : 좋습니다 그래서 기조 연설과 내가 보았던 몇몇 데모에서, 나는 원형 이미지로의 움직임이 있음을 발견했다 조회수 우리가 사용할 위젯이 될 것입니까? ADAM POWELL : 네 우리가 단순한 드로어 블을 만들었던 지 기억하지 못합니다

또는 실제보기를 표시하지만 지원에 구성 요소가 있습니다 우리가 가서 적용 할 도서관 당신의 이미지에 그 원형 클립 CHAR HAASE : 반올림 된 비트 맵이 있습니다 지원 라이브러리의 드로어 블 그래, 그런 것 같아

그게 당신이 말한거야? 네 그것은 매우 간단합니다 우리는 플로팅 액션 버튼이나 팹 위젯을 만들지 않았지만, 왜냐하면 그것은 매우 단순합니다 기본적으로 이미지보기입니다 당신의 그림은 원형 이미지입니다

매우 간단합니다 당신은 그것에 대한 표고를 설정합니다 당신은 개요가 무엇인지 우리에게 말해주고 우리는 옳은 일을합니다 그것으로 실제로 CardView와 비슷합니다

나는 이것을 언급하고자한다 실제로 CardView 효과를 얻는 것은 매우 쉽습니다 사실, 우리가 한 이야기에서 보여줄 데모 나중에 오늘 표준보기를 사용하여 구현했습니다 나는 클릭하고 나는 적절히 그늘을 드리웠다 그것은 간단했다

특정 위젯에 넣는 이점 적어도 우리는 표준 패딩과 레이아웃을 가지고 있으며 또한 그 비슷한 모습을 가질 수있는 능력 이전 릴리스에서 느껴집니다 그래서 그것은 팹을위한 위젯을 만들만한 가치가있는 것 같았습니다 별로 관객 : 고마워 응, 그래

관객 : 그래서 활동 거래와 모든 것 정말 좋고 공통적 인 고통 점을 확실히 해결합니다 제가 알고 싶었던 점은 그 부분에 대한 지원이 필요하다는 것입니다 조각 거래 및 사물을위한 조각 경계를 넘나들며? ADAM POWELL : 네 나는 아직 그것이 미리보기로 그것을 만들었다라고 생각하지 않는다 예

예 아직 그러나 그렇다 우리가 정말로 어려운 문제를 해결하자마자 활동 전환, 다음 단계 프래그먼트 전이였습니다 그래서 나는 그것을 찾을 것입니다

관객 : 고마워 예 ADAM POWELL : 뒤에서 관객 : 그는 같은 질문을했습니다 나는 활동을 위해 한적했다

그러나 우리는 기대를 볼 수있다 아마 다른 미리보기에서 그것을 볼 수 있습니까? 내가 타이밍이 뭔지 모르겠다 나오고있는 다른 비트들 나는 L에서 그것을 볼 것을 기대한다고 말할 것입니다

관객 : 그러나 당신은 그것에 대해 연구하고 있습니까? 예 예 ADAM POWELL : 음 – 흠 관객 : 이제 우리는이 고도를 갖게되었습니다 객체에 대한 전환은 조작 가능성을 의미합니다

화면에있는 것들 끌어서 놓기 기능이 향상 되었습니까? L도 들려? ADAM POWELL : 어떤 종류의 드래그 앤 드롭 특별히 찾고 있어요? 청중 : 임의로 컬렉션을 재정렬합니다 오, 알았어 청중 : 좋은 이벤트 인터페이스 네

아담 파웰 : 네 그래서 RecyclerView로 해보겠습니다 기본적으로 일부 항목 터치 리스너를 적용 할 수 있습니까? 그것은 당신이 컬렉션의 수준에서 터치를 처리 할 수 ​​있도록, 특정 항목보기 수준보다 따라서 번역을 많이 수행 할 필요가 없습니다 부모까지 그리고 나서 다시 그것을위한 공간의 특정 지점에 그러면 훨씬 쉬워지기를 바랍니다

관객 : 네 그게 내가 원하는 바야 감사 뒤에서 ADAM POWELL : 뒤에서

청중 : 이해가 되나요? 기존 코드에서도 ListView를 변경할 수 있습니다 RecyclerViews에? ADAM POWELL : 그래서 그들은 대체로 호환됩니다 두 가지 중요한 차이점이 있습니다 첫째로 커서 어댑터에 익숙하다면 그것은 두 개의 뷰로 뷰를 만들고 분리합니다 다른 단계, 이것이 기본값입니다

RecyclerView에있는 상태 따라서 이러한 구성 요소를 분리 할 수있는 한 현재 ListView 어댑터에서 GetView를 가져오고, 그러면 그것은 쉬운 일 중 하나입니다 다음 작품은 전에 언급 한 것처럼, 더 풍부한 알림을 제공 할 수 있음 데이터 세트 변경의 본질에 대해 그래서 그러한 종류의 신호를 얻지 않고, 매우 거친 나뭇결보다는 ​​오히려 통보 데이터 세트 변경 호출, 그럼 우리는 애니메이션 만큼은 할 수 없을 것입니다 관객 : 그 때가 유일한 유익입니까? 그게 ADAM POWELL : 어느 쪽 이죠? 애니메이션? 청중 : 풍부한 통보 CHET HAASE : 그것은 더 새로운 것입니다 더 시원합니다 ADAM POWELL : 분명해야합니다

나는 그 질문을 이해하지 못한다고 생각한다 그래서 우리가 이전에 이야기했던 것들 중 일부부터, 우리는 어댑터를 통해 전환 할 때의 이점을 의미합니까? 또는 ListView에서 RecyclerView로 전환 본질적으로 동일한 UI가 무엇입니까? 관객 : 예 ADAM POWELL : 좋습니다 네 ListView가 여전히 사용자의 요구를 충족시키는 경우에는 꼭보십시오

이미해야 할 일보다 더 많은 일을하지 마십시오 이것은 대부분 모든 UI의 요구 사항을 해결하기위한 것입니다 훨씬 더 많은 것을 할 수 있기를 정말로 원하는 곳 복잡한 모션과 복잡한 터치 또는 항목을 사용하거나 사용자 정의 레이아웃을 수행하려는 경우 관객 : 네 감사

관객 : 너는 그 관계에 대해 어떻게 생각하니? 이 새로운 스타일과 기본적으로 어떻게 그것이 과도하게 쓰러지고 싸우는 것과 관련이 있습니까? 저의 견해로 볼 때, 그것은 우호적 인 것 같지 않습니다 ADAM POWELL : 일부 작품에 대해 이야기하고 싶습니까? 우리는 드로잉 명령을 재정렬하면서 일부 작업을 수행했습니다 그 중 일부가 들어올 것 같아서요 응 그래

우리는 툴킷 팀에서 많은 모자를 착용합니다 그리고 그 중 하나는 모두 성능에 관한 것입니다 이전 릴리스에서는 많은 작업이있었습니다 디스플레이 목록 최적화 및 오버 드래그 제거에 대한 정보 우리가 실제로 프레임 워크에서 자동으로 할 수있는만큼 그래서 당신이 가진다면, 보기가 완전히 완료되었다고합시다

그것보다 더 큰 또 다른 시각으로 가려졌다 그리고 완전히 불투명 해지면, 우리는 그 일을 과장 할 것입니다 우리는 무슨 일이 일어나고 있는지 모르기 때문에 그걸 그려 내고 싶다면, 우리가 그릴거야 갑자기 갑자기 2 배나 과장됩니다

아무것도하지 않고 이제 우리는 실제로이를 제거 할 수 있습니다 표시 목록에서 일부 후 처리를하기 때문에, 그래서 우리는 완전히 모호한 것으로 그려 내지 않습니다 그래서 많은 정보가 있습니다 이미이 재생 목록 최적화에 그 상황의 일부를 피하십시오

나는 더 많은 애니메이션과 더 많은 부자가 화면의 그래픽은 아마도 의미합니다 무슨 일이 일어나고 있는지 알고 있어야합니다 반투명 효과가 사라지는 경우 항상 화면 전체에서 그렇다면 더 많은 픽셀을 그릴 것입니다 네가 그렇게하지 않은 것보다 하지만 그것은 일종의 표준 Android 프로그래밍 기술입니다

화면에 무슨 일이 일어나고 있는지 알고 있어야합니다 오버 드로 감지기와 같은 도구를 사용하십시오 실제로 픽셀 수준에서 진행되고있는 것을 보여줍니다 당신이 그 위험을 극복하지 않고 있는지 확인하십시오 ADAM POWELL : 실제로, 우리는 많은 팀을 보았습니다

지금까지 소재 UI를 구축하기 시작하십시오 그리고 전반적으로 그들의 과다한 상황 이전 디자인과 크게 달라지지 않았습니다 소개를 시작하자마자 다시 다른 것 위로 미끄러 져 완전히 불투명 한 배경 스태킹을 많이 시작하면, 그렇다면 네가있는 곳이있다 조금 넘치는 것에 대해 생각하기 시작하고 싶어합니다

클리핑을 피하기 위해 할 수있는 일이 더 많습니다 우리는 할 수있는만큼 최선을 다하고 있습니다 자동으로 그렇게하는 프레임 워크에서 관객 : 제 생각으로 생각합니다 모든 디자인 원리가 중요합니다

누적 된 느낌 이를 성취하기 위해 몇 번에 걸쳐 물건을 쌓아야 할 것입니다 그리고 주위를 둘러 볼 수있는 좋은 방법이 있습니까? CHASE HAASE : 스태킹은 일시적인 상태에 가깝습니다 전 일이 전임으로서 많은 UI를 보지 못했습니다 서로의 위에 겹쳐서

ADAM POWELL : 글쎄요, Google Now 카드에있는 것들 그것은 서로의 위에 쌓일 것입니다 그러나 심지어 그 중 일부는, 그들이 무엇을 시작했는지 카드 중 일부가 함께 하나의 카드로 병합을 시작하십시오 컬렉션의 일부인 경우에는 일부 상세보기에서 나옵니다 그리고 그 중 일부는 일부 데모에 표시되었다고 생각합니다 게다가

관객 : 고마워 나중에 2 초 남았 어 질문을 위해, 우리는 모두 시간이 없다는 것을 의미합니다 고맙습니다 ADAM POWELL : 원한다면 우리가 여기있을거야

나중에 다른 질문을 할 수 있습니다

Maps Live: New Features in the Google Maps Mobile APIs for Android and iOS

嗨 CHRIS BROADFOOT : 안녕하세요 나는 Chris Broadfoot입니다

저는 Chris Broadfoot입니다 Google지도 개발자 관계 팀에서, Google지도 개발자 관계 팀에서 일합니다 나는 Daniel Schramm입니다 Daniel Schramm : 저는 Daniel Schramm, Associate Product입니다 Google지도 모바일 API 프로젝트의 제품 관리자 조수로서 Google지도 모바일 API의 관리자입니다

얼마 전에 우리는 iOS 및 Android에서 CHRIS BROADFOOT에있었습니다 : 우리는 최근에 모바일에 대한 업데이트를 릴리스했습니다 iOS와 Android 모두에서 업데이트 된지도 API입니다 오늘 우리는 비디오에서 다니엘 SCHRAMM 이야기 :이 업데이 트는 세 가지 새로운 기능을 소개합니다 이번 업데이트에서 우리가 오늘의 비디오에서 이야기하고자하는 세 가지 새로운 기능 – 패딩 마커 매핑 회전 및 플랫 마커는 패딩, 마커 회전 및 플랫 마커를 매핑합니다 먼저, 맵 패딩 (Map Padding)에 대해 살펴 보겠습니다 CHRIS BROADFOOT : 먼저 맵 패딩에 대해 설명하겠습니다

지도 채우기를 사용하면 기본 작업을지도로 옮길 수 있습니다지도 채우기를 사용하면 기본 Google지도를 오프셋 할 수 있습니다 동시에지도 외부에서 오버레이 컨트롤을 추가하여 추가 할 수 있습니다 예를 들어 반투명 메뉴 막대 또는 세로 막대와 같이 투명 메뉴 막대 또는 세로 막대 오버레이를 추가 할 수 있습니다 지도 채우기의 값은 언제든지 변경하거나 애니메이션으로 변경할 수 있습니다 예를 들어지도에서 사이드 바가 표시되거나 사라지는 경우 (예 :지도에서 사이드 바를 밀거나 내릴 때) 지도는 각 방향의지도 패딩 값을 고려하며지도를 다시 중심에 배치하는 것과 같은 카메라 업데이트는 안쪽 여백을 고려하여 마커의 위치를지도의 중앙에 위치 시키면 아무 것도 할 필요가 없습니다

오프셋에 대한 수동 계산의 번거 로움을 제거합니다 다음에 우리가 이야기하려고하는 것은 대니얼 SCHRAMM입니다 : 우리가 이야기하고 싶은 다음 미래 평면 마커는 평면 마커입니다 보는 방향에 관계없이 새로운 유형의 디자인입니다 평면 마커는 항상 평면으로 유지되는 새로운 유형의 마커입니다 카메라 배치 방식에 관계없이지도에 항상 배치됩니다 다른 마커와는 다른 표준 마커와는 다릅니다

지도를 회전하면지도에 제목이 표시 될 때 평면 마크가 항상지도에서 튀어 나오게됩니다 두 가지 유형의 마커를 사용할 수 있습니다 이제 평면 마커와 표준 마커를 모두 회전시킬 수 있습니다 앵커 포인트는 앵커 포인트를 중심으로 회전합니다 그래서 재미있는 평면 마커를 만들 수 있습니다 이렇게하면 평면 마커를 만들 수 있습니다

예를 들어, 나침반처럼 나침반처럼지도에 고정시킬 수 있습니다이지도는 항상지도에 고정되며, 항상 특정 방향의 한 방향을 가리 킵니다 위의 두 점을 CHRIS BROADFOOT와 결합하십시오이 두 특징은 다음과 결합 할 수 있습니다 멋진 사용자 경험을 통해 정말 매력적인 경험을 얻을 수 있습니다

예를 들어 GPS 경로를 재생 중입니다 예를 들어 GPS 경로를 재생 중입니다 마크는 사용자의 실시간 위치 및 방향을 나타냅니다 마커의 방위는 사용자의 방위를 나타냅니다 그리고 그 특정 시점에, 마커가지도를 따라 움직일 때 움직일 수 있습니다 DANIEL SCHRAMM의 크로스 플랫폼 기능 중 일부는 다음과 같습니다

이는 크로스 플랫폼 기능입니다 오늘 우리는 그것에 대해 이야기 할 것이고, 오늘 이야기 할 시간이 있습니다 플랫폼의 각 기능, 플랫폼 별 기능을 배우려면 릴리스 정보를 참조하십시오 설명서에 게시 된 설명서를 살펴보십시오 Google Maps API를 설치하는 것을 잊지 마십시오

CHRIS BROADFOOT : Google+ 서클의 Google지도 API + 페이지에 추가합니다 지켜 줘서 고마워요 들어 주셔서 감사합니다 다음에 다시 보겠습니다 DANIEL SCHRAMM : 너 보자

Shortcuts: Kick-start Google Maps Android API v2 Development

안녕하세요, 저는 Chris Broadfoot입니다 이번 주 Google지도 개발자 바로 가기에 오신 것을 환영합니다

Google을 시작하는 방법을 알려 드리겠습니다 5 분 안에 Android API를 매핑합니다 나는 방금 Android를 매핑하는 방법이라는 프로젝트를 발표했습니다 githubcom/googlemaps에 있습니다

가서 저장소를 확인하십시오 원하는 경우 포크를 사용할 수 있습니다 더 쉬운 경우 zip 파일을 다운로드하십시오 모두 좋다 여기 아래로 스크롤하면 다음과 같은 지침이 표시됩니다

자세한 세부 사항 그러나이 비디오를 따라 가십시오 따라서 디렉토리에 들어가면 모든 파일이 체크 아웃됩니다 이제 Eclipse, IntelliJ 또는 Ant를 사용할 수 있습니다 괜찮아요

먼저 가져 오기 방법을 보여 드리겠습니다 프로젝트를 Eclipse로 가져온다 나는 확실히 새로운 작업 공간을 사용하려고합니다 모든 것이 깨끗하고 우리가 가서 가져올거야 그곳에 프로젝트가 있고, 헬락 맵을 운영하십시오

따라서 파일, 가져 오기, 기존 Android를 가져오고 싶습니다 디렉토리를 선택하고 열기를 누른 다음 이 두 확인란을 모두 클릭하고 마침을 누릅니다 그게 뭔지는 잘 모르겠지만 여전히 효과가있을 것 같습니다 Perspective를 닫고 Java Perspective를 다시 열면, 모든 파일을 볼 수 있습니다 저거 닫아

여기에서 가장 중요한 파일은 바로 Androidmanifestxml 이제 API 키를 여기에 추가해야합니다 잠시 후에 그 방법을 알려 드리겠습니다 IntelliJ로 가져 오는 방법을 빠르게 보여 드리겠습니다

홈 화면에서 프로젝트 열기를 누르거나 파일, 프로젝트 열기 다시 한 번 프로젝트로 이동하십시오 선택을 누릅니다 그것은 열릴 것입니다 이제 가장 먼저해야 할 일은 Android SDK를 프로젝트 정의에 추가합니다

따라서 파일, 프로젝트 구조 및 여기에서 Android SDK를 선택하십시오 자, 만약 당신이 이미 그들을 가지고 있지 않다면, 당신은 New, Android SDK 모든 것을 설정하십시오 그건 매우 쉬워요 확인을 누릅니다

프로젝트에 들어가면 모든 파일을 다시 볼 수 있습니다 Androidmanifestxml, 매우 중요합니다 이제 프로젝트를 실행하기 위해 편집으로 이동해야합니다 구성

플러스 기호, Android 애플리케이션을 누르고 hellomap 모듈 우리는 USB 장치가 필요합니다 Android지도 애플리케이션을 실행하기 위해 에뮬레이터를 사용할 수 없습니다 계속해서 확인을 누릅니다 모듈, hellomap 모듈을 잊어 버렸습니다

확인을 누르고 전화가 연결되어 있고 잠금이 해제되어 있는지 확인하십시오 이제 Google API 콘솔로 이동하십시오 새 프로젝트를 만들고 Android를 활성화해야합니다 거기 API, 안드로이드지도 API API 액세스로 이동하고 새로운 Android 키를 만듭니다

디버그 키 저장소를 얻는 방법에 대한 지침이 있습니다 여기에 인증서가 있으면 당신은 comexamplehellomap 패키지를 사용하고있다 이제 열쇠를 가지고 안드로이드에 넣으세요

Eclipse 또는 IntelliJ에서 Run을 누르십시오 Ant가 작동합니다 좋아 그리고 휴대 전화로지도를 볼 수 있습니다 즉, Android지도 개발 경험을 즐기고, 다음에 또 보자

On-device machine learning: TensorFlow on Android (Google Cloud Next '17)

YUFENG GUO : PC 혁명으로이 컴퓨팅 세계가 시작되었습니다 우리가 오늘 살고 있습니다

인터넷이 와서 PC를 연결했습니다 최근에는 모바일 어디에서나 컴퓨팅을 구현했습니다 인공 지능은 혁명을 일으킬 태세이다 다시 한번 혁명을 일으키고, 우리가 어떻게 계산하며, 어떻게 연결 시키며, 그리고 우리는이 모든 일들을 어디에서나하고 유비 쿼터스하게 만듭니다 내 이름은 Yufeng이고 저는 Google에서 개발자 옹호자입니다

오늘, 너를 설득하고 싶다 모바일과 인공의 힘을 결합하는 것 지능과 기계 학습이 시스템을 만들 것입니다 더 나은 세상을 위해 우리가 살고있는 세상을 바꾸십시오 훌륭한 경험을하도록하십시오 포천 500 대 중 절반은 2000 년 이후로 사라졌습니다

불과 몇 년 전, 신생 기업 및 기업 때때로 인공 지능을 언급 할 뿐이다 비즈니스 프로세스에 추가되는이 추가 기능으로 또는 그들이 가진이 생각에 그러나 이제는 거의 모든 창업이 AI 창업입니다 결국 그 종류의 꼬리표 일뿐입니다 맞습니까? Google은 여기에 인공 지능, 기계 학습, 많은 모바일 경험 그리고이 중 일부를 화면에서 인식 할 수 있기를 바랍니다

잘하면 그들이 즐겁다는 것을 알았습니다 모바일에서 기계 학습을하기 위해, 우리는 여전히 서버에서 훈련을합니다 그리고 고전적으로, 우리는 훈련 기계를 생각합니다 모델을 매우 계산 집약적 인 행동으로 학습하고, 권리? 모바일에서 기계 학습을 어떻게 할 수 있습니까? 휴대 기기는 저전력입니다 그들은 많은 가상 머신으로 확장 할 수 없습니다

그래서 제가 논의하고자하는 것은 우리가 여전히 서버에서 교육을해야하지만 우리 장치에서 예측을 할 것입니다 그리고 당신은 여전히 예측을 위해 서버로 전화를 걸기위한 모바일 웹 앱이나 웹 사이트처럼 그러나 실제 예측을하면, 물리적 장치 자체에 기계 학습 모델을 넣고, 그것은 놀라운 사용자 경험을 가져올 수 있습니다 내가 좋아하는 훌륭한 예는 Google 번역입니다 온보드 기계 학습을 사용합니다

번역 된 텍스트를 오버레이합니다 전송중인 경우이를 수행 할 수 없습니다 근본적으로 앞에 무엇이 개최되고 있는지에 대한 비디오 네트워크를 통해 화면의 때로는 다른 나라에있을 수도 있습니다 데이터 연결이 없습니다

또한, 데이터 연결이 있더라도, 몰입도가 높고 반응이 좋은 경험을 원할 것입니다 어쩌면 당신은 우주선이나 비행기가있는 곳일 수 있습니다 네트워크에 연결되어 있지 않습니다 물론 이미지를 스트리밍하고 싶지는 않습니다 위성 전화 연결로

그러나 기계 학습, 좀 힘들지 요? 모바일 앱을 만드는 것도 쉬운 일이 아닙니다 두 가지를 결합하십시오 글쎄, 그것은 진짜 도전입니다 그러면 어떻게하면 더 쉽게 만들 수 있을까요? 오늘 나는 특별한 패러다임을 걷고 싶다 사용자 지정 이미지 분류를 수행하는 데 사용할 수있는 원하는대로 무엇이든 알아서 모바일 앱이 장치에 살 수 있습니다

이제 우리가 어디에서 건설 할 것인지 살펴 보겠습니다 그래서 여기에 내 전화가있다 Chromecast를 통해 전송하고 있습니다 그래서 우리가 데모로 넘어 간다면 그래서 우리가 가진 것은 기본적으로 카메라입니다

여기에 사탕이 있어요 이 중 일부를 인식 할 수도 있습니다 회의 초반부터 당신 중 일부는 심지어 일부를 즐겼을 수도 있습니다 이 땅콩 버터 컵 중

이들은 밀크 초콜릿입니다 그리고 여기 위에 화이트 초콜렛 땅콩 버터 컵이 있습니다 그리고 자연스럽게 전환되는 것을 볼 수 있습니다 그리고 여기에 우리는 단지 전통적인 Reese 's Peanut을 가지고 있습니다 버터 컵

그리고 내가 그걸 움직일 수 있다는 것을 알 수 있습니다 그리고 맨 위의 자신감은 놀라 울 정도로 높습니다 그리고 실제로 작은 Reese 's Cup을 가지고 있습니다 그래서 우리는 리즈가 작고 리즈가 큽니다 그래서 그것은 전환 할 것입니다

그리고 다양성을 위해서 우리는 즙이 많은 과일 땅콩 알레르기가있는 사람들을위한 것입니다 물론 이것은 모두 비행기 모드에서 작동합니다 그래서 아 물론, 그것은 가지 않을 것입니다 Chromecast에서 비행기 모드로 작업 할 수 있습니다 슬라이드로 다시 전환합니다

그런 시스템을 어떻게 구축 할 수 있는지 이야기 해 봅시다 참여하지 않는 방식으로 지루한 데이터 수집 및 라벨링 및 지출 대형 서버에서 GPU로 수 주간 교육 분산 된 코드 작성 그리고 나서 우리는 어떻게 모바일 용으로 포장 할거야, 그렇지? 보시다시피, 저는 회의에서 간식을 사용했습니다 나는 그들이 어떤 간식을 먹을지 몰랐다 나는 이번 주에 이것을 만들었다 1 시간도 채 걸리지 않았습니다

그리고 확실하게, 나는 준비를 했으므로 내가 여기 왔을 때 준비 됐을거야 그러나 백그라운드에서 실행되는 큰 시스템이 없습니다 이 일이 일어난다 그렇다면 교육에서 앱으로 넘어가는 것은 어떤 모습일까요? 첫 번째 단계는 교육 데이터를 수집하는 것입니다 이 경우 동영상으로 처리 할 것입니다

그리고 때때로 비디오는 협력하기를 좋아하지 않습니다 그래서 나는 그것을 가지고있다 돌아왔다 나는 그것을 여기에 가지고있다 내가하고있는 일은 글자 그대로 그것이 내가 훈련으로 사용하고 싶은 비디오입니다

톤과 톤의 이미지가 있지만 정말로 빨리 붙잡 혔습니까? 따라서이 비디오를 프레임으로 분리하면, 우리는 많은 훈련 데이터로 끝납니다 그리고 그들은 모두 함께 일괄 처리되기 때문에, 하나의 비디오는 훈련 할 이미지로 가득 찬 하나의 폴더입니다 그래서 저는 FFmpeg를 사용합니다 문자 그대로 명령 행 도구 해당 명령 줄에서 복사 – 붙여 넣기를 사용하십시오

파일 이름을 바꿉니다 폴더에 넣으십시오 폴더의 이름을 지정하십시오 이 경우 저스틴의 밀크 초콜릿과 다른 것을 만들어라 저스틴의 화이트 초콜렛

수분이 많은 과일을 위해 하나 만드십시오 그리고 당신이 얻는 것, 당신은이 그림들을 얻습니다 거기에 놀라움이 없습니다 다음 단계는 클라우드에 업로드하는 단계입니다 클라우드 머신 학습을 사용하여 교육을 실시 할 예정입니다

Google Cloud Storage에 사진을 저장하고 저장합니다 그리고 그것은 다시 해결 된 문제입니다 기본적으로 몇 가지 명령을 실행하는 것입니다 일부 파일 업로드, 일부 데이터 업로드, 훈련을 시작합니다 그리고 훈련이 끝난 후에, 우리는 그걸 알게 될 것입니다

이 교육 단계에 대해 더 자세히 이야기 해 봅시다 나를 기계의 열심히 광택을내는 사람이되게하지 마라 배우기 그래서 우리는 약간의 사이드 바를 갈 것입니다 왜냐하면 그것은 이미지 인식과 당신들이 배경을 가지고 있기 때문입니다

기계 학습에서 우리는 길쌈 신경 네트워크 (convolutional neural networks) 그래서 그것은 많은 음절입니다 그리고 철자 맞추기 대회에서 우승 한 적이 한 번도 없었어요 그러나 어떤 회선이 무엇인지 이해하는 데는 어느 정도 시간이 걸렸습니다 이미지를 인식하기 위해 기계 학습이 수행 한 작업

그래서 저는 지그 소 퍼즐의 비유를 사용하고 싶습니다 나는 최근에 해결하기 위해 열심히 일했습니다 그리고 이것은 MC Escher 그림입니다 실제로는 지그 소 퍼즐의 상자 표지입니다 그리고 보통 퍼즐을 풀기 위해 갈 때 – 나는 지그 소 퍼즐 전문가는 아니지만 어쩌면 너희들 나중에 나와 공유 할 수있는 몇 가지 고급 기술을 보유하고 있습니다

그러나 나는 먼저 하얀 조각들을 분리한다 그 밖의 모든 것 이것은 가장자리가 있었기 때문에 진짜 고통이었다 공백이 많이 있습니다 그리고 그 조각들은 영원히 함께 모입니다

그래서 당신은 그것들을 분리합니다 그리고 당신은 잘 말한다, 나는 하얀 물건이 그런 것을 안다 그리고 나머지는 우물 우물입니다 그것이 지그 소 퍼즐입니다 하지만 기다려

지붕,이 그림에있는 지붕 매우 별개의 패턴입니다 그래서 저는 그것을 저의 장점으로 사용할 수 있습니다 나는이 패턴처럼 보이는 조각들을 찾을 수있다 붐 나는 그것을 함께 조각 낼 수있다

그러면이 계단을 잘 말할 수 있습니다 그들은이 평행선 중 일부를 사용하고 있습니다 그리고 난간에는 난간 위에이 x가 있습니다 그걸 내 장점으로 사용하고 그 모양의 조각 그리고 그걸 합친다

그렇다면 이것이 기계 학습과 어떤 관련이 있습니까? 컨볼 루션 신경망은 추상적으로, 이러한 상세한 패턴을 찾는 것으로 생각할 수 있습니다 당신의 눈이 할 수있는 것과 같은 방식으로 이 하위 패턴을보고 있습니다 결론을 내리기 위해 그것들을 하나로 묶어 라 더 큰 그림에 대해서

이 x와 계단의 선을 말하면서, 음, 거기에 계단이 있습니다 아니면 거기에 지붕이 있습니다 지붕과 계단 연결 복도와 시계탑, 당신은 MC Escher 그림을 가지고 있다는 결론을 얻습니다 이제 나는 흰 조각이 많이 있었다고 말했다 그래서 나는이 단계에 오르기까지 정말 오랜 시간이 걸렸습니다

그래서 이것은 다른 하얀 조각들 협조하지 않는 것뿐이었습니다 그 비유에서 계속 나아가면서 이야기합시다 내가 훈련하는데 사용한 실제적인 일에 대해서 그리고 Inception V3 모델을 사용하고 있습니다 이것은 길쌈 (convolutional) 신경망이다

Google이 ImageNet에서 우승 할 때 사용했던 몇 년 전의 경쟁 이미지 분류를 배우는 국제 기계 경쟁 그리고 그것은 48 층 깊이입니다 48 개의 레이어가 무엇인지에 대해 약간의 컨텍스트를 제공하려면 그리고 얼마나 큰 규모인지, 최근 2011 년까지, 신경망을 훈련시키는 것은 비현실적이었습니다 깊이가 4 층 이상이었습니다

그래서 이것은 커다란 도약이었습니다 이 네트워크 이전의 가장 큰 네트워크 ImageNet은 22 개의 레이어로 이루어졌습니다 따라서 크기가 두 배 이상 증가하고 모든 것을 통과했습니다 1,000 개의 서로 다른 이미지를 분류 할 수 있습니다 그래서 우리는 그것을 다시 용도로 삼을 것입니다

우리는 모든 발전을 이룰 것입니다 이것을 사용하여 우리 사탕을 분류 할 수있었습니다 그래서 우리가 할 수있는 것은 우리가 네트워크의 마지막 레이어를 가져가는 것입니다 우리는 그 부분을 훈련 할 것입니다 마지막 단계는 버킷으로 분리되는 것입니다

네가 원한다면 인식되고있다 그래서이 경우, 우리의 다섯 가지 수업, 두 개의 다른 리즈 컵, 밀크 초콜릿, 화이트 초콜렛 땅콩 버터 컵, 그리고 우리의 육즙 과일 따라서 우리는 입력 데이터를 맨 위에 입력합니다 리즈 컵이 맨 위에 있습니다 그리고 우리는 그 신경망의 값을 모두 동일하게 만듭니다

그리고 전부 다 똑같지는 않습니다 우리는 훈련시키지 않습니다 우리는 움직이지 않도록합니다 우리는 단지 마지막 레이어가 훈련되도록했습니다 따라서 이러한 값은 교육 과정에서 업데이트됩니다

다른 모든 것은 그대로 유지됩니다 그리고이 단계,이 핵심 부분 이 재 훈련 측면에서 꽤 잘 이해 된 단계입니다 실제로, 우리는 코드 랩 (Codelab)을 가지고 있습니다 계단 아래로 보내 줄거야 하지만 이번이 마지막 세션 이잖아요, 그렇죠? 그러나 그것은 온라인입니다

그래서 당신은 자신의 문제에 대해서도 이것을 할 수 있습니다 그리고 지금, 그걸로 계속 전진하고 싶습니다 훈련 된 모델에서 우리가하는 일에 초점을 맞춘다 Android에서 숙련 된 모델로 왜냐하면 만약 당신이 순진한 접근에서 이걸로 온다면 그리고 OK라고 말하면서 모델을 얻었고, 그것을 안드로이드에 넣을 수있게했습니다 이거 작동 안 할거야

조금도 Android에서 사용되는 라이브러리 버전의 TensorFlow에 특정 작업이 없습니다 네가 원하지 않기 때문에 어떤 수술 우리가 이전에 이야기했던 것처럼 모바일 교육을하는 것입니다 별로 계산 능력이 없습니다 그래서 우리는 모델을 벗겨 내야합니다

그리고이 훈련의 결과물이 좋기 때문에 좋습니다 84 메가 바이트입니다 그래서 우리는 그 크기를 약간 줄이고 싶습니다 그리고 모바일 용으로 최적화 할 것입니다 그렇다면이 축소에 대해 이야기 해 봅시다

명령 행 도구가 있습니다 그래프 변환 도구 그리고 그것은 모델을 양자화합니다 양자화 란 무엇입니까? 그것이 의미하는 것은 모델이 있다는 것입니다 부동 소수점으로 채워진 파일 일뿐입니다

숫자, 십진수 그리고 이러한 부동 소수점 숫자는 일반적으로 합리적으로 높은 정밀도와 합리적으로 32 비트 공간을 차지합니다 그래서 우리는 그것을 축소하려고합니다 우리는 이것을 8 비트로 축소 할 것입니다 우리는 모든 값을 8 비트로 만들 예정입니다

하지만 그 정확성에 영향을 미치지 않을까요? 공정한 질문 고맙게도 신경망 설계 퍼지 입력을 허용해야합니다 약간의 관용과 정확성을 위해 설계되었습니다 따라서 4 배의 비용 절감 효과를 누릴 수 있습니다 한계가 공중에서 떨어지는 상태

우리가 20 메가 바이트 모델을 가지고 있기 때문에 어느 것이 좋습니다 우리가 우리의 앱에 추가 할 수있는 것 추가 고려 사항 앱에 모델을 추가하는 방법은 귀하에게 달려 있습니다 모델을 앱 자체에 넣을 수 있습니다

사용자가 Play 스토어에서 앱을 다운로드 할 때, 모델이 내장 될 것입니다 즉 앱이 20 메가 바이트 더 커진다는 뜻입니다 따라서 모델을 앱과 함께 파일로 배치 할 수도 있습니다 그런 다음 앱을 다운로드하면 그 운동을하지 않습니다 하지만 다른 고려 사항이 있습니다

권리? 그러면 앱에 로직이 있어야합니다 어떤 시점에서 스스로 모델을 다운로드 할 수 있습니다 Wi-Fi를 통해서만 가능할 수도 있습니다 다른 장점과 단점은 어떻습니까? 아마 당신은 잘 말합니다, 나는 정말로 내 모델을 안전하게 지키고 싶습니다 사람들이이 부동 소수점을 보게 될까 봐 걱정됩니다

이 파일의 숫자와 어떤 종류의 결론을 신성하게 그것에 대해 그래서 나는 그것을 안전하게 유지하고 내 응용 프로그램에 포장 싶어요 따라서 첫 번째 옵션을 선택하십시오 아니면 당신이 말하기를, 나는 유연성을 원한다 언제든지 내 모델을 업데이트 할 수 있습니다

어쩌면 단지 diff를 누르고 앱 자체를 업데이트하지 않아도됩니다 그럼 당신이 말한다, OK 모델을 별도의 파일로 저장하겠습니다 그런 다음 애플 리케이션에 이러한 업데이트를 할 수있는 논리를 가질 수 있습니다 그래서 이것은 여러분이 자신을 위해 무게를 달아야한다

제 경우에는 앱과 함께 포장했습니다 부분적으로 배포하는 것이 더 간단하기 때문에 부분적으로 그 모든 걸 내 전화기에 그리고 그래, 그래서 우리가 오늘 본 것입니다 우리는 그것을 포장했다 우리는 그것을 응용 프로그램에 넣습니다

그리고 그것은 우리의 전체 훈련 파이프 라인의 종류입니다 교육에서 앱 또는 케이스에서 동영상, 앱 그 비디오를 그림으로 변환하면, 그것을 클라우드에서 교육하고, 그 훈련 된 모델을 끌어 내려 모바일 용으로 최적화합니다 그런 다음 Android 앱에로드합니다 그래서 우리는 그것을 운송 할 준비가되어 있습니다

그래서이 시점에서 저는 조금 뒤로 물러나고 싶습니다 이 모든 것을 가능하게하는 것에 대해 이야기하십시오 그것은 최근 몇 년 동안 이었기 때문에, TensorFlow가 존재했다고 가정 해 봅시다 예를 들어 15 개월이 지나야 만합니다 그리고 그 전에, 어떻게 했습니까? 기계 학습 모바일? 훈련을받는 데 얼마나 걸렸을까요? 데이터? 어디에서 훈련 시켰습니까? 그것을 훈련 시키는데 당신은 무엇을 사용합니까? APK의 크기를 어떻게 처리할까요? 맞다, 능력을 떨어 뜨리지 않고 모델의 크기는? 그리고 자신 만의 프레임 워크를 만들어야합니다

그 기계 학습 모델을 로딩하기위한 장치 자체에 그래서 현실은 당신이 아마 결국 예측을하는 중이다 클라우드의 서비스, 서버의 서비스, 해당 모바일 장치가 해당 끝점으로 호출되도록하는 와 함께 REST API를 사용합니다 그렇게하면 모든 종류의 산만 함이 발생합니다 우리가 이전에 말했던 것, 당신이 가질 수없는 것 당신이 지적 할 수없는이 몰입 형 경험 뭔가있는 카메라를 가지고 즉시 그것이 무엇인지 보여주십시오

그래서 TensorFlow는 게임을 정말로 바 꾸었습니다 정말 멋진 점은 무엇을 위해 작동하는지뿐만 아니라 오늘 안드로이드로 보았습니다 하지만 iOS와 Raspberry Pi에도 동일합니다 모바일 앱을 배포 할 수 있습니다 모든 즐겨 찾는 플랫폼에서 사용할 수 있습니다

TensorFlow가 환상적이었던 또 다른 이유 저와 여러분 모두를위한 커뮤니티입니다 많은 사람들이 TensorFlow를 사용하여 예제를 만들고 있습니다 정말 멋진 사용 사례 만들기, 응답하기 서로의 질문 및 지원 서로를 돕고 훌륭한 경험을 쌓을 수 있도록 돕습니다 그리고 그것은 가장 최근의 한해에만 일어납니다 그리고 TensorFlow가 2 월 중순 현재 1

0이되었으므로, 당신은 안심하고, 프로덕션에서, API가 변경되지 않는다는 것을 알고 지금까지 길 아래에있는 TensorFlow 20까지 당신 밑에서 나는 지금까지 생각조차하지 못했다 따라서 모바일 학습은 멋진 경험을 선사합니다 활용하지 않고도 지금 할 수 있습니다 과거의 고통

그리고 툴링은 기본적으로 조리법에 따라 작동 시키십시오 그리고, 그것을 할 수 있기 위해서 귀하의 특정 응용 프로그램이 정말 강력하게 만드는 것입니다, 당신이 확실히 Inception, 그 네트워크, 사전 교육을받은 시스템을 인식 할 수 있습니다 1,000 개의 다른 것들,하지만 그들은 단지 일종의 무작위 보트와 오렌지, 나무와 집 거리와 보도 하지만 당신은 특정 물건에 신경 쓰지, 그렇지? 자신의 사물을 인식 할 수있는 앱을 만들고 싶습니다

그래서 그것을 재교육하고 존재하는 것 쉽게 비디오를 캡처하고 비디오 캡처, 테라 바이트 급의 데이터를 축적 할 필요없이, 로드, 처리 및 교육에 수 주일을 소요 모델을 만들고 나서 만들어야한다 모바일, 이걸 아주 멋지게 만듭니다 그리고 우리가 할 수있는 마지막에 와서 자유롭게 오십시오 내가 만든 앱으로 놀아 라 그러나 그것은 정말로 장난감의 예입니다

내가 그 비디오를 찍는 방법을 봤어 나는 단지 조금은 걸어 다녔다, 비디오를 가져 갔다 흰색 배경에 그것을하려고하는, 연단이 하얗다는 것을 알았 기 때문에 그러나 실제 사례 (실제 사례)에서, 당신은 아마도 다양한 배경으로 그것을 할 것입니다 어쩌면 그늘에서 그리고 햇빛에서

흰 표면, 카펫, 목재, 금속 위에있을 수 있습니다 사용자가 어디에서 볼 수 있는지 생각해보세요 당신이 인식하고 싶어하는 것 따라서 전체 과정을 교육용 파이프 라인으로 사용할 수 있습니다 그리고 그것은 당신이 그것을 무언가로 생각하게합니다

더 이상 큰 부담을 느끼지 않아도됩니다 기본적으로 상단에 데이터를 입력 할 수 있습니다 그런 다음 앱에서 기계 학습을 할 수 있습니다 다른 쪽에서 나옵니다 더 이상 당신이 말한 곳에서는 문제가 없습니다

보자 우리가이 일을 할 수 있다면, 우리는 박사 팀을 고용하여 우리가 어떻게 할 수 있는지 생각해 볼 돈이 필요합니다 우리의 특정 제품을 인식하십시오 그들은 매우 미묘합니다 그들 중 일부는 다른 것들과 약간 다릅니다

시작은 그것을 처리 할 수 ​​있습니다 모델 자체는 가장 작은 차이점을 발견합니다 그리고 바라건대, 많은 사람들, 그렇지 않으면 모두, 조금 방황 할 기회가 있었어 회의 도중 3 층 부근 우리는 캔디 분류기와 함께 예제를 가지고 있습니다 기본적으로 세운 일본인 농부를 기반으로합니다

이 시스템은하지만 그의 오이를 분류하는 나무 딸기 파이에 그리고 나는 너에 대해 모르지만 나는 오이의 차이를 알 수 없다 그들 모두는 똑같이 보입니다 가게에서도 평범한 오이와 같습니다 그리고 나서 그들은 멋진 것들을 가지고 있습니다

유럽 ​​오이 라 불리운다 그리고 그들은 길고 얇은 것 같습니다 그러나 그들은 모두 플라스틱으로 포장되어 있으며, 그래서 나는 그들이 있는지 여부를 결코 알지 못한다 더 신선하거나 덜 신선한 그리고 일본에는 여러 종류의 오이가 있습니다

이 녀석이 모두 함께 자라고있어 그리고 전에, 그는이 모든 것을 스스로 분류해야했습니다 네가 다른 곳으로 팔아 버렸기 때문이지, 그렇지? 그리고 지금 그는 그를 위해이 시스템을 가지고 있습니다 그리고 그 상황에서, 당신은 매우 통제 된 환경을 가지고 있습니다 그는 오이가이 컨베이어 벨트 아래로 올 것이라고 알고 있습니다

그는 카메라를 가지고 있으며이 방향에서 그것을 볼 것입니다 내 상황에서는 카메라를 가리키고 있음을 알았습니다 연단에서 흰색 배경 가진 각도로, 밝은 빛 아래서 그래서 내 모델을 훈련했을 때 나는 흰 테이블을 발견했다 밝은 불빛과 내 카메라를 내 비디오에 지적했다

내 물건에 나는 각을 덮기 위해 주위를 걸었다 그러나 나는 그렇게 할 필요가 없었기 때문에 많이하지 않았다 따라서 모든 종류의 문제를 해결할 수 있습니다 특정 유스 케이스에 따라 다르다

그리고이 문제를 생각하면서, 이 모델에서는이 모드에서 완전히 처음부터 시작해야한다 몇 가지 요점을 생각해보십시오 디자인 고려 사항을 도울 수 있습니다 말하자면 길 아래에서 많은 문제를 해결하십시오 그래서 나는 방법이 있다고 언급했다

이것을 재교육하거나 온라인, 회의가 끝났기 때문에 그래서 거기에 당신을위한 짧은 링크가 있습니다 온라인으로 할 수 있습니다 그것이 과정을 안내 할 것입니다 네트워크를 재교육하는 것 때문에 이 작업을 수행하는 컴퓨터처럼

그리고 사물의 모바일 측면을 위해, TensorFloworg/mobile으로 가면, 그것은 당신에게 안드로이드, iOS, 그리고 Raspberry Pi, GitHub 예제는 문자 그대로 가능합니다 복제, 빌드 및 배포, 곧바로 코드 변경은 필요 없습니다 그리고 나서 일하게되면, 당신은 두 사람을 함께 연결할 수 있습니다 당신은 전송 학습, 그 시작, 첫 번째 코드 랩입니다

저것의 산출을 가지고 가십시오 그래프 변환 도구를 실행하십시오 그런 다음 Android 애셋에 있던 그래프를 대체하십시오 폴더에 마지막으로 클라우드 머신 학습 리소스가 있습니다

그곳에 대해 더 많이 알기를 바랍니다 그 부분을 작동 시키려면, 코드 랩 (Codelab) 그 얘기는하지 않습니다 그래서 그걸로 고맙습니다

Understand Kotlin Coroutines on Android (Google I/O'19)

YIGIT BOYAR : 안녕하세요 모두들 환영합니다

내 이름은 Yigit Boyar입니다 저는 Android 팀의 엔지니어입니다 이봐 요, 제 이름은 세르게이입니다 그리고 저는 같은 팀에서 일합니다 숀 매 퀸런 : 안녕하세요, 저는 션입니다

나는 Android 개발자입니다 YIGIT BOYAR : 오늘 우리는 coroutines에 대해 이야기 할 것입니다 안드로이드에,하지만 우리가 그것에 대해 이야기하기 전에, 우리가 왜 일부 코 루틴을 필요로하는지 알아 내려고합시다 그리고 그것을 이해하기 위해, 어떻게 잊어 버립시 다 당신은 안드로이드에 AI 코드를 씁니다

이것이 우리가 작성하고자하는 꿈의 코드입니다 우리는 함수 호출은 네트워크 요청을합니다 도대체 무엇이 사용자를 얻고 텍스트 필드에 설정합니다 이것은 당신이 쓰고 싶은 것입니다,하지만 당신이 그것을 쓰면, 네트워크를 만들 수 없기 때문에 예외가 발생합니다

요청을 주 스레드에서 쉬운 우리는 코드를 스레드 안에 넣고 코드를 실행합니다 이제 textView가 불평 할 것입니다 백그라운드 스레드에서 UI 스레드를 만질 수는 없습니다

그리고 OK, 우리는 이런 종류의 코드를 작성할 것입니다 비동기로 만들 수 있습니다 콜백을 제공하고, 백그라운드 스레드에서 그립니다 UI 스레드에서 콜백을 호출합니다 이 코드는 코드를 작성하는 경우를 제외하고는 잘 작동합니다

이처럼, 당신은 메모리 부족 예외가 발생합니다 콜백을 왼쪽이나 오른쪽으로 새어 나올 것입니다 이것에 대한 해결책도있다 구독에 대한 이해를 가질 수있는 곳 이 체인을 유지합니다 그리고 당신이 멈 추면 언제든지 구독을 취소하십시오

그 중 하나가 작동하지만, 당신은 이런 식으로 끝납니다 그건 그렇고, 나는 이걸 만들지 않을거야 3 년 전, 우리가 Architecture Components를 시작했을 때, Google App 코드를보고있었습니다 그리고 나는 26 라인을 가진 하나의 어플리케이션을 발견했다 [INAUDIBLE]을 (를) 등록하십시오

Google에서 일어난다면 모든 곳에서 발생합니다 우리는 항상 최고의 코드를 작성하지는 않습니다 그러나 이것에 대한 해결책도 있습니다 RxJava와 같은 것을 사용한다면 이 함수는 관찰 할 수있는, AutoDispose 라이브러리를 사용할 수 있습니다 귀하의 [INAUDIBLE] 라이프 사이클과 연관된 가입 안전하게 가입하십시오

그리고 이것은 완벽하게 작동합니다 마찬가지로 LiveData를 사용할 수도 있습니다 관찰 할 수있는 생명주기가 있어야합니다 이것은 또한 작동합니다 그래서이 오래된 문제입니다, 그렇죠? 우리가 이미 여기에 대해서 이야기하는 이유는 무엇입니까? 좋은 해결책? 매년 우리는 이러한 개발자 벤치 마크 조사를 실시합니다

우리는 개발자들에게 그들이 어떻게 행동하는지, 그들의 문제는 무엇인지 물어 본다 그리고 작년에 우리가 조사한 설문 조사 중 최고 불만 중 하나 스레딩과 동시성이었다 개발자는 이것이 Android에서 어렵다고 말합니다 가장 큰 요청 중 하나는 바로 LiveData ++입니다 사람들은 우리가 LiveData를 확장하기를 원합니다

그것을 RxJava와 같이 만드십시오 우리는 왜 그런가? 왜 이걸 원하니? 우리에게는 좋은 해결책이 있습니다 그 중 하나만 사용하십시오 그래서 우리는 우리가 모를 때 최선을 다했습니다 우리는 UX 연구를 수행했습니다

이것은 동시성에 관한 User Experience Research입니다 그래서 우리는 9 명의 개발자와 심층 면접을했습니다 그들이하는 일은 부부를 위해 정규 일을하는 것입니다 자신의 회사에서 몇 주 그리고 동시성에 관한 문제를 볼 때마다, 이 관찰 가능한 것처럼, 그들은 단지 그것을 적어 둡니다

이것이 문제였습니다 이것이 내가 어떻게 해결했는지입니다 그리고 이것이 제가 그것에 대해 어떻게 느끼는지입니다 이 연구에서 우리는 세 가지 주요 사항에 초점을 맞추 었습니다 우리의 관찰 가능한 데이터 보유자 인 LiveData에 중점을 둡니다

우리는 RxJava에 중점을 두었습니다 우리는 Reactive Extensions 라이브러리를 보았습니다 그리고 coroutines는 정지 가능한 계산을 제공합니다 그리고 그 연구의 결과에서 이것은 결론이었습니다 LiveData는 사람들이 좋아한다고 말하면서, 그러나 우리는 완전한 해결책을 원합니다

사실 재밌 네요 LiveData는 메인 스레드 외에는 아무 것도 지원하지 않습니다 그러나 우리는 동시성 연구에서 그것에 대해 이야기합니다 RxJava의 경우 놀랍습니다 사람들은 그것을 사랑하고 싫어합니다

그들은 그것이 얼마나 강력한지를 좋아하지만 일반적인 불만 사항 우리는 항상 그것이 항상 잘못 사용되고 있다고 들었습니다 과잉 느낌 그리고 코 루틴의 경우, 이것은 정말 같았습니다 최상의 솔루션 인 것처럼 보이지만 확실하지 않습니다 그것은 아주 새롭다

성숙하지 않습니다 그래서 이것은 전반적인 결론이었습니다 우리는 단순한 솔루션이 필요하다고 말했습니다 그 해결책을 배우는 것이 어렵지 않아야합니다 포괄적이어야합니다

따라서 다양한 유스 케이스로 확장 할 수 있어야합니다 그리고 그것은 견고해야합니다 테스트 스토리가 내장되어 있어야합니다 그래서 우리는 두 가지 결정을 내 렸습니다 우리가 말했지, 좋아, 우리는 일류 품질 Jetpack의 지원

그리고 우리는 RxJava에 대한 더 많은 지원을 할 것입니다 우리의 문서에서 그러나 오늘날, 그것은 coroutines에 관한 전부입니다 션, 왜 우리 한테 조금 더 말하지 그래? 무슨 coroutines에 관하여? SEAN MCQUILLAN : 고마워요, Yigit 그래서 나는 단지 5 분 걸리고 싶다

코 루틴의 문제점에 대해 조금 이야기 해보십시오 위대한 해결 그래서, 문장에서, coroutines가 해결하는 주된 문제 콜백을 대체하여 비동기 프로그래밍을 단순화하고 있으며, 이것은 아주 추상적입니다 그럼 몇 가지 샘플을보고 어떻게 생겼는지 살펴 보겠습니다 나는 가상의 네트워크 요청을 세 가지 방법으로 만들 예정입니다

첫 번째 스타일은 차단 스타일이라고합니다 결과가 직접 반환됩니다 함수에서 실행 방법을 살펴 보겠습니다 그리고 재미있게, 나는 주 스레드에서 그것을 실행할 것입니다

호출 될 때, 블로킹 네트워크 콜 호출 한 스레드를 차단합니다 따라서 네트워크 요청이 실행되는 전체 시간, 주 스레드가 차단됩니다 UI를 업데이트해야하는 스레드입니다 사용자 접촉을 처리하므로 사용자 앱이 정지 된 것을 보거나 충돌 할 수 있습니다 이제 멈추고 거기에 있다고 말하고 싶습니다

네트워크 API의 차단 스타일에 아무런 문제가 없습니다 하지만 우리가 Android에서하고 싶은 것이 아닙니다 그래서, Yigit가 이미 이야기 한 것처럼, 우리는 일반적으로 콜백을 도입했습니다 그럼 어떻게 실행되는지 봅시다 우리는 여전히 메인 스레드에서 이것을 호출 할 것입니다

하지만 이제 fetchUser가 호출되면, 주 스레드는 자유롭게 다른 작업을 수행 할 수 있습니다 그것은 onDraw를 다루거나 사용자 접촉에 응답 할 수 있습니다 그리고 네트워킹 라이브러리는 실제로 요청을 실행하는 다른 스레드 결과가 준비되면 네트워크 라이브러리 내가 또 다른 콜백을 사용할 수있다 그것은 내 코드를 다시 호출하고 그것이 준비되었음을 알려주는 것입니다 정확히 같은 코드를 coroutines로 다시 작성해 보겠습니다

차단 스타일처럼 보입니다 fetchUser의 결과는 즉시 사용할 수 있습니다 콜백을 도입 할 필요가 없습니다 코 틀린에게 나는 코 루틴으로 이것을 실행하기를 원한다 이 함수에는 일시 중단 수정자가 있습니다

우리가 그것을 실행할 때 여전히 주 스레드에 있습니다 주 스레드는 콜백과 마찬가지로 차단 해제됩니다 그리고 이것은 coroutines의 핵심 개념입니다 네트워킹 요청은 여전히 ​​다른 스레드에서 실행됩니다 결과가 준비되면, 코 루틴을 다시 시작합니다 어디에서 멈췄다

이 코드는 콜백 스타일보다 훨씬 간단합니다 여전히 Android 앱을 작성할 수 있도록 보장합니다 사용자를 위해 동결하지 마십시오 이것은 코 루틴의 핵심 메커니즘입니다 일시 중지하고 다시 시작하십시오

코 루틴이 중지되면 실행되지 않습니다 일시 중지되었습니다 그리고 그것이 다시 시작될 때, 그것은 중단했던 곳에서부터 나아집니다 코 루틴을 콜백으로 일시 중지한다고 생각할 수 있습니다 나머지 기능들

그래서 당신은 그것을 함께 넣었습니다 일시 중지하고 다시 시작하십시오 콜백을 대체하십시오 우리는 심지어 그것을 시각화 할 수 있습니다 콜백 버전 및 코 루틴 버전 거의 똑같은 방식으로 실행됩니다

되돌아 가서 fetchUser를 살펴 보겠습니다 네트워크를 만드는 함수를 어떻게 호출 할 수 있습니까? 메인 스레드의 요청? 시작하려면 fetchUser를 만들어야합니다 또 다른 정지 기능 이것은 코 틀린에게 코 루틴과 함께 작동한다고 알려줍니다 그리고 내부에서 다른 정지 기능을 호출합니다

withContext를 호출합니다 우리는 그것을 dispatchersio에게 넘겨 줄 것이다 그 디스패처 확대, Kotlin 디폴트, IO 및 메인의 세 가지 디스패처를 제공합니다 그리고 그들은 다른 것들에 사용됩니다

CPU 집약적 인 작업에는 기본값을 사용해야합니다 100 가지 요소의 목록을 변형하는 것과 같은 것들, DiffUtil 호출 또는 사전 계산 텍스트 주 스레드에서 실행하기에는 너무 오래 걸리는 것이 있습니다 기본 발송자에서 실행해야합니다 IO는 네트워크를 차단하는 데 최적화 된 운영자입니다 디스크 IO

필요하면 언제든지 사용해야합니다 파일 쓰기와 같은 API를 차단하는 코드 작성 또는 소켓에서 읽는 중 그리고 메인 – 이것은 안드로이드의 주요 스레드입니다 그리고 놀랍게도, 그것은 우리의 추천입니다 응답으로 코 루틴을 시작할 수있는 적절한 장소 UI 이벤트

보통 코 루틴을 시작하기 때문에 메인 스레드에서 머무르다 간단한 조작을위한 추가 작업을 피할 것입니다 그런 다음 목록을 변형하거나 파일을 작성해야 할 때, coroutines를 사용하면 다른 Dispatcher 중 하나로 전환 할 수 있습니다 withContext를 사용하여 withContext는 전달한 블록을 실행합니다

운영자에게 말하십시오 여기이 블록은 디스패처에서 실행됩니다 네트워크 통화를 차단하는 것은 무료입니다 이를 통해 우리는 주요 안전 API를 제공 할 수 있습니다 당신은 단지 읽고 쓸 수있는 함수를 만들 수 있습니다

이 같은 네트워크에서 및 주 스레드에서 호출하십시오 Android에서 큰 이점입니다 이제는 모든 단일 기능에 대해 걱정할 필요가 없습니다 어떤 스레드가 실행될 필요가 있습니다 대신, 나는 단지 그것을 부를 수있다

기능 자체로 메인 쓰레드에서 호출하는 것이 안전하다는 것 코 루틴 소개를 끝내기 위해 Kotlin이 어떻게 구현하는지 살펴보십시오 모든 스레드에는 호출 스택이 있습니다 디버거 또는 스택 추적에서 볼 수 있습니다 Kotlin이 실행중인 기능을 추적하는 방법입니다

및 그 지역 변수 일시 중지 기능을 호출 할 때, Kotlin은 사실을 추적해야합니다 정규 함수 대신에 코 루틴을 실행합니다 이것을 서스펜션 마커로 나타낼 것입니다 서스펜드 마커 위에있는 모든 것은 코 루틴이됩니다

아래의 모든 것은 정규 기능입니다 그런 다음 Kotlin은 정상적인 기능처럼 loadUser를 호출합니다 스택 스택에 스택 항목을 넣을 것입니다 그리고 이것은 loadUser에 대한 지역 변수입니다 저장 될 것이다

그런 다음 발견 될 때까지 실행합니다 다른 일시 중단 함수 호출 이제 Kotlin은 일시 중지를 구현해야합니다 어떻게 그럴 수 있죠? 일단 당신이 그것을 이해하면 간단합니다 Kotlin이해야 할 일은 상태 복사입니다

함수를 스택에서 다음 위치로 옮긴다 그것은 나중에 저장할 수 있습니다 모든 중단 된 코 루틴을 여기에 넣을거야 스택과 같은 구조는 아닙니다 그런 다음 Kotlin은 실제로 fetchUser를 호출합니다

다른 스택 엔트리를 작성해, withContext를 호출하면 (자) 저것을 또한 중단한다 그래서이 시점에서 주 스레드의 모든 coroutine 일시 중지되었습니다 그리고 이것은 주 스레드가 onDraw 핸들과 같은 다른 작업을 수행 할 수 있습니다 또는 사용자 접촉에 응답 할 수 있습니다 그리고 이것은 정말로 중요합니다

스레드의 모든 coroutine이 일시 중단 된 경우, 스레드는 다른 작업을 수행 할 수 있습니다 우리가 몇 초 빨리 감기면, 네트워크 결과가 준비됩니다 그리고 코 틀린은 이력서에 전화해야합니다 그렇게하기 위해서는 저장 상태와 복사본 만 필요합니다 그것을 다시 스택에 놓고, 기능을 다시 시작합니다

loadUser를 다시 시작하면 계속해서 정상적으로 실행을 계속하십시오 loadUser가 오류가 발생하면 예외가 발생했습니다 바로 거기 중지 및 재개 메커니즘은 coroutines 뒤에있는 마법입니다 그리고 우리는 당신에게 그것을 보여주고 싶었습니다

그들이 당신처럼 일하는 방식을 이해할 수 있습니다 코드에서 사용하기 시작하십시오 그것은 coroutines 소개를 감쌌다 안드로이드의 코 루틴은 우리에게 능력을 제공합니다 콜백을 대체하여 코드를 단순화하는 방법 우리가 주요 안전을 만들어 보장 할 수 있도록 우리는 주 스레드를 차단하지 않습니다

이제 세르게이에게 넘겨 줄거야 누가 오늘 사용할 수있는 도서관에 대해 조금 이야기 할 것인가? coroutines와 함께 고마워, 션 그래, 그 스레드는 [INAUDIBLE],하지만 우리는 정말로 우리의 실제 적용에 도움이되고 싶습니다 그리고 매우 어린 코 루틴에도 불구하고, 이미 그들을 지원하는 도서관이있다

그들의 안정된 또는 더 나은 유물에서 WorkManager로 시작하겠습니다 AndroidX에서 우리에게 새로운 브랜드입니다 이미 안정적인 릴리스에서 코 루틴을 지원합니다 그리고 코 루틴 작업에도 사용할 수 있습니다

그러나 한 발 뒤로 물러나서 알아 내려고합시다 왜 그렇게하는지, 우리는 그것을 사용합니다 그래서 이것은 전형적인 노동자들의 흐름입니다 따라서 WorkManager에 익숙하지 않은 경우, 당신은 일종의 노동자라고 생각할 수 있습니다 그 긴 배경 직업 않습니다

몇 가지 제약이있을 수 있지만 매우 간단합니다 그냥 약간의 일 그 전형적인 유스 케이스, 당신은 일부 로컬 데이터를 웹 서버와 동기화해야합니다 그리고이 흐름이 너처럼 보일거야 데이터베이스에서 새 노드를 쿼리하고, 그런 다음 서버에 업로드하십시오

마지막으로, 해당 노드를 성공적으로 동기화 된 것으로 표시합니다 콜 루틴은 필요 없습니다 음, 실제로, 우리는 취소에 대해 이야기하기 시작하지 않았습니다 취소 사유는 여러 가지 이유로 발생할 수 있습니다 예를 들어이 작업자에 대한 제약 조건은 더 이상 충족되지 않습니다

UI를 제공 한 경우 사용자가이 작업을 명시 적으로 취소합니다 그러면 취소를 어떻게 지원할 수 있습니까? 음, 그런 식으로하려고 할 수 있습니다 ifCheck를 사용하여 다른 모든 줄을 넣으려고합니다 어리석은 것을보기 시작합니다 더군다나 실제로는 그렇지 않습니다

이 전화는 아마도 가장 비싼 전화 일 것입니다 네트워크에 연결되어 일부 작업을 수행하기 때문에, 취소 신호 전파가 없으므로, 그것이 시작 되었다면 무엇이든 상관없이 끝까지 달려 가라 그리고 이것은 실제로 노동자로 하여금 우리를 도울 것입니다 우리는 아직 그것에 대해 말하지 않았지만, 코 루틴은 콜백을 멋지게 잡아라 또한 좋은 cancellation 속성을 제공합니다

따라서 모든 일시 중지 기능을 취소 할 수 있습니다 이 취소에 대응할 수 있습니다 또한, 모든 내부 호출을 전파합니다 이 취소 신호 이러한 호출 내부의 코드가 여전히 차단되고 있다고 말할 수 있습니다

우리는 어쨌든 그로부터 이익을 얻지 못합니다 이것은 사실입니다 그러나 Room을 데이터베이스 솔루션으로 사용하는 경우, 쿼리를 일시 중지 기능으로 표시 할 수 있습니다 그리고 Room이 취소를 처리합니다 Sean이 여러 번 언급 한 것처럼 실을 꿰는 것뿐만 아니라, 이 일은 안전 할 것입니다

방은 스레딩을 처리합니다 그것은 배경 스레드에서 쿼리를 실행합니다 그럼, 우리 데이터베이스 호출은 지금 취소 할 수 있습니다 그러나 우리가 전에 논의한 것처럼, 주요 호출은 이것입니다 실제로 Retrofit을 사용하는 경우, Retrofit 이미 벌금을 부과 했으므로 일시 중지 할 수도 있습니다

네트워크 호출에 대한 일시 중지 식별자를 지원합니다 Retrofit을 강조하고 싶습니다 AndroidX에 포함되어 있지 않습니다 Android에서 설계된 자바입니다 다음에 Android를 사용하면 Android [INAUDIBLE]이 (가) 포용합니다

coroutines, 우리는 그것을 좋아한다 하루가 끝나면 우리에게는 일이 적습니다 좋은 이제이 코드는 취소를 지원합니다 그리고 이전처럼 쉽게 보입니다

그래서 우리는 무료로 취소를 받았습니다 그래서 이것들은 물건들에 대한 빠른 견해였습니다 오늘 이용 가능했습니다 그리고 Yigit은 우리가 방금 만든 많은 새로운 사람들을 당신에게 선물 할 것입니다 BOIGAR : 감사합니다, Sergey

그래서, 지금까지 우리는 코 루틴으로 할 수있는 것에 대해 이야기했습니다 그리고이 이야기의 나머지 부분을 위해, 우리는 새로운 것을 이야기 할 것입니다 그래서 첫 번째는 LiveData와 coroutines입니다 이제 매우 명확 해지기 위해 LiveData 동시성을 위해 설계되지 않았습니다 그것은 관찰 가능한 가치 보유자입니다

그리고 너는 접근 할 수있을 것으로 예상된다 메인 thread로부터의 값 그건 의도적 인거야 그러나 그것이 상호 운용 될 수 없다는 것을 의미하지는 않습니다 그래서 이것이 우리가 오늘 당신에게 제공 할 것입니다 coroutines와 함께 LiveData를 사용하는 쉬운 방법이있을 것입니다

따라서 가장 보편적 인 사용 사례는 가치가 있다는 것입니다 당신은 코 루틴에서 계산하기를 원합니다 결과를 LiveData로 제공하려고합니다 오늘 라이프 사이클 22 알파 01 유물로 시작하여, 이 새로운 API 인 LiveData를 얻습니다

따라서 시퀀스와 매우 유사한 빌더 함수입니다 Kotlin의 건축업자 그 안에 coroutines 블록을 전달합니다 그리고 안으로, 당신은 당신이 원하고 전화를 할 수 있습니다 이 함수는 값을 전달하는 함수를 내 보냅니다

따라서이 데이터베이스로드 기능을 보면, HLS [INAUDIBLE] 기능입니다 이 경우 사용자가 emit을 호출하기 때문에, 우리는 당신을 위해 그 타입을 추론 할 수 있습니다 이것을 지정해야합니다 따라서이 간단한 LiveData API 귀하의 LiveData 요소들 사이의 간격을 연결합니다 그리고 당신의 coroutines

이제 API에 대해 좀 더 자세히 살펴 보겠습니다 이것이 세 가지 매개 변수입니다 그리고 첫 번째 문맥입니다 그렇다면 우리는 왜 문맥이 필요한가? 이 데이터가 loadUser 함수라면, [INAUDIBLE] 기능은 일반적인 기능 이었지만, 이 코드를 작성하면 주 스레드 예외에 대한 IO를 수신하려면, 이 블록은 기본적으로이 그림의 메인에 그려지기 때문입니다 그러나 우리는 그것을 바꿀 수 있습니다

이 사진의 입출력과 같이 상황을 알릴 수 있습니다 이제이 코드는 완벽하게 작동합니다 너 한테 내가 변하지 않았 음을 알아줬으면한다 코드의 모든 내용 당신이 원하는 어떤 디스패처에서든지 내보낼 수 있습니다 값을 변경하기 위해 기본 Dispatcher에있을 필요는 없습니다

이제 두 번째 방법은 정말 어색한 매개 변수입니다 timeout이라고 불린다 시간 초과 매개 변수가 필요한 이유를 이해하려면 Android의 악명 높은 회전 문제를 살펴 보겠습니다 그래서 왼쪽에는 LiveData를 제공하는 ViewModel이 있습니다 그리고 오른쪽에는 활동 디스크가 있습니다

그래서 내 활동이 시작된 상태로가는 동안, LiveData가 활성화됩니다 확인을 의미합니다 사용자가 볼 수있는 관찰자입니다 일부 값을 만드는 것이 더 좋습니다 그러나 그 시간 동안 우리의 활동이 어떻게 변화합니까? 그래서 그것은 멈추게 될 것입니다

LiveData는 비활성 상태가되거나 파괴되거나, 새로운 활동이 올 것입니다 지금 당장은 LiveData를 관찰하는 사람이 없습니다 그래서 결과를 낼 이유가 없습니다 새로운 것을 다시 시작하는 것을 제외하고는, 다시 활성화됩니다 여기서 우리가 풀려고하는 문제는 이 차이는 LiveData 동안 신속하게 매우 빠르게 연속적으로 비활성화되고 활성화됩니다

보통 1 초 미만 어떻게 해결할 수 있을까요? 코드 블록을 어떻게 실행하는지 자세히 살펴 보겠습니다 더 잘 이해하기 위해 그냥 타이머 기능을 작성하려고합니다 기본적으로 LiveData 용 타이머를 만듭니다 현재 시간을 가져오고, LiveData 빌더를 반환하며, 그리고 무한 루프에서, 그것은 단지 방출한다

시간, 1 초 지연, 시간 방출, 지연 1 초, 결코 끝나지 않습니다 그리고 내가 보여주고있는이 코드는 100 % 쓸 수 있습니다 실제로 어떻게 작동합니까? 이 블록에 의해 반환 된 LiveData가 활성화되면, 우리는이 블록을 실행했는지 확인합니다 그리고 우리가 그 블록을 실행하지 않으면, 이제 실행을 시작합니다 우리가 그것을 실행하는 동안, 그 블록이 비활성화되면, LiveData가 비활성 상태가되면, OK,이 블록이 아직 실행 중입니다

그리고 아직 실행중인 경우 완료 할 시간을줍니다 그러나 타임 아웃 후에도 여전히 실행중인 경우 우리는 기본적으로 비활성 상태입니다 불필요한 계산입니다 LiveData를 관찰하는 사람은 아무도 없습니다 그러나 보드는 계속 달리고있다

그래서 우리는 단지 그 연속을 취소합니다 코 루틴 따라서 LiveData가 다시 활성화되면, 우리는 단지 그것을 재시작 할 것입니다 당신은 한번만 할 수 있습니다 그래서 완료되면, 거기 다시 시작할 이유가 없습니다

이제 하나 이상의 값을 방출 할 수 있습니다 이제 우리가 가지고 있던 샘플 주위에 구조를 만들자 getUser가있는 저장소가있는 곳 함수, loadUser 함수 및로드 해당 값을 내 보냅니다 자, 대부분의 경우, 이것은 작성한 코드가 아닙니다 웹 서비스로 이동하여 업데이트 된 사용자를 가져와야합니다

데이터베이스를 업데이트하고 해당 값을 다시 내 보냅니다 그래서 emit을 여러 번 호출 할 수 있습니다 당신이 그 격리 구역에있는 한 당신이 원하는대로 그러나 당신은 말할지도 모른다 음, 대부분의 경우 데이터베이스는 그렇지 않다

귀하의 사용자를 반환, 그것은 당신을 위해 LiveData를 반환 사용자, 당신이 변화에 대해 통보 받기를 원하기 때문입니다 글쎄, 여러분이 말할 수있는 것은 emit 소스를 호출 할 수 있다는 것입니다 MediatorLiveData를 사용하신다면, 이것은 emitSource와 매우 비슷합니다 LiveData에서 가져온 값이 무엇이든간에 그냥 내 가치로 만드십시오 변형과 같은 것을 실행할 수 있습니다

아, 우리도이 여분의 방출을 필요로하지 않습니다 우리가 이미 데이터베이스를 관찰하고 있기 때문에, 그래서 당신은 그것을 제거 할 수 있습니다 따라서이 LiveData API는 기본적으로 우리에게 제공합니다 coroutines와 함께 LiveData를 작동시키는 아주 좋은 방법입니다 하지만 ViewModels은 어떻습니까? SEAN MCQUILLAN : 고마워요, Yigit

코 루틴을 통합하는 방법에 대해 조금 이야기 해 봅시다 귀하의 ViewModel에 하지만, 우선 누출에 대해 조금 이야기하고 싶습니다 특히 코 루틴 누출 그리고 이것들은 매우 심각한 문제입니다

그들은 일종의 메모리 누출과 같아요 우리 모두가 잘 알고 있지만 더 나 빠졌다 코 루틴은 다시 시작될 수 있습니다 또한 메모리를 사용하는 것 외에도 CPU를 사용할 수 있습니다 파일을 쓸 수 있습니다

그것은 일어날 필요가없는 네트워크 요구를 만들 수 있습니다 코 루틴 누출 문제를 해결할 수 있도록, 코 틀린 (Kotlin)은 코 루틴 범위에 대한 아이디어를 소개했습니다 그렇다면 범위는 무엇입니까? 글쎄, 그것은 실제로 트랙을 유지하는 단지 방법이다 당신의 coroutines의 모든 코 루틴은 범위에서 실행해야합니다

그리고 범위는 모든 것을 취소 할 수있는 능력을 얻습니다 그것 안의 coroutines의 또한, 그들은 또한 장소입니다 코 루틴에서 잡히지 않은 예외가 섞여 버릴 수 있습니다 너는 그걸 모두 모으고 너는 범위를 사용하면 코 루틴을 누출하지 않도록 할 수 있습니다

Sergey가 말한 WorkManager는 범위를 제공합니다 Yigit이 방금 이야기 한 LiveData Builder도 마찬가지입니다 viewModelScope는 범위입니다 ViewModel의 KTX 라이브러리에서 멸종 속성입니다 나는 그 무서운 무한 루프의 다른 하나를 할 것이다

Yigit가 보여준 것들,하지만 이번에는 코 루틴에서 나는 ViewModel에서 시작한다 viewModelScope을 사용하여 스코프에 코 루틴을 시작합니다 그리고 기본적으로 이것은 메인에서 시작됩니다 그런 다음 무한 루프를 시작합니다

그 자체를 멈추는 법을 알아라 그리고 매 초마다 파일을 씁니다 이제 꽤 비쌉니다 코 루틴은 파일을 더 빨리 또는 더 빨리 작성하지 않으며, 우리는 분명히이 작업을 누설하고 싶지 않습니다 ViewModelScope를 사용하면 이와 같은 코드를 안전하게 작성할 수 있습니다

사용자가 화면에서 벗어날 때, 범위가 취소됩니다 이 매우 값 비싼 작업이 누출되지 않도록 보장합니다 따라서 viewModelScope는 코 루틴 누출을 방지 할 수 있습니다 모든 코 루틴을 보장함으로써 사용자가 화면을 떠날 때마다 취소됩니다 나는 세르게이에게 넘겨 줄거야

누가 우리가 추가하고있는 다른 영역에 대해서 이야기 할 것인가 세이지 바실리 네크 : 그래, 고마워, 션 네 자연스럽게 제공되는 또 다른 기능 범위는 라이프 사이클입니다 그 이름에서 시작과 끝이있는 것을 볼 수 있습니다

그리고 네가 생각한다면, 네, 그건이 수명주기에 익숙합니다 소유자 인터페이스, 당신은 실제로, 그것은 당신의 활동이기 때문입니다 그것은 당신의 단편입니다 그 단편을 편리하게 잊지 마라 두 개의 다른 라이프 사이클이 있습니다

그리고 두 번째 것은 – 우리는 그것의 내부를 사용합니다 불행히도, 저를 위해서, 저는 이제 그것에 대해 이야기해야합니다 그러나 거기에서 더 정확한 범위를 정의합시다 아시다시피, 당신의 단편은 다시 만들어집니다 구성 변경 사항 이상

따라서 수명이 더 짧아 질 수 있습니다 더 길 수 있습니다 그리고 lifecycleScope은 단지 그것을 반영합니다 라이프 사이클 소유자가 파괴 이벤트를 받으면, lifecycleScope가 취소됩니다 그리고 모든 내부 업무 또한 취소됩니다

따라서 알 수 있듯이 lifecycleScope UI와 매우 밀접하게 결합되어 있습니다 그리고 그것은 그런 상황에서 가장 잘 작동합니다 그래서 이전에, 당신은 뭔가를 할 것입니다 당신이 지연된 UI를 보여 주기로 결정했을 때 이런 식으로 그리고 이것은 꽤 간단 해 보입니다

그래서 우리는 조금 더 어렵게 만들 수 있습니다 두 단계가 있다면 이 심오함 때문에 아주 못 생겨 보입니다 그리고 실제로, 당신이 면밀한 관찰을 가지고가는 경우에, 이 mainHandler 때문에 실제 문제가 있습니다 그리고 UI에 닿는 기능은 실제로는 그렇지 않습니다 mainHandler가 함께하기 때문에 잘 작동합니다

GlobalScope의 일종입니다 라이프 사이클을 전혀 신경 쓰지 않습니다 그리고 그 함수들은 참조를 가지고 있습니다 파편이나 활동에 지연이 충분히 길다면 쉽게 많은 것들을 누출시킬 수 있고 그들로부터받을 수있다

그들의 예외 lifecycleScope는 이러한 코덱을 취소하지만, 그들은 우리에게 showFullHint입니다 일시 중지 기능이기 때문에 일종의 콜백입니다 [INAUDIBLE]에서 취소 할 것입니다 일단 당신의 라이프 사이클이 파괴되면

따라서 매우 순차적이기 때문에이 코드는 멋지게 보입니다 그리고 실제로 더 안전합니다 그러나 나는 lifecycleScope 약간의 위험 지대입니다 그러니 조금 되감습니다 나는 당신에게 개조 및 룸 지원을 보여준 사람이었습니다

일시 중단 기능 Yigit는 당신에게 뭔가를 보여 줬어 – 아주 친숙한 – 그런 것 같습니다 당신이 말할 때, 좋아, 나는 그 기능들을 결합 할 것이다 네트워크 및 데이터베이스에 대한 일부 저장소 패턴, 이제는 단 하나의 기능 만 사용할 수 있습니다 이 모든 작업을 조정하는 일시 중지 기능입니다

그래서 나는 그것을 호출하는 범위가 필요합니다 그렇다면 왜 내 수명주기에 그것을 부르지 않았을까요? 그것은 실제로 가장 밝은 아이디어는 아니지만 왜? 그리고 저를 잘못 이해하지 마십시오 Yigit와 Sean이 당신에게 모든 것을 올바르게 팔았습니다 주 스레드를 잠그지 않습니다

[INAUDIBLE]이 (가) 누출되지 않습니다 그러나, 당신은이 그림을 기억합니까? lifecycleScope가 취소되고 모든 구성이 변경됩니다 네트워크 요청이 발생 함을 의미합니다 매번 취소되므로 낭비가됩니다 사용자 자원과 리소스를 낭비하고 있습니다

환경에 좋지 않습니다 어떻게 제대로 할 수 있을지 음, 사실 중 하나가 Yigit에 의해 제시되었습니다 이 LiveData 빌더는 매우 잘 작동합니다 이런 상황에서

나는 당신에게 어떻게 접근 할 수 있는지 당신에게 보여줄 것입니다 이런 종류의 작업을위한 출발점 ViewModel 스코프입니다 따라서이 loadNote 함수를 실행하면됩니다 이 ViewModel 스코프 그런 다음 ViewModel에 함수를 도입했습니다 노트를 가져올 때 ViewModel에서 UI를 연결합니다

글쎄, 우리가 논의한 것처럼, 그것은 어딘가에있는 네트워크 호출입니다 의 loadNote 그래서 이것은 동기식 동작입니다 그래서 그것은 중단되어야합니다 그리고 이제는이 노드를 어떻게 든 연결해야합니다

하나의 범위에로드됩니다 그리고 loadNote 함수는 다른 범위에서 호출됩니다 글쎄, 나는 CompletableDeferred를 사용할 것이다 글쎄, 약간 무서운 것 같지만 실제로는 아주 간단한 것 잠시 후에보실 수 있습니다

우리가 어떻게 사용하는지 – 우리는 우리가 적재 한 메모와 함께 연기를 완료한다 그것은 단지이 오브젝트에 노트를 넣었습니다 아무 반응이 없습니다 그리고 독자는 무게 기능을 가진 주를 요구합니다 이걸 연기 했어 메모가 아직 준비되지 않은 경우 리더가 일시 중지됩니다

준비가되면 리더가 즉시 재개됩니다 이것이 우리가 ViewModel을 구현 한 방법입니다 그리고 마지막 단계에서 우리는 라이프 사이클 범위에서이를 호출합니다 ViewModel에서 소개 한이 loadNote 함수 그리고 우리의 네트워크 호출은 ViewModel에서 제대로 실행됩니다

범위이므로 구성 변경의 영향을받지 않습니다 그리고 우리의 업데이트 UI 기능은 수명주기 소유자가 파손되면 유출됩니다 그러나 일단 그림에 조각을 추가하면, 상황은 언제나처럼 복잡해집니다 그래서 우리는 조각 트랜잭션을 실행하기로 결정했습니다 그리고 합법적 인 주 예외를 받게됩니다

아무것도 보증하지 않기 때문에 조각을 실행할 수있는 올바른 상태에 있습니다 업무 그리고 우리는 뭔가 똑똑하고 도입했습니다 거래를 돕는 몇 가지 특수 기능 이런 종류의 상황들 그리고 이것은 약간 까다로울 것입니다

실제로는 상당히 복잡한 것 하지만 무슨 일을하는지,이 블록은 응용 프로그램이 시작되거나 다시 시작될 때, 그것이 전경에 있다는 것을 의미합니다 그리고이 블록은 귀하의 라이프 사이클이 막 생성되었습니다 자, 실제로 어떻게되는지에 대한 예를 살펴 보겠습니다 방법

그래서 당신은이 기능을 가지고 있습니다 아마도 처음에 불려집니다 메모가 준비되지 않았기 때문에 블록이 일시 중지됩니다 그런 다음, 일단 이것이 준비되면, 보통의 상황에서, 우리는 실행을 재개하고 다음 줄로 진행할 것입니다 그러나 launchWhenStarted 기능으로, 우리는 가서 라이프 사이클을 점검 할 것입니다

시작되지 않으면 Google은 수명주기가 끝날 때까지 다시 시작된다 일단 시작되면 우리는 다음 라인으로 진행 이 트랜잭션을 쉽게 실행할 수 있습니다 그래서 우리는이 예외적 인 상황에 처하지 않을 것입니다 그래서이 블록을 강조하고 싶습니다 생성 중에 일시 중지되었습니다

그리고 취소 된 것과는 다른 것입니다 lifecycleScope에 의해 취소가 여전히 제공되기 때문에 destroyEvent가 발생했습니다 그리고 지금, 당신이 볼 수 있듯이, 그것은 무언가입니다 우리가 시험 할 필요가있는 부분은 Sean이 도와 줄 것입니다 SEAN MCQUILLAN : 고마워요, Sergey

오늘 우리는 코 루틴에 대해 많은 이야기를 나눴습니다 API를 정리하는 방법에 대해 이야기했습니다 콜백을 대체하여 일시 중지했다가 다시 시작합니다 우리는 그들이 할 수있는 다양한 방법에 대해 이야기했습니다 다른 상황에서 사용됩니다

그리고 모든 것이 훌륭합니다 정말 끝내주는 군 그러나 그들이 시험하기가 어렵다면, 그저 비 스타터 일뿐입니다 그건 내가 진지하게 받아 들일만한 것이 아닐거야 사용할 물건으로

그래서 내가 너에게 옳은 얘기를하고 싶다 지금 Kotlinx-coroutines-test입니다 1 주일 반 전에 나왔던 새로운 도서관입니다 현재 실험용 coroutines API로 표시되어 있습니다 그것이하기 전에 더 많은 피드백이 필요하기 때문에 안정된 곳까지

Google과 JetBrain의 공동 작업입니다 안드로이드에서 coroutines를 테스트하는 것을 아주 쉽게 만들어줍니다 따라서 모든 테스트 라이브러리와 결합되지 않습니다 따라서 JUnit 4를 사용할 수 있습니다 JUnit 5를 사용할 수 있습니다

사용자가 작성한 사용자 정의 테스트 러너를 사용할 수 있습니다 그리고이 라이브러리는 코 루틴을 테스트하는 데 도움이 될 것입니다 그래서 저는 LiveData Builder에 집중할 것입니다 Yigit는 보여 주었다 그리고 우리는 그것을위한 테스트를 작성하는 방법에 대해 이야기 할 것입니다

그래서 나는 하나를 방출 할 것입니다 나는 잠깐 기다릴거야 그리고 나서 두 개를 방출 할 것입니다 이것은 비교적 간단한 LiveData입니다 그래서 나는 그것에 대한 테스트를 작성하는 방법에 집중할 수 있습니다

시작하려면 주 디스패처를 조롱해야합니다 LiveData Builder는 dispatchersmain을 사용합니다 기본적으로 Android의 실제 주 스레드입니다 테스트 코 루틴 디스패처로 대체 할 수 있습니다

특수 설계된 디스패처입니다 coroutines 테스트 그리고 우리는 테스트 코 루틴 범위를 만들 수 있습니다 이것은 코 루틴 테스트를위한 범위입니다 그러면 설치 프로그램에서 dispatchers

main을 전환 할 수 있습니다 테스트 발송자를위한 것입니다 dispatchersmain의 전역 값이 변경됩니다 즉시 LiveData Builder 우리가 제공 한 발송자를 사용할 것입니다

그런 다음 tearDown에서 resetMain을 기본값으로 설정하십시오 그리고 마지막 줄은 여기에 있습니다 정말로, 정말로 중요합니다 그것은 testScopecleanupTestCoroutines를 말합니다

운영자와 범위에 대해 생각하는 경우 하고있어, 그들은 매우 안정적이야, 맞지? 그들은 당신의 코 루틴을 추적해야합니다 실제로 실행합니다 이것을 부르지 않으면 매우 쉽습니다 검사 사이에 상태가 누출 될 수 있습니다 그래서 그것은 많은 상용구입니다

그래서 당신은 계속해서 함께 할 수 있습니다 어쩌면 JUnit 4 규칙 일 수도 있습니다 이것은 도서관에 없지만, 그러나 모든 코드를 규칙에 작성할 수 있습니다 그리고 저는 도서관을 볼 것으로 기대합니다 이것은 상대적으로 짧습니다

따라서 어떤 테스트 프레임 워크를 사용하든, 그러나 추상화를 구축해야합니다 그것은 당신의 테스트 프레임 워크에 적합합니다 그 코드를 할 수 있습니다 여기서 정의하는 규칙은 testCoroutineScope 인터페이스 runBlockingTest를 호출 할 수있게 해줍니다

이것은 테스트를 위해 최적화 된 코 루틴 빌더입니다 그것은 일종의 runBlocking처럼 작동합니다 그러나 그것은 많은 테스트를 쉽게 작성하게 만듭니다 오, 그러면 단위가 반환되므로 단일 표현으로 사용할 수 있습니다 스타일을 테스트합니다

그런 다음 주제를 얻습니다 그런 다음 LiveData 관찰을 시작해야합니다 그래서 실행됩니다 LiveData Builder가 실행되지 않는다는 것을 기억하십시오 누군가 그것을 관찰 할 때까지

observeForTesting이라는 작은 테스트 도우미를 정의 할 것입니다 이것은 내 테스트 코드 일 뿐이다 도서관 어디에도 없습니다 옵서버를 시작하려고합니다 내가 통과 한 블록을 호출하십시오

그리고 다시 시험에 첫 번째 값은 이미 방출되었습니다 이 테스트로 모든 것을 결정적으로 만들었 기 때문에 내가 사용하고있는 규칙 나는 [INAUDIBLE] 주장을 사용할 것이다 값이 1과 같아야하는지 확인하려면, 그리고 나서 나는 1 초씩 시간을 앞당길 것입니다

이것은 큰 장점 중 하나입니다 testCoroutineDispatcher의 가상 시간을 제어 할 수 있습니다 따라서 advancedTimeBy는 지연을 발생시킵니다 즉시 돌아온다 그리고 나는 내 시험에서 그것을 제어 할 수 있습니다

따라서 두 번째 방출은 이미 이 코드 줄을 읽었습니다 회전하고 결과를 기다릴 필요가 없습니다 그리고이 시험은 벗겨지지 않을 것입니다 나는 단지 제목을 말할 수 있습니다 값은 2와 같아야합니다

테스트를 통과하면 테스트를 통과합니다 테스트는 1 초가 아닌 즉시 실행됩니다 라이브러리를 확인해보십시오 당신이 찾은 버그는 반드시 제출하십시오 현재 실험중인 coroutines API로 표시되었습니다

그것이 안정을 높이기에 충분한 피드백을 가질 때까지 그리고 지금, 나는 마이크를 돌려 주겠다 이야기를 중단하기 위해 Yigit에게 BOYAR : 고마워, 션 좋아요,이게 너무 많아요

다음은 무엇입니까 그래서 오늘 우리는 당신이 어떻게 할 수 있는지 당신과 이야기합니다 AndroidX 및 기타 Android 라이브러리에서 동시 루틴을 사용하십시오 우리는 새로운 LiveData Builder를 도입했습니다 이를 통해 실제 데이터를 coroutines와 통합 할 수 있습니다

그리고 뷰 모델에 대한 새로운 라이프 사이클 기술 당신의 뷰 모델과 당신의 삶을위한 코 루틴 스코프 사이클 그런 다음이 새로운 기능을 도입했습니다 우리는 coroutines를 실행할 수있는 시작했다 귀하의 라이프 사이클 상태를 기반으로합니다

마지막으로 우리는 새로운 테스트를 도입했습니다 coroutines 용 라이브러리 그래서 오늘 일찍 우리는 코 틀린을 먼저 발표했습니다, Android 용 [INAUDIBLE] 및 Jetpack 용 그것은 coroutines보다 먼저입니다 이것은 권장 사항입니다 우리는 coroutines이 최상의 기능을 제공한다고 믿습니다

Android에서의 동시성 사용 용이성을 제공합니다 그러나 우리는 이것이 진행중인 작업임을 인정합니다 우리가 보여준 대부분의 도서관 실험적이거나 알파 하나, 우리는 지역 사회와 함께 이것을 발전시키고 자한다 건축 회사와 같은 방식으로 및 다른 Jetpack 라이브러리 그래서 우리와 함께하거나 6 개월을 기다릴 수 있습니다

그런 다음 사용을 시작하십시오 그리고이 일환으로 Kotlin이 점점 더 많이 보일 것입니다 제트 팩에서 나오는 코 루틴 따라서 이들 모두는 라이프 사이클 20에서 사용할 수 있습니다

01부터 오늘 시작하십시오 한번보세요 당신이 그것에 대해 어떻게 느끼는지 알려주십시오 또한 우리는 실제로 코 루틴을 좋아합니다 고맙습니다

[음악 재생]

Maps Live: Map Padding in the Google Maps Android API v2

안녕하세요 Google 개발자의 에피소드에 오신 것을 환영합니다

살고 있다 저는 Google Maps Developer Relations 팀의 Sarah Maddox입니다 지도를 사용하는 방법을 보여 드리겠습니다 Google Maps Android API로 패딩 지도가있는 애플리케이션이 있다고 가정 해 보겠습니다

사이드 바를지도에 추가하려면 하지만지도 UI 컨트롤이나 Google을 숨기고 싶지는 않습니다 심벌 마크 추가하면 어떻게되는지 봅시다 지도 패딩을 추가하지 않고 사이드 바를 만듭니다 이 작은 데모 응용 프로그램에는 오른쪽에 사이드 바가 있습니다

그리고 내 위치 컨트롤 찾기를 볼 수 있습니다 오른쪽 상단에 있지만 사이드 바에 의해 가려져 있습니다 마찬가지로지도 확대 / 축소 컨트롤 오른쪽 하단에 있으며 완전히 숨겨져 있습니다 그래서이 응용 프로그램으로 내가 한 일은 padded라는 버튼을 추가합니다 그리고 내가 덧대는 단추를 만지면, 응용 프로그램은 다음과 같은 메소드를 호출합니다

지도의 오른쪽에 30 픽셀의지도 패딩을 추가합니다 이제 UI 컨트롤이 멋지게 보입니다 내 사이드 ​​바 왼쪽에 약간 표시됩니다 지도는 여전히 전체보기를 사용합니다 그러나 사용자 컨트롤과 제스처 그들이 단지 사용하지 않는 것처럼 행동한다

지도의 더 작고 눈에 보이는 부분 그래서 내 위치 찾기 찾기를 탭할 것입니다 그리고 당신은 작은 파란색 위치 표시기가지도의 중심에 잘 배치되어 있습니다 지도 패딩을 고려했습니다 이제 정상적인 버튼을 누르면 내지도에서지도 패딩을 제거한 다음 내 위치 버튼을 다시 찾으십시오

위치 표시기가 약간 움직 였는지 확인하십시오 오른쪽으로 가면 중심에서 벗어난 것처럼 보입니다 전체지도를 고려하고 있기 때문입니다 보이는 부분 대신에 좋아, 나는 시드니를 만지고 위치를 잡을거야

호주 수학의 중심 그래서 주위에 멋진 푸른 바다가 많이 있습니다 그러면 Google 로고를 볼 수 있습니다 화면 왼쪽 하단에 있습니다 이제는 애플리케이션 요구 사항에 주목할 가치가 있습니다 Google 로고를 표시합니다

Google 로고가 숨겨져 있다면 Google지도의 서비스 약관을 준수하지 않음 아피스 따라서 UI 컨트롤을 왼쪽 하단에 추가해야하는 경우 맵의 패딩은 좋은 방법입니다 Google 로고가 나타나는지 확인하십시오 자, 코드를 살펴 보겠습니다 매우 간단합니다

Google지도 세트 패딩 사용 메서드를 사용하여지도 가장자리에 패딩을 추가합니다 이 메서드는 패딩을 결정하기 위해 네 개의 매개 변수를 사용합니다 왼쪽, 위쪽, 오른쪽 및 아래쪽 가장자리에 매개 변수 이름은 기억하기 쉽습니다 왼쪽, 위쪽, 오른쪽, 및 바닥 지도 재 센터링 (re-centering)과 같은 카메라 업데이트, 자동으로 패딩 처리됩니다

따라서 오프셋을 직접 계산할 필요가 없습니다 그리고 언제든지지도 패딩을 동적으로 변경할 수 있습니다 세부 사항은 문서에 있습니다 또한 Google지도 API 데모 앱을 살펴보십시오 Google Play 서비스와 함께 제공됩니다

다음은 데모에 대한 설명서 링크입니다 앱 그것은 내가 여러분에게 보여준 것보다 더 복잡한 예입니다 예를 들어, 애니메이션을 추가 할 수 있습니다 사이드 바를 안팎으로 밀어 넣을 수 있습니다

패딩 데모는 데모 앱에서 보이는 영역이라고합니다 메뉴 감사합니다 Google에서이 동영상을 즐기 셨기를 바랍니다 개발자 라이브

What's New in Kotlin on Android, 2 Years In (Google I/O'19)

[음악 재생] JEFFREY VAN GOGH : 안녕하세요 나는 Jeffrey van Gogh입니다

저는 Android Studio의 기술 책임자입니다 그리고 나는 프로그래밍 언어를 책임지고있다 및 컴파일러 하디 해리 : 그리고 저는 하디, 개발자 옹호자입니다 JetBrains에서

[치어 리더] JEFFREY VAN GOGH : 그래서 2 년이 지났습니다 구글이 안드로이드에 대한 코 틀린의 지원을 발표 한 이후 그리고 어제 Google은 Kotlin-first를 발표했습니다 그래서 우리는 당신에게 이것을 배경으로 줄 알았습니다 그리고 물론, 우리는 2 년 전에 시작하지 않았습니다

우리는 물건을 얻기 위해 상당한 시간이 걸렸습니다 안드로이드에서 Kotlin에 대한 준비 그리고 우리는 3 년, 3 년, 1 년 반 전에 결정했습니다 Google에는 수많은 언어 괴짜가있었습니다 나도 코 틀린과 놀기 시작 했어

헤이, 이것은 실제로 아주 멋지다 물론 Android Studio는 IntelliJ를 기반으로합니다 그리고 IntelliJ는 Kotlin을 오래된 코드베이스로 사용하기 시작했습니다 그래서 우리는 점점 더 코 틀린을 보게되었습니다 Android Studio에서 사용 중입니다

그리고 동시에, 우리는 고객 권고에서 많은 고객 피드백 게시판, 설문 조사 및 임시 토론 이 같은 회의에서 사람들은 Kotlin을 정말 좋아합니다 그리고 그들은 정말로 Google이 그것을 지원하기를 바라고 있습니다 왜냐하면 그들의 회사는 그렇지 않으면 Kotlin을 채택하지 않기 때문입니다 물론, 그런 새로운 언어를 사용합니다 큰 일이다

그래서 우리는 이사들에게 이것이 투자 할 가치가있는 무언가 우리가 발견 한 가장 좋은 방법은 우리 이사들에게 코드를 작성하게 Kotlin에서 며칠 동안 그 후에 그들은 팔렸다 I / O 2017 이전에 몇 달 전에, 우리는 그것을하기로 결정했습니다 이것은 많은 회의가이 모든 것을 설정하는 것을 의미했습니다

테크니컬 리드 나 매니저로서, 당신은 더 이상 코딩 할 시간이 충분하지 않습니다 기초를 설정하십시오 따라서 Google I / O 2017 이전의 모든 준비가 완료되었습니다 Android Dev 하위 레딧에이 큰 스레드가있었습니다 구글이 결코 Kotlin을 받아들이지 않을 것입니다

물론 우리는 무슨 일이 일어날 지 알고있었습니다 하지만 그 스레드에 회신을 보내는 것은 너무 어려웠습니다 그래, 2 년 전 Steph는 무대에 올랐어 코 틀린 지원 발표 나는 그것이 개발자의 가장 큰 박수라고 생각한다

기조 그것은 훌륭했다 물론, 우리 모두는 JetBrains과 Google 모두에서 알고있었습니다 그건 우리가 많은 일을했다는 것을 의미했다 우리 앞에 Kotlin이 잘 작동했는지 확인하십시오

Android 및 일반적으로 그리고 오늘, 우리는 우리가 지난 2 년 동안해온 일의 하디가 무슨 일이 일어 났는지 얘기 할거야 지난 몇 년 동안 코 틀린에게 그리고 나서 다시 가져 가겠 어 안드로이드 측에서 우리가 한 일에 대해서 이야기하겠습니다

하리 하리 : 고마워 시작하려면 먼저 언급하고 싶습니다 코 틀린 재단 (Kotlin Foundation) Google에서 공식 지원을 발표 한 시점을 기억한다면 몇 년 전에 Kotlin을 위해, 우리는 또한 간략하게 언급했다 우리가 창안 된 기초가 될 것입니다 JetBrains와 Google이 보호, 홍보 및 홍보 언어 Kotlin

재단은 이사회의 통제를받습니다 JetBrains의 두 대표, 두 구글, 및 1 명의 독립적 인 일원 그리고 당신에게 약간의 아이디어를주기 위해서입니다 기초의 범위가 무엇인지, 직업 중 하나 현재 언어 리드 디자이너를 임명하는 것이고, 물론 Andrey Breslav가 있습니다 변화를 막기위한 언어위원회

그리고이 점을 이해하는 것이 매우 중요합니다 범위면에서 제한적입니다 따라서 변경 사항을 깨는 것입니다 Kotlin은 지금도 열려 있기 때문에 계속 개발되고 있으며, GitHub에 우리는 여전히 KEEP을 가지고 있는데 이것은 Kotlin Evolution 개선 프로세스

그러나 언어위원회는 대부분 언어에 일어날 수있는 변화를 깨고 또한 상표 소위원회가 있습니다 그것은 Kotlin의 상표를 보호하는 것입니다 Kotlin을 홍보하고 사용하는 데 도움이되는 커뮤니티와 협력 공정한 방법으로 Kotlin 그리고 당신이 기초에 관하여 더 많은 것을 발견하고 싶은 경우에, 당신은 KotlinLang 웹 사이트에 갈 수 있습니다 세부 정보뿐만 아니라 더 많은 정보를 얻을 수 있습니다

Kotlin과 상표 등을 어떻게 사용할 수 있는지에 관한 정보 그리고 그걸로 데모로 넘어 갑시다 그리고 나는 언어로 당신에게 몇 가지 것을 보여줄 것입니다 이것은 내가 다른 사람의 기계를 사용하고있는 곳이다 이것이 어떻게 진행되는지 봅시다

ID가 맞다고 생각해 예 그래서 저는 언어에 대해 몇 가지 것을 보여 드리겠습니다 아마 가장 근본적이고 가장 중요한 것입니다 우리가 한 짓은 아주 취한 것입니다

오랫동안, 당신이 코 틀린을 쓰는 것에 익숙하다면 응용 프로그램을 사용하면 주된 진입 점이 있습니다 그래서 우리는 실제로 그것을 만들었으므로 매개 변수가 없습니다 그게 전부입니다 고맙습니다 제프리, 네가 원하니? 오

[웃음] 우린 2 년이 걸렸어 아니 그래서 우리는 우리가 가지고있는 작은 것들 중 일부부터 시작할 것입니다 언어 자체로 완성되었습니다 예를 들어, when 문을 사용하면 변수의 값을 캡처해야합니다

그 변수를 검사해야합니다 너는 너의 실제 내부에서만 그것을 사용하고있어 when 문 그래서 우리는 이것을 조금 더 멋지게 만들었습니다 본질적으로 변수를 때 문 자체

따라서 범위 밖에서 참조 할 필요가 없습니다 그리고 이것은 당신에게 당신의 언어로 의미를 부여합니다 사람들은 이것이 실제로 제한되어 있음을 이해합니다 조건부로 하지만 조금 더 얘기하자

우리가 소개 한 멋진 기능들 그것들은 좋지 않았다 나는 우리가 도입 한 더 멋진 기능을 말하고 있습니다 예를 들어 응용 프로그램이 있다고 가정 해 봅시다 클래스를 만들고 싶습니다

그리고 수업을 만들겠습니다 MicroserviceAPI라고 불릴 것입니다 그래서 저는 마이크로 서비스 API의 인스턴스를 만들 수 있습니다 마이크로 서비스 API를 말할 것입니다 우리는 거기에 갈

이제,이 마이크로 서비스가 필요한지는 모르겠습니다 마지막으로 갈거야 단지 유행 일 수 있습니다 그래서 내가하고 싶은 것은 사람들에게 이게이게 친절한 사람들이야 실험적인 기능과 같습니다

우리가 할 수있는 일은 우리가 실제로 할 수있는 것입니다 주석 클래스를 만든다 예를 들어, 이것이 새로운 API라고 말할 수 있습니다 그 주석 클래스에 주석을 달아라 Experimental이라는 다른 클래스와 함께 이제 새로운 실험적 주석을 사용할 수 있습니다

나는 내가 실험적으로 생각하는 어떤 것에도 창조했다 내 API에서 그래서 여기에이 새로운 API를 추가 할 수 있습니다 그리고 내가 그렇게하면, 이것이 빨간색으로 변하고 있음을 알 수 있습니다 그래서 그것은 나에게 컴파일러 오류를주고있다

당신이 이것을 사용할 수 없다는 말입니다 이것은 실험적인 기능이기 때문입니다 그 위에 마우스를 올려 놓으면 실험적이라고 말하는 것입니다 사실, 우리는 그것을 바꿀 수 있습니다 우리는 그것이 오류가 아니라, 실제로 경고로 정의 할 수 있습니다

그래서 여기에 경고가 될 수 있습니다 그리고 지금 막 가고 있습니다 경고로 표시됩니다 그래서 이것을 사용하기 위해서, 개발자 기본적으로이 기능을 선택해야합니다 내가 할 수있는 것은 Alt-Enter입니다

이제는 함수 호출에 새 API를 추가합니다 그래서 내가 어디에서 이것을 사용하는지, 이것은 실험적인 기능이라고합니다 이것은 사람들에게 당신이 지금 생각할 수있는 아이디어를줍니다 실험적이고 비슷한 종류의 API를 만들 수 있습니다 나는 아무것도 보증하지 않을거야

내일 우리가 뭔가를 바꾸고 싶다면 괜찮아 니가 경고 했어 Alt-Enter를 누르십시오 당신이 Alt-Enter를 봤다는 것을 알았습니다 괜찮아

너 자신의 잘못이야 그리고 우리가 실제로이 일을 한 것 중 하나는 우리는이 계약 개념을 도입 했습니까? 따라서 약간의 코드 계약에 익숙하다면, 우리는 이것을 Kotlin의 실험적 기능으로 소개했습니다 게다가 그래서 나는 어떤 함수가 있다고 가정 해 봅시다 예 : printLength

그리고 이것은 nullable 인 문자열을 취할 것이고, 그리고 string이 null이 아닌 경우, 나는 println 길이 할거야 이제이 방법이 효과가 있으며 스마트 캐스트가 완료되었습니다 문자열, null이 아닌 문자열, 내가 이미 그걸 발견했기 때문에 이것이 nullable이 아니라는 것을 알아 냈습니다 그래서 나는이 똑똑한 던지기를 할 수있다 그러나 내가 이것을 취해야한다면, 그리고 널 (null)이 아닌 대신에, 나는 무언가를한다, 아니다, 나는 앞으로 나아가고 창조한다

내 함수, 그래서 내 함수를 만드는 가정 해 봅시다 String이고 notNull 인 경우 부울을 반환합니다 그런 다음 반환 값이 null이 아니라고 말합니다 그 효과가 없다는 것을 알 수 있습니다 컴파일러가 실제로 그것이 not-nullable

컴파일러에게 알려주는 것이 좋을 것입니다 이 기능은 특정 계약을 준수해야합니다 그리고 Kotlin에서 이것을 정의 할 수 있습니다 계약 람다를 사용하여 계약 함수 계약이다 그리고 그것이 수입이라고 말할 수 있습니다

그리고 나는 진정한 의미의 반환을 말할 수 있습니다 이 @ notNull이 null이 아님을 나타냅니다 이제 오류가 발생합니다 무시해 아니, 농담이야

이 오류가 발생하는 이유 이것은 위에서 언급했듯이 실험적인 기능이기 때문입니다 두 가지 방법이 있습니다 첫 번째 것을 보여주었습니다 주석을 추가 할 수있었습니다 그러나 주석을 추가하면 그 주석이 전파되지 않습니다

그래서 뭔가가 그 API를 사용하고 있다면, 또한 주석을 추가해야합니다 전파 주석을 추가 할 수 있습니다 이것,이 형식입니다, 그리고 지금 나는 그렇게하지 않아도됩니다 그 통지를 추가하자마자, 지금 자동으로 다시 null이 허용되지 않는 문자열로 변환됩니다 따라서 실제로 계약을 맺고 함수에 대한 당신의 주장 특정 조건을 충족시킵니다

그리고 그것은 기본적으로 특정 수준의 코드 정확성 실제 코드에서 그럼 우리가 뭘하고 있는거야? 글쎄, 우리는 이것을 직렬화라고 부릅니다 멀티 플랫폼 인 직렬화 라이브러리입니다 JVM, JavaScript, Kotlin / Native, iOS, macOS, 리눅스, 윈도우, 임베디드 나는 태양 아래 모든 것을 언급했다고 생각한다

그리고 이것은 다중 플랫폼 라이브러리입니다 어떤 종류의 반성도 요구하지 않는, 일부 제품의 일부입니다 우리가 언어와 생태계의 일부로하고있는 일 그것 주위 그래서 여기에서는 클래스, 전형적인 데이터 클래스, 그리고이 serializable 어노테이션을 추가했다 이 라이브러리는 Kotlin 직렬화 라이브러리의 일부이며, 그런 다음 고객이 있으며 고객 목록이 있습니다

그래서 저는 println과 같은 것을 할 수 있습니다 그리고 나서 여기에서 나는 Json을 할 것입니다 stringify, Customer, 사용하고 싶은 시리얼 화자를 표시 한 다음 실제 고객을 전달하십시오 그리고 나는 똑같은 일을 고객 명단에서 할 수 있습니다 그래서 여기에 목록을 작성한 다음 고객 목록을 전달할 수 있습니다

그리고 이것을 실행한다면, 기본적으로 무엇을 할 것인가? JSON에서 해당 데이터 클래스로 출력됩니다 우리는 JSON을 지원합니다 Protobuf에 대한 지원이 있습니다 그리고 다른 것들이 작동합니다 그리고 우리는 분명히 그 반대를 할 수 있습니다

예를 들어, 여기에 JSON이 있다고 가정 해보십시오 이제 JSON을 만들어 보겠습니다 그래서 우리는 id가 1과 같을 것이고, 그 다음에 이름이 나와 같습니다 이메일은 you@mecom과 같습니다

나는 너무 독창적이다 이제 println을 할 수 있습니다이 경우, 저는 Json을 할 것입니다 parse, serializer를 다시 통과 시키십시오 그리고 내가 전달하고자하는 실제 JSON

그리고 이것이 할 일은 본질적으로 나에 대한 실제 데이터 클래스 객체 그리고 당신은 그것이 또한 – 나를 위해 데이터 객체를 반대로 만듭니다 내가 뭘 한거지? 이메일, 이름, 이메일 관객 : [INAUDIBLE] 하리 할리 : 필드 소스가 필요합니까? 아니, 그렇지 않아 관객 : [INAUDIBLE] 하리 할리 : 아니

그건 사실 맞아 어쨌든, 그렇게 일하고있었습니다

[웃음] 제프리예요 그는 뭔가를했습니다 제프리 반 고글 : 어 – 허 [박수 갈채] HADI HARIRI : 나는 사람들이 박수를 치기를 정말 좋아합니다 그래서 나는 그곳에서 무슨 일이 일어나고 있는지 모른다

그러나 그것은 라이브 데모에 대한 좋은 점입니다 뭔가 잘못 됐는지 확인하고 싶습니다 나는 사실 그것을 실제로했다 그래서 저는 그것을 운동으로했습니다 나중에 사무실 시간에 나에게 와서 그게 뭐가 잘못 됐는지 말해 줄거야

계속 나아 갑시다 내가 너에게 보여주고 싶은 다음 주석 클래스에 대한 간략한 개요입니다 여기에 지원을위한 몇 가지 추가 사항이 추가되었습니다 열거 형 예를 들어, 주석에 enum을 가질 수 있습니다

중첩 된 주석을 가질 수 있습니다 내 동반자 개체의 일부로 속성을 가질 수 있습니다 다시 말하지만, 이것은 나에게 더 많은 표현력을줍니다 실제 주석을 사용할 때 이제 우리가 작업 해 온 또 다른 것이 있습니다

당신이 들었을지도 모르는 멀티 플랫폼 프로그래밍입니다 그리고 멀티 플랫폼 프로그래밍의 아이디어는, 한 입 가득, 그 아이디어는 바로 지금 Kotlin입니다 다른 유형의 플랫폼을 타겟팅 할 수 있습니다 그래서 JVM을 대상으로 할 수 있습니다 자바 스크립트를 타겟팅 할 수 있습니다

네이티브 등을 타겟팅 할 수 있습니다 이제 이것에 대한 위대한 것들 중 하나 코드를 공유 할 수있는 능력, 왜냐하면 내가 공유하기를 원하는 많은 코드가 있기 때문입니다 권리? 비즈니스 로직, 검증 로직 등이 있습니다 내가 공유를 끝내고 싶다 그러면 우리는 어떻게 이런 일을 할 수 있습니까? 이것이 우리가 멀티 플랫폼의 개념을 도입 한 곳입니다

프로그램 작성 그리고 그 결과로, 당신은 지금 이 다중 플랫폼 프로젝트를 가질 생각이 들었습니다 그래서 당신은 내가 IDE에서이 프로젝트를 가지고 있다는 것을 알 수 있습니다 다른 플랫폼을 타겟팅하고 있습니다 그래서 나는 macOS를 가지고 있고, JVM을 가지고 있으며 JavaScript를 가지고있다

그런 다음 일련의 공통 코드가 있습니다 이것은 보통이라고 불린다 그리고 여기 안에는 몇 가지 코드가 있습니다 그래서 여기에 hello라는이 함수가 있습니다 즉, platform

name에서 인사하는 것입니다 그리고 platformname은 object의 속성입니다 그러나 차이점은이 객체 기대라고하는이 단어가 앞에 있습니다 이것이 말하는 것은 이것이 약간의 코드라는 것입니다

내 공통 코드에서 참조 할 수있는 구현은 실제로 여기에 제공되지 않습니다 구현이 제공 될 것입니다 다른 유형의 플랫폼에서 다른 방식으로, 이는 플랫폼에 따라 다를 수 있기 때문입니다 그래서이 귀여운 것을 볼 수 있습니다 여기 모퉁이에 작은

Alt Enter를 누르면 선언에 들어가라고 말하면서, 어떤 플랫폼 선언을보고 싶은지 묻습니다 따라서 JVM이라고하면 JVM으로 연결됩니다 내가 돌아가서 macOS에서 실제 선언문으로 간다면, 그것은 나를 macOS에 데려 갈 것이다 권리? 그래서 다른 플랫폼에서 다른 구현을 할 수 있습니다 그럼에도 공통 코드에서 해당 코드를 참조 할 수 있습니다

내 공유 코드 기반의 일부로 사용하십시오 그리고 시원한 것은 그렇게 생각해

생각해라 인터페이스와 조금 닮았습니다 그러한 인터페이스의 구현 그리고 멋진 점은 정적 컴파일 시간을 얻는다는 것입니다 확인, 말하자면 그래서 내가 이것을 주석으로 달아서 여기로 돌아 가면, 당신은 그것이 저에게 오류를주는 것을 볼 수 있습니다, 실제 플랫폼 중 하나 구현이 누락되었습니다

이제이 작업을 통해 공통 코드를 공유 할 수있는 다중 플랫폼 프로젝트 기초를두고 특정 구현을 기반으로한다 실제 목표에 약간 다르게 적용됩니다 그리고 그것은 멀티 플랫폼 프로젝트의 일부입니다 우리가 코 틀린과 함께 나아갈 것을 제안하고있다 예를 들어 Android와 공통 코드 기반을 공유하는 Android 애플리케이션, iOS 등

슬라이드로 다시 전환 할 수 있다면 내가 너에게 약간 얘기 할거야 우리가 가져온 다른 것들 Kotlin에게 언어 우리는 더 많은 표준 라이브러리 API를 가지고 있습니다 우리는 여전히 메소드의 API 번호를 유지하고 있습니다 조금 낮추지 만 더 많은 기능을 추가하고 있습니다

그 지역에 부호없는 정수 지원 – 아무도? 아니? 예 [박수 갈채] 나는 누군가를 항상 알고 있기 때문에 그것을 추가했다 그것에 대해 두드림 분명히 우리는 2018 년 패킷 KotlinConf를 발표했습니다

Kotlin 네이티브가 베타를 친다 툴링면에서 우리는 향상된 성능을 제공했습니다 Gradle 프로젝트를위한 고속, 병렬 빌드, KAPT를 사용한 점진적 주석 처리 Google에서 Ivan Garvrilovic에게 큰 소리 치십시오 우리를 돕기 위해

새로운 유형의 추론 엔진 상호 운용성의 많은 경우에, 특히 RX 주변에서 일하는 경우, 뿐만 아니라 언어를 조금 더 빌더를 사용할 때 간결하게, 등등 그리고 우리는이 프로그레시브 모드를 도입했습니다 본질적으로 당신이 코 틀린을 시험해 볼 수있게 해줍니다 새로운 기능을 사용해보십시오 일부 코드를 어기십시오

이제는 할 수있는 깃발입니다 Kotlin과 함께 좀 더 살기 가능하게하다 가장자리에 그리고 그걸로 제프리에게 건네 주겠어 그게 우리가했던 다른 것들을 보여줄거야

특히 안드로이드에서하고 있습니다 JEFFREY VAN GOGH : 고마워, 하디 데모를 잊어 버린 기능이 하나 있다고 생각합니다 HADI HARIRI : 당신이 무슨 말을하는지 전혀 모르겠습니다 JEFFREY VAN GOGH : 괜찮습니다

내 데모에 보여 줄게 HADI HARIRI : 당신이 아마 그것을 망 쳤어 [웃음] 제프리 반 고글 : 좋아 이제 Android 측에서 수행 한 작업을 살펴 ​​보겠습니다 Kotlin을 지원합니다

먼저 OS로 시작합시다 물론 OS는 바이트 코드로 작동합니다 따라서 Kotlin을 지원하기 위해해야 ​​할 일이별로 없습니다 그러나 우리는 정확성을 추가했는지 확인했습니다 성능 테스트를 통해 코 틀린 패턴을 깨지 않게했습니다

우리는 몇 가지 구체적인 성능을 구현했습니다 이러한 테스트를 기반으로 한 최적화, 루프 최적화에 특히 적합합니다 그리고 나서 우리는 OS 측면에서 큰 일을했습니다 디버깅 지원이 향상되었습니다 Kotlin은 몇 가지 구조를 가지고 있습니다

당신이 다른 언어로 가지고 있지 않은 인라인 함수처럼 Android의 새로운 버전 이제 더 나은 디버깅을 지원합니다 그런 다음 안드로이드 프레임 워크, 거기에서 일어나는 일이 많습니다 중요한 것은 API 주석을 추가 한 것입니다 아직 완성되지 않았습니다

그러나 새로운 API는 이제 nullness와 기본 매개 변수를 갖습니다 기본 값 주석이 있으므로 Kotlin에서 온 사람들을 사용할 수 있습니다 기존 API를 통해 작업하고 있습니다 뿐만 아니라 주석을 달 수 있습니다 그런 다음 Kotlin 확장 API를 추가했습니다

그래서 이것들은 여러분이 프로젝트에 다음을 제공하십시오 확장 메소드를 통한 추가 API Kotlin 코드를 더 관용적으로 만드십시오 그런 다음 우리는 전체 묶음에 대해 코 루틴 지원을 추가합니다 Jetpack 라이브러리 [박수 갈채] 따라서 비동기 코드를 작성할 수 있습니다

좀 더 절차적인 방법으로 그리고 물론, 어제 우리는 Jetpack Compose를 발표했습니다 그것은 모두 코 틀린입니다 이제 데모를 살펴 봅시다 좋아요 그래서 여기에 작은 앱을 만들면, 쇼 목록을 다운로드합니다

개조를 사용하여 서버에서 사용할 수 있습니다 그런 다음 로컬 SQL 데이터베이스를 검사합니다 방 API를 사용하여이 쇼들을 봤다 면요 그래서 여기에, 내가 정의한 것을 볼 수 있습니다 API를 사용하여 둘 다 RX 자바를 사용하여 쇼의 목록을 얻을, Kotlin 코딩 비동기 기능을 사용할 수도 있습니다

그리고 API는 거의 동일하다는 것을 알 수 있습니다 같은, 조금 다른 반환 유형 그리고 방 쪽 – 오, 미안 (QUIETLY) 내 코드는 어디에 있습니까? 좋습니다, API는 건너 뜁니다 꽤 많이 있습니다

오, 여기 있습니다 죄송합니다 그래서 당신은 똑같은 것을 봅니다 나는 쇼를 봤어? Java의 RX는 매우 유사합니다 여기 Flowable이 있습니다

[무관심]이 있습니다 따라서 API는 꽤 유사합니다 이제 전화하는 방식을 살펴 보겠습니다 RX와 Java 사이의 코드 – RX와 coroutines 그래서 RX에서는 쇼를 진행하기 위해 많은 운영자를 사용합니다

모든 비동기 호출로 우리의 흐름을 수행하십시오 그리고 이것들은 꽤 복잡해 질 수 있습니다 그리고이 코드는 노란색으로 강조 표시되어 있습니다 그게 내가 아는 뭔가가 있다는 뜻이야 반환 유형으로 수행

따라서 구독 할 때, 당신은 구독을 처리합니다 물론 RX는 Java에 뛰어난 표현력을 제공했습니다 그리고 RX의 발명가들은 똑똑했습니다 그들은 그들이 무엇을 만들고 있는지 알았습니다 그러나 그들은 언어에 의해 제한되었습니다

Kotlin에서 우리는 이제 coroutines를 가지고 있습니다 우리는 실제로 이것을 훨씬 더 멋지게 할 수 있습니다 그래서 코 루틴을 사용하는 동일한 코드가 있습니다 먼저 서버에서 프로그램 목록을 가져옵니다 우리는 이것을 대기 함수라고 부릅니다

신원이 알려줍니다 이봐 요 여기서 비동기적인 일이 일어나고 있습니다 그런 다음 우리는 for for 루프를 사용할 수 있습니다 그리고 그것은 반환 쇼 동안의 [INAUDIBLE]입니다

그리고 우리는 우리의 비동기 내가 로컬 데이터베이스에 쇼를 본 적이 있는지 알아보기 위해 호출하십시오 그리고 거기에서 계속됩니다 그리고 나서, 여기에, 당신은이 발사 호출을 봅니다 이 전화 해 데이터 세트가 변경되었음을 알리는 지 확인하십시오

UI 스레드에서 그리고 여기서 좋은 점은 절차 적으로 보입니다 디버깅을 할 때 – 나는 지금 시작해야한다 물론 작동하지 않습니다 오! 우리는 거기에 갈

이미 실행 중입니다 그래서 내가 실제로 볼 수 있다는 것을 알 수 있습니다 전체 방법으로부터의 변수들에서, 특정 운영자 만이 아닙니다 그래서 인생이 훨씬 쉬워집니다 비동기 코드를 디버깅 할 때 이제 슬라이드로 다시 전환하십시오

다음은 Android Tooling입니다 Android Studio에서 많은 작업을 수행했습니다 Kotlin이 잘 지원되는지 확인하십시오 우리가 한 첫 번째 일은 Kotlin 플러그인이 Android Studio에 포함되어 있음 우리가 그것을 공개하기 전에 우리는 그것을 잘 테스트 할 수 있습니다 JetBrains와 긴밀하게 협력했습니다

그들이 Kotlin 플러그인을 업데이트 할 때마다, 공개하기 전에 테스트를 통해 확실하게 확인합니다 Android Studio와 Kotlin은 잘 작동합니다 다음으로 Android 리팩토링 지원을 추가했습니다 IDE에는 많은 작업이 있습니다 Android 관련 리팩토링입니다

우리는 지원을 추가하기 위해 노력하고 있습니다 코 틀린에있는 모든 사람들에게 린트쪽에는 린트가 거의 있습니다 완전히 다시 작성되었습니다 자바 언어에 대해 [INAUDIBLE] 점검을 작성하는 데 사용되었습니다

이제는 UAST라고 불리는 것을 사용합니다 한 번 같은 린트 체크를 쓸 수 있습니다 그리고 Kotlin과 Java 코드를 모두 분석 할 수 있습니다 제품 템플릿을 추가하여 당신은 새로운 단편이나 새로운 활동을 만들고 있습니다 당신은 Kotlin 코드를 처음부터 가지고 있습니다

당신은 그것을 변환 할 필요가 없습니다 이제 컴파일러 측면에서, 우리의 새로운 Shrinker R8 Kotlin 특정 최적화가 많이있다 그것으로, 당신이 만드는 이익을 얻을 수 있도록 가능한 한 작은 코드 물론 IDE는 이제 Jetpack을 지원합니다 구성된 프레임 워크

문서 및 샘플 사이트에서, developerandroidcom을 보면, 모든 API 참조에는 이제 Kotlin 및 Java 구문이 모두 있습니다 유효한 Kotlin 관련 문서 포털이 있습니다

Kotlin을 시작하는 방법, 사용법을 알려줄 것입니다 호출자 루틴 등 또한 많은 샘플과 스 니펫 이제 Kotlin을 사용할 수 있습니다 양쪽 측면, GitHub 샘플입니다 올해 Google I / O를 살펴볼 수있을뿐만 아니라, Androids의 프레젠테이션 대부분을 볼 수 있습니다

그들의 샘플을 Kotlin에서해라 당신도 볼 수있는 몇 가지 애플 리케이션이 있습니다 Google I / O 앱은 물론이 새로운 Android 해바라기 앱 Kotlin을 사용하여 처음부터 구축되었습니다 우리는 종종 헤이 (hey)를 요청 받는다 너희들이 코 틀린을 추천하고있다

하지만 너 혼자 사용하고 있니? 물론 그것은 매우 공정한 질문입니다 현재 Google에는 많은 사내 개발자 도구가 있습니다 그래서 Kotlin 지원을 추가하는 데는 시간이 걸렸습니다 Google 직원을위한 내부 앱으로 시작했습니다 예를 들어 내부 앱이 있습니다

지도와 사무실 위치를 보여줍니다 그래서 우리는 그 사실로부터 많은 것을 배웠습니다 그 이후로 우리는 실제로 일부 공개 Google Apps에서 Kotlin을 사용하기 시작했습니다 여기에 몇 가지 앱이 있습니다 오늘 Kotlin 코드를 휴대 전화에 보냅니다

그리고 더 많은 것을 기대할 수 있습니다 Kotlin을 채택하는 것에 대해 말하면, 전체 생태계를 살펴보고, 우리는 활발한 개발에서 – 적극적인 개발은 지난 6 개월 동안 Play 스토어에 업로드했습니다 우리는 애플 리케이션의 16 %가 지금 Kotlin을 사용하고있는 것을 본다 그리고 앱이 개발 될 수 있음을 명심하십시오 하나의 버그 수정 또는 하나의 자산 변경이 있기 때문입니다

그래서 16 %는 꽤 인상적입니다 지난 I / O 이후로 5 배나 성장했습니다 그리고 당신이 최고 천개의 앱을 본다면, 그것은 실제로 이미 훨씬 더 커졌습니다 우리가 Kotlin을 사용하여 볼 수있는 애플 리케이션의 44 % 그래서 우리를 코 틀린으로 데려옵니다

어제 발표했습니다 그래서 왜 우리가 왜했는지에 대한 더 많은 개요를 알려 드리고자합니다 그것은 무엇을 의미할까요? 그렇다면 왜 코 틀린을 발표할까요? 우리는 코 틀린을 사용하는 사람들의 강한 입양을보고 있습니다 우리는 지역 사회에 큰 흥분을 안겨줍니다 사람들이 Kotlin을 사용할 때

실제로 사람들이 설문 조사에서 질문을받을 때 그들이 얼마나 Kotlin을 더 행복하게 사용하는지, 실제로 사람들보다 25 % 높은 점수를받습니다 누가 Kotlin을 사용하지 않고있다 업계 전반 및 Google 내부의 많은 앱 지금 Kotlin을 사용 중입니다 우리는 많은 고객에게 다가갔습니다 고객 자문위원회 (Customer Advisory Board)를 포함하여 그리고 Kotlin에 대한 투자에 집중하십시오

그럼 그게 무슨 뜻 이죠? 물론, 우리는 자바 프로그래밍을 계속 지원할 것입니다 많은 측면에서 언어 플랫폼, Android Studio 지원, 보풀, 안드로이드 X와 같은 Docs가 사라지지 않을 것입니다 하지만 다른 노력들을 보면 우리의 온라인 교육, 샘플처럼 우리는 먼저 Kotlin, 그리고 나서 자바 외국어가 최선의 노력이 될 것입니다 그리고 물론, 몇 가지 기능이 있습니다

다중 플랫폼 프로젝트와 Jetpack Compose 그것들은 단지 Kotlin에서 제공 될 것입니다 지금 당연히, 우리가 사람들에게서 들리는 다음 질문은, 그게 내가 전환해야한다는 뜻인가? 제발 Kotlin을 먼저 가져 가지 마세요 모든 Java 코드를 가져 와서 Kotlin에서 다시 작성해야합니다 그건 우리가 네가하고 싶지 않은거야 Android Studio를 확인하십시오

그것은 많은 수십만 줄의 코드입니다 지금은 Android Studio의 약 10 % Kotlin입니다 특정 코드 그리고 우리가하는 일은 새로운 기능 만 사용한다는 것입니다 코 틀린에 써라

그리고 그것은 Kotlin 자바와 좋은 상호 운용성을 가지고있다 Kotlin에서 단일 클래스를 작성할 수 있습니다 나머지는 Java로 유지하십시오 또는 Kotlin에서 코드의 99 % Java에서 남은 부분 만 남았습니다 물론, 당신의 현재 상태는 중요합니다

프로젝트 및 팀의 당신이 당신의 방출을 발송하는 것으로부터 1 주일 떨어져 있다면, 아마도 Kotlin으로 전환하기에 가장 좋은시기는 아닙니다 그러나 새로운 개발주기를 시작한다면, 니가 코 틀린을 데려 갈 수있을거야 물론 팀에 따라 다릅니다 그들은 Kotlin에 관심이 있습니까? 이것들을 안전하게 지니고 있습니까? 우리는 또한 많은 사람들이 실제로 모집에서 언급 한 Kotlin을 사용합니다 그들은 더 많은 후보자를 얻을 수 있습니다

고려해야 할 사항 물론, 기술적 측면에서, 고려해야 할 트레이드 오프가 있습니다 Kotlin은 뛰어난 기능, 더 많은 생산성, 그리고 만족 그러나 당신은 학습 곡선에 대해 생각해야합니다 사람들이 배우는 데는 시간이 걸립니다 관용적 인 코 틀린을 쓰기

우리는 Kotlin을 쓰는 대부분의 사람들이 첫번째 주, 그들은 정말로 Kotlin에 자바를 쓰고있다 그리고 3 개월에서 6 개월이 걸립니다 실제로 관용적 인 코 틀린을 쓰기 시작합니다 괜찮아 내 말은, 당신은 여전히 ​​코 틀린의 모든 이익을 얻습니다

nullness, et cetera에 대해 경고합니다 그럼 빌드 속도가 있습니다 Kotlin은 Java 컴파일러보다 느립니다 그것은 당신을 위해 더 많은 일을하고 있습니다 그리고 그것은 더 어린 컴파일러입니다

우리는 그것을 더 빨리 만들기 위해 열심히 노력하고 있습니다 그리고 물론, 유의하십시오 예, 느립니다 하지만 앱을 만들면 빌드가 줄어들 수 밖에 없습니다 가능성이 가장 높습니다

APK 크기도 있습니다 응용 프로그램은 표준 라이브러리를 사용하며, 약간의 공간이 필요합니다 그러나 R8과 같은 것들은 그것을 줄일 수 있습니다 진행중인 Kotlin 작업은 Google에서 계속 진행되고 있습니다 물론, Jetpack Compose가 가장 큰 것입니다

항상 새로운 KDX API를 계속 추가하고 있습니다 컴파일러 쪽에서 우리는 많은 작업을하고 있습니다 빨리하기 Kotlin 10330과 마찬가지로 증분 처리기 그리고 훨씬 더 많은 것이 있습니다

더 향상된 도구 및 더 많은 문서와 샘플을 볼 수 있습니다 Kotlin을 사용합니다 Kotlin 사용에 관심이 있다면, 하지만 어디서부터 시작해야할지 모르겠다 우리는 Kotlin Everywhere를 발표하고 있습니다 두 Google이 주최하는 일련의 교육입니다

및 JetBrains 그리고 지금과 KotlinConf 사이에서 일어나고 있습니다 올해 말 12 월 그것에 관심이 있다면, 참여하거나이 사이트를 호스팅하는 것을 돕고,이 링크로 이동하십시오 가입하십시오

따라서 새로운 Kotlin 첫 번째 로드맵을 통해, 안드로이드 용 Kotlin에 대한 투자 단지 더 커질 것입니다 아직 코 틀린을 사용해 보지 않은 여러분 모두를 초대하고 싶습니다 최근에 그것을 사용하지 않았거나 오늘 앱에서 사용해보십시오 Kotlin과 비슷한 경험을 해 주셨으면합니다 좀 더 예측적이고 코딩이 더 재미있을 것입니다

고맙습니다 [음악 재생]