Drawn out: how Android renders (Google I/O ’18)

[음악 재생] 안녕하세요 우리 이야기에 오신 것을 환영합니다

"그려진 것 – Android가 UI를 렌더링하는 방법 " 그것은 거의 다른 것으로 불 렸습니다 우리는 그것을 이것을, 그리고 몇몇 행정부에서 위치가 실제로 가고 있다고 결정했다 "앱을 최적화하는 방법 Top Rendering Performance "또는 뭔가 그 얘기가 아니 었습니다

다행히도, 우리는 그것을 다시 바꿨습니다 ROMAIN GUY : 아직도 그렇지 않습니다 CHET HAASE : 대신에, 우리는 당신에게 어떻게, 사실, 물건이 작동합니다 나는 쳇 하세입니다 나는 안드로이드 툴킷 팀 출신이다

Romain Guy : 나는 Romain Guy입니다 저는 Android 프레임 워크 팀에 있습니다 나는 실시간 그래픽을한다 CHET HAASE : 그것은 오늘날 우리가 이야기하고있는 것과 같습니다 그래서 우리는 이전에이 버전의 버전을 제공했습니다

우리는 우리가 끝난 줄 알았다 그리고 나서 우리는 충분한 것들을 깨달았습니다 어쩌면 시스템 내부에서 바뀌었다 이 일을 다시하고 우리가있는 곳을 볼 시간이었습니다 이것이 우리의 시도입니다

가자 그래서 우선, 렌더링이라는 단어가 있습니다 그게 무슨 뜻이야? 일반적으로 그것을 명확히하기 위해 지방을 녹이는 것을 의미합니다 그것은 우리가 오늘 이야기 할 내용이 아닙니다 대신, 우리는 실제로 선회하는 과정에 대해 이야기하고 있습니다

버튼과 체크 상자와 같은 모든 것들 화면의 모든 것을 픽셀 단위로 사용자가 볼 수있는 그리고 많은 일들이 진행되고 있습니다 우리가하는 많은 세부 사항이 있습니다 우리는 오직 오늘부터 이것을 40 분 안에하십시오 그러나 우리는 그 길을 따라 많은 세부 정보를 덤프 할 것입니다 그래서 우선, 나는 너를 데려 갈거야

~을 통해 색깔의 무리가 될 것입니다 상단에 도트가 표시됩니다 이야기의 나머지 부분에 대한 시각적 단서의 종류 그래서 저는 일종의 걸음마 단계를 밟을 것입니다 정보의 흐름에서 일어나는 일생의 화면의 픽셀까지 내려갈 수 있습니다 우리는 안무가라고 불리는이 물건을 가지고 있습니다

보통 60 초에 한 번 찰 때, Vsync라고합니다이 간격은 다음과 같습니다 프레임이 동기화되고 있습니다 버퍼가 화면에 나타납니다 우리가 많은 정보를 처리 할 좋은 시간입니다

그 정보의 렌더링 처리 그 결과로 Vsync 연산을 얻습니다 Java SDK 영역으로 보내졌으며 우리는 UI 스레드를 사용하고 있습니다 그리고 갑자기 우리는 입력 이벤트를 처리해야합니다 속성의 변경 사항을 트리거합니다 우리는 또한 모든 애니메이션을 실행합니다

그래서 우리는 속성 값을 변경합니다 다시 말하지만, 레이아웃 및 무효화와 같은 일이 발생할 수 있습니다 우리는 전체 통과 통과를 측정합니다 그들이 얼마나 큰지 알아 내기 위해서, 그것들을 실제로 배치하는 것입니다 어디로 가야하는지, 그리고 그 다음에 그려야합니다

일단 모든 정보가 완료되면, 해당 정보의 결과를 동기화합니다 렌더링 스레드라고 불리는 것에 이르기까지 그리고 렌더링 스레드가 그것을 받아서, 좋아, 글쎄, 나는 이것들을 실행하려고합니다 나는 기본적으로 이것을 돌릴거야 모든 정보의 기본 버전으로 우리는 Java 레이어에서 제작 한 다음 GPU에서 버퍼를 얻으려고 할 때, 그래서 나는이 정보를 쓸 곳이있다

그리고 나서이 모든 GPU 명령을 실제로 발행 할 것입니다 저기있는 OpenGL 같은 것들 그리고 나서 저는 말할 것입니다 좋아요, 이제는 버퍼를 바꿀 때가되었습니다 그런 다음 GPU로 넘깁니다

그리고 그래픽 시스템은 합성이라고하는 것, 우리는 오늘이 단계의 대부분에 대해 이야기 할 것입니다 그래서 합성은 생각합니다 우리는 전에 결코 설명하지 못했습니다 그래서 우리는 약간의 세부 사항을 들어갈 것입니다 안드로이드 렌더링 아키텍처의이 부분에 대해서

그럼 작은 색 점들 화면 상단에 주목할 것입니다 우리는 몇 가지 예를 거쳐 과정을 진행하고 있으며, 우리는 이것을 더 잘 이해할 수 있습니다 예제를 말하면, 여기 간단한 예제가 있습니다 따라서 사용자가 있다고 가정 해 봅시다 사용자가 항목을 클릭하면 나는이 굉장한 RecyclerView 응용 프로그램을 썼다

그 모양이 정확히 같습니다 나는 그것이 스크린 샷이기 때문에 그것이라는 것을 안다 내 멋진 응용 프로그램에서 그것에는 아이템이 잔뜩 들어있는 RecyclerView입니다 사용자가 하나를 클릭하면이 놀라운 일이 발생합니다

그것은 배경에 임의의 색상으로 변합니다 그것은 믿을 수 없다 나는 너에게 근원을 줄 수 있었지만 나는 모른다 그것은 꽤 복잡합니다 네가 이해할 수 있을지 확신 할 수 없다

여기 내 놀라운 데모 응용 프로그램을위한 놀라운 레이아웃이 있습니다 ConstraintLayout이 있습니다 내부에 RecyclerView가 있습니다 그런 다음 런타임에 채 웁니다 그 안에는 무작위적인 물건들이 잔뜩 있어요

이 것에 대한 뷰 계층 구조 기본적으로 이렇게 보입니다 실제로, 그것은 기본적으로 이와 같이 보이지 않습니다 그것은 정확히 이것과 같습니다 그래서 당신은 DecorView에서 내려갑니다 LinearLayout과 FrameLayout이 있습니다

나는 왜 우리가 깊은 둥지를 틀고 있는지 정확히 알지 못한다 하지만 뭐든간에 역사 우리는 거기에 행동 바에 대한 것들을 잔뜩 가지고 그게 정말 중요하지 않습니다

우리가 여기서 염려하는 것은 콘텐츠 계층 구조에서 실제로 무슨 일이 일어나고 있는지, 그것이 응용 프로그램에 영향을 줄 수 있기 때문입니다 그래서 우리는 내용 FrameLayout, 우리는 ConstraintLayout을 가지고있다 바깥쪽에는 RecyclerView를 감 쌉니다 그리고 나서 모든 항목 구체적으로 이들은 다음과 같은 항목입니다

그것들은 유일한 것들이기 때문에 화면에 있습니다 실제로 측정되고 배치되고 그려집니다 그래서 어떻게됩니까? 이 예제를 실행하고 우리가 처음부터 끝까지 간 모든 흐름을 통해 사용자가 클릭하면 Vsync 작업이 실행됩니다 그것이 전송되고 입력 단계에서 입력을 처리합니다 우리는 이것이 클릭이라는 것을 알게됩니다

나는 여기에 몇 가지 세부 사항에 광택을 쓰고있다 사실, 우리는 먼저 다운이 있다는 것을 알아 차릴 것입니다 그런 다음 위로 올라간 다음에 클릭으로 처리됩니다 우리가 결국은 당연한 것으로 받아 들여 여기를 클릭하여 처리 할 것입니다

이 항목에서 클릭 끝나는 방법 내가 가지고있는 놀랍도록 복잡한 예에서, 그 안에 배경색을 설정합니다 이 항목에 임의의 색상을 지정하십시오 그것이 내가이 방법을 무작위로 호출 한 이유입니다 viewjava에서 설정된 배경색으로 전송됩니다

배경에 색상을 설정하는 물건을 잔뜩합니다 drawable, 그리고 나서 결국 호출 이 메소드는 invalidate라고 불린다 무효화는 프로세스입니다 실제로 뷰를 다시 그리지는 않습니다 View Hierarchy에 무엇인가를 알려주는 과정입니다

다시 그려야합니다 그래서 클릭이 발생합니다 그것은 아래쪽에있는 항목에서 발생합니다 그 두 번째 아이템 – 당신은 녹색으로 둘러싸인 것을 보았습니다 우리는 약간의 무효화 메소드가 있습니다

그걸 부름 받았고 기본적으로 나무 위로 걸어 간다 나무 위로 줄곧 일련의 메소드를 호출합니다 뷰는 다시 그려야한다는 것을 알고 있기 때문에, 하지만 실제로 그 정보를 전파해야합니다 계급을 따라 올라간다 그래서 그때 우리는 앞으로 모든 것을 다시 그릴 수 있습니다

그래서 무효 심판을 계층 구조의 맨 위로 불러옵니다 결국 그것은 거대한 수업으로 끝납니다 우리가 ViewRootImpljava를 호출했다고하자 거기에이 무효화 자식 메소드가 있습니다

그리고 그것은 기본적으로 좋아, 나는 순회 일정을 잡아야한다 알았어, 누군가 정보를 가져 왔어 어딘가에서 무효화 됐어 즉 나중에 트래버스 코드를 실행해야합니다 이 과정이 끝나면 순회는 일을하는 과정입니다

실제로 필요한 모든 단계 해당 프레임을 렌더링합니다 구체적으로 말하자면, 보기가 얼마나 큰지, 레이아웃 – 뷰의 위치와 크기를 설정하고 뷰를 그립니다 이 모든 것을 순회라고합니다 그래서 우리는 순회를 계획했습니다 그것은 나중에 일어날 것입니다

그리고 나중에 시간이 지금이다 그래서 같은 프레임에서 우리는 traversal 코드로 끝납니다 이 performTraversals 메소드에서 그것은 PerformDraw를 할 것입니다 PerformDraw는 무승부를 요구합니다

메소드를 핵심 뷰에 추가하면됩니다 모든 방법으로 전파됩니다 그리기 방법은 실제로 최적화에서 끝납니다 허니 콤에서 다시 구현 한 Get DisplayList를 호출합니다 따라서 DisplayList는 렌더링을 저장하는 구조입니다 정보? 버튼 코드의 작성 방법을 보면 또는 일반적으로 코드보기, 그래픽 명령 호출 DrawBackgrounds, DrawDrawable, DrawLine, 도대체 무엇이

그러나 이것들은 DisplayList의 연산으로 끝납니다 이는 이러한 작업을 나타내는 간결한 방법이며, 뿐만 아니라 작업에 대한 매개 변수도 제공합니다 그래서 Get DisplayList를 호출합니다 사실 장식보기는 변경되지 않았습니다 그래서, 글쎄요, 저는 변하지 않았습니다

하지만 확실히 내 아이를위한 DisplayList를 얻을 수 있습니다 그리고 나무 아래로 내려 가면서, 그것이 항목 2에 도착할 때까지, 그리고 그것은 말합니다, 오, 나는 변했습니다 무효가 나를 불렀을 때, 뭔가를 유발해서 내가 다시 새겨 져야한다는 것을 알았습니다 그래서 Get DisplayList 실제로 끝납니다 뷰를 그리는 호출로서 재생성됩니다

자체 디스플레이 목록 자 이제이 onDraw 메서드로 끝납니다 DisplayList에있는 작업으로 끝납니다 DisplayList는이 항목에 대해 기본적으로 rect 정보와 텍스트 정보 – 꽤 기초적인 그리고 기본적으로 DisplayList가 있습니다

전체 계층 구조 그래서 그 자체가보기 자체가 아니 었습니다 하지만 우리는 계층 구조 자체를 가지고 있습니다 이 표시 목록의 계층 구조에서 재생됩니다 줄곧

이제 전체 트리에 대한 DisplayList가 있습니다 그게 우리가 UI 스레드에서해야 할 모든 것입니다 이제 우리는 그 정보를 렌더링 스레드 및 렌더링 스레드 GPU를 실제로 다루는 별도의 스레드입니다 이 작업의 측면 Java 측에서는 모든 정보를 생성했습니다

네이티브 측에서, 우리는 실제로 – 우리는 그 정보를 가지고 GPU로 동기화합니다 동기화 작업이 있습니다 기본적으로 우리는 저기서 핸들을 복사 해 또한 관련 정보를 일부 복사합니다 피해 지역을 복사 했으니 까

그 아이템 2 – 그게 중요하다는 걸 아는 것이 중요합니다 그 틀에서 변한 유일한 것 우리가 아무것도 다시 그릴 필요가 없다는 것을 의미한다 그렇지 않으면 그 지역 밖 그래서 우리는 클립 바운드를 복사 할 것입니다

그래서 우리는 다시 그려야 할 것을 알고 있습니다 이제 최적화를 수행 할 것입니다 비트 맵 업로드 같은 것들 따라서 이것은 프레임의 시작 부분에서 그것을 수행하기에 좋은 시간입니다 그들에게 실제로 그들을 돌려 줄 시간을주세요

길을 따라 텍스처에, 우리는 다른 것들을하고있어 ROMAIN GUY : 여기에 우리가 업로드 중임을 언급합니다 하드웨어가 아닌 비트 맵 하드웨어 비트 맵은 새로운 유형의 비트 맵 구성입니다 Android O에 추가되었습니다 일반적으로, 비트 맵을 가지고있을 때 메모리를 할당해야합니다

자바 측에서 그리고 그릴 시간이 왔을 때, 우리는 GPU에서 비트 맵 복사본을 만들어야합니다 이것은 비싸다 시간이 걸리며 사용하는 RAM의 양이 두 배로 늘어납니다 따라서 Oreo에서 사용 가능한 하드웨어 비트 맵을 사용하면, 당신은 방정식의 Java 측을 유지할 수 있습니다

GPU에만있는 비트 맵을 가질 수 있습니다 따라서이 비트 맵을 다시 수정하지 않을 경우, 이것은 메모리 효율적인 현명한 효율적인 방법입니다 비트 맵의 ​​메모리를 저장합니다 CHET HAASE : 이전에 렌더링 스레드에 대해 언급했습니다 이것은 우리가 롤리팝에서 소개 한 것입니다

해제 GPU 와만 통신하는 별도의 스레드입니다 그것은 네이티브 코드입니다 Java 코드 외부에는 호출이 없습니다 애플리케이션 코드에는 분명히 콜 아웃이 없다

그냥 GPU와 대화합니다 우리는 이것을했습니다 그래서 우리는 여전히 기본적으로해야합니다 우리가했던 것과 같은 일, 미리 렌더링 된 쓰레드, 우리는 모든 DisplayList 정보를 생성합니까? 그 다음 DisplayList 정보를 보냅니다 GPU에

그래서 일련의 직렬하지만 렌더 스레드 원형처럼 물건을 원자 적으로 할 수있다 리플 애니메이션뿐만 아니라 애니메이션도 보여줍니다 벡터 드로어 블 애니메이션으로서 – 렌더링 스레드에서 원자 적으로 발생할 수 있습니다 그래서 일어날 수있는 일 UI 스레드를 정지시키지 않아도됩니다 그리고 그 동안 UI 스레드 유휴 상태 일 때 다른 일을 할 수 있습니다

동기화 후, 유휴 프리 페치 중 일부 작년에 한 RecyclerView에서 일합니다 따라서 스레드가 실행됩니다 우리는 모든 것을 동기화했습니다 우리는 DisplayList를 가지고 있습니다, 피해 지역이 있습니다, DisplayList를 무언가로 바꿉니다 우리가 DLOps라고 부르는 것 – 표시 목록 조작

따라서 중간에 채우기 작업이 있음을 알 수 있습니다 그것이 우리가 녹색으로 변한 것입니다 그런 다음 우리는 우리가 수행하는 최적화가 있습니다 ROMAIN GUY : 여기서 우리는 다양한 최적화 작업을 수행합니다 그래서 예를 들어, 알파 렌더링을한다면 뷰에 Set Alpha를 호출하거나 하드웨어를 설정 한 경우 레이어를 선택하면 그리기 명령을 식별하려고합니다

해당 레이어를 대상으로해야하는 프레임의 시작 부분에서 이동시킵니다 이렇게하면 GPU 내부의 상태 변화를 피할 수 있습니다 매우 비쌉니다 따라서 이런 종류의 최적화를 수행하지 않고, 당신은 끔찍하고 끔찍한 성적을 보게 될 것입니다 GPU 자체가 느려지 기 때문이 아닙니다

GPU가 CPU를 기다리고있을뿐입니다 그것을 지시하기 위해 우리가하고있는 다른 하나, 우리는 당신에게 실제적인 실제적인 예를 보여주기 위해, 재정렬 및 ​​매칭이라고합니다 우리는 모든 작업을 살펴보고, 우리가 목록 항목을 가지고 있기 때문에이 예제에서 볼 수 있습니다 우리는 유사한 많은 작업을 인터리빙합니다

그래서 우리는 직사각형을 그릴 것입니다 그리고 나서 텍스트를 그릴거야 그런 다음 사각형과 텍스트를 다시 그릴 것입니다 그리고 다시 여기에서 우리는 GPU의 상태를 바꾸고 있습니다 여러 번, 대신에 우리는 명령어가 겹치지 않으면 할 수있다

우리는 모든 직사각형을 함께 그릴 수 있습니다 그리고 나서 우리는 모든 텍스트를 함께 그릴 수 있습니다 이것은 재정렬과 매칭의 일부입니다 그리고 때때로, 우리가하는 일은 우리가 말하길, 우리가 사용하는 많은 텍스트를 볼 수 있다면 동일한 색깔 및 동일한 글꼴, 다른 텍스트 불러 오기가 필요하지 않습니다 그것들은 전체 화면을 커버하는 단 하나의 것일 수 있습니다 CHET HAASE : 원본 DLOps를 볼 수 있습니다 채우기 작업을 한 다음 어떤 텍스트를 그리기를 원한다

텍스처 맵이 될 것입니다 글리프 캐시에서 복사합니다 그런 다음 채우기 작업이 있고 그 다음에 더 많은 텍스트와 채우기 그래서 우리는 이러한 모든 작업을 인터리브했습니다 따라서 재정렬 작업 후에, 그러면 좀 더 보입니다

일련의 채우기와 일련의 텍스트 작업이 있습니다 함께 배치 할 수도 있습니다 더 최적이 될 것입니다, 우리는 여기서 볼 것입니다 ROMAIN GUY : Gmail의 예입니다 그래서 그것은 허니 콤 시대에있었습니다

여기서 어떻게 파이프 라인을 수정했는지 알 수 있습니다 렌더링 속도를 늦추고 볼 수 있습니다 Gmail이 그리는 방법을 정확하게 설명합니다 그래서 우리는 많은 목록 항목을 가지고 있습니다 그것들을 정확한 순서대로 그려라

뷰 계층 구조에 코드 순서대로 존재해야합니다 사실은 캔버스에 그린 모든 그리기 호출은 그 명령을 존중해라 불행히도, 내가 말했듯이, 그것은 매우 비효율적입니다 대신에 일괄 처리 및 병합 및 재정렬 한 후, 우리는 이것을 얻는다

특히 모든 별들이 같은 시간에 그려지며, 대부분의 텍스트가 한꺼번에 나타납니다 흥미로운 점은 모든 목록을 그리는 것입니다 항목 배경이 차례로 나타납니다 그래서 좋았어 재정렬이 효과가있었습니다

일괄 처리가 작동하지 않았고 부분적으로 목록이 항목이 약간 겹쳐 있습니다 명령이 겹칠 때 우리는 명령을 하나로 그려야합니다 블렌딩을 존중할 다른 후, 알파 값이 올바른지 확인하십시오 따라서 효과는 실제로 응용 프로그램에 따라 다릅니다 KitKat에서 올바르게 기억한다면, 설정 응용 프로그램은 전체 화면을 그릴 수있었습니다

수십, 수십 개가 아닌 약 6 회의 무승부 요청으로, 뷰 계층 구조에서 볼 수 있습니다 따라서 이것은 우리에게 매우 중요한 최적화입니다 CHET HAASE : 나는 현재의 장치들에 대한이 작업을 생각한다 밀리 초와 같은 것을 저장했다 우리가 가진 것을 깨닫지 못한다면 16 세 안에 모든 것을 할 수 있습니다

그래서 실제로 큰 발전이었습니다 Gmail 덕분에 Gmail이 덜 복잡해질 수있었습니다 종종 다음 프레임으로 밀려 나왔다 그래서 모든 것에 대한 우리의 설명으로 되돌아갑니다 그런 다음 clipReject가 있습니다

그래서 이것은 우리가 피해에 대한 정보를 얻는 곳입니다 지역? 그래서 우리는 두 번째 항목이 화면에 있었는지 알고 있습니다 우리는 우리가 그릴 필요가 없다는 것을 안다 그 밖에는 아무것도 없어 따라서 우리는이 DLOps를 처리하면서, 우리는 기본적으로 버릴 수 있다는 것을 압니다

그 지역 밖에서 그려지고있는 모든 것 그래픽에서는 사소한 불량이라고합니다 따라서 우리는 모든 DLOps를 사소하게 거부합니다 그 지역과 교차하지 않은 이제 우리가해야 할 일은 채우기를 그리는 것뿐입니다 그리고 일부 텍스트와 라인

그래서 우리는 그렇게합니다 이를 수행하는 과정에서 우리는 GetBuffer를 수행 할 수 있습니다 이것은 대개 암시 적 작업입니다 우리는 완충을 요구하지 않는다 GPU 작업을 시작하자 마자, 그러면 GPU가 우리에게 버퍼를 넘깁니다

특히, SurfaceFlinger가 우리에게 버퍼를 건네줍니다 우리는이 명령들을 넣을 수 있습니다 그런 다음 명령을 실행합니다 이것은 일련의 GL 명령입니다 슬라이드에서 볼 수 있듯이 glCommand라고합니다

기본적으로 우리가 무엇을 필요로하는지에 상응합니다 채우기 또는 텍스트 수행하기 – 비트 맵은 줄을 복사합니다 그리고 우리는 버퍼를 교환합니다 그래서 이것은 우리가 말하고있는 것입니다, 우리는 우리의 모든 렌더링 작업 이 프레임을 화면에 표시 할 준비가되었습니다

SurfaceFlinger가 버퍼를 교환하라는 요청입니다 기본적으로, 우리는 버퍼로 드로잉을 마쳤습니다 앞면에있는 것과 이것을 바꿀 수 있습니다 그것을 화면에 표시합니다 한편, SurfaceFlinger에서 우리는 Romain이 가고있는 합성 단계가있다

나중에 많이 이야기하기 하지만 기본적으로 화면의 모든 창을 차지합니다 탐색 막대, 상태 표시 줄, 응용 프로그램의 실제 내용 창 그것은 하드웨어 컴포 지터에있는 모든 것을 결합합니다 그들을 화면에 놓은 다음, 타다 끝났어

그래서 정말 간단한 예였습니다 매우 복잡한 예를 살펴 보겠습니다 이것은 두 단계로 진행될 것입니다 하나, 그래서 우리는 목록을 끌어 올거야 그래서 우리는 그것을 끌고 갈 것입니다, 그리고 우리가 그것을 끌고 갈 때, 우리는 항목을 조금씩 옮길 것입니다

그리고 결국 우리가 계속 움직이면, 우리는 새로운 아이템을 나타낼 것입니다 그래서 우리는이 두 가지 버전을 살펴볼 것입니다 이동 전용 버전이 있습니다 그래서 우리가 그것을 끌어 올릴 때, 새로운 아이템 – 새 항목이 표시되지 않습니다 모든 것이 조금 바뀌 었습니다

우선 우선 처리해야합니다 그래서 우리는 Vsync를 가지고 있습니다 입력 이벤트를 처리 할 시간입니다 그래서 우리는 그렇게하고, 우리는 이런 식으로 끝납니다 RecyclerView의 터치 이벤트에서 잘, 아래 가동이 있었다는 것을 밝힌다

그리고 등록 만하면됩니다 그 일이 일어난 곳 아무것도 처리 할 필요가 없습니다 화면에서 아무 것도 바뀌지 않았습니다 우리는 방금 사용자가 실제로 눌렀다는 것을 등록했습니다

그래서 우리는 그것을 나중에 기록하고 아무런 작전도 없습니다 우리는 우리가 얘기 한 나머지 것들은하지 않습니다 아무것도 바뀌지 않았기 때문에 그들은 드래그를 계속하고 유사한 코드로 끝납니다 그래서 우리는 다음 프레임에서 입력을 처리합니다

우리는 터치 이벤트에서 OK라고 말합니다 오, 이제 우리는 그들이 실제로 움직 였다는 것을 알고 있습니다 우리는 이전 X를 저장했기 때문에 그들이 얼마나 많이 움직 였는지 압니다 우리는 델타를 계산합니다 그리고 이제 우리는 offset top와 bottom이라고 불리는 것을 호출합니다

기본적으로 화면의 모든보기에 대해 우리는 단순히 Y로 그들을 이동합니다 그리고 위쪽과 아래쪽 호출 오프셋 무언가 무효화 방법입니다, 하지만 약간 다릅니다

그것은, invalidateViewProperty 말한다 이것은 우리가 두는 최적화입니다 아마 허니 콤 두 번째 릴리스 또는 무언가 DisplayList 속성 그래서 이전에 DisplayList에 대해 이야기했을 때, 내가 빠뜨린 하나의 뉘앙스가있었습니다 우리는 운영에 관한 정보를 가지고 있습니다 그리고 그래픽 작업을위한 매개 변수

하지만 일부 핵심 디스플레이에 대한 정보도 있습니다 기본적으로 뷰의 속성 인 속성, 번역 속성과 마찬가지로 회전 알파 그리고 이것들은 우리가 필요로하지 않는 속성입니다 변경하려는보기를 다시 렌더링합니다 우리는 단순히 DisplayList 구조 자체에서 그것들을 변경할 수 있습니다

그런 다음 GPU 발행시에 선택됩니다 따라서 우리가 그렇게하는 것이 매우 빠릅니다 따라서보기를 무효화하는 대신 그 모든 것을 모두 다시 그리는 것 우리가하는 말은 번역을 바꾸는 것입니다 이보기의 속성 그래서 우리는 invalidateViewProperty를 호출합니다 그것은 나무 위로 모든 길을 전파합니다

우리는 여전히 최상위 계층에서 어떤 일이 발생 하는지를 알아야하기 때문에, 하지만 훨씬 더 최적의 단계입니다 이렇게되면 일정이 정해진 다 Traversals, 이전처럼 추첨에서, 그것은 performTraversals에서 끝나고, PerformDraw는 이보다 훨씬 간단한 버전을 수행 할 수 있습니다 DisplayList가 실제로 변경되지 않았기 때문입니다

DisplayList 속성을 변경하면됩니다 그것의 내부 그래서 우리는 즉시 그 정보를 렌더링 스레드로 그런 다음이를 실행하여 DisplayList 연산으로 변환 할 수 있습니다 버퍼를 얻는다

기본적으로 모든 것은 이전과 같습니다 두 번째 단계로 가자 그 복잡한 복잡한 예입니다 사용자는 드래그를 계속하고, 드래그 할 때, 하단에 새 항목이 나타납니다 따라서 Vsync는 입력을 처리합니다

우리는 이와 같은 방법으로 끝납니다 우리는 그들이 움직 였다는 것을 압니다 오,하지만 그건 우리가 창조를 촉발시킬 필요가 있음을 의미합니다 그리고 거기에 새 항목의 바인딩 결국이 코드에서 끝납니다

상위 뷰를 추가하십시오 그래서 RecyclerView는 새로운 시각을 갖게 될 것입니다 RequestLayout을 호출 할 것입니다 그래서 RequestLayout은 일종의 무효화입니다 그러나 말하는 대신에, 나는 다시 그려야한다

그것은, 내가 다시 측정하고 relaid 필요가 말합니다 그리고 그것은 모든 사람들에게 영향을 미칠 수 있습니다 그래서 우리는 기본적으로 RequestLayout을 모든 방법으로 전달합니다 무효처럼 나무를 올리십시오 그런 다음 전체 트리에서 측정 및 레이아웃을 수행합니다

거기서 무엇이 바뀌 었는지 보러 그래서 RequestLayout은 부모에서 일어나고, 그리고 그 모든 것이 전파됩니다 그리고 그것은 다시 일정에 잡 힙니다 여행자, 우리 친구 그런 다음 트래버스를 수행하십시오

지금 그릴 물건에 대해 우리는 performMeasure를 할 것입니다 및 performLayout 측정은 기본적으로 모든 의견을 묻습니다 그들이 얼마나 큰 지 알고 싶습니다

그것은 요청입니다 레이아웃이 말하길, 이것은 당신이 얼마나 커질 지에 대한 것입니다 그리고 이것은 당신이 위치 할 곳입니다 그것은 견해와 모든 부모 사이의 협상이다 시스템의 모든 제약 조건에 따라 그래서 우리는 수행을 수행합니다

그것은 기본적으로 측정을 상단에서 호출합니다 그 모든 것이 아래로 전파됩니다 그리고 우리는 모든 정보를 가지고 있습니다 모든 견해가 얼마나 커지고 싶어하는지, 그게 우리가 레이아웃을 계산하기에 충분하다 정보

그런 다음 레이아웃을 트리 전체로 전파합니다 그리고 그 일이 아이템과 부모에게 일어나면 변경된 다음, 실제로 그 항목을 배치합니다 우리는 갈 준비가되어 있습니다 이제 우리는 실제로 물건을 그릴 수 있습니다 모든 것은 이전과 같습니다

여기서 뉘앙스는 단지 레이아웃면이었습니다 중요한 뉘앙스를 제외하고는 우리 모두가 이 RequestLayout과 측정 및 레이아웃에 대한 정보 이 RecyclerView 상황 그러나 RecyclerView는이를 최적화합니다 부모와 자녀에 대해 충분히 알고 있습니다 실제로는 뷰를 상쇄 할 수 있습니다

RequestLayout을하는 대신, 실제로는보기를 이동시킬 수 있습니다 새 항목을 만듭니다 따라서 RecyclerView, 이전 목록보기뿐 아니라 ROMAIN GUY : 이제 우리는 이야기 할 것입니다 우리의 윈도우 컴포지션 인 SurfaceFlinger가, 화면의 모든 창을 합성합니다 이것은 흥미 롭습니다

음, 우선, 뭔가를 배우는 것이 항상 재미 있기 때문입니다 새로운 기술에 대해서뿐만 아니라 이해할 수 있기 때문에 어떤 개념 뒤에 일부 개념 Surface API, SurfaceTexture API, SurfaceView 또는 MediaCodec 그래서 우리가 구성을 이해하기 전에, 우리는 안드로이드에 대한 매우 중요한 개념을 이해해야합니다 버퍼 큐를 호출했다 따라서 이름에서 알 수 있듯이 버퍼 대기열은 우리의 그래픽 버퍼가있는 버퍼 큐에 불과합니다

일반적으로 1 ~ 3 개의 버퍼가 있습니다 내부적으로 다양한 옵션이 있습니다 여기서 우리가 버퍼 큐를 설정할 때, 우리가 원하는 버퍼 수를 요청할 수 있습니다 그리고 매우 중요하게도 버퍼 큐는 두 개의 끝점을 가지고 있습니다 우리에게는 생산자가 있고 우리에게는 소비자가 있습니다

따라서 일반적으로 버퍼 대기열을 사용하는 방법 – 생성자는 dequeueBuffer라는 메서드를 호출합니다 대기열에 있습니다 대기열에서 버퍼를 가져옵니다 이제는 그것을 소유하고 있습니다 그것은 모든 종류의 렌더링을 할 수 있습니다

이것은 픽셀 데이터를 직접 전송할 수 있으며, 그것은 OpenGL을 사용할 수 있습니다, 그것은 캔버스를 사용할 수 있습니다 별로 중요하지 않습니다 OpenGL을 사용하면 기본적으로 마지막에 썰매 버퍼를 호출하면 어떻게됩니까? 그 때 우리는 버퍼 안에 내용을 생성합니다 따라서 제작자가 컨텐트를 제작할 때, 그것은 큐 버퍼를 호출하고, 버퍼에 다시 준다 버퍼 큐에 저장한다

이제 소비자는 다음 버퍼를 잡을 수 있습니다 acquire를 사용하여 대기열에 있습니다 그래서 그것은 획득 버퍼를 호출합니다 큐 내의 최초로 이용 가능한 버퍼 그것은 그것과 관련이있는 것은 무엇이든합니다

그리고 그것이 끝나면, 그것은 release를 호출함으로써 그것을 되돌립니다 그래서 아주 간단한 개념입니다 물론 코드를 보면 모든 헤더 파일과 모든 코드 복잡하다 부분적으로 복잡하다 버퍼 큐의 두 끝점 다른 프로세스에서 살 수 있습니다

그리고 이것은 정확하게 일어납니다 이것은 우리의 곡면 작곡가가 작동하는 방식입니다 따라서 시스템에 창을 만들 때, Window Manager가 있고 SurfaceFlinger가 있습니다 따라서 창 관리자는 효율적입니다 이 시나리오의 제작자 및 SurfaceFlinger 우리의 소비자입니다

그래서 addView에서 Window Manager를 호출하면 – 이 작업은 자동으로 수행됩니다 당신은 토스트를 만들 때 대화를 만들고, 나는 믿습니다 활동을 만들 때 – 내부적으로 우리는 윈도우 객체를 생성한다 이 윈도우 객체는 SurfaceFlinger면에 형제가 있습니다 레이어라고합니다

이름은 조금 혼란 스러울 수 있습니다 그래픽에서는 버퍼와 대기열을 처리해야하기 때문에, 그것이 우리 모두가하는 일이며 우리는 빨리 이름이 없어집니다 그리고 그래픽 팀 – 그게 우리가 생각한 이유야 표면 및 표면 텍스처와 버퍼 큐 및 레이어 및 창 네

그래서 좀 지저분 해 그래서 SurfaceFlinger에 하나의 레이어가 있습니다 그것은 기본적으로 창입니다 레이어가 시스템의 구성 요소입니다 이는 응용 프로그램에 대한 버퍼 대기열을 생성하고 소유합니다

그래서 그것은 버퍼 큐를 생성하고 우리는 애플리케이션에 엔드 포인트를 보내는 방법이있다 서페이스를 만듭니다 따라서 API 중 하나에서 Surface를 볼 때마다 당신은 정말로 버퍼 큐의 프로듀서 끝 점이 있습니다 귀하의 프로세스에서 시스템의 다른 어딘가에 살고있는 또는 일부 다른 프로세스에서 대부분의 시간은 SurfaceFlinger 내부에있게 될 것입니다

이제는 전형적인 유스 케이스로, 애플리케이션 개발자로서 Surface API를 다루려고한다 SurfaceView를 만들 때 따라서 SurfaceView가 작동하는 방식은 자체 표면 인 창입니다 우리가 여기에서 볼 수 있습니다 그럼 우리는 그 표면을 통해 구멍을 효과적으로 잘라 냈습니다

그리고 창 관리자와 SurfaceFlinger에게 물어 봅니다 두 번째 서페이스를 만듭니다 그리고 우리는 그것을 밑으로 밀어 넣습니다 그것들이 같은 창문의 일부인 척하십시오 그러나 그들은 그렇지 않습니다

그것들은 두 개의 다른 표면입니다 그들은 두 개의 서로 다른 버퍼 큐를 가지고 있는데, 그들은 서로 완전히 독립적 일 수 있습니다 따라서 SurfaceView를 사용하면 아마도 OpenGL이나 Vulcan이나 미디어 플레이어를 사용할 것입니다 콘텐츠를 생성합니다 예를 들어,이 경우 OpenGL ES가 있습니다

짐을 뽑아 버릴거야 그것은 약간의 렌더링을 할 것입니다 버퍼를 Surface로 대기열에 넣고, 따라서 버퍼 큐에 저장됩니다 표면 질감을 사용하면 소비자가 OpenGL이됩니다 그래서 텍스쳐 ID를줌으로써 SurfaceTexture를 만듭니다

이 경우 SurfaceTexture가 생성하고 소유합니다 버퍼 큐, 그래서 종종 자신의 프로세스에있을 것입니다 그런 다음 SurfaceTexture를 전달해야합니다 어떤 제작자에게, 그리고 이것을하기 위해, 자신이 엔드 포인트를 작성하고, 서페이스를 만듭니다 SurfaceTexture를 취하는 Surface의 생성자가 있습니다

그래서 당신은 당신의 서피스를 만들고 그것을 보냅니다 다른 응용 프로그램으로 이동 한 다음 OpenGL 코드를 렌더링 할 준비가되면, 그것은 acquire를 호출하여 버퍼 큐에서 버퍼를 가져옵니다 렌더링을 수행합니다 다른 큐의 내부에 버퍼를 생성합니다 완료되면 릴리스를 호출 할 수 있습니다

TextureView는 UI 툴킷의 일부인 위젯입니다 SurfaceTexture의 혜택을 누릴 수 있습니다 이 특별한 경우 렌더링 스레드 우리가 얘기 한 것은 SurfaceTexture의 소비자입니다 당신은 여전히 ​​Surface를 얻는 책임이 있습니다 TextureView에서 그것을주고 당신이 선택한 프로듀서에게

당신은 그것을 멋진 이미지라고 생각할 수 있습니다 정말 효율적으로 업데이트 할 수있는 이미지보기입니다 하드웨어 가속을 사용합니다 최근 몇 년 동안 우리는 당신에게 말 했었습니다 TextureView가 해결책이었습니다

SurfaceView의, 비디오 또는 OpenGL을 통합하고자 할 때 복잡한 응용 프로그램 내에서 렌더링 예를 들어, ListView 또는 CountView 또는 움직이는 모든 것 SurfaceView는 두 개의 다른 창으로 구성되어 있기 때문에, 자연적으로 그렇게 효율적이었습니다 렌더링과 동기화되지 않았습니다 자신의 응용 프로그램의

이 문제는 Android 최신 버전에서 수정되었습니다 그래서 대부분의 시간, 안드로이드의 최신 버전에서, TextureView 대신 SurfaceView를 사용해야합니다 필요한 경우에만 TextureView를 사용하십시오 어쩌면 당신의 다른 견해들 사이에 끼어 있을지도 모릅니다 또는 SurfaceView에서 지원하지 않는 애니메이션을 사용하십시오

CHET HAASE : O 릴리스라고 생각합니다 그건 O– 어쩌면 N 이네 어쩌면 ROMAIN GUY : 둘 중 하나 테스트를해야합니다

CHET HAASE : 우리가 최근에 말한 이유입니다 ROMAIN GUY : 그리고 여기에 다른 제작자들의리스트가 있습니다 및 플랫폼의 소비자 그래서 우리는 SurfaceView와 SurfaceTexture를 보았습니다 OpenGL ES는 제작자입니다

또한 소비자 일 수도 있습니다 Chet가 그 라이프 사이클에서 어떤 시점에서, 우리는 버퍼를 얻는다 렌더링에서 dequeueBuffer를 호출 할 때입니다 thread로 보내고, 이것은 일반적으로, 우리가 첫 무승부를 할 때 마지막에는 eglSwapBuffer를 호출 할 때 운전자에게 우리가 우리의 프레임을 다 끝냈다는 것을 알리기 위해, 실제로 프레임을 생성합니다

다시 버퍼 큐에 넣으십시오 Vulcan, MediaPlayer, 및 MediaCodec 그리고 우리는 플랫폼 전반에 걸쳐 훨씬 더 많은 것을 가지고 있습니다 자, 실제 작곡 그래서 우리는 여러 창을 만들었습니다

각각 자신의 레이어가 있습니다 SurfaceFlinger는 모든 레이어에 대해 알고 있으며, 그리고 SurfaceFlinger는 실제로 디스플레이와 대화하기 위해 하드웨어 작곡가 (Hardware Composer)라고 불리는 것에 대해 이야기합니다 하드웨어 합성기는 하드웨어 추상화 레이어입니다 우리가 GPU 사용을 피하기 위해 사용하기 때문에 화면에 모든 창을 합성해야합니다 이유 중 하나는 배터리를 절약하는 것입니다

그렇게 효율적으로 전력을 소비합니다 하지만 응용 프로그램에 액세스 권한이 있는지 확인해야합니다 기본적으로 GPU의 모든 기능에 적용됩니다 우리는 당신을 멀리하지 않습니다 그리고 과거에는 들었을 수도 있습니다

창 수를 제한해야한다고 당신이 화면에 넣어 그리고 당신은 왜 몇 슬라이드에서 볼 수 있습니다 그래서 우리는 하드웨어 작곡가가 있습니다 효과적으로 하드웨어 블록입니다 멀티플 비트 맵을 사용하면 정말 빠릅니다

화면에서 함께 구성 할 수 있습니다 그리고 우리는 방금 이것에 대해 이야기했습니다 그래서 실제로 작동하는 방법 – 하드웨어 작곡가 정말 일종의 프로토콜입니다 여기에서는 이전 Hardware Composer에 대해 설명하겠습니다 하드웨어 작곡가 1 또는 하드웨어 작곡가 0이라고합니다

나는 항상 혼란 스럽다 우리는 Hardware Composer 2라는 것을 사용합니다 하지만 훨씬 더 복잡해 그래서 나는 그렇지 않다 여기에서 설명 할 것입니다 그러나 그것의 요지는 기본적으로 같은 방식으로 작동합니다

그래서 SurfaceFlinger는 많은 레이어를 가지고 있습니다 하드웨어 작곡가에서 준비를 할 것입니다 그리고 더 오래된 레이어를 Hardware Composer로 보냅니다 모든 계층에서 무엇을하고 싶은지 알려달라고 요청하십시오 모든 하드웨어 합성기는 독점적 인 조각입니다 사용중인 휴대 전화 또는 태블릿의 하드웨어 정보 우리가 쓸 수있는 방법이 없습니다

모든 다른 하드웨어 작곡가를위한 드라이버 저 밖에 그래서 대신, 하드웨어 작곡가의 그가하고 싶은 것을 우리에게 말해 줄 것입니다 따라서이 경우에는 레이어가 있습니다 하드웨어 작성자가 오버레이로 답장합니다 즉, 하드웨어 작성자가 픽셀 형식을 이해하고 있음을 의미합니다

그 창에 대해 그것을 처리 할 수 ​​있다고 알려줍니다 그리고 그 창문을 위해 작곡을 할 것입니다 그래서 우리는 계속 간다 두 번째 레이어에 오버레이가 표시됩니다 세 번째 레이어를 오버레이한다고 말하고 있습니다

그래서 훌륭합니다 즉, 모든 구성을 자동으로 수행 할 수 있습니다 우리를 대신하여 매우 효율적인 방법으로 이제 우리 지도자들은 모두 오버레이와 일치합니다 우리는 세트라고 부른다 이번에는 모든 레이어를 하드웨어 작곡가에게 보냅니다

실제 작곡을 위해, 그리고 하드웨어 작곡가 모든 것을 화면에 보냅니다 이제는 더 복잡한 예입니다 그래서 우리는 많은 수의 레이어를 가지고 있습니다 우리는 준비라고 부릅니다 처음에는 모든 것이 잘됩니다

하드웨어 작곡가는 오버레이라고 말합니다 그것은 그것을 처리 할 수 ​​있습니다 그러나 어떤 이유로, 다음 하나를 위해, 그것은 말한다, 프레임 버퍼 이렇게하면 픽셀 형식을 사용하는 경우에 발생할 수 있습니다 지원되는 것일 수도 있습니다

회전을 사용하여, 그리고 하드웨어 작곡가 알지 못한다 회전을 처리하는 방법 또는 화면에 너무 많은 레이어 또는 여러 가지 이유 그 하드웨어 작곡가에 특유한 것입니다 CHASE HAASE : 이것은 기기에서 훨씬 더 보편적이었습니다 아마 3 년에서 4 년 또는 그보다 더 오래 전에 그래, 맞아

우리는 약 4 개의 하드웨어 레이어를 사용했습니다 네가 사용할 수있는 네 명이야 5 점입니다 네 명이야 그래서 우리는 4 개를 가지고 있었고, Pixel 2에는, 너무 많은 세부 사항으로 들어가기없이, 당신은 기본적으로 7을 가지고 있습니다

그래서 예전보다 훨씬 나아졌습니다 그러나 Pixel 2 XL을 사용하는 경우 두 개의 레이어를 사용합니다 둥근 모서리를 그립니다 그래서 당신은 실제로 7이 없습니다 너는 5 명이있다

실제로 병합 될 수 있기 때문에 실제로 6 개입니다 하드웨어 작곡가 어쨌든, 많은 세부 사항은 정말 복잡 할 수 있습니다 모든 세부 사항을 알 필요는 없습니다 어쨌든이 경우 우리는 하나의 레이어를 가지고 있습니다

하드웨어 작곡가로 바로 갈 수 있습니다 프레임 버퍼로 표시된 두 개의 레이어가 있습니다 그리고 그것이 우리를 위해 어려운 부분이 시작되는 곳입니다 하드웨어에서 처리하지 않는 레이어가있을 때 작곡가, 우리는 그들을 합성하기 위해 GPU를 사용해야합니다 그래서 SurfaceFlinger는 모든 것을 할 수 있어야합니다

하드웨어가 할 수있는 것 그리고 그 상황에서, 우리는 기본적으로, 스크래치 버퍼 – 다른 레이어 – 우리가 알고있는 형식으로 하드웨어 작곡가 수락 할 수 있습니다 그런 다음 사용자 정의 OpenGL 코드를 사용합니다 그 두 계층의 구성을 스스로 할 수 있습니다 그럼, 일단 우리가 그 부분을 다 끝내면, 우리는 두 개의 레이어 만 남았고 우리는 그것들이 Hardware Composer로 보내질 수 있다는 것을 알아라

그래서 그것이 우리가하는 일입니다 우리는 set을 호출 한 다음 화면에 표시합니다 CHET HAASE : 그럼 언젠가 호기심이 생기면, 이 명령은 adb shell dumpsys SurfaceFlinger 명령을 실행할 수 있습니다 ROMAIN GUY : 자본금 S, 자본금 F CHET HAASE : 매우 중요합니다

그리고 그것은 당신이 원하는 것보다 더 많은 정보를 얻게 될 것입니다 그러나 그것이 당신에게 보여줄 것 중 하나 화면의 창에 대한 테이블입니다 현재 그들이 대표되고 있는지 여부 오버레이 또는 프레임 버퍼로 ROMAIN GUY :이 명령을 꽤 실행해야하지만 내부적으로 수많은 최적화가 있기 때문에 신속하게 처리 할 수 ​​있습니다 따라서 레이어가 잠시 동안 화면에 있었다

우리는 그들이 변화하지 않는다는 것을 알고 있습니다 그들의 하드웨어 작곡가가 그들을 붕괴시키고 있을지 모른다 다시 바뀔 때까지 단일 레이어로 그래서 그 명령의 출력은 때로는 조금 있습니다 오해의 소지가 있습니다 결과를 볼 수도 있기 때문입니다

시간에 기반한 최적화 따라서 가장 좋은 방법은 일반적으로이 작업을 실행하는 것입니다 애니메이션이나 무언가를 운영 할 때 화면에서 변경 중입니다 그것은 당신에게 가장 가치있는 정보가 될 것입니다 그래서 우리가 이야기하지 않은 몇 가지 다른 것들

텍스트를 무효화하는 변형을 사용하라고 알려 왔습니다 직사각형 뷰의 일부만 무효화 할 수 있습니다 당신이 다시 칠해야 할 필요가 있음을 알았습니다 이는 구형 Android 기기에서 특히 중요했습니다

대역폭이 극도로 제한 되었기 때문입니다 우리는 소프트웨어 렌더링을 사용하고있었습니다 그리고 우리를위한 GPU 렌더링의 초창기에도, 우리는 꽤 쉽게 GPU를 맥 아웃했다 그래서 그것들은 정말로 중요한 저축이었습니다 더 이상이 작업을 수행 할 필요가 없습니다

심지어 최신 버전의 Android에서도 이 기능이 사용 중지되기 전에 실제로는 시스템에서 무시됩니다 이제 어떻게 될까요? 무효화하거나 무효화 할 때마다 뷰에 직사각형이있는 경우 렌더링 스레드의 전체보기를 재검토하려고합니다 그 유일한 손상된 지역을 재 계산하십시오 그것에 대해 걱정할 필요가 없습니다 그리고 우리가 제거하고있는 이유 중 하나 저축을 위해 더 이상 필요하지 않을뿐만 아니라, 하지만 오류가 발생하기 쉽기 때문입니다

한 번에 하나씩 오류나 반올림하는 것이 쉽습니다 오류 및 화면에 아티팩트를 가져올 수 있습니다 그리고 쳇과 나는 그걸 증명할 수있어 우리가 너무 많은 버그를 링크 시켰기 때문에 API 사용 그리고 프레임 워크 자체에는 여전히 버그가 있습니다 그 주위에

이제는 걱정할 필요가 없습니다 RecyclerView는 이제 프리 페치를 수행 할 수 있습니다 항목의 미리 CHASE HAASE : 예, 우리는 이것을 일찍 언급했습니다 이것은 우리가 지금 나가고있는 승리 중 하나입니다

때문에 별도의 렌더링 스레드를 가지고, 지금, 음, 유휴 시간이 있어요 UI 스레드는 동기화 된 후에 작업이 완료되었습니다 음, 유휴 시간을 생산적으로 사용할 수 있습니다 물건을 가져 오는 것과 같은 다른 일을 할 때 그것은 다음 몇 프레임에서 필요할지도 모른다는 것을 알고 있습니다 로망 가이 : 작곡을 위해서, 내부적으로, 우리는 실제 디스플레이의 개념을 가지고 있습니다

이것은 사용할 수있는 API입니다 예를 들어, 그게 우리가 스크린 샷을 찍을 때 사용하는 것입니다 또는 비디오를 녹음 할 때 또는 우리가 캐스팅 할 때 – 예를 들어 Chromecasting 우리가 효과적으로하는 것은 SurfaceFlinger에게 컴포지션을 수행하지만 직접 표시하지는 않습니다 다른 표면으로

그래서 이것은 표면을 만드는 또 다른 방법입니다 관심이 있으시면 훌륭한 샘플 애플리케이션이 있습니다 GitHub에서 K를 사용할 수있는 Graphika가 있습니다 그것은 그래픽 회원이 썼다 몇 년 전에 팀에

그것은 기본적으로 모든 것을 모아 놓은 것입니다 당신은 SurfaceFlinger, Surface, 미디어 인코더가있는 SurfaceView와 가상 디스플레이가 결합되어 있습니다 이 코드는 매우 흥미로운 코드입니다 색상 변환 Android O에서는 색상 관리, 이것이 우리가 적용 할 수있는 색 변환 중 하나입니다

야간 조명과 같은 것들도 색상 변환입니다 우리는 또한 색맹 시뮬레이션을합니다 그것들은 하드웨어에 의해 처리 될 수 있습니다 특정 상황에서 작곡가, 그리고 그들은 성능 문제의 원인이 될 수 있습니다 예를 들어 잠시 후, 야간 조명 N5X 또는 N6B에서 지원되지 않았습니다

이유 중 하나는 하드웨어였습니다 우리는 색 변환을 할 수있는 드라이버가 없었습니다 그래서 우리는 GPU 구성으로 돌아 가야했습니다 정말 비쌌습니다 배터리를 아프게 했으므로 장치에 기능이 있습니다

그리고 Chet가 말했듯이, 더 많은 세부 사항들이 많이 있습니다 렌더링 파이프 라인에 대해 이것은 단지 매우 높은 수준의 개요였습니다 우리는 과거에 많은 회담을 가졌습니다 더 자세히 설명하는 우리는 예를 들어, UI 렌더링 자체에서, 일괄 처리 및 병합을 어떻게 처리할까요? 그런 종류의 최적화 그래서 당신이 관심이 있다면, 당신은 그들을 참조 할 수 있습니다

그림자 계산은 흥미 롭습니다 나는 우리가 우리가 이야기 한 이야기가 있었다고 생각한다 그 세부 사항의 그러나 렌더링 파이프 라인에 정확히 어디에서 적합합니까? 일종의 영리합니다 그러나 그렇다

더 많이 거기에서 계속하고있다 그러나 잘만되면, 이것은 Android에서 어떻게 작동하는지 일반적인 감각을 제공합니다 ROMAIN GUY : 그걸로 끝났습니다 우리가 거기 멈출거야 고맙습니다

[박수 갈채] [음악 재생]

Android Meets TensorFlow: How to Accelerate Your App with AI (Google I/O ’17)

[음악 재생] KAZ SATO : 고맙습니다 우리 세션에 참석해 주셔서 감사합니다

"Android Meets TensorFlow " 저는 사토 카즈입니다 저는 Google Cloud Platform 팀의 개발자 대행사입니다 과– HAK MATSUDA : 안녕하세요 좋은 아침

아주 이른 아침에와 주셔서 감사합니다 나는 아침에 사람이 아니기 때문에 나는 조금 졸려있다 어쨌든, 제 이름은 마츠다 하쿠로입니다 나는 안드로이드 게임 개발자 옹호자이다 및 고유 기술

KAZ SATO : 그래서 오늘,이 세션에서, 우리는이 주제들에 대해 토론하고 싶습니다 그래서 이번 세션의 첫 번째 부분은, 나는 AI, 기계 학습, 신경 네트워크, 깊은 학습, Google이 이러한 종류의 기술을 어떻게 사용하고 있는지 우리의 서비스를 구현합니다 그리고 TensorFlow는 무엇입니까? 그것은 건물을위한 오픈 소스 라이브러리입니다 너 자신의 신경망 그리고 나는 Hak에 그 무대를 전달할 것이다

그는 당신이 안드로이드를 어떻게 구축 할 수 있는지 논의 할 것입니다 TensorFlow에서 제공하는 애플리케이션 최적화 방법 마지막으로 미리보기를하고 싶습니다 TensorFlow Lite 및 Android와 같은 새로운 기술 신경 네트워크 API 그렇다면 기계 학습과 신경망은 무엇입니까? 얼마나 많은 사람들이 실제로 신경 네트워크를 시도 했습니까? 몇 명? 오, 너무 많은 사람들! 20 %처럼? 실제로 얼마나 많은 사람들이 신경망을 실제로 사용 했습니까? 모바일 장치에서? 매우 감사합니다 나는 10 명의 사람들을 발견했다

오늘은 TensorFlow를 사용하는 방법을 배우고 싶습니다 기계 학습 모듈 실행 내부 모바일 애플리케이션 너무 많은 유행어가있었습니다 인공 지능, 기계 학습, 신경 네트워크, 또는 깊은 학습 우리는 그 유행어에 대해 들었습니다

지난 몇 년간 차이점이 뭐야? 인공 지능이나 인공 지능 – 당신은 건물과 같은 똑똑한 것을 만들기위한 과학입니다 자율 주행 차 또는 아름다운 그림을 그리거나 음악을 작곡하는 컴퓨터 AI의 비전을 실현하는 한 가지 방법 기계 학습에 있습니다 기계 학습은 당신은 컴퓨터가 스스로 훈련하는 것을 허용 할 수 있습니다 모든 단계를 지시하는 인간 프로그래머, 자체적으로 데이터를 처리합니다

그리고 기계 학습에서 많은 다른 알고리즘 중 하나 신경 네트워크입니다 그리고 2012 년 이래로 우리는 큰 돌파구를 보았습니다 신경 네트워크의 세계에서, 특히 이미지 인식, 음성 인식, 또는 자연어 처리 및 기타 여러 응용 프로그램에 사용할 수 있습니다 그리고 Google에서 우리는 몇 년 동안 신경 네트워크 기술을 개발했다 그렇다면 신경 네트워크 란 무엇입니까? 수학의 함수처럼 생각할 수 있습니다

또는 프로그래밍 언어의 함수 따라서 모든 종류의 데이터를 입력으로 넣을 수 있습니다 일부 행렬 연산 또는 계산 수행 신경 네트워크 내부 그런 다음, 결과적으로 출력 벡터를 얻을 수 있습니다 많은 레이블이나 추측 값을 가지고있다

예를 들어 이미지가 많은 경우, 당신은 분류하기 위해 신경 네트워크를 훈련시킬 수 있습니다 어느 것이 고양이의 이미지인지 또는 개 이미지인지 그리고 이것은 사용의 한 예일뿐입니다 신경 네트워크의 경우 기술을 적용하여 모든 종류의 비즈니스를 해결할 수 있습니다

문제가 있습니다 예를 들어, 게임 서버가 많은 경우, 다음 모든 사용자 활동을 변환 할 수 있습니다, 플레이어 활동, 숫자의 무리로 그들을 변환, 벡터와 같은 신경망을 학습하고 신경 네트워크를 훈련 시키십시오 게임 서버의 플레이어 유형을 분류합니다 예를 들어, 어떤 치욕적 인 플레이어를 찾고 싶다면 자동화 된 스크립트를 사용하여 귀하의 서버에서 속이려고하거나 프리미엄 플레이어를 찾기 위해 신경망을 사용할 수 있습니다 게임 서버에서 점점 더 많은 아이템을 구입할 수 있습니다

그래서 이것은 하나의 가능한 예일뿐입니다 가능한 수천 가지 응용 프로그램 중 Google은 심층 학습 기술을 사용해 왔습니다 100 개가 넘는 스마트 기능 구현을위한 Google 검색, Android, Play, 및 많은 다른 응용 프로그램 예를 들어 Google 검색을 매일 사용하는 경우, 즉, 깊은 학습 기술에 액세스하고 있음을 의미합니다 매일 Google에서 제공합니다

2015 년에 RankBrain을 도입 했으므로, 이는 깊은 학습 기반 랭킹 알고리즘 인 정의 및 순위 지정을위한 신호를 생성합니다 검색 결과 모바일 애플리케이션을 살펴 본다면 Google의 예를 들어 Google 포토는 하나입니다 가장 성공적인 모바일 애플리케이션의 분석과 이해를 위해 깊은 학습을 해왔다 스마트 폰이 찍은 각 이미지의 내용, 그래서 직접 태그 나 키워드를 넣을 필요가 없습니다 대신, 당신은 단지 강아지, 당신의 친구의 이름, 또는 결혼식 파티 가이 콘텐츠를 기반으로 이미지를 찾을 수 있습니다

스마트 회신은 회신 옵션을 표시하는 기능입니다 각 이메일 스레드로 그래서 자연 언어 처리를 사용합니다 신경망 모델에 의해 구동 됨 전자 메일 교환의 컨텍스트를 이해하려고 시도합니다 그리고 지금, 응답의 12 % 이상 스마트 회신 기능으로 생성됩니다

이제 컴퓨터로 이메일을 작성했다고 말할 수 있습니다 더 이상 인간이 아닙니다 Google 번역 앱이 최근에 소개되었습니다 새로운 신경 번역 모델 인 품질, 특히 유창함이 향상되었습니다 번역 된 텍스트의 따라서 가능한 많은 유스 케이스가 있습니다

기계 학습 간의 결합 모바일 애플리케이션, 시작 이미지 인식, OCR, 음성 텍스트 텍스트 음성 변환, 번역 및 NLP가 포함됩니다 특히 기계 학습을 적용 할 수 있습니다 모션 감지 또는 GPS와 같은 모바일 전용 애플리케이션 위치 추적 그리고 왜 당신은 당신의 기계를 운영하고 싶습니까? 학습 모델, 신경 네트워크 모바일 애플리케이션 내부의 모델? 기계 학습을 사용함으로써, 상당한 양의 트래픽을 줄일 수 있습니다 그리고 당신은 훨씬 더 빠른 응답을 얻을 수 있습니다

귀하의 클라우드 서비스에서 원시 데이터에서 의미를 추출 할 수 있기 때문입니다 그게 무슨 뜻이야? 예를 들어, 기계 학습을 사용하는 경우 이미지 인식, 가장 쉬운 방법 이를 구현하기 위해서는 모든 원시 이미지 데이터를 보내야합니다 카메라에 의해 서버로 전송됩니다 대신에 기계 학습 모델을 실행하게 할 수 있습니다

귀하의 모바일 응용 프로그램 내부에서 귀하의 모바일 응용 프로그램 각 이미지에 어떤 종류의 물체가 있는지를 인식 할 수 있고, 그래서 당신은 단지 꽃과 같은 라벨을 보낼 수 있습니다 또는 사람의 얼굴을 서버에 보냅니다 트래픽을 1/10 또는 1/100로 줄일 ​​수 있습니다 상당한 양의 트래픽 절감 효과가 있습니다 다른 예는 모션 디텍션 일 수 있습니다

여기서 모든 움직임, 감각 데이터를 수집합니다 – 원본 이미지를 서버로 직접 보내지 않고, 기계 학습 알고리즘을 사용하여 추출 할 수 있습니다 소위 특징 벡터 기능 벡터는 숫자의 무리 일뿐입니다 특성을 나타내는 100 개 또는 1,000 개의 숫자 또는 모션 센서로부터의 모션의 서명 따라서 100 또는 1,000 개의 숫자 만 보낼 수 있습니다

특징 벡터에서 서버로 그리고 빌드의 출발점은 무엇입니까? 기계 학습으로 구동되는 모바일 애플리케이션? 출발점은 TensorFlow, 머신의 오픈 소스 라이브러리 Google의 정보 TensorFlow는 최신 프레임 워크입니다 기계 학습 또는 인공 지능 기반 서비스 개발을위한 개발 Google에 2015 년 11 월에 오픈했습니다 이제 TensorFlow가 가장 인기있는 프레임 워크입니다

신경 네트워크 또는 세계에서 깊은 학습을 구축합니다 TensorFlow로 얻을 수있는 한 가지 이점 개발의 용이성이다 시작하기가 정말 쉽습니다 몇 줄의 파이썬 코드를 작성할 수 있습니다 또는 수십 줄의 파이썬 코드를 사용하여 신경망을 정의하십시오

혼자서 실제로이 기술은 사람들에게 매우 가치가 있습니다 나는 정교한 수학적 지식이 없기 때문에 나를 좋아한다 배경 그래서 신경망에 관한 교과서를 읽기 시작했을 때, 나는 교과서에 많은 수학 방정식을 발견했다

차별 증식, 역 전파, 및 그라디언트 디센트 그리고 저는 모든 것을 혼자서 구현하고 싶지 않았습니다 대신, 이제 TensorFlow를 다운로드 할 수 있습니다 여기서 한 줄의 파이썬 코드를 작성할 수 있습니다 GradientDescentOptimizer와 같습니다

그 한 줄의 코드는 캡슐화 할 수 있습니다 그래디언트 디센트, 역 전파, 또는 구현 된 기타 최신 알고리즘 Google 엔지니어가 그래서 너는 너 자신을 가질 필요가 없다 신경망을 구현하도록 설정된 기술 기술을 처음부터 또한 TensorFlow의 이점 이식성과 확장 성입니다 예를 들어, 기술로 시작한 TensorFlow를 다운로드 할 수 있습니다

Mac 또는 Windows에서만 사용할 수 있습니다 아주 간단한 샘플의 Hello World 종류로 재생할 수 있습니다 그러나 기술에 대해 진지하게 생각하고 있다면 예를 들어 모델을 처음부터 렌더링하려는 경우 고양이의 이미지를 인식하려면 다음을 사용하십시오 GPU 서버 – GPU는 10 배 또는 50 배이기 때문에 CPU 또는 Mac 또는 Windows보다 빠름 – 모델 훈련 하지만 Google 어스와 같은 많은 대기업 또는 다른 모든 기업에서 클라우드에서 수십 또는 수백 개의 GPU 실행 컴퓨팅 파워가 가장 크기 때문에 깊은 학습 기술에 대한 도전

하지만 여전히 큰 변화는 필요 없습니다 귀하의 TensorFlow 신경망에, TensorFlow는 확장 가능하도록 설계 되었기 때문에 따라서 일단 신경 네트워크를 정의하면, 너는 그것을 배우고, 훈련하고, 사용할 수있다 단일 CPU 또는 다중 GPU에서, 또는 수백 개의 GPU 또는 TPU 또는 Tensor 처리 장치, Google에서 설계 한 ASIC 또는 맞춤형 ADSI입니다 그리고 일단 모델 교육을 마치면, 당신은 모델을 복사 할 수 있습니다 예를 들어, 이미지 인식을 위해, 단일 모델은 100 메가 바이트 데이터, 매개 변수

이러한 매개 변수를 모바일 장치에 복사 할 수 있습니다 Android, iOS 또는 Raspberry Pi와 같은 그리고 TensorFloworg 웹 사이트에 가면, 당신은 임베디드 시스템을위한 샘플 코드를 찾을 수있다 및 휴대 전화 그런 다음 TensorFlow에서 얻을 수있는 이점 지역 사회와 생태계입니다

따라서 실용적인 제작 품질을 원한다면 솔루션을 제공한다면 TensorFlow는 그 최선의 대답 너무 많은 대기업과 개발자가 있기 때문에 심각한 개발을 위해 TensorFlow를 사용하는 사람들, ARM, 이베이, 인텔, 드롭 박스, 트위터 등이있다 그들은 모두 TensorFlow를 사용하고 있습니다 이제는 무대를 Hak에 전달하고 싶습니다 누가 당신이 안드로이드를 어떻게 구현할 수 있는지 이야기 할 것입니다

TensorFlow에서 제공하는 애플리케이션 [박수 갈채] 오 감사합니다 Hak MATSUDA : 고마워요, Kazu Android 부분으로 넘어 갑시다 Kazu가 말했듯이, 우리는 많은 것을 발견했습니다

TensorFlow를 실행하는 유용한 사용 사례 모바일 장치에 대한 추론 우리가 어떻게 통합 할 수 있는지 살펴 보겠습니다 모바일 장치의 TensorFlow 추론 우리가 어떻게 그것을 최적화 할 수 있는지에 대해 설명합니다 TensorFlow는 다음을 포함한 여러 모바일 플랫폼을 지원합니다 Android, iOS 및 Raspberry Pi와 호환됩니다

이 강의에서는 Android와 같은 휴대 기기에 중점을두고 및 IOS TensorFlow 공유 객체를 처음부터 빌드하기 조금 까다 롭습니다 여러 단계를 거치기 시작했습니다 GitHub의 [INAUDIBLE], Bazel 설치, 설치 안드로이드 스튜디오, 안드로이드 SDK 및 NDK, 마지막으로 설정 파일을 편집하는 등의 작업을 수행 할 수 있습니다 그러나 우리에게는 오늘 좋은 소식이 있습니다

이 IO를 발표하면서 방금 JSON 통합을 추가했습니다 그 단계가 훨씬 쉬워집니다 [박수 갈채] 고마워요, 고마워요 빌드 줄에 하나의 선을 추가하기 만하면됩니다 Gradle은 나머지 단계를 처리합니다

도서관 자료실에서 [INAUDIBLE] TensorFlow 공유 객체가 JCenter에서 다운로드되면, 응용 프로그램과 자동으로 연결됩니다 또한 미리 작성된 모델을 가져올 수 있습니다 파일 (예 : 시작, 스타일 화, 등등, 구름 에서뿐만 아니라 iOS에서도 쉽게 사용할 수 있습니다 우리는 Cocoapod 통합을 시작했습니다

지금은 아주 간단합니다 TensorFlow API를 사용하는 방법을 살펴 보겠습니다 Android 유추 라이브러리를 출시했습니다 Java 응용 프로그램 용 TensorFlow를 통합합니다 라이브러리는 Java의 [INAUDIBLE]입니다

네이티브 구현에 성능에 미치는 영향은 최소화됩니다 처음에는 TensorFlow 유추 인터페이스를 만들고, APK의 자산에서 모델 파일을 엽니 다 그런 다음 피드 API를 사용하여 입력 피드를 설정하십시오 모바일에서는 입력 피드가 카메라, 가속도계, 등등

그런 다음 추론을 실행하십시오 마지막으로 결과를 가져올 수 있습니다 거기에 fetch 메소드를 사용합니다 이 통화가 모두 통화를 차단하고 있음을 알 수 있습니다 따라서 작업자 스레드에서 실행하는 대신 작업 스레드에서 실행하려고합니다

API는 길고 오랜 시간이 걸릴 것이기 때문에 메인 스레드, 몇 초 이것은 Java API입니다 물론 일반 C ++ API도 사용할 수 있습니다 당신이 C ++을 사랑한다면 내가하는 것처럼 승인

데모로 넘어 갑시다 이것은 Android에서 실행되는 TensorFlow 샘플입니다 샘플에는 세 가지 모드가 있습니다 첫 번째는 Inception v3을 실행 중입니다 카메라 이미지를 분류합니다

또한 분류 된 얼굴과 양식화 된 사진이 있습니다 견본 이 사진은 카메라 미리보기에 예술적 필터를 적용하고 있습니다 [박수 갈채] 고맙습니다 그리고 데모에서 한 가지 특별한 점 GPU를 사용하여 데모를 약간 수정 한 것입니다

[INAUDIBLE] 계산 쉐이더를 사용하십시오 [INAUDIBLE] 샘플은 CPU를 지원합니다 새로운 최적화 하지만 GPU를 사용하여 그것을 조정했습니다 그리고 이것은 단지 실험을 위해서 였고 재미를 위해서였습니다

그것은 꽤 재미 있었다 그리고 저는 TensorFlow를 GPU에 맞게 최적화하는 방법을 많이 배웠습니다 기본적으로 Android 기기에서 성능 제한 요소 대부분 메모리 대역폭에서 발생합니다 컴퓨팅 자체가 아니라 메모리 대역폭 줄이기 많은 도움이되었습니다 예를 들어, 어떤 [INAUDIBLE] 커널에서, 그것은 32 32 x 32 32 x 4 샘플을 가져 오는 중입니다

하나의 출력 값을 생성하기 만하면됩니다 Compute의 관점에서 엄청난 양의 데이터입니다 셰이더 따라서 메모리 대역폭은 안드로이드에있어 결정적으로 중요합니다 및 모바일 장치 최적화

어쨌든, 모두 TensorFlow 코드를 조정할 수 있습니다 오픈 소스이기 때문입니다 오픈 소스의 아름다움입니다 맞죠? 이제 모바일에 TensorFlow 추론을 통합 할 수 있습니다 내가 아주 쉽게 설명했다

그러나 성능에는 아직 문제가 있습니다 심지어 모바일 장치 성능 상당히 증가했다 클라우드 나 데스크톱보다 컴퓨팅 성능이 떨어집니다 또한 제한된 RAM을 가지고 있습니다 모바일에 소중한 자료

응용 프로그램이 1 기가 바이트의 RAM을 사용한다면, 그때 응용 프로그램은 매우 가능성이 높습니다 시스템 자체에 의해 죽임을 당한다 응용 프로그램이 백그라운드로 이동하면 행복한 상황이 아니지, 그렇지? TensorFlow를 최적화 할 수있는 방법에 대해 살펴 보겠습니다 그래픽, 메모리 사용 공간 감소, 런타임 성능 향상 및로드 시간 개선 잘 이 모델은 Inception v3 모델의 모델입니다 이 모델은 약 91 메가 바이트의 저장 공간을 필요로하며, 2,500 만 가지 매개 변수가 있습니다

그리고 바이너리 크기는 12 메가 바이트 걸릴 것입니다 그것은 거대합니다 그리고 우리는 그래프를 최적화하는 여러 기법을 가지고 있습니다 Graph Transform (그래프 변환)을 사용하여 그래프 고정 도구, 양자화, 메모리 매핑 등 가자

그래프 정지는로드 중 하나입니다 시간 최적화, 변수 노드를 변환 상수 노드에 변수 노드 란 무엇입니까? TensorFlow에서 변수 노드는 다른 파일에서 시작됩니다 그러나 상수 노드가 포함되어 있습니다 그래프 def 자체에서

따라서 변수를 상수 노드로 이동하십시오 여러 개의 파일을 하나의 파일로 연결할 수 있으며, [INAUDIBLE]처럼 그것은 약간의 성능이 될 것입니다 모바일에서 이기고 다루기가 더 쉽다 그렇게하기 위해 우리는 동결 그래프 점 파이썬 스크립트를 준비합니다

그래프 변환 도구는 친구입니다 이 도구는 다양한 최적화 작업을 지원하며, 추측을 위해 사용되지 않는 노드를 스트립하는 것과 같은 하지만 그것은 학습 문구에서만 사용됩니다 추론 노드를 배울 때 필요하지 않습니다 나는 그것이 현재 약간의 작은 단계가 필요할 것이라고 생각한다

어떤 노드가 시작 노드인지 판단한다 어느 노드가 출력 노드인지를 결정한다 따라서이 도구는 시작과 출력이 모두 필요합니다 포인트는 수동으로 지정됩니다 양자화에 대해 이야기 해 봅시다

신경망 작업에는 무리가 필요합니다 매트릭스 특성의, 곱하기의 톤을 의미 추가 작업 현재 모바일 장치는 일부 기능을 수행 할 수 있습니다 전문 하드웨어 예를 들어, [INAUDIBLE] 명령 CPU, 범용 컴퓨팅 GPU, DSP 등에서

대략적으로 모바일 CPU에서는 총 10 ~ 20GB FLOPS GPU를 사용하면 300 ~ 500 기가 플롭스 이상을 달성 할 수 있습니다 큰 숫자처럼 들리지만 여전히 데스크톱 또는 서버 환경 기반 그래서 우리는 최적화를 수행하기를 원합니다 양자화는 기술 중 하나입니다 메모리 사용 공간과 컴퓨터 부하를 줄입니다 일반적으로 TensorFlow는 단 정밀도 부동 값을 사용합니다

입력 및 수학을 위해 또한뿐만 아니라 출력 아시다시피, 단 정밀도 부동 소수점 각각 32 비트 걸린다 그러나 우리는 정밀도를 16 비트, 8 비트로 줄일 수 있다는 것을 발견했습니다 비트 또는 심지어 더 적은 결과를 유지하면서, 우리의 학습 과정에는 자연에 의해 약간의 잡음 그리고 약간의 여분의 소음을 추가하는 것은별로 중요하지 않습니다

따라서 양자화 된 가중치가 최적화입니다 저장 공간의 크기를 줄이면 정밀도가 떨어집니다 그래프 파일의 상수 노드의 값 그러나 양자화 된 가중치 최적화와 함께, 값은 메모리에 확장됩니다 그래프가로드됩니다

그래서 우리에게는 또 다른 최적화가 있습니다 우리는 그것을 양자화 된 계산이라고 부를 수 있습니다 양자화 된 계산으로, 우리는 양자화 된 값을 사용하여 계산 정밀도를 줄일 수 있습니다 예배 규칙서 이것은 첫 번째 메모리 대역폭에 좋으며, 이는 모바일 장치의 제한 요소입니다

또한 하드웨어는 이러한 정밀도 값을 더 빨리 처리 할 수 ​​있습니다 단 정밀도 부동 값보다 그러나 우리는 여전히 열려있는 문제가 있습니다 양자화 된 계산을 수행하기 위해 최대 값과 최소값이 필요하다 양자화 된 값의 범위를 지정합니다 우리는 여전히 훌륭한 해결책이 없습니다

그것은 여전히 ​​수동입니다 그러나 활발한 연구가 진행되고 있으므로 희망적으로이 문제는 곧 해결 될 것입니다 이것은 양자화 된 특성화의 예입니다 최적화는 TensorFlow에서 작동합니다 TensorFlow에는 양자화를 지원하는 일부 연산이 있습니다 예를 들어, 행렬에 대한 컨볼 루션 [INAUDIBLE] 등을 곱하십시오

우리는 그것이 충분히 다루기에 충분하다고 생각합니다 대부분의 추론 시나리오 그러나 우리는 여전히 연산 순서를 양자화하지 않았습니다 아직 값을 양자화하고 값을 역 양자화해야하기 때문에 각 노드의 앞과 뒤 바로 출력 그리고 그래프 변환 도구는 부품을 분석합니다

각 그래프 노드의 때로는 불필요한 양자화 및 역 양자화 된 값 메모리 매핑은 로딩 시간에 대한 또 다른 최적화입니다 이 최적화를 통해 모델 파일 변환되어 직접 매핑 될 수 있습니다 약간있을 수있는 memmap API 사용 일부 Linux 기반 운영에서 성능 최적화 Android와 같은 시스템입니다 또 하나는 실행 파일 크기를 줄이는 것입니다

모바일에서 중요한 주제입니다 모바일 장치에서, 실행 가능한 패키지 크기는 특정 크기로 제한됩니다 Android의 경우 100 메가 바이트, 이진, 그래픽 및 기타 리소스를 포함하여 기본적으로 휴대 장치는 선택한 여러 개의 거의 충분하다 추론 작업을 커버하지만, ops는 학습 프로세스를 사용 누락 따라서 모바일 장치에서 학습을하고 싶다면, 추가 작업을 등록해야합니다

또한 그래프에 일부 사전 등록 된 작업, 또한 그 중 일부를 제거합니다 그렇게하기 위해 선택 등록을 할 수 있습니다 예를 들어, Inception v3의 경우, 선택 등록을함으로써, 원래의 바이너리 크기는 12 메가 바이트였습니다 최적화 후에는 15 메가 바이트로 줄일 수 있습니다

이 최적화를 위해서는 공유를 다시 빌드해야합니다 당신 지역의 물건 따라서 빌드 환경을 구축해야합니다 따라서 이러한 최적화를 통해 Inception v3 그래프 이제 23 메가 바이트와 15 메가 바이트가됩니다

현재 바이너리 크기는 75 % 작아집니다 카즈 돌아 가자 KAZ SATO : Hak 고맙습니다 하크 (Hak)가 언급했듯이, 너무 많습니다

[박수 갈채] 고맙습니다 Hak이 언급했듯이, 많은 팁과 트릭이 있습니다 TensorFlow 모델 최적화 안드로이드 모바일 응용 프로그램으로 짜내다 그리고 바로 지금 할 수있는 일입니다 이러한 기술은 현재 사용 가능합니다

하지만 지금은 조금 이야기하고 싶습니다 가까운 미래에 출시 될 새로운 기술에 대해, TensorFlow Lite 및 Android Neural Network API 등이 있습니다 NNAPI 란 무엇입니까? 신경망 처리를위한 새로운 API입니다 안드로이드 안쪽에, 그리고 안드로이드 프레임 워크에 추가됩니다 새로운 API 추가의 목적 캡슐화하고 추상화하는 것입니다

계층은 GPU, DSP, 및 ISP 최신 스마트 폰은 강력한 컴퓨팅 리소스를 갖추고 있습니다 GPU 또는 DSP와 같은 CPU 이외의 다른 장치 특히 DSP는 거대한 양의 행렬 및 벡터 계산, DSP 나 GPU를 사용하는 것이 훨씬 빠릅니다 신경 네트워크 추론,보다는 CPU를 사용하여

하지만 지금 당장 당신이 그렇게하고 싶다면, 도서관에 직접 가야합니다 하드웨어 공급 업체가 바이너리를 빌드합니다 혼자서 지루한 작업입니다 또한 휴대용이 아닙니다

대신 표준 API를 제공하여 개발자가 하드웨어 가속기를 인식 할 필요가 없다 각 개별 공급 업체로부터 Neural Network API 위에는, 우리는 TensorFlow Lite를 제공 ​​할 것입니다 그것은 새로운 TensorFlow 런타임이 될 것입니다 모바일 및 임베디드 애플리케이션에 최적화되어 있습니다

따라서 TensorFlow Lite는 스마트하고 컴팩트 한 모바일 용으로 설계되었습니다 또는 임베디드 응용 프로그램 또한 Android와 결합되도록 설계되었습니다 NNAPI 그래서 당신이해야 할 일은 TensorFlow Lite로 모델을 작성하면됩니다

결국 모든 이점을 얻게 될 것입니다 당신은 안드로이드 NNAPI에서 얻을 수 있습니다, 하드웨어 가속과 같은 가까운 장래에 오픈 소스로 등장하게 될 것입니다 그러니 계속 지켜봐주십시오 이러한 새로운 기술에 관심이 있다면, 이 QR 코드의 사진을 찍어주세요 Android 용 ML에 대한 설문 조사에 참여할 수 있습니다

의견이나 요청을 할 수있는 곳 새로운 제품을 위해 네, 고마워요 그래서 마지막으로, 아주 흥미롭고 재미있는 것을 보여주고 싶습니다 TensorFlow로 구축 된 실제 응용 프로그램 모바일 및 임베디드 시스템에서 첫 번째 응용 프로그램은 Raspberry Pi에서 실행 중이며 일본인 오이 농부에 의해 사실, 나는이 사진을 찍었다

나는 오이 농장에 가서이 사진을 찍었습니다 그리고 그들은, 당신은 볼 수 있습니다 – 오, 미안 포인터가 없습니다 [CHUCKLE] 그래서 당신은 한 사람을 중간에두고 있습니다 그는 [부적절하다]

그는 2 년 전에 오이 농업을 돕기 시작했습니다 그리고 그는 오이를 올바른 부류로 분류하는 것을 알았습니다 가장 지루한 작업입니다 그의 어머니는 하루 8 시간을 보냈다 길이, 또는 색깔에 기초하여 각 오이를 분류하고, 9 개의 다른 수업으로 그녀를 돕고 싶지 않았어

그래서 대신 그는 TensorFlow를 다운로드했습니다 그 자신의 오이 선별기를 만들었습니다 [박수 갈채] 그가 한 일은 9,000 장의 사진을 찍은 것입니다 다른 오이 중에서 그의 어머니에 의해 분류 된 레이블, TensorFlow 모델을 혼자서 교육했습니다 그리고 그는 $ 1,500을 지출함으로써 스스로로 분류기 로봇을 만들었습니다

그리고 TensorFlow 모델은 Raspberry Pi에서 실행됩니다 접시에 놓은 오이를 감지 할 수 있습니다 그리고 그것은 오이를 9 개의 다른 종류로 분류 할 수 있고, 모양과 색상을 기반으로합니다 그리고 이것은 시스템의 시스템 다이어그램입니다 그래서 세 부분으로 구성됩니다

Arduino Micro는 서버 제어에 사용됩니다 및 모델 그리고 라스베리 파이에는 오이의 사진을 찍을 카메라가 있습니다 접시에 그리고 아주 작은 TensorFlow 모델을 실행합니다

그리고 이것은 실제로 아주 훌륭한 예입니다 작업을 분할하는 방법, 작업 에지 장치 및 클라우드 파트로 기계 학습을위한로드 그는 TensorFlow 전체 세트를 실행했기 때문에 Raspberry Pi 내부의 모델이 너무 무겁습니다 그래서 그는 그것을 두 가지 과제로 나누기로 결정했습니다 따라서 TensorFlow 모델은 Raspberry Pi에서만 실행됩니다

접시에 오이가 있는지 여부를 감지합니다 그리고 접시에 오이가 있음을 감지했을 때만, 그것은 그림을 서버로 보냅니다 그는 더 강력한 TensorFlow를 가지고 있습니다 오이를 9 개로 분류 할 수있는 모델 다른 클래스 흥미로운 또 다른 응용 프로그램을 살펴 보겠습니다

Android 및 iOS에서 실행되는 체조 운동 득점자 그게 뭐야? 사실 모든 일본인은 운동을 잘 알고 있습니다 우리는 전국 라디오 방송을 가지고 있기 때문에 방송 네트워크 그들은 동시에 같은 운동 음악을 연주한다 매일 아침

그리고 수천만 명의 일본인 매일 아침 같은 운동을하고 있습니다 당신은 알고 계십니까? [웃음] 이 응용 프로그램은 – 우리는 그것을 득점자라고 부릅니다 당신은 음악으로 당신의 운동을 해왔습니다 그리고 모션 센서로 모션을 캡처하려면, 그들은 TensorFlow를 사용했습니다 그리고 그들은 TensorFlow 모델을 포착하도록 훈련시킬 수있었습니다

데이터에서 패턴 또는 피쳐 추출 모션 센서에서 인간의 손으로 만든 동작을 평가할 수 있습니다 또한 TensorFlow 컴파일러를 자체적으로 구축했습니다 그래서 그들은 기술을 적용 할 수있었습니다 양자화 또는 근사와 같은 그리고 그들은 TensorFlow를 줄일 수있었습니다

모델을 수십 메가 바이트에서 수 메가 바이트로 모델링합니다 따라서 이것이 생산 품질을 구축하는 핵심 기술이었습니다 TensorFlow 기능을 갖춘 Android 및 iOS 애플리케이션 운동 실황 시범을 보도록하겠습니다 득점자 그럼 내가 여기로 바꿀 수 있을까? 선택할 수있는 응용 프로그램입니다 다양한 종류의 운동

그리고 나는 가장 표준적인 것을 연주 할 것이다 [음악 재생] 그래서 이것은 음악입니다 [웃음] [일본 축구 연발 스코어] [박수 갈채] 나는 잘하고 있니? 그래서 그렇게 그러니 그만하자 [웃음꾼과 박수] [음악 스톱] 충분 해 충분 해 [웃음] 이제 TensorFlow 모델이 시도하고 있습니다 이 운동을 얼마나 잘 수행했는지 평가하십시오

그리고 당신은 막대 차트를 여기에서 볼 수 있습니다 그것이 TensorFlow의 변형입니다 이 애플리케이션 내부의 모델 그것은 진짜입니다 승인? 슬라이드로 돌아가십시오

그것이 우리가 보여주고 싶은 것입니다 이 세션에서는 다음을 포함한 많은 것을 배웠습니다 일본에서 또 다른 이상한 물건, 그런 다음 몇 가지 최적화 기술 TensorFlow 응용 프로그램 구축 용 양질의 안드로이드 및 iOS 애플리케이션을 제공합니다 관심이 있으시면 TensorFloworg로 이동하십시오

시작하기에 많은 자료를 얻을 수 있습니다 그리고 훌륭한 codelab이 있습니다 codelab 웹 사이트에서 정말 고맙습니다 Hak MATSUDA : 고마워

[박수 갈채]

Sound Amplifier and the new Dynamics Processing Effect (Google I/O ’18)

[음악 재생] BRIAN KEMLER : 안녕하세요, 여러분 내 이름은 Brian Kemler입니다

저는 제품 관리자이고 Android 접근성을 연구하고 있습니다 리카르도 가르시아 : 안녕하세요, 저는 리카르도 가르시아입니다 안드로이드의 오디오 프레임 워크 팀의 소프트웨어 엔지니어 BRIAN KEMLER : 모두가 I / O의 마지막 날 이었습니까? 마지막 세션, 우! 너는 그것을 통해 만들었다 나와 줘서 고마워

그것은 훌륭한 I / O였습니다 오늘 우리는 얘기 할 정말로 흥미로운 것들이 많이 있습니다 주로 개발자 용입니다 우리는 새로운 사운드 강화 된 미래에 대해 이야기 할 것입니다 안드로이드 P라는 ​​Sound Amplifier에 있습니다

우리는 약간의 라이브 데모를 할 것입니다 어떤 상황에서도 사운드를 개선 할 수있는 방법을 보여줍니다 사용자 및 개발자와 동일한 방식으로 수행 할 수있는 방법에 대해 설명합니다 우리는 내부 활동에 대해 깊이 잠수 할 것입니다 앰프 및 다이내믹 처리 효과 코드 예제를 바탕으로 구축되었습니다

그게 정말 멋지다 바로 들어가자 비어있는 분야에서도 듣기가 어렵다 엄청난 귀 세트 그러나 매일의 현실은 우리가 살고, 일하고, 환경 소음의 증가로 재생할 수 있습니다

사실 원치 않는 사운드는 가장 일반적인 것 중 하나입니다 환경 문제 그것은 짜증나게 할뿐만 아니라 우리를 방해합니다 우리의 친구, 동료 및 사랑하는 사람들을 이해하는 것에서 우리가 얼마나 잘들을지라도, 우리는 다음의 음향 적으로 도전적인 상황 – 시끄러운 식당에서 데이트 상대를 이해하려고 노력 중이다

또는 시끄러운 술집, 정말에서 발신자의 말을 듣고 시끄러운 공항 라운지, 듣고 싶다 내게 너무 부드럽게 말하는 사람에게 환경 소음을 생각할 수 있습니다 상황 장애의 형태로 하지만 당신이 더 잘 듣는다면 당신이 놓치지 않을 스마트 폰 대화에서 한 마디? 이제 우리는 Sound Amplifier를 소개하기 때문에 가능합니다

사운드 앰프 란 무엇입니까? 사운드 앰프는 새로운 접근성 서비스입니다 사용자가 실제 대화에 집중할 수 있도록 도와줍니다 Android 스마트 폰과 헤드폰 세트 만 사용자는 수백 가지 맞춤 레벨을 조정할 수 있습니다 청취 경험을 최적화하기 위해 현재 환경으로 소리의 크기와 동적 조정을위한 두 개의 슬라이더 백그라운드에서 100 개가 넘는 오디오 사전 설정을 조정할 수 있습니다 이 설정은 각 귀에 독립적으로 적용 할 수 있습니다 그들을 조정하면 음질이 향상됩니다

다음과 같은 일련의 상황에서 시끄러운 소리, 불협화음 소리 등의 소리를 강화 음향 적으로 어려운 상황, 너무 부드럽게 말하는 사람의 볼륨을 높이는 것, TV 볼륨을 방안에있는 모든 사람들이 받아 들일 수있는 다른 사람을 폭파하지 않고 이제 저는 어떻게 들어가야하는지 잠깐 이야기 할 것입니다 우리는 API와 API가 만들어지는 효과를 만들었습니다 나는 데모를 할거야 사운드 앰프는 Android P의 새로운 역학을 기반으로합니다

처리 효과 이 효과는 4 단계 신호 처리 아키텍처로, 당신을 각 단계로 안내 할거야 그리고 리카르도가 조금 올거야 이 문제에 대해 깊이 생각해보고 개발자에게 보여줍니다 잠재 고객이 정확히 어떻게 적응할 수 있는지 그들의 응용 프로그램에

그래서 우선, 1 단계 1 단계는 사전 균등화입니다 사전 균등화에 대해 생각할 수 있습니다 프로그래밍 방식으로 사용할 수있는 이퀄라이저로 오디오 주파수를 조정하십시오 중음역, 고음, 전체 오디오 스펙트럼을 생각해보십시오

2 단계는 멀티 밴드 압축기입니다 멀티 밴드 컴프레서는 마음과 영혼입니다 다이나믹 처리 효과에 대해 정말 독특합니다 그것은 정말 크게 또는 자극을 조정할 수 동시에 소리는 – 걱정하지 마라, 나는 아무것도 만들지 않을 것이다 – 너무 부드러운 소리를 조정하십시오 그것은 변화없이이 모든 것을 할 수 있습니다

기본 오디오의 특성 당신이 시스템에 넣었던 세 번째 단계는 [INAUDIBLE] 평등화입니다 포스트 이퀄라이제이션으로 미세 조정 가능 원래의 NBC와 원래의 프리 이퀄라이저의 출력 그리고 마지막으로 리미터입니다 리미터가하는 것은 사용자를 보호하는 것입니다 추가 이득 또는 추가 볼륨으로부터 특정 개발자 지정 임계 값 초과 그래서 큰소리로, 거칠게, 또는 불편한 소음

자 이제 전환하고 약간의 데모를 할 것입니다 그래서 저는 아주 전형적인 Google 마이크로 키트를 사용할 것입니다 시원한 에스프레소가있는 곳의 워터 쿨러 타입의 휴식 백그라운드에서 제조 업체입니다 그리고 나는 이것에 빠져있다 나는 이것에 별표를 붙인다

[비디오 재생] – 너 진짜? 와우 – [INAUDIBLE] – [INAUDIBLE] BRIAN KEMLER : 소리가 들리네요 당신은 정말로 대화를들을 수 없습니다 – [INAUDIBLE] – 그래야 알카트라즈에서 탈출 할 수 있었어 – 나는 알 카트 라 즈에서 탈출 할만큼 충분히 멀리 수영했다

– 정말로 그랬니? 와우 알 카트 라 즈에 수영해야합니다 [끝내기] BRIAN KEMLER : 저는 동적으로 할 수 있습니다 이것을 조정하고 대화 듣기를 시작하십시오 이것은 모든 사용자에 맞게 사용자 정의 또는 조정할 수 있습니다

다시해라 나는 다시 별표를 얻는다 나는 정말로 나 자신이 아니다 저는 지금이 이야기를 리허설하는 것을 말하고 있습니다 그리고 나는 너무 조용히 말하기 때문에 내가 어떻게 소리를 조절할 수 있는지에 대한 또 다른 예가 될 것입니다

나는 더 잘들을 수있다 나도 언급하는 것을 잊었던 다른 물건 이걸 당신의 헤드폰과 함께 사용 했습니까? 그래서 당신은 비디오의 내용을 당신이 생각하는대로 생각할 수 있습니다 당신의 헤드폰을 듣고 있어야합니다 [비디오 재생] – 듣기가 어렵습니다 최선의 상황에서, 조용한 분야에서 배경 소음이없고 큰 귀가 있습니다

[끝내기] BRIAN KEMLER : 부스트를들을 수 있습니다 [비디오 재생] – 그러나 시끄러운 환경에서 일상의 현실 우리가 일하고, 놀고, 살며 환경 소음의 양 때문에 청취가 어렵습니다 [끝내기] BRIAN KEMLER : 조정하기가 아주 쉽습니다 환경에 대한 모든 음향 적 상황, 귀에 대한 청각 적 상황, 기타 등등 그리고 리카르도는 좀 더 깊숙이 뛰어 들어 조금 더 이야기 할 것입니다

역학 처리 효과에 관해서, 개발자들이 어떻게 이것을 오늘부터 사용할 수 있는지에 대해 설명합니다 리카르도 가르시아 : 고마워, 브라이언 리카르도, 너에게 리카르도 가르시아 : 고마워 음, 이제 우리는 데모를 보았고 사운드 앰프를 보았습니다

실생활에서 실제로 일하고 있습니다 그래서 우리는 내려 가서 볼 것입니다 사운드 앰프가 실제로 어떻게 작동하는지, 그리고 그 뒤에있는 마법은 무엇입니까? 그래서이를 위해 청력 역치를 알려 드리고자합니다 나는이 슬라이드에 잠깐 머물 것이다 나는 여기에있는 것을 당신에게 설명 할 것입니다

그리고 여기에서는 평균 청력 역치가 무엇인지보고 있습니다 평균적인 인간의 경우 청력 역치는 실제로 얼마나 많은 에너지가 필요합니까? 소리를들을 수있다 그래서이 음모에서, 우리는 왼쪽에서 오른쪽으로 볼 수 있습니다, 낮은 주파수에서 높은 주파수로, 20 헤르츠에서 20 킬로 헤르쯔 그리고 수직축에서 우리는 진폭을 볼 수 있습니다

우리는 얼마나 많은 에너지를 우리가 실제로 볼 것인가? 소리를들을 필요가있다 그래서 이것은 조용한 곳에서의 청력의 한계이기 때문에, 이 [INAUDIBLE]은 아무것도 말하지 않고 그 문턱 아래에있는 사람들은 사람들에게 들리지 않을 것입니다 예를 들어, 우리가 가서 4,000 헤르츠를 들여다 보면, 우리는 임계 값이 더 낮다는 것을 알 수 있습니다 그것은 우리가 더 적은 에너지를 필요로한다는 것을 의미합니다 소리는 더 희미 할 수 있고, 부드러울 수 있으며, 우리는 그것들을들을 것이다

그러나 우리가 같은 수준의 소리를 내면 주위에, 나 몰라, 100 헤르츠, 너 그것을들을 수 없을 것입니다 많은 기업들 이러한 곡선을 사용하면 이러한 종류의 청력 역치 곡선 장비를 설계하는 것 당신이 디자인 할 때, 나는 모른다, MP3 또는 CD 플레이어, 이 커브가 있습니다 또는 헤드셋, 스피커, 마이크, 이 모든 곡선들은 정말 중요합니다 사람들이 실제로 듣게 될 내용과 민감한 내용

그러나 이러한 커브는 이동할 수 있습니다 그래서 우리는 청력 역치를 가질 수 있습니다 많은 상황 때문에 – 말하자면, 환경의 소음 1 분 전에, 우리는 여기에 AC 폭파를했다 임계 값 변화가있었습니다

우리는 소리가 더 커야 할 필요가있었습니다 소리를들을 수 있도록 그 임계 값 이상 AC가 1 분 전에 꺼 졌을 때, 우리는 더 부드럽게 말할 수 있고 우리는 그것을들을 수 있습니다 우리의 문턱은 그 순간에 이동되었습니다 임계 값 이동은 당신이 그것을 알아 차릴 수 있도록 더 많은 에너지가 필요합니다

우리에게는 다른 변화가 있습니다 우리는 광대역이 아닌 교대를 가질 수 있습니다 스펙트럼 전체가 아닙니다 이전에 우리는보다 현지화 된 교대를 가질 수 있습니다 이 파란색 곡선은 우리에게 변화를 보여주고 있습니다

약 500 헤르츠 정도입니다 정말로, 정말로, 정말로 높다 거기에 약간의 소음이나 장애물이 있습니다 너에게 물건들을 수있게하지 않을거야 아주 잘 주위에 500 헤르츠

이 변화는 영구적 일 수 있습니다 – 너의 모든 삶은 그 변화가있을거야 일시적 일 수 있습니다 Brian이 언급했듯이, 일시적인 상황 일 수 있습니다 또는 장애 즉, 그 기간 동안, 너는 사물을들을 수 없을거야

당신의 헤드폰이 잘 작동하고, 당신은 시끄러운 환경에 있습니다 그 순간 당신의 귀가 잘 작동하지 않습니다 임계 값보다 낮은 소리, 시프트 된 문턱 값, 당신은 그 소리를들을 수 없을 것입니다, 이것이 중요한 부분입니다 임계 값보다 낮 으면 소리를들을 수 없습니다 그래서 우리가 관심을 가질 때 어떻게됩니까? 음악을 듣고 있다고 가정 해 봅시다

또는 누군가가 말하고 있거나, 당신에게 흥미있는 어떤 소리 그래서 줄거리에서 나는 그 안에 푸른 얼룩 (blob)을 넣었습니다 광대역 사운드입니다 그것은 많은 주파수를 가지고 있으며 에너지를 가지고 있습니다 여기 저기

하지만 다시 500 헤르츠 정도를 알아 차리면, 임계 값 이하의 많은 에너지, 이동 된 임계 값 인 파란색 임계 값이 손실됩니다 관심있는 소리가 들리면 상기 임계 값, 상기 시프트 된 임계 값, 들리는 것은 어려울 것입니다 또는 명료성은 정말 나쁩니다 소리를 이해할 수 없습니다 그래서 이것은 모든 사람들이 사운드 앰프가 지금 우리에게 어떻게 도움이 될 수 있습니까? 그래서 네가 물어 봤기 때문에 기쁩니다

사운드 앰프가 소리를 들으려고합니다 실제로 그들을 부양하려고합니다 가장 필요한 곳 500 헤르츠에서 1 킬로 헤르츠의 범위에서 다시 살펴보면, 우리는 소리를 들었고이 새롭고 처리 된 소리에서, 우리는 정말로 부드러운 소리를 들었습니다 그렇게 많은 에너지를 가지고 우리는 이동 된 임계 값 이상 끝까지 그래서 지금 우리는 그것들을들을 수 있습니다

하지만 매우 중요합니다 우리는 실제로 그 소리를 들었습니다

큰 소리로, 우리는 그들을 위로 움직였다 그러나 너무 많이 올라가지 마라 큰 소리는 크게 들리지만 너무 크게 들리지는 않습니다 따라서 일어난 과정을 보면, 그것은 스펙트럼 전체에 균일하지 않았습니다 그것은 물건을 변화시키고 그들을 수용하려고 노력했습니다

전환 된 임계 값 이상 그래서 거기에서 매우 지능적인 향상을하고있었습니다 이 모든 프로세싱은 새로운 다이내믹 프로세싱에 의해 수행됩니다 Android P에서 도입 한 효과 그리고 저는 더 이야기 할 것입니다 나는 [INAUDIBLE]을 1 분 안에 보여 드리겠습니다

약속 할께 Brian이 언급 한 것처럼 역학 처리 효과는 우리가 가진 새로운 처리 효과입니다 네 단계가 있습니다 프리 EQ, 멀티 밴드 컴프레서, 포스트 EQ 및 리미터가 있습니다 그리고 우리가이 효과를 사용할 때, 우리는 우리가 대답 할 필요가있는 두 가지 큰 질문을 가지고 있습니다

특히 Sound Amplifier에 적합합니다 첫째, 우리가 실제로 어떤 종류의 가공을 하는가? 소리를 듣고 싶니? 가능한 한 우리가 가진 필요에 따라 – 우리가 시끄러운 환경에 있거나 우리가 나쁜 관계에 있다면, 또는 우리는 공항에있다 어떤 종류의 가공이 필요한가? 우리가 가지고있는 변화된 문턱보다 높은 것을 만들기 위해서? 두 번째 방법은 사용자가 실제로 이동하고 올바른 매개 변수를 찾으십시오 그들은 당신을 위해 필요합니다 그래서 우리는 대답 할 두 가지 큰 질문을 가지고 있습니다

첫 번째는 처리를 위해 우리가 원하는 어떤 종류의 가공, 우리는 Google이 정말 잘한 일을 해냈습니다 우리는 많은 양의 데이터를 가져 와서 그 데이터를 처리하기 시작했습니다 그래서 우리는 청각 역치에서 데이터를 가져 왔습니다 일반 및 청각 장애가있는 사용자의 경우, 실제로 사람들이 어떻게들을 수 있는지, 귀가 어떻게 반응하는지, 우리는 그들을 거기에 넣었습니다 우리는 서로 다른 환경에서 임계 값 교대를 취했습니다

및 다른 환경 소음 우리는 공항, 식당, 우리가 소음 방해물이있는 장소 – 청력의 한계를 바꿀만한 것들 – 우리는 또한 그들을 믹서기에 넣습니다 그리고 우리는 가서 오디오 콘텐트를 얻으려고 노력했습니다 실제로 듣고 싶다 대화, 영화, 음악, 라이브 콘서트, 강의 – 우리는이 모든 것을 끌어낼 수있었습니다

함께 그리고 일련의 조리법, 매개 변수, 그게 처리에 좋을거야 많은 상황에서 소리 네가 그 일을 끝낼 때 너는 끝이 난다 나는 말할 것이다 다차원 공간, 수많은 솔루션, 그게 꽤 복잡해

다이내믹 효과 프로세서에 알려주는 매개 변수, 오, 이런 상황에 소리를 바꾸는 것이 좋다 이 상황에서는 그럴 것입니다 그러나 그것은 관리하기 어려운 것입니다 사용자에게 말하고 싶다면, 음, 이렇게 움직이는 매개 변수를 시작합니다 수백 가지 매개 변수가있을 것입니다

사용자에게는 매우 어려울 것입니다 이걸로 뭔가 좋은 걸 만들기 위해서 그래서 우리는 한 걸음 더 나아가서 어떤 차원 감소 그 모든 요리법, 다차원 공간, 그들을 평평하게하고 2 차원으로 그려 냈다 그리고 여기, 오른쪽 그림에서, 당신은 우리가 각각의 것을 볼 수 있습니다

일종의 수식 또는 가공법 우리가 역학 처리를 공급하기를 원한다 사운드를 변경하는 효과 그리고 차원 감소와 함께, 우리는 두 가지 주요 축을 발견했습니다 톤과 부스트 그래서 이것은 우리가 가지고있는 두 번째 질문을 해결합니다

사용자가이를 탐색하는 방법 음, 모든 매개 변수를 알 필요는 없습니다 우리가 필요로하는 것, 우리는 단지 그들에게 두 개의 슬라이더를 줄뿐입니다 우리가 방금 데모에서 본 두 슬라이더 그리고 그 슬라이더를 움직여 실제로 매우 지능적인 매핑을 수행하고 있습니다

수백 개의 매개 변수 이동 및 이동 거기에있는 각 채널에 대해 이동합니다 사용자가 이동하여이 슬라이더를 사용하여 반복 할 때, 그들은 실제로 조리법의 낱단을 통해 가고 있습니다, 일련의 가공들, 그리고 그들은 온다 그 순간 가장 잘 어울리는 것을 찾는다 해당 위치의 해당 사용자에 대한 그게 바로 우리가하고 싶은 일입니다 그래서 그것은 일종의 조감도였습니다

사운드 앰프 작동 원리 이제 우리는 더 깊이 가서 코드에 대해 이야기 할 것입니다 다이내믹 프로세싱 효과로 무엇을 할 수 있습니까? 따라서 다이나믹 처리 효과를 찾을 수 있습니다 안드로이드 미디어 오디오 효과의 [INAUDIBLE] 라이브러리에서 – 역학 처리 이제 유스 케이스에 대해 이야기 해 보겠습니다 언제 다이나믹 처리 효과를 사용할 수 있습니까? 우리가 처음 보았던 첫 번째 유스 케이스는, 당신은 사운드 앰프를 할 수 있습니다

그래서 오늘 가면, 지금 이니까 Android P 개발자 미리보기에서 사용 가능하며, 너 오늘 밤 갈 수있어 모두가 파티를 건너 뛰 겠어 가서 자신 만의 사운드 앰프를 만들어보십시오 사운드 앰프와 다이내믹 프로세싱 효과, 우리는 사람들이 자체 사운드 앰프 또는 자체 솔루션 생성 더 잘 듣고 더 잘들을 수 있도록

또 다른 예는 일어날 수있는 다른 [INAUDIBLE]입니다 기기, Android 기기, 스피커 또는 헤드폰을 조정하고 싶습니다 많은 회사들이 이퀄라이제이션 또는 할 소프트웨어를 가지고 있습니다 소리를 더 평평하게 만들기 위해 헤드폰에 무엇인가, 더 나은 저음을 갖기를 바랍니다 이제이 효과로 당신과 고객이 쉽게 할 수 있습니다

정말 흥미로운 또 다른 응용 프로그램 TV 자정 모드입니다 오전 2시에 TV를 시청하는 경우 잠을 잘 수 없으며, 그러나 당신이 영화를보기 시작하면, 때때로 누군가 영화에서 속삭이는 데, 그냥 정말 조용한 것을 말하고, 즉시, 빵, 음악은 거기에, 정말로 큰 무엇인가 들어온다 너 집 안의 모든 사람들을 깨웠다 다이내믹 프로세싱 효과로, 당신은 실제로 그들이 속삭이는 것을 가질 수 있습니다 – 영화의 매우 부드러운 부분은 위로 올릴 수 있지만 아주 시끄러운 음악이나 총소리 등 영화에서 일어나고있다, 그것은 내릴 수있다 모든 것이 더 많은 일을 할 것입니다

소리의 레벨, [INAUDIBLE] 소리 또 다른 예로 미디어 플레이어가 있습니다 당신은 당신의 자신의 미디어 플레이어를하고 있습니다 당신은 실제로 어떤 소리의 최대화를 원한다 또는 마스터 링

미디어 플레이어에서 클래식 음악을 듣고 싶습니다 너는 기차에있다 너는 통제권을 갖고 싶다 시끄러운 소리를 재빨리 짠다 부드러운 소리가 모든 것이 잘 작동하도록 당신이 거기에 가지고있는 다이나믹 레인지를 위해

이제 건축에 대해 조금 이야기 할 것입니다 코드가 올 것이라고 약속하지만 아키텍처를 보여주고 싶습니다 우리는 당신에게이 효과로 많은 힘을주고 있습니다 그래서 우리가 이전에 보여준 아키텍처, 우린 좀 친절 했어 단순하지 않습니다

조금 더 복잡합니다 아키텍처 – 네, 네 단계가 있습니다 우리는 프리 EQ, 멀티 밴드 컴프레서, 포스트 EQ, 리미터가 있지만 거기에서 더 많은 일을 할 수 있습니다 그 단계들 각각의 내부에서, 우리는 당신이 통제 할 수있는 많은 매개 변수를 가지고 있습니다 우리는 밴드를 가지고 있으며 pre-EQ에서 멀티 밴드 컴프레서, 포스트 EQ를 사용하면 원하는만큼의 밴드를 가질 수 있습니다

그리고 당신은 그 밴드들 각각을 제어 할 수 있습니다 그리고 그 밴드들의 매개 변수들 리미터는 싱글 밴드 리미터이며, 그러나 당신은 또한 그것을 제어 할 수 있습니다 이 모든 것이 하나의 채널에 포함됩니다 우리는 채널을 다음과 같이 정의했습니다

당신은 스테레오 신호를 가지고 있습니다 스테레오 신호에는 왼쪽과 오른쪽의 두 채널이 있으며, 그래서 우리는 채널 0과 채널 1을 가지려고합니다 그리고 당신은 그것들 모두를 독립적으로 제어 할 수 있습니다 또는 더 많은 채널을 가질 수 있습니다 5

1 신호가 있다고 가정 해 봅시다 실제로 6 개의 채널을 제어 할 수 있습니다 그 모든 채널을 색인화하고 말할 수 있습니다 멀티 밴드 컨트롤러를 변경하고 싶습니다 채널 2에서 밴드 번호 3, 그리고 이것을 바꾸고 싶습니다

Google은 이러한 모든 작업을 수행 할 수있는 API를 제공합니다 제가주의해야 할 한 가지는 리미터입니다 리미터는 링크 된 리미터입니다 나는 그것에 대해 더 이야기 할 것이다 그러나 당신이 말할 때 중요합니다

모든 리미터를 변경할 수있는 [INAUDIBLE] 채널 정보 필요한 경우 즉시 한 번에 자 이제 마침내 코드 예 우리는 코드를 약속했습니다 코드가 있습니다

그래서 이것은 역학의 인스턴스화 예제입니다 처리 효과 이를 위해 많은 매개 변수가 있으므로 구성 할 수있는 많은 것들, 구성 빌더를 가지고 있습니다 구성 빌더를 만든 다음 실제로 효과를 인스턴스화하려고합니다 먼저,이 예제에서 config 빌더를 사용하여, 우리는 변형과 같은 몇 가지 매개 변수를 가질 수 있습니다

채널 수 – 저는 그것에 대해 잠시 후에 더 이야기 할 것입니다 그런 다음 각 단계를 사용 또는 사용 중지 할 수 있습니다 이 예에서는 모든 단계를 사용할 수 있습니다 예, pre-EQ, 멀티 밴드 컴프레서, 포스트 EQ, 리미터 – 및 밴드의 수 스테이지 유형별로 원하는 밴드의 수를 말할 수 있습니다

그래서 모든 프리 EQ가 가질 수 있습니다 8 밴드, 멀티 밴드 압축기 10 밴드, EQ 13 밴드 이후 유일한 제한은 스테이지 유형 요구 사항과 같습니다 같은 수의 밴드를 가지려면, 원하는 밴드를 원하는만큼 선택할 수 있습니다 앞서 언급 한 것처럼 몇 가지 추가 매개 변수가 있습니다

채널의 변형 및 수와 선호 집합 프레임 지속 시간 – 구성 빌더에서 설정할 수 있습니다 마지막 줄에서 우리는 실제로 구성을 작성합니다 우리는 빌드를 말하고 있으며 우리는 설정 객체를 가지고 있습니다 그런 다음 구성을 직접 사용하고 싶지 않습니다 때로는 내 효과의 아키텍처를 끝내기를 원한다

가서 기본 매개 변수를 변경하십시오 따라서이 예에서는 채널이 생겼습니다 config에서 첫 번째 줄에 채널 객체가 생겼습니다 그리고 저는 채널 번호 0에서이 경우, 멀티 밴드 압축기를 얻으십시오 멀티 밴드 압축기가 있습니다

그런 다음 8 개의 밴드를 반복합니다 내 멀티 밴드 컴프레서에있는 것, 그리고 나는 가서 각각의 매개 변수를 변경했습니다 이것은 I / O의 예입니다 확실해 실제 응용 프로그램에서는 더 많은 것을 할 수 있습니다 그러나 우리는 우리가 가서 각각의 것들을 설정할 수 있음을 봅니다

우리가 원하는 것은 – 그 석방, 공격, 비율 문턱의 – 당신이하는 방식 밴드 하나 하나를 원해 마지막으로 우리는 가서 인스턴스화합니다 내 역학 처리 효과, 그리고 그것을 인스턴스 수 있습니다 우리가 설정 한 설정 파일 생성 된 세션 ID 및 세션 ID 이 효과를 어디에 붙여야할까요? 미디어 플레이어 또는 관심 오디오 트랙

그리고 나서 프로그램을 시작하십시오 모든 것을 통제하고 있습니다 API를 사용하지 않고 [INAUDIBLE]을 표시하는 대신 좀 더 메타, 좀 더 개념적으로 갈 것입니다 이것을 그래픽으로 조금 보여줄 수 있습니다 따라서 구성에서 또는 우리가 실시간으로 실행될 때, 우리는 당신에게 보여준 채널에 접근 할 수 있습니다

그리고 우리는 많은 채널을 가지고 있습니다 따라서 채널 객체와 우리는 색인을 생성 할 수 있습니다 인덱스 번호에 의한 채널 그래서 0, 1, 2, 3 – 우리는 채널을 얻을 수 있습니다 각 채널 객체에는 실제로 몇 가지 매개 변수가 있습니다

채널에서 이동하고 변경할 수있는 입력 게인과 비슷합니다 아니면 단계가 있습니다 [? pre-q?] 다중 대역 압축기, [? post-q,?] 또는 리미터 그리고이 순간, EQ에서, 실제로 EQ를 잡을 수 있습니다 두 EQ는 API 레벨에서 완전히 동일하게 보이지만, API 관점에서

그리고 EQ의 파라미터를 변경할 수 있습니다 또는 각 밴드에서 파라미터를 변경하십시오 미안 해요, 아주 깊어 질거야 그래서 우리는 밴드에서 EQ로 갈 수 있습니다 채널에서 다음 채널 모음

따라서 모든 세분화 된 요소에 액세스 할 수 있습니다 우리가 원하는 곳 멀티 밴드 압축기도 마찬가지입니다 우리는 멀티 밴드 압축기에 접근 할 수 있습니다 채널 측면에있는 다음 매개 변수에 액세스합니다

우리가 각 밴드에서 가지고있는 마지막으로 리미터입니다 리미터에는 밴드가없고, 파라미터 만 있습니다 그곳에 그리고 우리는 그것에 접근 할 수 있습니다 이제 저는 좀 더 다이빙을 할 것입니다

각 스테이지 유형 및 우리가 가지고있는 접근자가 무엇인지, 우리가 가진 세터들과 게터들? 첫째, 이퀄라이저입니다 나는 대부분의 사람들이 이퀄라이저에 익숙하다고 생각한다 이퀄라이저가하는 일 그러나, 아주 빨리 – 이퀄라이저로 다른 주파수를 지정하려고합니다 밴드

우리는 0에서부터 밴드를 가질 것입니다 500 헤르츠, 500-3000, 3,000-7,000 그리고 우리는 에너지, 레벨 또는 이득을 바꿀 것입니다 우리는 그 밴드들 각각에 있습니다 여기서 우리는 원하는대로 밴드를 설정할 수 있습니다

그래서 우리는 많은 밴드를 가질 수 있고 어떤 색깔도 가질 수 있습니다 우리가 원하는 주파수 그리고이 그래프는 오해의 소지가 있습니다 모든 밴드가 같은 너비를 가지고 있기 때문입니다 그건 사실이 아니야

원하는 너비를 할 수 있습니다 그리고 일단 밴드를 만들면, 당신은 갈 수 있습니다 그리고 여기에있는 접근 자와 함께, 우리는 이득을 얻을 수 있습니다 – 현재 이득은 무엇입니까? 또는 우리는 이득을 설정할 수 있습니다 그리고 우리는이 모든 것을 실시간으로 변경할 수 있습니다 우리는 가고있다– 그런 다음 멀티 밴드 압축기

그러니 먼저 면책 조항 누군가 너를 지적했다 다중 대역 압축기에 하나의 대역을 보여줍니다 그리고 네, 하나의 밴드를 보여주고 있지만, 멀티 밴드 압축기가하는 일을 쉽게 보여줍니다 Brian이 언급하고 언급 한대로, 압축기, 멀티 밴드 압축기, 큰 목표 인 소리를 듣는 것이 주요 목표입니다

그 (것)들을 더 연약하고, 아주 연약한 소리에하십시오 그들을 더 크게 만든다 여기에 우리가 표현한 방식, 우리는 전에도 같은 문장을 가지고 있습니다 우리는 문장이 크고, 중간이고, 상단에는 부드럽고 그리고 우리가 처리를 적용한 후에 멀티 밴드 컴프레서의 모습은 이후처럼 보일 것입니다 즉, 큰 소리는 조금 부드럽습니다 매체 1은 매체를 유지합니다

그리고 부드러운 하나는 아주 크게 움직입니다 멀티 밴드 압축기가 작동하는 방식, 또는 매개 변수가 작동합니다 그래픽– 우리는 입력을 가지고 있으며, 신호의 레벨은 무엇입니까? 가로축에 숫자는 마이너스 100에서 10까지입니다 숫자가 낮을수록 마이너스 50과 같습니다 어쩌면 마이너스 10보다 부드럽습니다

따라서 마이너스 10은 크게 들릴 것입니다 압축기는 입력을 분석합니다 입력 값이 임계 값보다 높으면 임계 값을 갖습니다 매개 변수 – 말하기로 결정할 겁니다, 알다시피, 너무 시끄러워 내가 너를 데려다 줄거야

그러나 그것이 문턱보다 낮아지면, 그것은 건드리지 않는다 예를 들어,이 그래픽에서 마이너스 40을 선택합니다 입력 값은 마이너스 40 레벨입니다 출력은 정확히 마이너스 40입니다 우리는 한계점을 밑돌고 있습니다

우리는 그 신호를 수정하지 않을 것입니다 그러나 임계 값은 약 25입니다 따라서 마이너스 20의 값을 선택하면, 실제 출력은 주변에있을 것입니다 죄송합니다 10의 충동을 선택합시다

미안, 그게 더 낫네 입력 인 마이너스 10은 출력 20에 마이너스로 매핑됩니다 즉, 소리가 부드러워졌습니다 임계 값을 초과했습니다 이러한 모든 매개 변수와 압축 비율을 사용하면, 임계 값 및 입력 게인, 출력 게인, 그리고 우리가 할 수있는 다른 매개 변수들 우리가 약속 한 바를 우리가 소리를 들려주고 소리를 크게 할 수있다

큰 소리를 듣고 부드럽게 만듭니다 이것이 멀티 밴드 컴프레서가하는 일입니다 그리고 그것은 다른 밴드에서 이것을하고 있습니다 우리는 0에서 1,000 헤르쯔의 주파수 범위를 가질 수 있습니다 1,000에서 다른 지역과 다른 방식으로 행동합니다

5,000 명이 행동합니다 우리는 당신에게 통제 할 수있는 모든 힘을주고 있습니다 가장 복잡한 것 중 하나 인 멀티 밴드 압축기는, 당신은이 세터와 게터를 얻을 수 있습니다 따라서 공격 시간, 릴리즈 시간, 비율 등을 얻을 수 있습니다 실제로 구성해야하는 모든 매개 변수 압축기

그리고 당신은 밴드 당 이것을합니다 – 음 한 가지는, 모두가 이것을 요구하고 있다고 확신합니다 왜 당신은 pre-gain, post-gain, 멀티 밴드 압축기가 전후에 있다면 균등화? 그리고 그것은 사실입니다, 그들은 중복됩니다

그들은 거의 똑같이하고 있습니다 그러나 우리는 한 가지 이유로 그렇게했습니다 우리는 많은 개발자와 사람들과 이야기했습니다 실제로는 이러한 알고리즘이 실제로 많이 사용됩니다 그리고 그들 중 상당 부분은 정말로 평등화를 원한다

멀티 밴드 컴프레서로 튜닝 스피커 또는 마이크를 연결합니다 그들 중 일부는 멀티 밴드 압축기를 원한다 균등화 상태 그래서 우리가이 효과를 매우 보편적으로 만드는 가장 쉬운 방법입니다 일부 중복성을 구축하고 API를 그런 식으로 수행하는 것이 었습니다 이전 알고리즘을 쉽게이 포트에 포팅 할 수 있습니다

마지막 단계는 리미터입니다 리미터는 거의 동일합니다 그것은 멀티 밴드 컴프레서지만 싱글 밴드입니다 그래서 우리는 여러 밴드를 가지고 있지 않습니다 그리고 이것이하는 일은 거의 동일합니다

그것은 소리를 내고 있고, 너무 시끄러운 소리라면 – 임계 값의 특정 수준 이상인 경우 그냥 그걸 내려 버릴거야 매우 유용합니다 오디오 처리가 끝나면 보통 발견됩니다 체인, 특히 스피커를 보호합니다 그 처리를 원하지 않는다

뭔가 펑키하고 소리가 정말 크게 들렸어요 그리고 너는 그 큰 소리를 원하지 않는다 스피커에서 나옵니다 그래서 당신은 가고, 리미터는 말할 것입니다, 좋아, 미안, 너무 큽니다 나는 클립하지 않을 것이다, 그러나 나는 정당하다 스피커를 망가 뜨리지 않도록 스쿼시를 내려갑니다

그래서 리미터가 정말 좋습니다 그리고 나는 그 링크에 대해 언급 할 것을 약속했다 리미터는 링크 리미터이며 링크 그룹이 있습니다 여러 채널을 보유하고 있다면 우리는 두 개의 채널이 있다고 말하십시오 그리고 그들은 같은 그룹에 속해 있습니다

그리고 채널 중 하나, 왼쪽 채널, 그 채널에서 정말 큰 일이 일어난다 매우 시끄 럽습니다 그것은 왼쪽 채널 만 아래로 모두 질질 질거야 스테레오 이미지가 오른쪽으로 끝까지 이동합니다 왜냐하면 이것은 올바른 것이었기 때문에 아무것도하지 않았습니다

그러나 그들이 연결되어 있고, 어떤 이유로 든, 채널 중 하나가 큰 소리를 내었고 두 채널 모두 다운됩니다 동시에 스테레오 신호, 스테레오 이미지, 움직이지 않을거야 그것은 중심에 머무르고 그들이 필요한 곳에서 머무를 것입니다 따라서 스테레오 신호의 링크 그룹을 제어 할 수 있습니다 또는 다중 채널 환경에서 – 스테레오 스피커를 연결하려는 경우, 다른 그룹의 서라운드 스피커, 따라서 공간 이미지를 손상시키지 않아도됩니다

그리고 그것은 우리에게해야 할 또 다른 특징이었습니다 글쎄, 다이나믹 처리에 대한 더 많은 코멘트가 있습니다 효과 첫 번째는 실시간 컨트롤입니다 여기에 요약하려고했던 API의 모든 컨트롤은 그러나 그것은 정말로 크다

계속해서 API 문서를 읽으시기 바랍니다 이 모든 컨트롤은 대부분 실시간 컨트롤입니다 당신은 그것들을 사용할 수 있고, 당신의 효과가 실행되면, 당신은 갈 수 있고 거의 모든 매개 변수를 변경할 수 있습니다 당신이 원하는 그 여기서 레벨을 변경할 수 있습니다

당신은 공격, 릴리스, 비율을 변경할 수 있습니다 – 어떤 채널에서나 원하는 모든 것, 모든 밴드에서 인스턴스화를 위해 거의 동일한 API를 사용할 수도 있습니다 때로는 효과를 만들고 싶습니다 즉시 갈 준비를하십시오 재생이 시작되면 바로 모든 매개 변수로 재생

그래서 그렇게 될 것입니다 우리는 또한 약간의 구현을 가지고있다 현재 우리는 두 가지 구현을 제공하고 있습니다 우리가 선호하는 빈도라고 부르는 두 가지 변종 때로는 이러한 효과를 위해 주파수 도메인이있는 경우 구현, 그것은 당신이 밴드에서 매우 정확한 주파수 스플릿을 가질 수있다

당신이 나가는 데 필요할 수도 있습니다 동시에 원하는 프레임을 제공합니다 크기 당신이 오디오 엔진에 줄 수있는 힌트 – 효과 엔진에 – 말하자면, 음, 음, 나는 주파수를 좋아한다 그리고 나는 약 10 밀리 초, 20 프레임 밀리 초입니다

그래서 보증은 아니지만, 당신은 엔진을 말할 수 있습니다, 나는 그것을하고 싶습니다 이 효과가있는 또 다른 중요한 것 그것이 AOSB에 내장되어 있습니다 따라서 모든 AOSB, Android AOSB가이 효과와 함께 출하됩니다 그러나 OEM으로 대체 할 수있는 효과입니다 따라서 OEM이 정말로 스 내퍼와 함께하기를 원한다면 효과 또는보다 나은 구현 또는 무엇인가, 그들은 그것을하도록 격려받습니다

그리고 우리가 청중에 OEM 사람들이 있다면, 나중에 나 한테 말해줘 그러나 그렇습니다, 계속 해보세요 그리고 유일한 것은, 이것들과 함께 아주 멋진 효과를하십시오 아주 좋은 품질의 효과 다른 하나는 개발자가이 효과를 사용할 수 있다는 것입니다

인서트 이펙트로서 응용 프로그램에서 구현되지 않은 상태로 이동할 수 있습니다 미디어 플레이어가 있습니다 음악 응용 프로그램이 있습니다 당신은 단지 가서 안드로이드 미디어, 모든 효과, 동적 처리 효과를 제공하며 사용자가 사용할 수 있습니다

거기에 구현합니다 오늘 요약하면, 우리는 많은 것들을 배웠습니다 첫 번째는 새로운 기능을 도입 한 것으로, 사운드 앰프 따라서 새로운 접근성 기능입니다 스마트 폰과 헤드폰 세트 만 사용합니다

청취 경험을 향상시키는 데 도움이됩니다 Brian은 몇 가지 멋진 데모를 보여 줬습니다 건전한 사람들에게 감사드립니다 그 순간에 그들은 AC를 꺼 버렸다 그래서 우리는 사물을 조금 더 잘들을 수있었습니다

우리는 청력 역치와 청력에 대해 배웠습니다 한계점 교대와 그들이 어떻게 힘을 얻는 지 사운드 앰프가 작동한다는 것 그리고 마지막으로 우리는 역학 처리 효과를 보여주었습니다 코드, 스테이지의 작동 방식, 이동 및 생성 방법 당신 자신의 다이나믹 프로세싱 효과 자신의 응용 프로그램에 포함 할 수 있습니다 그래서 그걸로 우리는 감사를 드리고 싶습니다

이 프로젝트에 참여한 많은 사람들에게 Brian의 팀인 Android 접근성 팀 우리 팀, 안드로이드 미디어 프레임 워크 팀; Google 연구 팀 소리 이해 팀; 그들이 도와 준 타이베이의 우리 팀 오늘 본 애플리케이션을 구현하십시오 그리고 내가 머물고있어서 고맙다 너무 늦게 I / O의 마지막 날 제발, 저희에게 연락주세요 만약 질문이 있다면

고맙습니다

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

[환호와 박수] 체타마, 제가 도입부에 대해 조금 긴장하고 있다는 걸 말씀 드리고 싶네요 이걸 정말 제대로 리허설을 했는지 모를 정도로 말이에요 [웃음] 이건 완전히 즉흥적으로 진행될 거예요 제가 여기서 얘기하는 것에 대해 끊임없이 반복해서 연습하긴 했지만요 굉장히 즉흥적인 강연이 될 거예요 특히 이 도입부가 정말로 걱정되네요 안녕하세요, 안드로이드의 새로운 점을 보러 오신 분들을 환영합니다 [환호와 박수] 이곳까지 오셔서 정말로 감사드립니다 해안선에서 가장 작은 공간에서 강연을 하게 되어서 죄송합니다 사실이에요 설 수 있는 자리가 마련되어 있고요 만약 옆자리가 비어있다면 손을 들어 주세요 다른 분들이 비어있는 자리를 찾을 수 있게 말이에요 그러면 좋겠네요 저는 안드로이드 UI 툴키트 팀의 쳇 하제입니다 저는 안드로이드 시스템 UI 팀의 댄 샌더스입니다 저는 안드로이드 팀에 있는 로만 가이입니다 다시, 한번 더 한번 더 [환호와 박수] 하지만 쳇의 팀에 있지는 않아요 절대로 들어가지 않을 거예요 아뇨, 아뇨 [웃음] 그 반란은 성공적이었다고요 다시는 그런 문제를 반복해서 일으키지 않을 거예요 자, 오늘 우리는 안드로이드의 새로운 점들에 대해서 얘기할 거예요 특별히, 프리뷰가 진행되고 있기 때문에 N의 새로운 점에 대해서 얘기해 봅시다 아니면, 안녕하세요 이걸 보시죠 우리는 이걸 안드로이드의 새로운 점이라고 했어요 사실 우리는 이걸 이렇게 불러야 해요 안드로이드의 새로운 것 같은 점이라고요 이러한 것들에 대해서 이미 어느 정도는 얘기를 나누었고 바라건대, 모든 분들이 프리뷰에서 들었으리라 생각하고 이러한 것들을 사용하며 버그를 신고하고 새로운 특징과 기능을 사용하고 있으리라고 말이죠 그래서 이러한 점들을 볼 거고요 개발자 프리뷰3에서 더욱 새로운 점들에 대해서 그리고 다른 관련된 점들에 대해서 얘기를 나눠볼 거예요 자, 시작해 봅시다 가장 중요한 질문으로 N이 무엇을 나타내는 걸까요? 제 생각에는 말이죠 러시아어로 생각해 봤어요 물론 니엣(nyet)은 아직 또는 말하지 않을 거라는 걸 뜻하지만 현재 이것이 뜻하는 것은 N 프리뷰에요 좀 더 자세히 말해서 N 프리뷰 3를 뜻하는 거죠 이러한 특징에 대해서 관찰하게 되는 다양한 관점과 분석으로 인한 의견이 많지만 사용자들이 실제로 보게 되는 관점과 개발자들의 측면에서 보게 되는 것을 함께 얘기하는 게 좋을 것 같다고 생각했어요 그리고 개발자들이 접하게 되는 특징에 대해서 얘기를 할 거예요 그러한 특징을 이용해서 실행할 때와 그 뒤에 있는 코드에 대해서 말이에요 데모를 이용해서 시작해 보겠습니다 [환호] 그래요 콘스트레인트 레이아웃에 대해서 얘기를 할 거예요 오늘 오전에 있었던 기조연설에서 잠시 언급이 됐었죠 스테프가 이에 대해서 말했어요 로만이 이것이 어떻게 실행되는지 보여드릴 거예요 자, 콘스트레인트 레이아웃은 안드로이드에 있는 완전히 새로운 레이아웃이에요 언번들 라이브러리가 될 거예요 프레임워크를 업데이트 하지 않고도 여러분의 앱에 통합시킬 수 있는 거죠 진저브레드까지 전부 호환이 가능해요 여러분이 원하는 모든 앱에서 사용할 수 있어요 여기에 있는 것은 자체적인 툴과 함께 고안된 첫 번째 레이아웃이에요 안드로이드 레이아웃 매니저를 만들면서 또한 안드로이드 스튜디오의 사용자경험을 고안하는 거예요 기조연설에서 간단하게 보셨겠지만 이게 약간 보기 어려웠어요 자동적으로 제한을 나타내는 시스템을 가지고 있으니까요 새로운 시스템에는 레이아웃을 만들 수 있는 여러가지 방법들이 있어요 예를 들어, 여기에서 저는 버튼을 가지고 있어요 보시다시피 움직일 수 있고 여러분에게 가이드라인을 제공하죠 머티리얼 디자인의 가이드라인이 있는 폴더를 보여주고 있는데요 다양한 위젯사이에서 여러분이 사용해야 하는 올바른 여백을 나타내주고 있어요 위젯사이에 있는 올바른 여백과 화면의 가장자리를 보여주고 있죠 이제, 두 번째 버튼을 추가하면 여기에 있는 두 개의 버튼에 제한을 둘 수 있어요 이제 나란히 정렬되어 있죠 새로운 레이아웃 편집기에서 정말로 효율적인 것은 1초마다 60개의 프레임으로 안드로이드 스튜디오에 있는 안드로이드 레이아웃 이면에서 알고리즘을 작동시킬 수 있다는 거예요 그래서 제가 첫 번째 버튼을 옮기게 되면 여러분도 실시간으로 보시겠지만 레이아웃이 모든 제한을 변형시키는 지 보이실 거예요 이로 인해서 현재 상황에 대해서 훨씬 더 빠르게 많은 피드백을 줄 수 있어요 제한을 두기 전 상태를 보여드릴 수도 있어요 이 제한을 드래그하면서 화면의 가장자리로 당겨서 마우스에서 손을 놓기 전의 모습을 여러분에게 보여드릴 거예요 어떤 일이 일어날지에 대해서 애니메이션으로 보여드릴 건데요 이러한 제한을 두게 되면 렐러티브 레이아웃 뷰를 사용하는 분들이 물론 있으실 건데요 추가적인 위젯을 보내게 되었을 때 때때로 발생하는 상황에 대해서 놀라신 분들도 있을 겁니다 모든 것들이 갑자기 화면에 있는 다양한 위치로 이동하게 되죠 이제는 그런 일이 없어요 그래서 정말 빠르게 더 많은 제한을 생성할 수 있고 제가 가진 두 개의 버튼을 하단에 추가할 수 있어요 오토커넥트를 사용하셔도 됩니다 오토커넥트를 활성화 해서 새로운 버튼을 화면에 두면 예를 들어, 가이드라인을 보시게 되면 화면에 중심에 있죠 이곳에 제 버튼을 놓겠습니다 그러면 시스템에서 자동적으로 저를 대신하여 제한을 생성해줍니다 그래서 저는 제한을 따로 생성하지 않아도 되죠 물론 그 다음에 제한을 수정할 수 있어요 규모를 유동적으로 수정할 수 있어서 모든 공간을 다 차지하게 해도 되고요 아니면 그 반대로도 가능하죠 백분율을 기반으로 하여 위치를 정할 수도 있어요 여기에서는 버튼이 중심에 놓여 있지만 만약에 여러분이 다른 위치를 원한다면 예를 들어, 화면 상단의 25%가 될 수 있어요 여러분의 화면 크기에 맞춰서 조절이 될 거예요 이외에 다른 특징들에 대해서 금요일 오전 9시에 데모를 보여드릴 거예요 예를 들어, 종횡비에 대해서 다룰 거예요 여러분의 위젯을 항상 1:1의 종횡비나 16:9로 원하는 대로 설정할 수 있어요 그리고 마지막으로, 이러한 특징도 기조연설에서 짧게 다뤄졌는데요 여러 가지 위젯을 화면에 두겠습니다 상단에는 텍스트 필드를 두고 레이블에는 텍스트뷰를 넣을 거예요 여기에 있는 위젯의 위치는 제가 원하는 방향에 맞춰서 꼼꼼하게 배치할 거예요 모든 제한은 다 제거하겠습니다 이제, 여기에 있는 필드 레이블 아이콘을 클릭하면 제가 여기에서 의도한 바를 파악할 거예요 그리고 제 레이아웃이 작동할 거예요 이건 잠겨지는 게 아니에요 계속해서 제한을 추가할 수 있어요 행위를 계속해서 변경해도 되고요 다른 위젯을 추가할 수도 있고 자동 추론을 다시 실행할 수도 있어요 여러분은 이러한 과정을 처리할 권한을 가지고 있어요 여러분의 UI를 도울 수 있고 빠르게 만들 수 있도록 말이에요 [박수] 고마워요, 로만 그리고 죄송해요, 한 가지만 더 말씀 드릴게요 이건 프리뷰에요 우리는 알파1이라고 부르죠 개략적으로 설명 드리는 거예요 안드로이드 22 프리뷰를 다운로드 하셔서 직접 사용해보시고 버그를 신고해주세요 제가 직접 버그 트래커를 사용해서 볼 거예요 그리고 엔지니어들을 마구 괴롭혀서 대다수의 버그를 고칠 수 있도록 할 거예요 더욱 많은 것들이 나올 거고요 지금은 아직 작업 중에 있습니다 지금 나온 레이아웃과 레이아웃 편집기가 최종 버전이 아니라고 말씀 드리고 싶어요 마지막으로 질문이 있어요 얼마인가요? [웃음] 100킬로바이트요 좋은 건가요? [웃음] 그러면 쳇에게는 얼마죠? 4백만 달러요 [웃음] 좋아요, 이걸 사용해보시길 바랍니다 피드백을 제공해주세요 슬라이드로 돌아가보겠습니다 정말로 멋진 데모였지만 슬라이드로 다시 돌아가볼까 해요 잘 해보시길 바랄게요 좋아요 멀티윈도, N에서 눈에 띄는 변화 중에 하나이죠 한번에 화면에서 다수의 활동을 할 수 있는 기능이지요 여러분이 볼 수 있는 두 개의 주요한 모드에요 하나는 나란히 정렬되어 있는 분할 화면이고 위에서 아래로 수직으로 분할시킬 수도 있어요 최근 버튼을 보면 여기에서 동영상 캡쳐 기능을 볼 수 있습니다 최근에서 이 기능을 드래그해서 화면의 한쪽에 놔둘게요 그 다음으로 하는 일은 화면의 나머지 반쪽에 있죠 그 다음활동을 하기 위해서는 하나를 탭하기만 하면 되요 드래그를 하다 보면 윈도우 매니저에서 제가 손을 떼기 전까지는 단순히 배경색으로 빠르게 보여주고 있어요 그렇게 하면 전체적인 환경설정을 할 수 있는 거죠 여러분의 앱에 대해서 색다르게 생각하는 거예요 안드로이드 레이아웃의 마술이죠 환경설정을 변경하는 방법을 알아봤습니다 새로운 크기에 맞춰서 레이아웃을 조정하는 법도 알아봤어요 화면의 폼 팩터에 대해서도 봤고요 윈도우 매니저는 이러한 것들을 기반으로 하여 만들어졌어요 여러분이 새로운 사이즈와 나란히 정렬되는 레이아웃을 이용하여 앱이 간단하게 작동될 수 있도록 하실 수 있어요 직접 사용해보시고 테스트 하세요 나란히 정렬시키는 모드 또는 분할 화면 모드를 여러분이 원하는 대로 선택하여 이용해보시길 바래요 필요하시면 API도 사용해보세요 선별하셔서 사용하시면 됩니다 기본값으로 선택할 수 있도록 자동적으로 설정되어 있어요 만약 여러분이 크기 조정이 가능한 활동을 원하지 않으신다면 기본값과 최소한의 사이징으로 정할 수 있는 몇 가지 매개변수가 있습니다 여러분이 소리를 듣고 시스템에서 멀티윈도 모드가 작동되는지 혹은 현재 멀티윈도 모드를 사용하고 계시는지 알 수 있도록 하는 몇 가지 API도 있습니다 그리고 마지막으로, 여러분이 멀티윈도 모드를 사용하고 있고 또 다른 하위활동이 나란히 보여지도록 만들면서 실행시키고 싶다면 하위활동이 인접할 수 있도록 요청하면 됩니다 직접 이걸 확인해보시길 바랍니다 픽쳐 인 픽쳐 모드에서도 확인해보세요 안드로이드 TV에 있는 멀티윈도 모드의 또 다른 기능입니다 이제 여러분은 픽쳐 앤 픽쳐에서 활동을 할 수 있는 기능을 사용할 수 있습니다 비디오를 완전히 재생시키면서 사용자가 보는 컨텐츠를 선택할 수 있는 런처와 같은 다른 활동을 동시에 사용할 수 있습니다 전면에 비디오를 재생시키는 동안에 말이죠 이러한 두 가지 특징보다 더 많은 것들이 있습니다 오늘 오후 4시에 멀티윈도 세션에 참여해보시길 바랍니다 픽쳐 인 픽쳐 모드에 보면 몇 가지 활동을 더 할 수 있는데요 멀티윈도 모드에서 본 것과 굉장히 유사해요 이렇게 진행되는 것들을 볼 수 있고 어떤 일을 할 수 있는지 볼 것입니다 새로운 드래그 앤 드롭 기능이 있어요 적어도 진저브레드 이후부터 드래그 앤 드롭 플랫폼을 가지고 있었는데요 이제는 이것이 기능으로 추가되었습니다 이제 여러분은 멀티윈도 모드를 사용하기 때문에 하나의 활동에서 다른 활동으로 드래그해서 이동시키는 것이 좋지 않을 까요? 이전의 드래그 앤 드롭에서는 허용되지 않는 기능이었어요 그렇게 할 필요가 없었으니까요 하지만 이제는 콘텐츠를 다양한 활동들 앞뒤로 이동하면서 드래그 할 수 있어요 몇 가지 API와 이러한 기능을 이용할 수 있도록 몇 가지를 추가했어요 여기에서 몇 가지 API를 볼 수 있습니다 대다수는 승인에 관련된 거예요 패스워드 필드에서 여러분의 활동으로 복사하고 싶지 않은 활동이 있을 수도 있으니까요 아니면 여러분의 활동으로 인기 있는 동영상을 옮기고 싶지 않을 수도 있고요 그러므로 올바른 승인을 받기 위해서 앞뒤로 주고받는 과정이 이루어집니다 동작을 시작하거나 드래그 셰도우를 업데이트하는데 매우 부적절한 이름이 있다면 동작을 실행하는 동안에 취소할 수 있는 방법이 항상 있어요 사실상 여기저기로 드래그되는 콘텐츠의 섬 네일을 나타내는 거예요 여러분이 원하는 걸 업데이트 할 수 있게 말이에요 셰도우 표현으로 애니메이션을 나타내고 싶으시면 계속해서 업데이트할 수 있어요 오, 그렇군요 그렇게 하고 싶으시다면 말이죠 동영상 캡처를 간단하게 보자면 여기에서의 동작을 볼 수 있어요 어디 봅시다, 그래요 이건 우리가 내부적으로 가지고 있는 몇 가지 데모에요 이건 곧 기사로 공개될 것이고 그러면 외부에서 작동할 수 있어요 승인이 필요 없는 것과 승인을 받아야 하는 것들을 드래그하고 앱 사이로 드래그할 수 있는 기능을 사용하는 것에 대한 기본적인 상호작용을 보여드렸어요 다음으로 넘어가겠습니다 알림 기능이 있어요 자, 바라건대 여러분 모두 이에 대해서 얘기하는 걸 보셨을 거예요 그리고 이제 제가 이 부분에서 15분간 설명을 할 건데요 알림 기능에 대해서 정말로 멋진 모든 부분들에 대해서 얘기할 거예요 끼어들지 마세요 지금은 제가 말하는 시간이니까요 그러니 내일 오전 9시에 다시 방문해주시길 바래요 기조연설에서 본 안드로이드와 안드로이드 웨어2

0에 있는 알림 기능에서 정말로 멋진 새로운 점들에 대해서 자세하게 알아볼 거니까요 그러니까 저는 클릭커를 이리 줘봐요 아뇨, 아직 끝나지 않았어요 있어봐요 [웃음] 저는 여러분이 아셨으면 하는 몇 가지에 대해서 설명 드리고 싶은 거예요 조금 더 알아보고 싶다면 개발자 문서를 확인해보세요 먼저, 새로운 템플릿을 최초로 보여드릴게요 허니콤 이후에 처음으로 공개하는 거예요 약간의 머터리얼 업데이트를 하고 몇 가지만 출시하긴 했지만 몇 가지 새로운 템플릿은 어느 정도 이동을 할 수 있고 앱에 새로운 속성을 만들 수 있어요 알림에 보낼 수도 있고요 이렇게 하면 누군가 어떤 걸 올렸는지 바로 알 수 있어요 번들 알림 기능도 있어요 원래 안드로이드 기어에서 개발했던 기능이죠 마침내 휴대폰과 태블릿에서도 이용 가능해요 몇 가지 알림들을 하나로 묶을 수 있는 기능이죠 바로 답장 기능도 있어요 답장버튼을 클릭하고 글을 쓰면 텍스트가 바로 나타나요 다시 말씀 드리지만 안드로이드 웨어에서는 이미 있었던 기능이에요 시계를 이용하여 얘기할 수 있고 메시지를 보낼 수 있죠 이제는 닫힌 화면에서도 그렇게 할 수 있는 거예요 사용자가 그러한 기능을 설정하면 말이죠 시스템 UI에 관련된 것들에 대해서 설명하고 있는데요 빠른 설정에 대해서 설명 드리고 싶네요 사용자들이 오랜 기간 동안 요청해온 기능이 마침내 나오게 되었는데요 편집 가능한 기능이에요 여러분이 원하는 대로 빠른 설정에 있는 메뉴를 추가하거나 제거할 수 있어요 사실 이 기능에는 더욱 빨라진 빠른 설정이라는 이름도 지어졌어요 제가 방금 지어내긴 했지만요 더욱 빨라진 빠른 설정은 다섯 가지로 이루어진 목록인데요 여러분이 언제든지 볼 때마다 알림 목록의 상단에서 나타나는 빠른 설정으로 다섯 가지가 있습니다 원하시는 다섯 가지의 기능을 빠른 설정으로 이동하면 한번의 터치로 바로 사용하실 수 있습니다 언제든지 여러분이 알림을 볼 때 말이에요 [박수] 잠시만요 그게 다가 아니에요 집에서 이 영상을 보고 계시는 개발자들이 있으시다면 아시다시피 프리뷰 후반이 되면 여러분이 고유의 빠른 설정 타일을 만들 수 있어요 안드로이드N을 사용하는 모든 사용자들이 사용할 수 있어요 그러니 타일서비스에서 API문서를 한번 보시길 바래요 빠른 설정 타일에 대한 전체 라이프사이클을 생성할 수 있어요 언제 사용자가 타일을 목록에 추가하고 언제 타일이 실제로 보여졌는지 확인할 수 있죠 라이브 업데이트가 필요하다면 그렇게 할 수도 있어요 그리고 물론 가장 중요하게도 사용자가 타일을 클릭했을 때 무엇을 할지도 알 수 있어요 getQsTile을 호출하면 타일 오브젝트에서 포인터가 나타나고 여러분의 모든 상태를 보여주며 아이콘의 변경, 이름의 변경과 동작 상태로 들어가고 나올 수 있도록 허용하여 리소스의 사용 가능 여부에 따라서 밝기를 이용하여 알려줍니다 모든 변경사항을 적용하고 난 뒤에 업데이트타일을 호출하는 것을 잊지 마세요 여러분만의 설정을 맞추기에 완벽한 방법이에요 잠금 화면에서 접근을 하기를 원하는 사용자들을 위한 앱의 몇 가지 빠른 기능이에요 만약 여러분이 스마트 홈을 만드느라 바쁘시다면 여러분에게 가장 먼저 필요한 것은 휴대폰에서 쓸 수 있는 빠른 버튼이에요 클릭하기만 하면 집에 도착하는 즉시 여러분의 테마 음악을 재생할 수 있어요 이렇게 하기 위해서 빠른 설정이 만들어졌어요 마지막으로 여러분이 해야 할 일은 매니페스트에서 나머지 작업을 하는 거예요 시스템 UI에서 여러분의 빠른 설정을 인식하고 어떻게 다룰지 알 수 있도록 하기 위해서 모든 것들에 대해서 올바르게 승인 받도록 신경 쓰시길 바래요 화면 사이즈에 대해서 얘기를 해볼게요 이건 사실 접근성에 관련된 기능이에요 폰트 크기를 늘리고 심지어 대체할 수 있도록 N에 도입한 기능이에요 폰트 크기는 안드로이드에서 오랫동안 사용할 수 있었던 기능이에요 개발자들이 ASPI에서 고유의 활자체를 명시하게 되면 사용자가 선택한 폰트 크기에서 크게 증가하여 사용자들이 이에 관련된 도움을 요청하거나 화면에서 전체적인 텍스트를 봤으면 좋겠다는 얘기를 하게 됩니다 하지만 개발자들도 아시다시피 ASPI는 굉장히 제한적이잖아요, 그렇죠? 폰트 크기를 기반으로 해서 레이아웃을 변경하지는 않아요 이를 해결하기 위해서 랩 콘텐츠를 사용하면 됩니다 하지만 시스템에는 특정한 부분들이 있어요 예를 들면 [헛기침] 알림 기능 [헛기침] 이러한 기능은 알림 기능과 잘 맞지 않아요 구조의 크기가 모든 추가적인 텍스트를 수용할 수 있도록 변경되지 않기 때문이에요 안드로이드 N에서는 디스플레이 크기 기능을 가지고 있어요 표시창 설정 단추에 가서 클릭을 하면 런타임에서 장치의 dpi를 변경시켜요 장치에 있는 모든 UI에서 단지 텍스트뿐만 아니라 새로운 밀도를 가지도록 변경할 수 있는 새로운 방법이에요 여러분은 모든 걸 크게 확장하거나 여러분이 가지고 있는 작은 화면에 맞춰서 매우 작은 크기로 축소할 수 있어요 085에서 거의 1과 1/2까지 설정할 수 있어요 이제는 제가 말하지 않아도 아실 거라 믿어요 하지만 레이아웃에서 px는 피하시길 바래요 이게 장치의 밀도를 변경하는 것이기 때문에 레이아웃에서 dps를 사용할 때 증가되거나 다른 계산을 사용할 수 있거든요 그 다음으로 여러분이 원했던 것을 보여드릴 거예요 비디오를 이용해서 바로 보여드리면서 정말로 명확하게 여러분의 앱이 sw320p에서 정말로 잘 작동되는 것을 보실 수 있을 거예요 많은 분들이 커다란 화면을 가진 휴대폰을 사용하고 있는 걸 알고 있지만 작은 화면을 가진 휴대폰을 쓰시는 분들도 계시니까요 갑자기 사용자가 밀도를 바꾸게 되면 화면이 곧바로 sw320dp로 바뀌게 될 거예요 이제 여러분의 앱을 조금 더 우아하게 만들어 보겠습니다 여기에 있는 비디오에서 어떻게 할 것인지 보여줄 건데요 이건 라이브 리사이즈에요 화면 크기로 들어가서 슬라이더를 움직이면 더 커지고 작아지죠 모든 것들의 크기가 변경되는 것을 볼 수 있을 거예요 텍스트뿐만 아니라 내비게이션 바, 상태 바 그리고 모든 다른 것들이 변경됩니다 사실 지금 이 부분에서 문제가 생겼어요 기본크기가 원래 이렇게 보이고 폰트 크기를 바꾸게 되면 다른 것들도 커져야 하는데요 하지만 변경되지 않았어요 하지만 화면 크기는 모든 걸 변경시킬 수 있죠 이제 여러분은 휴대폰에서 모든 정보들이 여러분에게 적절하게 보여질 수 있도록 UI의 모든 부분들을 더욱 크게 혹은 더욱 작게 만들 수 있어요 로컬에 대해서 얘기를 해볼게요 자, 해봅시다 좋습니다 고마워요, 댄 멀티 로컬 [박수] 아뇨, 아뇨 아직 안 끝났어요 [웃음] 정말로 보기에 놀라운 것은 객석에서 차양을 따라서 비어있는 좌석의 구조와 형태에요 뒷자리에 앉으면 정말로 덥죠? 이래서 360 피드로 봐야 해요 [웃음] 네 라이브 스트림으로 집에서 보면 덥지 않죠 집에서 영상을 통해서 보시는 분들을 위해서 멀티 로컬에 대해서 얘기하겠습니다 이건 정말로 많은 요청을 받았던 기능이에요 제가 속한 국가에 있는 사람들이 아니라 하나의 언어 이상을 사용하는 사람들이 요청했더군요 [웃음] 진짜에요 이런 말을 많이 들었어요 사람들이 절 좋아한다고요 그리고 이런 분들에게는 UI를 다루는 것이 매우 힘들 수 있어요 때때로 적절한 리소스가 없거나 다른 문제가 있을 때 여러분은 몇 가지 콘텐츠나 앱이 여러분이 선호하는 언어로 알려주거나 다른 시스템 기본값보다는 다른 대비책을 가지기를 원해요 다양한 언어로 설정하고 다룰 수 있는 로컬을 설정하고 싶은 많은 상황들이 있어요 이제는 그렇게 할 수 있습니다 이제 여러분은 이러한 다양한 언어를 선택할 수 있을 뿐만 아니라 여러분이 원하는 대로 장치에서의 보여지는 순서를 설정할 수 있어요 그리고 여러분은 또한 새로운 언어와 우리가 추가한 별어를 넣을 수도 있어요 작은 동영상 캡쳐 기능이 여기에 있고요 여러분이 여기에서 선택할 수 있어요 언어로 들어가면 저는 하나의 언어만 선택했는데요 왜 그랬는지는 모르겠지만요 여기에서 Deutsche를 선택하겠습니다 이건 네덜란드어가 아니라 독일어를 뜻합니다 참고하시길 바래요 저는 리히텐슈타인 변화를 선택했는데요 재미있을 것 같아서 골랐어요 그리고 순서를 다시 정렬해서 이걸 첫 번째에 놓을게요 이렇게 하니 제 UI를 읽을 수가 없네요 이제 독일어가 전체적인 시스템의 주 언어가 되었기 때문이에요 멀티 로컬이었습니다 이걸 사용해보시길 바래요 도즈 모드에 대해서 얘기해볼 거예요 이미 마쉬멜로우에서 도즈 모드가 있었는데요 간단하게 검토만 하겠습니다 시스템 상태를 다루는 직원의 다이어그램을 가져와봤는데요 이걸 보시게 되면 바로 아실 것 같았어요 다이어그램을 바로 여러분에게 보여드리겠습니다 도즈 모드가 무엇인지 곧바로 이해하시게 될 거예요 이건 좀 뻔한 것이긴 하지만 하지만 하이라이트를 사용하고 몇 가지를 지목하여 중요한 부분을 표시했어요 도즈 모드는 화면이 꺼진 이후에 작동됩니다 장치가 정지된 상태이고 배터리로 작동될 때에 나타나죠 얼마 동안 작동하고 있다가 도즈 모드로 들어가게 되요 여기에 보시면 초록색으로 표시되어 있는 부분들이에요 그리고 여기에는 관리 창이 있어요 갑자기 활동이 허용되어서 시스템에 참여하고 있는 거예요 관리 창에서 일반적인 것들을 실행하고 있는 거예요 그리고 여기에서 다시 반복되는데요 여기에 있는 관리 창 사이에서 기하급수적으로 소요 시간이 늘어나요 이렇게 반복적으로 일어나고 그 사이에는 도즈 모드가 있어요 이러한 활동이 발생되지 않는 시간이죠 네트워크 활동이 없고요 지연된 작업과 싱크도 없어요 웨이크록도 없죠 전부 좋아요 배터리가 더욱 오랫동안 지속되게 하죠 이 화면을 보면 다 알 수 있지만 계속 진행하면서 N에 대해서 얘기해볼게요 N에는 이렇게 모든 것들이 있지만 추가적으로 경량인 부분들도 있어서 도즈 모드에서는 이제 정지할 필요가 없어요 사람들의 주머니에서 오랜 시간 동안 있으면서 사용되지 않은 채로 있으니 활동으로 인해서 많은 배터리를 사용하지 않는 게 좋지 않을까요? 정지되지 않은 채로 있는 부분을 발견하여 잠시 동안 기다린 다음에 도즈 모드로 들어가게 되요 그리고 관리 창이 실행되고요 마쉬멜로우처럼 제한적이지는 않지만 그와 비슷한 개념을 가지고 있는 것이죠 여기에서도 보면 바로 알 수 있어요 다이어그램에서 유사한 구성 요소에서는 비슷한 색상을 가지고 있다는 게 보이실 거예요 즉, 유사하게 도즈 모드에 들어간다는 걸 뜻해요 그리고 비슷한 바코드 형태도 있죠 이것 또한 마찬가지에요 [웃음] N에 있는 기능을 다시 정리해보면 제가 방금 말씀 드린 경량 도즈가 있고요 사실상 이미 기능의 수퍼세트에요 장치가 정지된 상태이면서 동시에 경량의 기능을 가지고 있는 모든 기능이 N에 있어요 다이어그램을 이렇게 합친 것보다 더욱 제대로 된 기능을 만들면 이렇게 보이겠죠 [웃음] 제가 말씀 드렸다시피 이건 좀 뻔한 거예요 [박수] 몇몇 사람들은 제가 단어를 좀 더 사용해야 한다고 얘기해요 빨리 넘어가도록 할게요 마쉬멜로우에서 여러분이 장치를 가지고 있고 화면은 꺼져있어요 배터리로 작동하죠 정지된 상태이고 동시에 여러분은 네트워크를 사용하는데 제한되었고 지연된 작업 싱크, 알람이 있고 웨이크록은 없어요 N에서 다음과 같은 기능을 가지고 있고 서비스가 제한되어 있고 경량이에요 하지만 정지된 상태일 필요가 없어요 여러분의 주머니나 다른 곳으로 이동해서 사용해도 됩니다 그러면 여러분에게 덜 제한적이게 되죠 백그라운드 활동이 있기 때문에 동시에 실행되는데 있어서는 여전히 유효해요 오늘 오후 5시에 진행되는 배터리와 메모리 최적화와 강연에 참여하셔서 시스템 상태와 더 많은 것들에 대해서 알아보세요 시스템 상태에 관련해서 말이 나왔으니 스벨테 프로젝트에 대해서 말씀 드리겠습니다 최근에 제품들을 출시했을 때 시작된 프로젝트에요 시스템에서 배터리를 크게 소모시키는 것이 무엇인지 알아내고 앱에서 고쳐야 하는 것들과 필요한 것들을 해결하기 위해서 플랫폼에서 어떻게 할 수 있는지 개발자들에게 알려주기 위해서 만들었는데요 결국 완성해냈습니다 N에서, 이제는 다음과 같은 동작을 더 이상 겪지 않아도 됩니다 물로 이러한 동작들이 그리울 수 있어요 하지만 이제는 보내야 합니다 조사과정 속에서 이러한 상황들을 우리는 발견했어요 팀이 하고 있는 일 그리고 연결성과 관련하여 어떤 일이 발생할지 메시지가 발송되고 이러한 모든 동작들이 활성화 되도록 만들었어요 사용자들이 와이파이 네트워크가 변경됐을 때를 정말로 알고 싶어 하더라고요 그래서 회사 안에서 걸어 다니면서 한 라우터에서 다른 라우터로 옮기면서 모든 활동들을 활성화 할 수 있어요 그렇게 되는 거예요 그 다음은 뭘 해야 할까요? 아무것도 없어요 그리고 다시 자러 갈 거에요 그 동안에 시스템에서는 스래싱을 하고 있어요 전부 다 활성화되어 있으니까요 한 번에 메모리로 다 들어갈 수 없기 때문에 오래된 것부터 정리해서 새로운 파일이 시작될 수 있도록 하는 거예요 그리고 이렇게 지긋지긋한 스래싱이 시작되는 거죠 비슷하게도, 새로운 비디오나 새로운 이미지를 사용자가 촬영하면 그러면 여러분의 휴대폰에 있는 사용 내역 앱에서 결정을 내려요 오, 새로운 이미지에 대해서 인식하려고 하네요 사용자가 영수증을 사진으로 찍었을 수 있으니까요 그래서 활동이 관련된 40개의 파일과 함께 활성화되죠 그리고 여러분이 고양이의 이미지를 찍었기 때문에 그 사진에 대해서 인식할 것이 없다는 걸 알게 되면 다시 비활성화가 되요 트래싱과 비슷하죠 왜 우리가 그러한 기능을 줄이면서 단순히 이러한 전달 과정을 없애고 사용자의 편의를 위하여 배터리를 연장시켜 장치의 수명을 더욱 늘리지 않았을 까요? 대신에 새로운 접근을 이용했어요 잡스케줄러를 사용했죠 우리가 최근의 출시에서 얘기를 나눠본 주제에요 특히 새로운 API가 있는데요 콘텐츠를 변경에 대해서 요청을 허용하는 기능으로 여러분의 주의를 기울였으면 해요 곧바로 실행되지는 않아요 이전의 접근에 관련하여 문제가 있거든요 하지만 작업이 스케줄에 들어가기만 하면 새로운 미디어에 대해서 여러분이 알 수 있을 거예요 다시 말씀 드리지만, 배터리와 메모리 최적화 세션에서 더 많은 것을 알아보시길 바래요 그러면 앱은 여러분이 고양이 사진을 찍을 수 있도록 허용하겠죠 네 [웃음] 그럴 거예요 알고 보니 [청취불가]가 사용내역에 유효한 사진이었던 거죠 네, 좋은 지적이에요 고마워요 데이터 세이버는 사용자들에게 몇 가지 기능을 가능하게 만들어줘요 [청취불가] 장치에게, 그러니까 시스템에 특정한 앱이 사용하는 데이터의 양을 제한하도록 알릴 수 있어요 제가 살고 있는 이곳에서는 와이파이에 대해서 그다지 신경을 쓰지 않는데요 저는 데이터 플랜을 사용 중이고 데이터가 무제한이라서 그렇게 중요한 게 아니에요 물론, 전 세계적으로 보면 그렇지 않죠 네트워크 접근에 대해서 정말로 큰 비용을 부과해야 할 수도 있으니까요 아니면 정말로 속도가 정말로 느릴 수도 있고요 모든 사람들이 가지고 있는 제한된 대역폭이나 요금제로 사용 중인 대역폭을 다 사용하길 원하지 않으실 거예요 그래서 우리는 사용자들이 데이터 사용을 관리할 수 있는 기능을 제공합니다 더 적은 데이터를 사용하도록 알려줄 뿐만 아니라 특정한 앱에서 데이터 사용을 허용하거나 제한 또는 허용하지 않는 거죠 시스템 설정에 들어가면 이제는 여러분이 이걸 각각의 앱에 기반하여 토글하면 되는 거예요 개발자의 측면에서 보면 여기에 주의를 기울여야 한다는 거겠죠 여러분의 앱이 언제든지 제한될 수 있으니까요 이러한 것이 이루어지는 지에 대해서 여러분이 알아낼 수 있는 메커니즘이 시스템에 있으니 여러분은 접속 서비스에 대해서 문의하여 여러분이 A, 사용하는 만큼 계산되는 요금제 네트워크에 있는지 B, 백그라운드 접근이 사실상 제한되어있는지 알 수 있어요 다이렉트 부트, 안드로이드 N에서 제가 가장 좋아하는 특징 중의 하나에요 여러분의 장치에 PIN 코드를 설정해놓으면 장치는 암호화될 것이고 몇 가지 이유로 인하여 재시동되면 업데이트를 했거나 자동업데이트를 했을 수도 있고 아니면 즉흥적으로 재시동을 했을 수도 있죠 그렇게 되면 때때로 장치에서 PIN 코드 화면으로 나타날 수도 있어요 여러분이 PIN 코드를 입력해야 하죠 그렇게 되면 여러분은 문자 메시지나 이메일 또는 전화를 못 받을 수 있어요 하지만 지금의 시스템에서 다른 점은 여러분에게 PIN 코드를 요청하기 전에 잠금 화면으로 나타나면서 시동될 것이에요 여러분이 PIN 코드를 입력하고 몇 가지 앱이 작동시키고 다이렉트 부트 모드를 작동시킬 수 있는 여러분의 앱을 등록시킬 수 있을 때까지 말이에요 즉, 잠금 화면에서도 여러분은 몇 가지 기능에 접근할 수 있는 거예요 전화를 받거나 메시지를 받는 기능 말이죠 이에 대해서 더 많은 것들을 알고 싶으시거나 이러한 모드를 사용할 수 있는 여러분의 앱에서 어떠한 것들을 할 수 있는지 알고 싶으시다면 목요일 오전 9시에 있는 강연에 참여해주시길 바랍니다 안드로이드 보안에 대한 강연이 될 거예요 많은 요청을 받았던 또 다른 특징은 외부의 저장공간에서 특정한 디렉토리에 대한 접근이에요 만약 여러분의 앱이 사용자의 외부 저장공간에 있는 이미지, 음악, 비디오 또는 다른 것들을 인식해야 한다면 지금까지는 여러분이 전체적인 저장 공간에 대한 접근을 요청해야 했어요 플레이 스토어에서 앱을 다운로드 받을 때 사용자들이 약간 두려움이 될 수 있는 승인 이었어요 그 대신에, 여기에 있는 스크린 샷을 보시면 여러분의 앱은 특별하게도 이미지나 음악과 같이 하나의 디렉토리에 대한 접근을 요청할 수 있어요 N의 새로운 승인 시스템과 조합하여 사용자들이 어떤 앱을 사용하려고 하는지 그리고 어떤 앱이 접근할 수 있는지 확실하게 볼 수 있어요 안드로이드 포 워크에 관해서 여러분이 이에 관한 세션에 참여했으면 좋겠는데요 정말로 많은 것들에 대해서 다뤄요 이번 출시에서 안드로이드 포 워크에 있는 몇 가지의 특징만 여러분에게 말씀 드리려고 해요 그러니 목요일 오전 2시에 있는 작동 중인 여러분의 앱에 관한 세션에 참여하세요 그 동안, 여러분의 휴대폰에 업무 프로필이 설치되어 있다면 새로운 기능인 워크 모드가 있는데요 이건 워크 모드를 비활성화 하는 기능이에요 이에 대해서 조금 더 강조해서 말씀 드려야 할 것 같네요 워크 모드가 아니에요 빠른 설정에 들어가서 토글을 해제하면 되요 그렇게 하고 보시면, 여러분이 화면에서 볼 수 있을지 모르겠지만 작업 프로필 앱이 비활성화 되었어요 여기에 있는 것들 중에서 하나를 클릭하고 다이얼로그가 나오는데요 이걸 비활성화 할게요 이걸 켜고 끄기만 하면 되요 정말로 쉬워요 여러분이 선택하기만 하면 주말 동안에 업무용 이메일을 확인하지 않고 시간을 보낼 수 있어요 워크 챌린지라고 불리는 것도 있는데요 회사에서 해야 하는 불편한 인증과 같은 것들을 하지 않아도 되도록 하는 거예요 추가적으로 잠금 화면에서 제한하는 패스워드를 회사에서 요청하는데요 이제는 그렇게 하지 않아도 됩니다 대신에 여러분은 업무 프로필 앱이 작동될 때를 위해서 하나의 패스워드를 제공하면 됩니다 동영상 캡쳐한 것을 보여드릴게요 업무 프로파일 앱을 작동시키면 여러분의 패스워드를 확인하죠 그리고 앱이 실행되요 그리고 이제는 다른 워크 앱을 작동시켜볼게요 곧바로 실행될 거예요 여러분이 이미 전체적인 시스템에 인증했기 때문이에요 이제는 우리가 여기에 있는 진짜 이유를 말씀 드릴게요 개발자들을 위해서죠 처음으로 말씀 드릴 중요한 부분은 이미 기조연설에서 다뤄졌는데요 런다임을 변경하는 거예요 이제는 훨씬 빠른 인터프리터를 사용할 수 있어요 즉, 여러분의 앱이 설치될 때에 롤리팝이나 마쉬멜로우처럼 예정보다 빨리 편집되지 않아요 먼저 인터프리팅 모드로 작동되어서 JIT이 여러분의 앱에서 매우 자주 작동되거나 높은 성능으로 효율적인 코드의 부분들을 인식하면 제 시간에 모든 것들을 곧바로 편집할 거예요 여러분의 장치가 대기모드로 들어가면 앱애서 예정보다 미리 작동되는 부분의 프리컴파일로 JIT에서 모인 정보를 사용할 것이에요 이렇게 세가지를 알아볼 거예요 인터프리터, JIT 그리고 예정보다 빠른 컴파일 이러한 작업을 하는데 몇 년이 걸렸어요 이러한 세 가지 모두를 작업했어요 이제는 이러한 세 가지를 동시에 할 수 있어요 금요일 오후 1시에 미술 팀에서 진행하는 미술에 발전에 관한 강연에 참석하길 바랍니다 미술에 대한 모든 것들에 대해서 상세하게 강연할 것입니다 새로운 런타임 라이브러리도 있는데요 ICU4J의 새로운 기능으로 이제는 프레임워크의 일부분이에요 ICU는 라이브러리에요 여러분의 앱의 세계화와 인터넷 문명화에 유용하죠 꽤 큰 규모의 라이브러리에요 이제는 프레임 워크의 일부에요 다양한 패키지 이름을 가져서 기존에 있는 패키지 이름과 충돌하지 않아요 이제 여러분은 프레임워크의 기능을 사용하는 거예요 APK의 규모를 줄일 수 있죠 몇 가지 새로운 javautil 패키지도 추가했어요 여기에 javautil기능이 있는데요 Predicates와 같은 기능적인 스타일의 프로그래밍에 유용한 클래스와 API를 가지고 있어요 새로운 스트리밍 API도 있어요 새로운 언어 기능과 함께 조합하여 사용할 때에 굉장히 유용해요 새로운 자바 8 프로그래밍 언어 기능을 사용하기를 원하신다면 여러분의 그래이들 빌드 파일을 새로운 잭 컴파일러로 변경하셔야 합니다 또한 프로그래밍 언어 18 소스와 바이너리가 호환성을 갖도록 해야 해요 그렇게 하면, 여러분은 람다 기능에 접근할 수 있어요 람다는 여러분의 클래스에서 익명으로 실행되며 빠르게 인식되어서 진저브래드까지 호환이 가능해요 람다가 어떤지에 대한 예시가 몇 가지 있어요 어떤 것인지 잘 모르시거나 한번도 써보신 적이 없다면 이에 관한 문서와 기사 가 온라인에 많이 있어요 확인해보시길 바랍니다 여러분의 삶을 훨씬 더 좋게 만들어 줄 거예요 RxJava와 같은 것들을 사용하거나 안드로이드 UI 프레임 또는 람다를 많이 필요로 하는 경우에는 훨씬 더 쉬울 거예요 하지만 조심하셔야 해요 이러한 것들은 익명의 클래스를 생성해내니까요 보여지는 것보다 대가가 큰 편이에요 하지만 대다수의 앱에서는 그렇게 문제되지 않아요 기본값과 동적 인터페이스 방법은 두 개의 매우 유용한 기능이에요 이전의 기능과는 호환되지 않지만요 만약 기존의 인터페이스를 가지고 계시다면 새로운 방법을 추가하고 우리의 기본값을 실행할 수 있어요 추상 클래스에서 할 수 있는 것과 매우 유사하죠 다시 한번 말씀 드리지만 어떠한 파일이든지 고객과의 문제 없이 여러분의 APS를 보낼 수 있어요 많은 수신자들이 보게 될 유명한 어댑터 패턴을 생성하는데 쓸 수도 있어요 몇 가지 콜백 메소드를 가지고 있는 수신자가 있어요 일반적으로 그 다음으로 제공되는 어댑터 클래스는 이러한 모든 메소드를 실행하여 여러분이 그 중에서 한 가지의 메소드를 실행하려고 할 때에 모든 메소드를 선언할 필요가 없어요 그래서 이제는 기본값 메소드를 사용하는 것이 매우 쉽습니다 또한 인터페이스에서 동적 메소드를 가질 수 있어요 주석을 반복에 대해서 얘기하자면 여러분들 중 대다수는 수 많은 주석이 있지만 그러한 기능에 만족해하는 멋진 프레임워크를 가지고 있을 거예요 또한 불행하게도, 이전의 버전과 호환되지는 않아요 하지만 이제는 하나의 주석을 가지고 있어요 하단에 보면 @Exportable이라고 예시가 있죠 같은 종류로 여러 번 적을 수 있어요 예를 들어, 클래스를 하나 가지고 있다고 해볼게요 다른 포맷으로 직렬화 할 수 있는 클래스를 가지려고 하기 위해서 주석에 값을 정렬하는 방법을 사용하는 대신에 주석을 그냥 반복하기만 하면 됩니다 오디오 팀과 미디어 팀이 정말로 열심히 일했어요 안드로이드의 이전의 버전에서 오디오 지연을 줄이기 위해서 말이죠 대다수의 작업은 시스템의 본질적인 부분을 다루면서 이전에 이미 처리 되었어요 그리고 결국 오디오의 지연을 줄이기 위한 일은 더욱 높은 수준에서 이루어 졌죠 물론 여러분의 장치에 따라서 다를 수 있지만 오디오를 재생하면 40에서 70밀리세컨드의 지연이 줄었어요 활성화 하기에 굉장히 쉽죠 화면에 보시면 바로 예시가 있는데요 여러분의 미디어 플레이어에 오디오 속성을 생성할 때에 단지 저 지연 표시를 설정하기만 하면 되요 그리고 새로운 특징에 여러분이 접근할 수 있도록 만들었는데요 재생을 개선시키기 위해서 사용할 수 있는 몇 가지 새로운 API입니다 여러분이 미디어를 다시 재생할 때에 실행되는 언더런의 수를 생성할 수 있는데요 역동적으로 크기를 조절할 수도 있어요 지나치게 많은 언더런이 있으면 여러분의 버퍼가 실행을 하기 시작해요 이에 대해서 더 많은 것을 알고 싶으시다면 특히 여러분의 지연을 더욱 더 개선시키기 위하여 근본적인 API의 본질을 사용하는 방법을 알고 싶으시다면 목요일 오후 3시에 있는 강연에 참여하세요 렌더스크립트, 수 많은 부분이 개선되었어요 이제는 단일 소스 파일이에요 이제 여러분은 서로 호출할 수 없는 많은 커널을 가질 수 있어요 복잡한 컴퓨터 프로그램을 생성하기에 훨씬 더 쉬워졌죠 우리는 또한 축소판 커널을 만들었어요 그래서 여러분은 맵리듀스 종류의 API를 사용할 수도 있어요 예를 들어, 여러분이 히스토그램을 계산해야 한다면 축소판 커널을 이용하여 할 수 있죠 다양한 이미지에도 접근할 수 있어요 Allocation

getByteBuffer도 추가했어요 렌더스크립트 커널을 작동할 때에 생겨서 여러분이 가지고 있는 할당량을 줄이는데 도움을 줄 수 있어요 마지막으로, 여러분이 정말로 많은 데이터를 다루신다면 여러분을 위하여 우리는 16비트의 부동 소수점을 지원합니다 여러분의 데이터의 크기를 반으로 줄일 수 있도록 도와주죠 정확성이 여러분에게 중요한 요소라면 이에 대해서 알아보시는 게 좋을 거예요 OpenGL ES 32은 그래픽에 관심이 있는 사람들을 위한 거예요 OpenGL ES의 가장 최신 버전이죠 안드로이드 N에서 공개하는 건데요 효과적인 OpenGL ES 31 플러스로 안드로이드 확장팩으로 불려요 안드로이드 확장팩은 OpenGL 확장판의 묶음이죠 이러한 확장팩이 여러분의 장치에 도입되면 여러분은 이러한 모든 확장 기능에 접근할 수 있어요 이건 OpenGL ES 개발자들의 삶을 훨씬 더 편하게 만들어 줄 거예요 이러한 내용은 OpenGL ES 32 설명서에 다 포함되어 있어요 단 한가지만 빼고 말이죠 슬라이드를 보면 아실 수 있어요 고급 혼합 방식을 포함하여 강조되어 있는 부분이에요 이제는 하드웨어가 이러한 모든 혼합된 모드를 감당할 수 있어요 포토샵이나 여러분의 이미지 프로세싱 앱에서 볼 수 있는 모드 말이죠 이를 위해서 셰이더를 더 이상 적을 필요가 없어요 이제는 OpenGL의 한 부분이에요 여러분은 테셀레이션과 지오메트리 셰이더를 쓸 수 있어요 런타임에서 지오메트리를 생성하는데 매우 유용한 것들이에요 일반적으로 여러분이 할 수 있는 것은 꽤 간단한 메쉬에요 카메라가 물체에 점점 더 가까워지면서 더욱 더 많은 삼각형을 역동적을 추가할 수 있어요 화면에서 더욱 부드럽게 보이게 말이에요 이렇게 추가적인 삼각형이 필요하지 않을 때에는 메모리를 많이 사용하거나 성능에 신경 쓰지 않아도 되요 새로운 텍스쳐 압푹 포맷이 있는데요 ASTC 라고 불려요 그리도 다른 기능도 있죠 OpenGL ES를 사용하시면 기조연설에서 이미 언급되었던 불칸에 대해서 신경을 많이 쓰실 건데요 더 많이 알고 싶으시면 오늘 오후 6시에 이에 관한 강연이 있을 거예요 참여하시면 좋겠죠 불칸은 그래픽에서 낮은 수준의 API에요 OpenGL보다 더 낮아요 어떻게 보면 여러분은 사실상 드라이버가 되는 거예요 여러분이 다중 스레드에서 GPU에 명령을 생성할 수 있는 거죠 그렇게 되면 여러분의 앱의 효율성을 개선시킬 수 있어요 드라이버 자체에 오버헤드가 지나치게 있을 수 없어요 더 많은 드로우 콜을 만들 수 있죠 화면에 더욱 많은 오브젝트를 둘 수 있고 여러분의 셰이더를 오프라인으로 프리컴파일 할 수도 있어요 확인하는데 굉장히 유용하겠죠 규모가 큰 최적화에도 말이에요 장치에 있는 드라이버가 여러분의 셰이더를 최적화 하는 것과 셰이더를 편집하는데 너무 많은 시간을 보내지 않으면서 균형을 찾으려 하기 때문이에요 크로스 플랫폼 API도 있어요 안드로이드 N에 있는 불칸은 윈도우나 리눅스에서 볼 수 있는 불칸과 같아요 오늘 드라이버에서 전달되죠 여러분의 컴퓨터에서 여러분만의 코드를 적을 수도 있어요 그 이후에 휴대 기기에서 작동시킬 수 있죠 또한 OpenGL ES보다는 약간 더 어려워요 정확한 메모리 관리와 동기화를 해야 해요 우리는 미들웨어에서 불칸의 상당히 증가할 것이라고 생각해요 유니티나 언리얼 엔진과 같은 엔진들은 불칸을 지원하거나 불칸의 지원을 받아서 작동해요 이러한 엔진 중에 하나를 사용하신다면 아무 문제 없어요 여러분의 앱이 무료로 더욱 좋아지는 거니까요 기능성 뿐만 아니라 성능에 관련하여 adb를 위한 개선점들이 있어요 우리는 더욱 완전한 기능을 만들려고 했어요 더욱 전체적으로 말이에요 그래서 여러분은 꽤 많은 컨텐츠를 사용할 수 있어요, 예를 들어 LS 이러한 것들에 관해 adb에서 일어난 결과를 볼 수도 있어요 호스트를 이용하여 다른 프로세스로 이걸 보낼 수도 있고요 여러분이 사용할 수 있도록 더욱 완전한 기능을 제공하고 있어요 또 다른 거대한 성능 개선점이 있는데요 정말로 복잡한 알고리즘에서 특별히 노력해서 이뤄낸 건데요 버퍼 크기를 늘리는 거죠 [웃음] 구글에서는 이런 걸 해요 [웃음] 그래서 해 보세요 adb를 아신다면 선택권이 별로 없다는 걸 아실 거예요 하지만 즐겁게 이용하죠 예를 들어, 프로세스 종료 상태를 설정하고 멀리 있는 장치에 표준 입력을 전송할 수 있는 것은 특히 테스를 자동화하는데 유용해요 여러분의 장치에서 많은 것들을 자동적으로 실행시킬 수 있고 올바른 결과를 얻어낼 수 있죠 NDK의 모든 변경사항에서 우리는 클랭을 38로, 그리고 GCC를 4

9로 업그레이드 했어요 우리가 GCC를 업데이트 했지만 이번 GCC는 NDK에서 지원되는 마지막 버전일 거예요 만약 여러분이 아직도 GCC와 NDK를 사용하신다면 이제는 여러분의 앱을 클랭에서 테스트 하시는 게 좋을 거예요 이제는 바꿔야 할 때라고 생각합니다 우리는 또한 기본값을 만들었어요 arm7 아키텍처 기본값이죠 기존의 아키텍쳐는 잊으셔도 되요 그래서 여러분의 배너는 더 나은 최적화로 인해 이득을 볼 것이고 이것은 오늘날의 기기와 더욱 잘 연동이 되어야 하죠 VR, 이에 대해서 기조연설에서 간단하게 들으셨을 건데요 이번 주에 이에 대해서 조금 더 상세하게 알아볼 거예요 여러분이 알아야 하는 API의 거대한 서버 영역에 대해서 얘기할 거예요 먼저, 여러분은 장치에 있는 기능에 대해서 알아야 해요 장치는 기능보다 조금 더 구체적이에요 기조연설에서 들어서 아시겠지만요 그리고 여러분이 아셔야 할 API가 있습니다 나머지 세부사항에 관해서는 세션에 참가하셔서 알아보시길 바래요 정말로 많은 API가 있거든요 저번에 제가 봤을 때는 VR에 관해 대략 18개의 세션이 있었어요 그러니 한 번 보시길 바래요 제 생각에 이 중에서 가장 중요한 건 몇 가지 기술적인 세부사항에서 다룬 건데요 내일 아침 9시에 있는 것 같네요 하지만 스케줄을 확인해보세요 VR단계를 사용하면 아마 바로 아실 거예요 이건 마치 미안하지만, 뭐, VR? VR 보시다시피, 네 개를 인용했어요 두 개가 아니에요 네 개에요 네 개를 인용했어요? 네 개별적으로 말이죠 그렇군요 제가 덧붙일게요, 여러분이 VR에 관한 경험이나 게임, 가상 미술관이나 뭐든지 이러한 API가 여러분을 위한 게 아니라면 여러분의 앱에서 작동시키지 마세요 여러분의 앱을 더욱 빠르게 만들 수 있을 거라고 생각하신다면 이건 여러분을 위한 게 아니에요 VR을 사용하는 사람들을 위해서죠 맞아요 여러분을 위한 게 아니에요 절대 아니죠 [웃음] 서포트 라이브러리, 이건 N의 새로운점이 아니에요 하지만 간단하면서 빠르게 최근의 출시에 관해 몇 가지를 설명 드리려고 해요 232 출시에서 사람들이 고대하던 여러 가지 기능을 제공했는데요 나이트 모드 기능이에요 여러분의 앱이 밝고 어두은 테마 사이에서 빠르게 토글할 수 있는 기능이에요 머티리얼 디자인을 위한 하단메뉴 UI와 벡터/드로어블 그리고 애니메이티드벡터드로어블은 롤리팝에 있는 원래의 기능을 출시했을 때부터 사람들이 요청하던 기능이었어요 우리는 잘 몰랐죠 알고 보니 실행하기 꽤 까다로웠어요 리소스가 프로세스 되는 방식뿐만 아니라 드로어블과 이전의 버전과 호환되는 방식으로 작동되는 것 때문이었어요 처리하는데 좀 걸렸지만 결국 완성했어요 조금 이전의 출시에 있기 때문에 한 번 찾아서 확인 해보시고 사용해보시길 바래요 더욱 작은 규모인 APK로 이동해보세요 벡터가 같은 규모의 이미지보다 더 작은 경우가 많거든요 PNG나 JPEG같은 파일말이에요 리사이클뷰 오토매져, 또한 랩 컨텐츠 이러한 것들은 오랫동안 요청을 받아온 거예요 그래서 출시에 포함되었죠 231에서, 우리는 API를 리사이클뷰로 약간 조정했어요 더욱 좋은 성능을 허용할 뿐만 아니라 더욱 많은 기능이 있는 아이템을 가진 애니메이션을 위해서 말이죠 이러한 기능도 확인해보세요 벡터드로어블에 대해서 말해서 말인데요 콜트가 진행하는 강연이 있는데요 언제인지는 모르겠네요 이미지 압축과 여러분의 APK의 규모를 줄일 수 있는 방법에 대해서 다뤄요 벡터드로어블에 대해서도 얘기할 거예요 PNG와 JPEG 그리고 WebP를 사용하여 여러분의 앱을 더욱 작고 좋게 보일 수 있도록 만들 수 있는 기능도 얘기하고요 아, 그 기능이요 서포트 라이브러리에 관하여 제가 말씀 드리고 싶은 건 저는 이걸 미래라고 부르기도 하는데요 개발자들이 정말로 큰 관심을 가질 만한 흥미로운 점들이 있는데요 하지만 서포트 라이브러리에서의 새로운 점에 관한 세션이 있으므로 여기에서 말씀 드리는 것보다는 오늘 오후 4시에 진행되는 세션에 참석하셔서 앞으로 출시될 서포트 라이브러리에 관련하여 새로운 사실에 관해 알아보시길 바래요 이에 대해서 간단히 말씀 드릴게요 제가 좋아하는 주제니까요 실행에 관련된 세부사항이에요 외부에 있는 사람들은 알 리가 없는 부분이에요 하지만 N 프리뷰의 출시에서 벡터드로어블 성능은 크게 개선되었어요 로딩 측면뿐만 아니라 퍼스트드로우 측면에서의 성능과 개선에 중점을 두고 작업했으니까요 그래서 비트맵을 생성하고 여기에 만들었죠 이러한 경로를 만들어내는데 오랜 시간이 걸렸어요 여기에 시간을 투자했죠 파싱을 하는데도 시간을 투자했고요 정말로 복잡한 경로를 가지고 있으면 자바 수준에서 경로가 있는 파싱 작업에서 시간이 많이 소요돼요 여기에서 정말로 속도를 내며 작업했죠 벡터드로어블을 사용할 수 있도록 말이에요 플로트속성과 인트속성을 볼게요 제가 가장 좋아하는 속성이에요 왜냐하면 이걸 확인하게 되면 정말로 N에서 이 코드만 가지고 작업하신 거예요? 그럴수도 있죠 난 확신해요 아뇨, 아뇨 사실 저는 다른 코드도 많이 만들었어요 그리고 확인해보니 문제가 몇 가지 있더라고요 그래서 다시 확인했죠 [웃음] 플로트속성과 인트속성을 위하여 저는 많은 코드를 만들었을 뿐 아니라 이걸 대략 2년전에 이미 만들었어요 하지만 API뒤에 숨어 있었죠 이러한 기능이 공개된 API에서 노출될 때까지 사람들이 기본적인 속성 오브젝트만 사용하면서 이 기능에 접근할 수 없다는 걸 발견했어요 이제 나오게 되었으니 사용해보세요 특히 애니메이션을 위해서 말이에요 속성을 설정할 때에 JNI로 들어가서 백업하는 전형적인 매커니즘을 사용하지 않고 조금 더 직접적인 메소드를 사용하도록 허용해요 약간의 성능의 개선도 추가되었고요 그 외에 뭐가 있을까요? 안드로이드 인스턴트 앱 오늘 아침 기조연설에서 이걸 다뤘어요 여러분은 우리가 샌드박스 영역에서 데모를 확인하는 걸 보셨을 거에요 내일 아침에 하는 강연도 확인해보세요 개발자를 위한 안드로이드 플레이의 새로운 점에 관해서요 더욱 세부적인 내용을 다룰 거예요 여기서 가장 중요한 점은 출시된 제품을 얻는 거에요 아직 구매하지 않으셨다면 개발자 프리뷰 3에서 구매할 수 있으실 거예요 세션이 언제 시작하는지는 잘 모르지만 실제로 인터넷에 언제 나오는지도 잘 몰라요 하지만 가면 있을 거예요 가서 확인해보세요 dandroidcom을 모르시면 유용한 URL이 있어요 여기에 있네요 프리뷰를 구매하세요 SDK를 설정하시고요 그리고 꼭 버그를 신고하세요 그리고 빨리 해보세요 이번 출시를 마무리하려고 하니까요 다른 것들이 또 있나요? 그러면 제가 잠시만 콘스트레인트 레이아웃에 관하여 몇 가지만 말씀 드리려고 해요 제가 많이 신경쓰는 부분이니까요 여러분이 참여할 수 있는 코드 실험실이 있어요 만약 여러분이 이미 사용하고 계시다면요 그 외에는 몇 가지 질문을 받아도 될 것 같아요 약간 어색할 것 같지만요 관객들에게 마이크가 있나요? 우리가 어떻게 질문을 받아야 할지 모르겠네요 그냥 크게 말하세요 그거 아세요? 질문을 가지고 있는 2,000명의 사람들을 위해서 우리는 매일 하루가 끝날 때쯤 집무시간을 가지고 있어요 안드로이드 N 오피스 아워라고 불리는 집무 시간이에요 플랫폼을 다루는 많은 사람들이 있을 거예요 N을 위해서 일하는 사람들이죠 사실은 다른 출시에서도 열심히 일해온 사람들이에요 그곳으로 여러분의 질문을 가져 가세요 그 외에는 팀을 위해서 일하는 시간이에요 멀티윈도나 다른 것들을 위해서 말이에요 스케줄을 확인해보세요 그러면 질문을 받겠습니다 질문은 받지 않는 게 좋을 것 같아요 좋아요 약간 어색하네요 이제 마무리 하겠습니다 그리고 감사합니다 감사합니다 [박수] [신나는 음악] [전자 음악]

Build the new, modular Android App Bundle (Google I/O ’18)

피에르 레 세네 : 안녕하세요 저는 Pierre이고 Google Play의 소프트웨어 엔지니어입니다

안토니 모리스 : 안녕하세요 저는 Google Play의 소프트웨어 엔지니어 인 Anthony입니다 IBRAHIM KARAHAN : 저는 Google의 파트너 개발자 옹호자 인 Ibo입니다 피에르 레 세네 : 음, 여러분 중 일부는 이전 세션에서 온 것일 수도 있습니다 Google Play에 대한 개요를 제공 한 원형 극장에서 동적 게재 및 새로운 게시 형식 안드로이드 앱 번들 (Android App Bundle)과 어떻게 이것은 애플 리케이션을 작게 만들 것입니다

이 세션에서는 기술 심층적 인 다이빙을 할 것입니다 이 새로운 출판 형식 우리는 그것이 무엇을 포함하는지, 그것을 어떻게 만드는지, 그것을 게시하는 방법뿐만 아니라 그것을 테스트 할 수있는 다른 방법을 제공합니다 Google Play의 생성 및 게재 방법에 대해서도 설명합니다 APK를 최종 사용자에게 제공합니다

이제 Android App 번들의 형식부터 시작해 보겠습니다 Android App Bundle은 zip 아카이브입니다 이미 익숙한 파일이 들어 있습니다 APK에서는 텍스트 파일, 리소스, 자산, 네이티브 라이브러리 앱 번들과 APK가 두 가지 목적을 지닌 두 가지 고유 한 형식입니다

앱 번들은 순전히 출판 형식입니다 그래서 그것은 장치에 직접 설치 될 수 없습니다 또한 일부 메타 데이터 파일 최종 APK에서 끝나지 않는 도구가 올바른 방식으로 APK를 구축하는 데 도움이됩니다 마지막으로 앱 번들의 형식이 APK보다 엄격합니다 우리는 도구가 완전히 묶음에있는 파일 이해하기 유효한 APK를 생성 할 수 있습니다

이제 하나의 앱 번들을 열고 내부 내용을 살펴 보겠습니다 그래서 그 묶음을 열면, 이것은 당신이 기대해야하는 것입니다 그래서 이것은 많은 사람들에게 익숙해 져야합니다 바퀴를 다시 발명하는 대신에, 우리는 APK의 일부 구조를 재사용하기로 결정했습니다 우리가 파일을 더 잘 설명하는 데 필요한 것을 수정해야합니다

그래서 우리는 그들을 자유롭게 통과 할 것입니다 시작하려면 앱 번들에 다중 모듈 지원, 전에 들었을 수도 있습니다 그리고 곧 모듈에 대해 더 자세히 알려 드리겠습니다 지금 당장은 최상위 디렉토리 앱 번들에는 모듈의 이름이 있습니다 모듈에는 항상 base라는 모듈이 있습니다

번들에 이것이 우리가 여기서 바라 보는 것입니다 Android 매니페스트가 계속 표시됩니다 새 프로젝트는 실제 XML 파일입니다 APK에서는 바이너리 형식을 볼 수 있습니다

앱 번들에서 프로토콜 버퍼로 컴파일됩니다 형식을 사용하면보다 쉽게 ​​변환 할 수 있습니다 APK와 달리 dex 파일은 dex라는 디렉토리 아래에 있습니다 Android 리소스, 애셋, 반면에 부정적인 도서관은, APK와 동일한 디렉토리 구조를 따르십시오 유일한 차이점은 XML 리소스입니다

이들은 또한 프로토콜 버퍼 포맷으로 컴파일되며, 바이너리 형식 대신 resourcespb 파일은 리소스 테이블입니다 이것은 파일 resourcesarac과 같습니다

APK에서 보았을 수도 있습니다 앱에있는 리소스를 설명합니다 및 타겟팅pb 확장자는 프로토콜 버퍼 형식입니다

다시 말하면, 이전에 도구를 변형하기가 더 쉬워졌습니다 APK에서 이진 형식으로 변환됩니다 assetspb 및 nativepb 파일 자산에 대한 자원 테이블과 동일합니다

및 네이티브 라이브러리 그래서 자산이나 네이티브 라이브러리가있는 경우에만 존재합니다 또한 파일의 대상 지정을 설명합니다 각각의 디렉토리에 있습니다 앞에서 언급 한 것처럼 리소스 테이블, 자산 테이블 및 기본 라이브러리 테이블 앱 파일 타겟팅에 대해 설명합니다

그래서 나는 그것이 의미하는 바를 설명하겠습니다 파일 타겟팅은 설명입니다 주어진 파일을 대상으로하는 장치 또는 사용자 유형 Google Play 동적 게재의 핵심 개념입니다 파일 타겟팅을 이해 한 이후 은 주어진 사용자에게 필요한 파일 만 제공 할 수 있음을 의미합니다 그리고 이것이 우리가 앱을 더 작게 만들 수있게 해줍니다

앱 번들은 APK에 존재하는 타겟팅을 다시 사용합니다 당신은 이미 이것에 익숙합니다 그래서 나는 빨리 가서 빨리 달릴 것입니다 리소스의 경우, 예를 들어, 리소스의 디렉토리 이름에 HDPI HDPI 장치를 대상으로 지정하거나 프랑스 사용자를 대상으로 fr을 추가하십시오 네이티브 라이브러리의 경우 동일합니다

디렉토리에 아키텍처를 추가합니다 여기서도 새로운 것은 없습니다 앱 번들도 같은 방식으로 작동합니다 이제 우리는 당신 중 일부를 위해, 애셋은 앱의 큰 부분을 차지합니다 따라서 앱 번들은 자산 타겟팅을 지원합니다

언어 타겟팅부터 시작합니다 곧 텍스처 압축 형식을 추가 할 예정입니다 및 그래픽 API 버전 따라서 우리는 관련 자산 만 사용자에게 제공 할 수 있습니다 앱과 게임의 크기를 줄이십시오

이것이 대상 자산 디렉토리를 만드는 방법입니다 해시 기호를 사용하는 동안 타겟팅하는 저작물 디렉토리를 식별하려면 다음에 정의하는 키가옵니다 우리가 목표로 삼고있는 차원들 – 예를 들어, lang은 언어를, tcf는 텍스처 압축 포맷을, 등등 그런 다음 키와 관련된 값이옵니다 음, 몇 가지 예를 살펴 보겠습니다

애셋이 포함 된 디렉토리의 예는 다음과 같습니다 프랑스어 사용자 이것은 자산 디렉토리의 또 다른 예이며, 여기서 텍스쳐 압축 포맷에 기초하여 타겟 화되고, etc1 형식을 지원하는 장치를 타겟팅합니다 이제 앱 번들 형식에 대해 더 많이 알고 있으므로 나는 Anthony에게 그것을 넘겨 줄 것이다 사용자에게 소규모 앱을 제공하는 데이 방법을 사용하는 방법을 알려줍니다 ANTHONY MORRIS : 고마워, 피에르

안녕, 모두들 피에르가 너에게 설명하고 있었어 우리가 어떻게 형식을 바꾸는 지 Play 스토어에 게시합니다 그리고 지금 나는 너에게 설명 할거야 사용자에게 제공하는 서비스의 형식을 어떻게 변경하는지, 어떻게 우리가 이것을 제공하는 데에만 사용하는지 각 사용자에게 필요한 것

이제 분할 된 APK부터 시작하겠습니다 그래서 Android Lollipop에서 Android에 기능을 추가했습니다 플랫폼으로 분할 APK라고합니다 Split APK를 사용하면 여러 APK를 장치에 설치할 수 있습니다 마치 하나의 앱에 속한 것처럼 행동합니다

이 분할 APK를 설치할 수 있습니다 다른 장치에서 다른 조합으로, 한 번에 하나씩 설치하거나 한 장씩 설치할 수 있습니다 이제 분할 된 APK는 일반 APK와 동일한 형식을 갖습니다 여기에는 Java 코드 색인 파일, 원시 코드, 자원, 및 자산 디렉토리 일단 APK가 분리되면, 단일 APK에있는 것처럼 액세스 할 수 있습니다

또한, 각 애플리케이션 패키지 이름과 버전이 같다 다른 모든 것들과 코드 장치에 설치되어 있어야합니다 동일한 키로 서명해야합니다 자 이제 Android App을 어떻게 사용할 수 있는지 살펴 보겠습니다 우리가 장치에 제공하는 분할 APK를 묶어서 생성하십시오

먼저 앱 번들을 살펴 보겠습니다 모든 장치에 공통되는 모든 것을 찾아야합니다 기본 APK에 넣습니다 그래서 여기에는 Android 매니페스트 파일이 포함됩니다 예를 들어, dex 파일 등이 있습니다

그런 다음 다른 APK를 생성합니다 각 화면 밀도에 대해 각 분할에는 모든 내구재가 포함됩니다 Android 프레임 워크에 의해 선택되었을 것입니다 그 밀도를 가진 장치에서 다른 APK를 생성 할 수도 있습니다

네이티브 라이브러리를 포함하는 각 네이티브 아키텍처 용 그 아키텍처의 그리고 우리는 다른 분할을 생성 할 수 있습니다 앱에서 지원하는 각 언어에 대해 각 언어의 문자열을 다른 APK에 저장합니다 자, 함께, 우리는 이러한 분할 구성을 호출합니다 분할 또는 구성 분할

이제 기기에 앱을 제공하려고 할 때, 우리는이 분할의 서브 세트를 제공하기 만하면됩니다 모든 기기에 모든 것을 제공하는 대신 그래서 삼성 갤럭시 J5가 있다고 해봅시다 기본 APK와 xhdpi 밀도를 설치합니다 split, ARM 아키텍처 분할 및 영어 왜냐하면 나는 영어 만 할 뿐이니까 하지만 그보다 조금 더 까다 롭습니다

Pierre는 프랑스어와 영어를 모두 구사하며, 그는 자신의 장치에서 두 가지 언어를 모두 지정합니다 설정 그래서 그의 장치에서 Pixel 2 XL과 올바른 밀도와 아키텍처 우리는 영어와 불어를 모두 제공합니다 자기 장치로 나눠 피에르가 브라질로 이주하여 포르투갈 인

그런 다음 포르투갈어를 장치에 추가 할 수 있습니다 이제 그가이 작업을 수행 할 때 Play 스토어 이를 인식하고 포르투갈어를 다운로드하려고 시도합니다 기기에서 스플릿을 사용하는 모든 앱에 대한 언어 분할 그리고 그 당시 장치가 온라인 상태가 아닌 경우, 그러면 우리는 그 언어를 다운로드 할 것입니다 다음 기회에 나눕니다

그리하여 이것이 config split이 작동하는 방법입니다 그러나 내가 처음에 언급했듯이, Lollipop 이상에서만 지원됩니다 이는 현재 사용자의 약 85 %를 차지하지만 대부분의 사용자는 여전히 L 장치를 대상으로합니다 이러한 기기의 경우 앱 번들 여전히 크기 절약을 달성 할 수 있습니다 특정 밀도를 포함하는 독립 실행 형 APK 생성 및 아키텍처

그래서 우리가 L 플러스에서 할 것처럼 분할을 생성하는 대신, 우리는 독립형 APK 매트릭스를 생성 할 것입니다 우리는 이것을 언어로 확장하는 것을 간략히 고려했다 쪼개지도 그러나 우리는 합계의 약간을했다 손에 조금 닿았습니다

하지만 지금은 Pre L 기기의 경우 각 독립 실행 형 APK에 모든 언어를 포함합니다 이제 앱을 제공하려고 할 때 장치에 가장 적합한 단일 APK를 선택하십시오 Galaxy Nexus라는 첫 번째 Android 기기가 있다면 우리는 hdpi 팔 독립형 APK를 제공 할 것입니다 이것을 인식 할 수 있습니다 당신이 한 일과 비슷하다

과거에는 멀티 APK로 하지만이 모든 것을 하나로합시다 이 그림은 이렇게 보입니다 실제로는 방법에 대한 세부 사항을 실제로 걱정하지 않아도됩니다 이 모든 분할 APK가 생성됩니다 또는 독립 실행 형 APK가 생성됩니다

하나의 앱 번들 만 업로드하면됩니다 Play는 오른쪽 분할을 생성하고 각 장치에 적합한 역할을합니다 그리고 우리가 지금까지 토론 한 차원들 시작일뿐입니다 Pierre는 앱 번들을 사용하여 애셋을 타겟팅하는 방법에 대해 설명했습니다 그래픽 API를 사용하면 곧 설정 분할을 생성합니다 그걸 바탕으로 우리는 또한 설정 생성을 시작합니다

새로운 플랫폼 기능을 활용하기 위해 분할합니다 그리고 우리는 압축되지 않은 네이티브 라이브러리 m-class 장치에서 이제 이보에게 가져 가라고 부탁합니다 이 앱을 사용하여 앱 크기를 얼마나 줄일 수 있는지 살펴 봅니다 묶음

이브라힘 카라간 : 고마워요, 안소니 이제 Play에서 APK를 기기로 분할하는 방법을 알았습니다 우리는 앱 번들로 크기 절약에 대해 이야기 할 것입니다 평균적으로 앱 번들로 게시 된 앱 20 % 더 작아지고 매회 20 % 절약됩니다 응용 프로그램이 다운로드되거나 업그레이드됩니다

이제 우리가이 숫자에 어떻게 도달했는지 살펴 보겠습니다 Play 스토어의 모든 애플리케이션을 분석했습니다 다운로드 횟수는 1 백만 회를 넘습니다 그리고 우리는 문자열에 대해 언어 분리를 사용하여 크기의 95 % 이상을 절약 할 수 있습니다 이미지의 경우 45 %입니다

또한 네이티브 라이브러리의 경우 크기의 20 %를 절약 할 수 있습니다 즉, 모든 앱이 앱 번들로 이동하는 경우, 우리는 하루에 약 10 페타 바이트의 데이터를 저장합니다 앱 다운로드 및 업데이트에서 가져옵니다 그것은 1000 만 기가 바이트, 또는 3 억 뮤직 비디오입니다 YouTube에서

그리고 그 위에 사용자는 추가 300 메가 바이트를 볼 수있었습니다 더 많은 사진, 더 많은 앱 또는 더 많은 음악을위한 디스크 공간 확보 자신의 장치에 이제 실제 크기 절약을 살펴 보겠습니다 이는 초기 액세스 프로그램 및 파트너 중 일부입니다 그래서 우리는 Twitter로 시작할 것입니다

Twitter – 이미 다중 APK로 게시 중입니다 전에 아키텍처가 분할되었습니다 그러나, 그들의 응용 프로그램은 번역되었습니다 많은 언어로, 그리고 그것은 여러 화면을 지원합니다 밀도 그들은 여전히 ​​출판비로 많은 비용을 절감합니다

앱 번들과 함께 크기가 20 % 증가합니다 또한 더 이상 다중 APK를 제공 할 필요가 없습니다 다음은 이전에 멀티 APK를 사용하지 않는 TextPlus입니다 앱 번들을 사용하면 앱 번들을 사용하여 모든 크기에서 26 %의 크기 절감 Jaumo의 앱은 원래 크기의 절반이며, 이것은 그들이 [무관심] 한 대형 도서관을 가지고 있기 때문입니다 또한 단일 APK에서 여러 아키텍처를 지원했습니다

이제 앱 번들을 만드는 방법을 살펴 보겠습니다 지금 저장을 시작할 수 있습니다 최신 안드로이드 스튜디오 32 카나리아 Android 앱 번들을 완벽하게 지원합니다 이제 우리는 빌드 할 새로운 옵션을 보게 될 것입니다

빌드 메뉴의 번들 [부적절한] 모든 앱 번들 할당은 쉽습니다 우리는 앱 모듈, 제품 맛을 선택하기 만합니다 빌드 유형 및 Android Studio 당신을위한 앱 번들을 만들고, 서명하고, 게시 할 준비가되었습니다 커맨드 라인을 선호하는 사람들을 위해 또는 자동화 된 빌드 시스템과 통합하려는 경우, 새로운 Gradle Android 플러그인은 새로운 작업 세트를 제공합니다

Android 앱 번들을 만들 수 있습니다 기억하십시오, 이것은 당신이 사용하는 것입니다 – 조립 작업 명령 줄에서 APK를 만듭니다 이제 앱 번들의 경우 번들 명령으로 전환하십시오 어셈블 링 태스크와 마찬가지로, 번들 태스크 또한 특정 향미료를 만들 수 있습니다 귀하의 응용 프로그램의

일단 번들 작업이 끝나면 출력 폴더에 앱 번들을 만들려고하는데, 맛과 빌드 유형이 선택되었습니다 빌드 된 아키텍트는 bundleiad입니다 번들 작업은 서명 구성과 호환됩니다 귀하의 build

gradle 파일 그리고 하나의 gradle 작업으로, 당신은 서명 된 앱 번들을 생성 할 수 있습니다 출판 준비 또한 앱 번들을 사용하면 Play가 자동으로 애플리케이션을 아키텍처, 화면 밀도, 및 언어 스플릿을 기본적으로 사용합니다 당신 구성을 할 필요가 없습니다

그러나 우리는 또한 개발자 스플릿을 완전히 제어 할 수 있습니다 어떤 이유로 든 분할을 사용하지 않으려는 경우 모든 차원에서 새로 도입 된 기능을 사용하여 번들 블록은 여기에 이제 Pierre는 앱을 게시하는 방법에 대해 이야기 할 것입니다 번들을 재생 콘솔에 추가합니다 PIERRE LECESNE : 감사합니다

좋아요, 그래서 당신은 앱 번들을 만들었습니다 이제 어떻게 게시 할 수 있는지 살펴 보겠습니다 Google Play Console에 있습니다 먼저 Google Play에서 앱 서명에 등록해야합니다 기억하는 사람들을 위해이 프로그램을 시작했습니다

작년에 Google I / O에서 등록 할 때 공개 키를 안전하게 전송합니다 Google Play에 그런 다음이 릴리스 키를 사용하여 Play에 서명합니다 사용자를 대신하여 생성 된 APK 사용자에게 보내기 전에 그러나 APK를 계속 업로드하는 경우 제작 탭 트랙에서 테스트 트랙에서 앱 번들을 테스트하고, Play는 업로드 된 APK를 사임하지 않습니다 그리고 우리는 당신이 자신감을 가질 수 있도록 이것을했습니다 먼저 작은 청중에게 앱 번들을 시험해보고, 현재 프로덕션 사용자에게 영향을주지 않습니다

등록한 후에는 릴리스를 관리하고, APK에서했던 것처럼 새 릴리스 만들기 – 앱 번들을 현재 같은 위치에 드롭합니다 APK를 삭제하고 업로드를 기다립니다 업로드되면 출시를 검토하고 출시를 해제 할 수 있습니다 그게 전부 야 그리고 나는 충분히 강조 할 수 없다

더 이상 멀티 APK를 처리 할 필요가 없습니다 Play Console이 백그라운드에서 생성했습니다 지원되는 모든 APK를 제공합니다 이제 앱 번들을 업로드했습니다 그리고 플레이는 너를 위해 모든 힘든 일을 해냈다

큰 그러나 개요를 가질 수 있으면 좋지 않을까요? Play에서 무엇을 생성 했습니까? 이제 Play Console에서 새로운 도구를 만들었습니다 번들 탐색기라고합니다 번들 탐색기를 사용하면 업로드 된 번들을 탐색 할 수 있습니다 보세요

첫 번째 화면에서 오른쪽 상단 모서리에 번들 게시로 얻을 수있는 크기 절감 효과 이제 앱의 1/4 이상을 저장했습니다 물론 이것은 장치마다 다릅니다 그래서 우리는 널리 사용되는 장치 구성을 사용하여 이것을 계산했습니다 또한 장치 구성 목록 아래에 있습니다

및 해당 장치에 대한 APK 서비스의 전체 크기입니다 몇 가지 기기를 클릭하고 어느 기기를 볼 수 있습니까? 기기는 각 버켓에 있습니다 지원되는 모든 장치를 이름으로 검색 할 수도 있습니다 생성 된 APK 집합을 다운로드하려면 특정 장치에 게재되었습니다 이것은 매우 도움이 될 것입니다

그 특정 장치에 대한 버그 보고서를 얻고, 그리고 사용자가 얻은 것을 정확히 얻고 싶습니다 APK가 제공되는 서비스 따라서 이름을 검색하고 다운로드를 클릭 한 다음, Play에서 제공 한 APK 세트를 받게됩니다 물론, 우리는 여러분 모두를 잊지 않았습니다 누가 우리의 출판 API를 사용하는지 앱 번들 업로드는 오늘 API를 사용하여 가능합니다

모든 문서를 찾을 수 있습니다 developersgooglecom/android 게시자 그리고 이제 앤서니에게 넘기십시오 ANTHONY MORRIS : 고마워, 피에르

이제 우리는 빌드하고 게시하는 방법을 배웠습니다 Android 앱 번들 그러나 우리가 배포판을 완성하기 전에, 우리는 여전히 테스트의 라운드를하고 싶습니다 그러나 앱 번들 자체는 설치할 수 없습니다 그럼 어떻게 테스트합니까? 첫째, 개발 과정에서 앱에서 빌드 된 APK를 설치할 수 있습니다

Android Studio에서 직접 다운로드 할 수 있습니다 따라서 여기서 아무 것도 할 필요가 없습니다 그러나 품질 관리 팀의 경우 항상 그렇지는 않습니다 Android Studio에서 소스 코드에 액세스 할 수 있습니다 따라서 세 개발자의 이야기를 통해 이야기하겠습니다

앨리스, 밥, 클레어 QA로 앱 번들을 테스트하는 방법 항목 앨리스부터 시작합시다 Alice는 새로 출시 된 내부 테스트를 사용합니다 재생 콘솔에서 내부 트랙은 알파 베타 트랙과 유사하지만, 이미 익숙 할 수도 있습니다 그러나 지연이 거의 없다는 점이 다릅니다

번들 업로드와 업데이트 사이 테스터 장치에서 사용할 수 있습니다 품질 보증 테스트를위한 신속한 처리 Play Console (앨리스)을 거치며 품질 보증팀이 받게 될 신뢰감이 있습니다 자신의 장치에서 byte와 byte는 무엇과 같은가? 최종 사용자는 릴리스를 프로덕션으로 푸시하면 얻을 수 있습니다 앨리스가 어떻게 이것을 설정하는지 보도록하겠습니다

정말 간단합니다 그래서 Alice는 최대 100 명의 QA 테스터의 이메일리스트를 생성합니다 내부 테스트 트랙에 적합합니다 그녀의 QA 테스터가 업데이트 링크를 따릅니다 업로드 된 번들을 받게됩니다

내부 테스트 트랙으로 그게 전부 야 그러나 모든 사용자가 Play Console에 액세스 할 수있는 것은 아닙니다 귀하의 품질 보증주기 동안 피에르가 밥의 이야기를 들어 봅시다 피에르 레 세네 : 사실, 밥은 접근 할 수 없습니다

Play Console에 연결합니다 그는 자신의 컴퓨터에서 로컬로 테스트하는 것을 선호합니다 아무것도 업로드하기 전에,하지만 그는 여전히 사용자가 얻을 수있는 것을 테스트하려고합니다 어떻게 그 일을합니까? 음, 번들에서 APK를 생성하려면, Play는 Bundletool이라는 새로운 도구를 사용합니다 따라서 Bob이 로컬에서 빌드를 재생하려면, 그는 단순히 Bundletool을 다운로드하고 몇 가지 간단한 명령

Bundletool에는 Build APKs라는 명령이 있습니다 Android 앱 번들을 사용하여 우리가 APK 세트 아카이브라고 부르는 것 APK 세트에는 APK 모음이 들어 있습니다 장치에 설치할 준비가되었습니다 APK 설치라는 또 다른 명령 해당 APK 세트 아카이브를 가져 와서 APK를 추출하고, 해당 장치에 설치하십시오

실제 커맨드 라인 작업을 보도록하겠습니다 그래서 여기에 명령 [? 최근?] Bob에 의해 build-apks 호출, 앱 번들 전달, APK가 만들어지기를 원하는 위치를 말합니다 그리고 깃발 연결 장치를 통과시킴으로써, Bundletool은 현재 기기 전용 APK를 구축합니다 자신의 컴퓨터에 연결되어 있습니다 그리고 Bob이 APK를 생성하려고한다면, 말하자면 팀원이 아닌 다른 사람 손에 물리적 장치, 그것은 여전히 ​​수 있습니다

사양이 포함 된 파일을 제공하십시오 장치를 JSON 형식으로 그리고 당신은 여기서 그 파일의 압축을 볼 수 있습니다 이 장치가 지원하는 API에 대한 정보를 제공하며, 지원되는 언어, 화면 밀도 및 APK 버전 Bundletool도 이러한 장치 사양 파일을 생성합니다 따라서 온라인에서 장치 사양을 찾을 필요는 없습니다

또는 직접 작성하지 않아도됩니다 이 명령을 실행하면됩니다 이 파일을 생성하십시오 또한 Bob은이 APK를 설치하려고하기 때문에 장치에서 APK는 개인 키로 서명해야합니다 그래서 그는 경로를 키 스토어에 전달합니다

APK 세트에 포함 된 모든 APK 그러면 서명되어 Bob의 장치에 직접 설치할 수 있습니다 다음은 APK 설치 명령의 호출입니다 APK 세트에서 APK를 추출합니다 연결된 장치에 직접 설치합니다 쉬운

그래서 Bob과 그의 지역 테스트였습니다 이제 Ibo가 클레어의 이야기를 들려 줄 것입니다 이브라힘 카라한 : 클레어가 일하고있다 중간 규모 회사의 경우 그들의 응용 프로그램을 채우기 위해 지속적인 통합 도구를 설정하십시오 매일 QA 팀은 야간에 응용 프로그램 빌드, 여러 장치에 설치, 응용 프로그램이 올바르게 작동하는지 테스트합니다

클레어는 QA 팀을 돕고 싶어합니다 그녀는 Bundletool을 다시 사용합니다 CI에 APK 세트를 생성합니다 그녀는 다음과 같은 명령을 사용합니다 Bob은 이전에 사용했습니다

그러나 이번에는 장치 사양 플래그를 생략하고, APK 세트를 생성합니다 APK 세트에는 가능한 모든 기기의 APK입니다 이제 QA 팀이 CI에서 설정 한 APK 만 가져옵니다 그들은 장치를 연결하려고합니다 install-apks 명령을 실행하십시오

Bundletool이 장치 구성을 읽습니다 첨부 된 기기에서 APK 세트의이 구성과 일치하는 APK, 장치에 설치하십시오 Play와 동일한 선택입니다 특정 기기에 대해 APK를 게재 할 때 발생합니다 Bundletool이 할 수있는 한 가지 더 범용 플래그를 전달하여 범용 APK를 생성하는 것입니다

범용 APK는 파일을 포함하는 단일 APK입니다 모든 장치의 모든 파일 따라서 모든 장치에 설치할 수 있습니다 글쎄, 그건 정말 대변하지 않아 사용자가 언제 받게 될지 Play 스토어에서 애플리케이션을 설치합니다 그러나 이는 APK를 사용자에게 전달하는 편리한 방법입니다

사용자가 어떤 장치를 실행 중인지 모를 때 Bundletool은 Android App Bundle을 만드는 데 사용되는 도구이기도합니다 Gradle은 장면 뒤에서 그것을 사용합니다 우리는 다른 사람들과 함께 일할 것입니다 체인, 툴체인 제작, 빌드 툴 통합 Android 앱 번들을 만들 수 있습니다 귀하가 사용하고있는 툴체인의 그리고 마지막으로, 우리는 어떻게 Google이 제공 한 APK를 생성합니다

귀하의 사용자에게 Bundletool을 오픈 소싱하는 이유는 무엇입니까? 오늘 가서 githubcom/google/bundletool을 이용하십시오 실행 파일 또는 [? 빌드?]에서 그것 출처 이제 Pierre는 다른 방법에 대해 이야기 할 것입니다 응용 프로그램을 더 작게 만들 수 있습니다

PIERRE LECESNE : 감사합니다 Google Play 동적 전송을 사용하면 우리는 헤어지는 새로운 방법을 도입하고 있습니다 앱을 별도의 기능으로 통합하여 각 사용자마다 필요합니다 레시피 앱이 있다고 가정하고 초기 다운로드를 작게 유지하려고합니다 모든 사용자가 좋아하는 동안 레시피 검색, 작은 분량 만 선택 실제로 새로운 레시피를 추가 할 수 있습니다

그리고이 기능이 앱의 중요한 공간 당신이 할 수있는 일은 그 기능을 자체 모듈로 분해하는 것입니다 필요한 때에 만 봉사하십시오 여기서 사용자를 찾는 방법을 볼 수 있습니다 앱을 엽니 다

그래서 사용자가 레서피를 추가하기를 원할 때, 그는 바닥에 작은 플러스를 클릭한다 그리고 백그라운드에서 볼 수 있습니다 모듈이 다운로드되어 설치됩니다 몇 초 후에 모듈을 사용할 수 있습니다 앱의 어느 부분에서 별도의 기능으로 탈출 하시겠습니까? 사용자 중 일부만이 기능을 사용하는 경우, 좋은 후보가 될 수 있습니다

특히 해당 기능이 앱에서 상당한 공간을 차지하는 경우 마지막으로, 사용자가 몇 초 동안 기다릴 수 있는지 고려하십시오 기능을 사용하기 전에 생성 할 기능을 결정한 후에는 이것이 앱 번들에서와 같이 보일 것입니다 기본 디렉토리 이외에도, 이제 별도의 디렉토리가 있습니다 앱의 각 모듈에 대해 이 디렉토리의 형식은 정확하게 앞에서 다룬 기본 형식과 동일합니다 Play에서 재생할 APK입니다

각 모듈에 대해 분할 세트를 생성합니다 기능 분리 및 구성으로 구성 해당 모듈을 분할합니다 Anthony는 앞에서 언급했듯이 APKS가 분리되어 소개되었습니다 Android Lollipop을 사용하여 3L 기기를 지원하고, 거절 할 모듈을 표시 할 수 있습니다 Bundletool은 지정된 APK를 생성합니다

모듈이 함께 병합되었습니다 이제 동적 기능의 작동 방식에 대해 살펴 보았습니다 내가 너를 이보에게 넘겨 주자 너는 너를 보여 줄 것이다 그것들을 만드는 법

IBRAHIM KARAHAN : 고마워, 피에르 동적 모듈을 만들려면 필요한 작업 만 수행하면됩니다 안드로이드 스튜디오 32 카나리아 다운로드 동적 기능 마법사를 사용하십시오 파일 메뉴의 새 모듈을 클릭하고, 동적 모듈을 선택하십시오

모듈 이름을 입력하면 Android Studio가 실행됩니다 새로운 동적 모듈을 만들 것입니다 수동으로 동일한 작업을 수행 할 수도 있습니다 manifest 및 buildgradle 파일을 편집하십시오

새 모듈의 매니페스트부터 시작할 것입니다 첫 번째 단계는이 모듈을 선언하는 것입니다 앱의 새로운 APK로 설정합니다 이렇게하려면 split 속성을 추가합니다 매니페스트 태그에 이름을 지정합니다

이 예제에서는 vrviewer입니다 다음 단계는 모듈 태그를 추가하는 것입니다 모듈을 선언하려고하면 모듈에 제목을 붙이십시오 이 태그는 Play 스토어에서 모듈을 식별하는 데 사용됩니다 귀하의 응용 프로그램의

그런 다음이 모듈을 주문형 모듈로 선언합니다 onDemand 특성을 추가합니다 즉,이 모듈은 사용자의 기기로 전달됩니다 앱이 Play 스토어에 앱을 요청하면 설치시 전달하는 대신 물론, 주문형 모듈은 L plus 장치에서 지원됩니다 따라서 3L 장치에서이 모듈을 제공하기로 결정한 경우, 융합 태그를 추가 할 것입니다

포함하도록 Play 스토어에 지시 이 모듈은 설치시 기본 모듈 옆에 있으며, 3L 기기 또는 범용 APK로 전송할 때 이제 buildgradle 파일을 살펴보십시오 동적 모듈부터 시작하겠습니다 첫 번째로 지금은 새로운 플러그인을 사용하고 있습니다 com

androiddynamic-feature 두 번째로 기본 모듈을 추가합니다 이 모듈에 대한 종속성으로 기본 모듈에 포함 된 기능에 액세스 할 수 있습니다 베이스의 build

gradle 파일에 필요한 유일한 변경 사항 모듈은 동적 피처 목록을 추가하는 것입니다 모든 동적 모듈 이름을이 목록에 넣으십시오 이것은 gradle이 리소스를 저장하도록 지시하는 것입니다 동적 모듈에서 사용할 수있는 기본 모듈 이제 Anthony는 어떻게 이러한 모듈을 사용할 수 있는지 보여줄 것입니다 새로운 Play Core 라이브러리로 ANTHONY MORRIS : 고마워, 아이보

그럼 어떻게 가는지 살펴 보겠습니다 온 디맨드 모듈의 설치 요청시기 당신은 그들이 설치되기를 원한다 따라서 Play 스토어와 상호 작용하려면 분할 설치 API를 도입했습니다 Play Core Library라는 새로운 라이브러리의 일부로 이제 Play Core 라이브러리는 Java 클라이언트 라이브러리입니다 장치에서 IPC를 사용하기 위해 Play와 통신합니다

그런 다음 Play 스토어에서 통신합니다 이 주문형 모듈을 Play의 서버에서 다운로드하여 당신은 그들을 요청합니다 약간의 코드를 살펴 보겠습니다 API는 동일한 작업 프레임 워크를 사용하여 구성됩니다 Google Play에서 익숙 할 것입니다

서비스 API 및 FireBase API 분할의 설치는 호출 된 클래스에 의해 조정됩니다 splitInstallManager 모든 모델로 요청을 구성합니다 다운로드하고 싶은 파일 재생을 시작하기 위해 startInstall을 호출합니다

요청한 모듈에 필요한 분할을 다운로드하십시오 API를 사용하면 수신 할 수도 있습니다 다운로드 및 설치 프로세스 전반에 걸쳐 업데이트합니다 진행 상황을 표시하고 다운로드 할 때 사용할 수 있습니다 설치 진행 상황을 사용자에게 알려주고, 온 디맨드 기능을 다운로드하기를 기다리고 있습니다

피에르 비디오에서 이걸 봤어 모듈의 주소를 다운로드 할 때 나타났습니다 대규모 모듈의 경우 사용자 확인을 받아야합니다 분할 설치 API로 다운로드하기 전에 앱이 요청할 때마다이 작업을 수행해야합니다 10 메가 바이트 이상의 온 디맨드 모듈 다운로드받을 수 있습니다

그러나 대체 옵션이 있습니다 이러한 모듈을 설치하는 데 필요하지 않은 경우 즉각적인 사용을 위해 즉각적으로 사용할 수 있으며 이것을 지연이라고합니다 설치 API 이 간단한 한 줄을 사용하여 지연된 설치를 요청하는 경우 모듈의 사용자가 편리한 시간에 다운로드 할 수 있습니다 일반적으로 사용자가 장치를 사용하고 Wi-Fi에서 충전하는 방법에 대해 설명합니다

이 때문에 우리는 더 큰 모듈을 설치할 수 있습니다 API에 의해, 사용자 확인을 요구하지 않고, 최대 100 메가 바이트 따라서 이것은 매우 사용자 친화적 인 방법입니다 앱의 대형 주문형 모듈을 다운로드 할 수 있습니다 분할 설치 API를 사용하여 귀하의 주문형 모듈

따라서 현재 어떤 모듈이 설치되어 있는지 확인할 수 있습니다 그리고 사용자가 더 이상 해당 모듈을 필요로하지 않는 경우, 모듈 제거를 요청할 수 있습니다 사용자에게 귀중한 디스크 공간 확보 기기에서 앱의 공간을 줄일 수 있습니다 이제 주문형 모듈을 설치하고 설치할 때 N Plus 기기에서는 앱을 다시 시작할 필요가 없습니다 따라서 코드는 즉시 사용할 수 있습니다

설치 완료 후 새로운 자원 및 자산 컨텍스트 개체를 새로 고치면 사용할 수 있습니다 그러나 Android L / M에서는 스플릿을 설치합니다 앱을 다시 시작해야합니다 올바르게 설치하려고합니다 하지만이를 피하기 위해 분할 컴팩트 라이브러리, 에뮬레이트하는 L / M에 스플릿 설치 앱이 백그라운드에 들어갈 때까지 우리는 올바르게 설치할 수 있습니다

그래서이 분할 컴팩트 라이브러리 앱을 다시 시작하지 않아도된다는 의미입니다 이 모듈 안에있는 거의 모든 것들 앱에서 즉시 사용할 수 있습니다 이 분할 컴팩트 라이브러리를 설정할 수 있습니다 어떻게하면 될지와 매우 유사한 방식으로 앱에서 Multidex 라이브러리를 설정하는 것에 익숙해야합니다 마지막으로 앱 업데이트를 릴리스하면 Play는 기본 모듈과 이미 설치된 모든 주문형 모듈을 포함합니다

따라서 장치에있는 모듈의 버전 항상 동기화됩니다 항상 같은 버전입니다 파트너는 이것이 실제로는 이 모델에 대해서 좋아, 그럼이 모든 걸 감싸 줘 오늘부터 모든 개발자가 Android App Bundles를 만들 수 있습니다

안드로이드 스튜디오 32 카나리아 그리고 모든 사용자에게 Play에서이를 게시 할 수 있습니다 그래서 나는 여러분 모두가 이것을 시도하고 보도록 권합니다 전환하여 앱이 얼마나 작아 질 수 있는지 안드로이드 애플 리케이션 번들로

이제 모듈화를 시작할 예정입니다 개발자들에게 앞으로 몇 개월 동안 오늘부터 모듈화 된 앱을 만들 수 있습니다 Studio Canary에 게시하고 게시 할 수 있습니다 Play 콘솔의 내부 트랙과 알파 트랙으로 이동합니다 하지만 우리는 출판과 제작을 시작할 것입니다

앞으로 몇 개월 동안 베타 버전으로 추적합니다 관심이 있으시면 관심사를 등록 할 수 있습니다 제공되는 링크에서 모듈화합니다 그리고 그걸로와 주셔서 감사합니다 질문이 있으시면 나중에 잡으실 수 있습니다

나는 우리가 지금 시간이 있다고 생각하지 않는다 또는 Sandbox에서 며칠 동안 우리를 붙잡을 수 있습니다 C, 무대 뒤 그리고 고마워 훌륭한 입출력을 가져라

[음악 재생]

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는 당신을위한 훌륭한 솔루션입니다 고맙습니다 [음악 재생]