Level Up with Data Binding (Android Dev Summit '18)

[음악 재생] DAN GALPIN : 데이터 바인딩으로 레벨 업 2015 년에 데이터 바인딩이 도입되었을 때 – 그리고 나는 아무것도 읽을 수 없으므로 여기서부터 할 것입니다 – 내 반응이 꽤 컸어

우리가 뭘 했니? XML 값 내부의 표현과 마찬가지로 이것은 일종의 견해입니다 그러나, 결과적으로 데이터 바인딩은 매우 멋지다 그리고 나는 단지 내 이해를 높이기 만하면되었다 그리고 내가 데이터 바인딩에 대해 좋아하는 한가지 실제로 얼마나 많이 사용하고 싶은지 선택할 수 있습니다 따라서 초급 단계에서 즉각적인 이점을 얻을 수 있습니다

FindViewById를 피하는 것과 같습니다 그러나 그것은 시작입니다 중간 수준에서, 당신은 실제로 사용자 지정 바인딩 어댑터 같은 것을 얻으십시오 그리고 관측 가능성, 전문가 수준에서, 실제로 양방향 데이터 바인딩이 있습니다 또한이 방법을 사용하면 관찰 가능성을 적용 할 수 있습니다

데이터에서 UI까지뿐만 아니라 UI에서 데이터까지 먼저, FindViewById를 없애자 [건배] 정확하게 먼저 데이터 바인딩을 활성화해야합니다 이제이 작업을 수행하기 만하면됩니다

설정 데이터 바인딩 활성화는 귀하의 Gradle 파일에서 true와 동일합니다 그리고 나서이 작은 레이아웃을 넣어야합니다 파일 주위의 래퍼 Android Studio에서 실제로 그렇게 할 수 있습니다 작은 전구에서 당겨서 자동으로 지금 당장 아이콘을 클릭하고 데이터 바인딩 레이아웃으로 변환합니다

꽤 멋지다 이제 바인딩은 실제로이 객체입니다 당신은 데이터 바인딩 유틸리티를 사용하여 레이아웃을 부 풀리게됩니다 그리고 속성과 청취자를 설정하기 만하면됩니다 이거 꽤 멋지네

하지만 솔직히 말해서 당신이 실제로이기 때문에 이것을 사용하십시오 실제 데이터 바인딩을 사용하려고합니다 이제 표현식을 바인딩하는 것에 대해 이야기 해 봅시다 그리고이를 위해 우리는 실제로 레이아웃에 데이터를 사용할 수 있도록해야한다 레이아웃의이 데이터 섹션에서 변수를 선언합니다

그리고 레이아웃 XML 속성에서 표현식을 사용할 수 있습니다 실제로 해당 데이터를 뷰에 연결합니다 이제 표현식은 실제로 중괄호로 묶입니다 @ 접두어가 붙습니다 다음은 데이터 바인딩 표현식의 몇 가지 예입니다

다시 말하지만,이 첫 번째 텍스트 속성을 할당합니다 뷰 모델 속성에 추가합니다 두 번째 예제에서는 맞춤 속성 (높이 0)을 사용하고 있습니다 그리고 세 번째 것에서 우리는 실제로 텍스트보기를 지나가는 람다 사용하기 같은 전화 그리고이 네 번째 것에서 우리는 실제로 텍스트 속성과 같이 호출하는 람다 사용 우리의 레이아웃에 다른 관점의

따라서 실제로 다른 뷰를 참조 할 수 있습니다 그것들을 통과 시켜라 그것은 꽤 근사하다 이제 ViewModel 엔진에 대한 데이터 바인딩 액세스를 제공하기 위해, 우리는 이처럼 바인딩 객체를 설정합니다 레이아웃을 부 풀린 후

매우 간단합니다 그리고 이제 뷰 모델을 해당 레이아웃에서 사용할 수 있습니다 그러나 진정한 질문은 이것이 모두 어떻게 작동할까요? 그리고 대답은 물론입니다 데이터 바인딩에는 마술이 없습니다 그러나 마술처럼 보입니다

우리가 내장 된 바인딩 어댑터가 있기 때문입니다 거의 모든 것을 다뤄 라 따라서 프레임 워크에 대한 모든 호출을 데이터 바인딩으로 바인딩 어댑터에서 실제로 만들어집니다 마법은 없습니다 실제로 코딩을 볼 수 있습니다

디버거를 사용하십시오 그것을 탐색 할 수 있습니다 메서드의 첫 번째 줄은 필요한 경우 변경 사항을 확인하여 UI 만 업데이트합니다 마지막 줄은 실제로 우리가 찾고있는 텍스트입니다 그리고 데이터 바인딩으로 제공되는 많은 어댑터가 있습니다

또한 지능적이고 일관되게 작동합니다 이러한 모든 관점에서 이제 이러한 소스 파일을 살펴보십시오 나만의 풍습을 짓는 데 도움이 될 것입니다 바인딩 어댑터 일이 흥미 로워지기 시작합니다 이제 어댑터 바인딩 101에 대해 살펴 보겠습니다

@BindingAdapter로 주석 된 어댑터 하나 이상의 속성 이름을 취합니다 어댑터 메소드는 뷰를 첫 번째 매개 변수로 사용합니다 뷰의 하위 클래스를 사용하여 제한합니다 특정보기 유형으로 추가 매개 변수는 다음과 같습니다 바인딩 표현식의 데이터면과 일치합니다

어댑터는 데이터 유형별로 다를 수 있습니다 어댑터를 사용하여 동작을 재정의 할 수도 있습니다 내장 속성의 경우 이제 모든 이미지 사용로드 소스 매개 변수가 설정된 활공을 사용합니다 하지만 이걸 조심해야 해 이것이 모듈 글로벌이기 때문입니다 그래서 정말 멋진 부작용이있을 수 있습니다

이것에 대해 당신은 기대하지 않을 것입니다 우리는 또한 많은 것들을 할 수 있습니다 고급 바인딩 어댑터 때로는 그 오래된 가치가 정말로 중요합니다 색상 변경 리스너와 같이

따라서 동일한 매개 변수 유형을 사용하는 경우 행의 두 매개 변수에 대해 바인딩 컴파일러는 실제로 이전 값을 첫 번째 값으로 전달했습니다 업데이트 된 것이 뒤 따른다 또한 여러 속성을 사용할 수도 있습니다 이 이미지보기 에서처럼 멋지다 따라서 실제로 여러 속성을 정의 할 수 있습니다

바인딩 어댑터를 선언 할 때 그리고 나서 그것들은 모두 여러분의 코드에서 사용할 수 있습니다 실제로, 당신이 그것을보고있는 것처럼 이제 관측 가능성도 꽤 좋습니다 실제로 LiveData를 사용하여 자동으로 수행 할 수 있습니다

관측 그래서 이것은 꽤 멋지다 우리는 사실 여기에 불변 클래스를 노출하고 있습니다 이것의 예와 함께 그리고 뒷받침 필드는 변경 가능하거나 조정자가 될 수 있습니다

LiveData 그런 다음 LiveData를 노출합니다 Kotlin getters 공격을 사용합니다 그런 다음 한 가지 추가 변경 작업을 수행해야합니다 실제로 라이프 사이클 소유자를 설정해야합니다

따라서 뷰 모델에서 LiveData를 관찰 할 수 있습니다 정확한 범위로 괜찮아 마지막으로, 양방향 데이터 바인딩 솔직히 이건 정말 사소한 일입니다 실제로 LiveData를 사용할 때

이제 단방향 데이터 바인딩을 두 가지 방법으로 사용할 수 있습니다 이 확인란의 예와 같습니다 하지만 실제로 양방향 데이터 바인딩으로이를 호출 할 수 있습니다 @ =를 사용하여 그리고 가장 중요한 부분은 LiveData를 실제로 관찰 할 수 있다는 것입니다

따라서이 경우에는 불변의 LiveData를 노출하는 것이 좋습니다 그것은 우리의 견해에 의해 수정 될 것이기 때문입니다 그런 다음 라이프 사이클 소유자를 설정하고 @ = 확인란의 표기법 이것이 양방향 데이터 바인딩입니다 어쨌든 그렇게 전문적이지는 않습니다

자세한 내용을 보려면 데이터를 확인하십시오 바인딩 코드 랩 및 설명서 on AndroidAndroidcom [음악 재생]

The Components of Material Design (Android Dev Summit '18)

[음악 재생] CAMETON KETCHAM : 헤이 제 이름은 카메론 케 um입니다

나는 Material Design Components 팀 또는 MDC Android 그리고 뉴욕시 사무실에서 일합니다 GAUTHAM SAJITH : 내 이름은 Gautham Sajith입니다 MDC Android에서도 작업합니다 저는 샌프란시스코에 있습니다

CAMERON KETCHAM : 그리고 우리는 조금 이야기 할 것입니다 머티리얼 디자인 컴퍼넌트 (Material Design Components)와 앱 테마에 대해 알려드립니다 이렇게 빨리, 우리가 토론 할 것입니다 Material Design의 간단한 역사, Material Theming 머티리얼 디자인 구성 요소를 사용하여 색상, 유형, 및 Shape 하위 시스템, 이러한 하위 시스템 적용 방법 우리의 석방 과정으로, 그리고 조금 기여하고 있습니다 이렇게 빨리, 재료 디자인 도서관의 간단한 역사

머티리얼 디자인은 2014 년에 처음 발표되었습니다 그리고 디자인 도서관도 없었습니다 그런 다음 1 년 후인 2015 년 I / O에서 Google이 마침내 디자인 지원 라이브러리를 발표했다 재료에 대한 많은 코드를 가져 오는 데 도움이되었습니다 다음을 포함한 특정 구성 요소에 대한 설계 탐색 드로어, 플로팅 동작 버튼, 스낵 바, 등등

그러나 아직도 그다지 그렇게 많지 않았습니다 그리고 올해 I / O에서 우리는 Material Theming을 발표했습니다 보다 큰 엔지니어링을 목표로 그것 뒤에 팀 따라서 우리는 많은 구성 요소를 구현하는 중입니다 Material Design spec을 기반으로합니다

그래서 재료 Theming Material Design의 원래 문제점은 무엇입니까? 글쎄, 그것은 디자인 시스템의 훌륭한 초기 버전이었습니다 그것은 많은 경우에 효과가있었습니다 그러나 브랜드의 표현으로는 부족했다 그래서 여기에 이메일 앱의 예가 있습니다

다른 모든 앱과 비슷합니다 Material Design을 사용합니다 이메일 앱이라고해도 과언이 아닙니다 내 의견으로는 여기에 사물의 예가 있습니다

Material Theming으로 할 수있는 일 앱을 눈에 띄게 만들 수 있습니다 그리고 우리는 약간의 세부 사항에 들어갈 것입니다 이렇게 빨리, 어떻게 theming 작동합니까? 기본적으로 Material Theming은 시스템입니다 우리가 당신을 돕기 위해 디자인 한 당신은 당신의 애플 리케이션을위한 독특한 디자인 글꼴, 색상 등의 몇 가지 사항을 결정하면됩니다

모양 등등 그리고 이것은 사용할 수있는 Material Design 스케치 플러그인입니다 디자인 아이디어를 만드는 데 도움이 될 것입니다 앱을 개발하는 데 사용할 수 있습니다 해당 도구에 대한 자세한 정보는 material

io를보십시오 우리가 한 몇 가지 물질 연구가 있습니다 Material Theming의 예를 보여줍니다 그리고 당신은 그것들 모두가 아주 다르게 보임을 볼 수 있습니다 그리고 이것들이 material

io에 훨씬 더 많이 있습니다 GAUTHAM SAJITH : 멋지다 이제 어떻게해야하는지에 대해 이야기 해 봅시다 자료를 사용하여 실제로 시작하기 구성 요소 라이브러리 이 시나리오를 상상해보십시오

이 이야기를 통해 몇 번 돌아 오십시오 당신은 당신이 만든 상당히 평범한 앱을 가지고 있습니다 바로 직선 AppCompat에서 그리고 팀 메이트가이 재 설계를 요청합니다 머티리얼 디자인 스펙을 사용합니다

그럼 어떻게 할 건데? 따라서 귀하는 지원 라이브러리 디자인에 대해 잘 알고있을 것입니다 패키지,이 v28 버전, 우리 도서관을 사는데 사용할 수 있습니다 그리고 이것을 사용할 수 있습니다 그러나 더 이상 업데이트되지 않습니다 따라서 conductgoogle

android 소재를 사용해 보셔야합니다 라이브러리, 안드로이드 X 주목할 사실 하나 행동 안드로이드 지원 및 행동을 사용할 수 없습니다 Google Android 패키지가 함께 제공됩니다

따라서 Android X로 전환하려면, 개발자에게 멋진 리팩터링 도구가 있습니다 안드로이드 사이트 그러면 앱을 리팩터링하는 데 도움이됩니다 그런 다음해야 할 일은 우리의 Material Themes를 사용하고 있습니다 그래서 우리는 기존에 상응하는 주제를 제공합니다 AppCompat 테마

그리고 이러한 테마는 다양한 속성을 제공합니다 모양, 색상, 유형 테마 중 일부를 수행하는 데 도움을줍니다 우리가 얘기 할거야, 사용할 수있는 기본 스타일은 물론 모든 구성 요소에 걸쳐 예를 들어, 귀하의 테마가 AppCompat Light에서 확장되면, 전환하기 만하면됩니다 themematerialcomponents

light 그리고 당신은 우리의 모든 속성을 가져야합니다 뿐만 아니라 우리의 모든 구성 요소 스타일 제가 언급했듯이, 많은 새로운 속성들이 있습니다 우리가 소개 할 것입니다

우리 구성 요소를 사용하려고하면 이러한 속성이 정의되지 않은 경우, 당신은 런타임에 Theme Enforcement Error를 얻게 될 것입니다 스타일은 테마에서 이러한 속성을 찾기가 쉽습니다 그리고 그것들이 존재하지 않는다면 그것은 런타임에 충돌 할 것입니다 그래서 이것에 대한 해결책은 우리의 테마를 사용하는 것입니다 그것은 당신에게 모든 속성을 줄 것이다

전체 주제로 전환 할 준비가되지 않았다면 꽤 아직 – 당신은 속성을 얻고 싶습니다 스타일들 중 – Bridge 테마라고 불리는 것을 사용할 수 있습니다 그리고이 브릿지 테마가하는 일은 그들이 당신에게 제공하는 것입니다 스타일링을 수행하는 데 필요한 모든 속성 그러나 그들은 당신에게 어떤 기본 스타일도주지 않습니다

따라서 구성 요소 스타일을 하나씩 사용하도록 선택할 수 있습니다 전환 할 준비가되었습니다 예를 들어 Bridge 테마에서 확장하는 경우, BottomAppBar 스타일을 사용하도록 선택하려는 경우, 기본 BottomAppBar 스타일을 정의 할 수 있습니다 당신의 주제에 그런 다음 모든 BottomAppBars 머티리얼 구성 요소 스타일을 얻습니다

CAMERON KETCHAM : 이제 우리는 단지 몇 가지 새로운 구성 요소에 대해 조금 이야기 할 것입니다 Material Theming을 통해 우리는 몇 가지 새로운 것을 소개했습니다 BottomAppBar와 같은 BottomAppBar는 탐색 및 키 동작을 표시합니다 모바일 화면 하단에 있습니다 한 손으로 만하는 사람들에게 좋은 것은 무엇입니까? 엄지 손가락을 사용하여 장치와 상호 작용합니다

꽤 간단합니다 코디네이터 레이아웃을 사용하여 BottomAppBar 간의 모션 플로팅 액션 버튼이 있습니다 여기서는 BottomAppBar에 대한 간단한 XML 만 있습니다 할 수있는 일 중 몇 가지 FAB의 수직 오프셋을 설정합니다 FAB 크래들 여백을 설정할 수도 있습니다

FAB와 BottomAppBar 사이의 거리입니다 둥근 모서리 반경뿐만 아니라, 이는 BottomAppBar가 FAB를 충족시키는 모서리입니다 스크롤 할 때 BottomAppBar 숨기기를 사용할 수 있습니다 그리고이 정렬 모드를 설정할 수도 있습니다 자동으로 FAB에 애니메이션을 적용합니다

네비게이션하는 경우 유용합니다 다른 조각이나보기 사이 시각적 인 차이를주고 싶다 서로 다른 화면 사이 이미 툴바를 사용하고 있다면, BottomAppBar를 사용하면 쉽게 시작할 수 있습니다 도구 모음에 대한 지원 작업 표시 줄을 설정하는 경우, BottomAppBar 대신 설정하십시오

그리고 다른 모든 것은 같은 방식으로 작동합니다 그러나 On Menu Item을 사용할 수도 있습니다 Listener를 직접 클릭하십시오 BottomAppBar에 있습니다 GAUTHAM SAJITH : 우리는 또한 버튼의 개조 된 버전 소재 버튼 호출

스타일을 훨씬 단순하게 만들기 위해 개편되었습니다 따라서이 Material Button 구성 요소를 XML에 넣으면, 스타일이 지정된 버튼을 얻을 수 있습니다 그러나 전체 테마를 사용하는 경우, 실제로 XML에서 Button 태그를 사용할 수 있습니다 그리고 우리는 Custom View Inflation이라고 불리는 것을합니다 이 태그는 재료 버튼으로 자동 팽창됩니다

꼬리표 그런 다음 비활성화 된 상태를 설정할 수 있습니다 이 버튼에 그리고 모든 주들이 이관 할 것입니다 색상이 전송됩니다

이 버튼에 아이콘을 설정할 수 있습니다 아이콘 속성뿐만 아니라이 아이콘을 설정하면 스타일 그리고이 스타일은 선택 사항입니다 그러나 그것은 패딩을 약간 조정할 것입니다 단추에 대한 시각적 균형을보다 균등하게 달성 아이콘이있을 때

속성을 사용하여 아이콘 크기를 변경할 수 있습니다 개요 단추 스타일을 설정할 수 있습니다 우리가 사용하는 기본 스타일 중 하나입니다 이 헤어 라인 윤곽선 단추를 얻으려면이 단추를 제공하십시오 버튼의 배경색을 설정할 수 있습니다

배경 색조 속성을 설정합니다 여기에 색상 상태 목록을 제공 할 수 있습니다 따라서이 경우 버튼이 활성화되어 있으면 보라색으로 표시됩니다 사용 중지되면 회색으로 표시됩니다 다른 속성을 설정할 수 있습니다

획 너비, 획 색상, 코너 반경을 사용하여 스타일을 지정합니다 아이콘 전용 버튼 만 만들 수도 있습니다 이 경우 아이콘을 설정합니다 아이콘 패딩을 0으로 설정하는 것뿐만 아니라, 버튼의 중앙에 아이콘이 표시됩니다 또한 콘텐츠 설명을 설정하고 있습니다

이 버튼에 그래서 텍스트가 없으므로 접근성 측면에서, 콘텐츠 설명을 설정해야합니다 그래서 사람들은 버튼의 내용을 알게 될 것입니다 버튼에 리플 색상을 설정할 수도 있습니다 예를 들어 여기에 자주색 리플을 설정하면, 버튼에 적용됩니다

색상 상태 목록이나 16 진수 값을 여기에서 설정할 수 있습니다 보시다시피 버튼 위에 보라색 잔물결이 있습니다 하지만 알파가 이미 내재되어 있기 때문입니다 리플에 녹색 버튼 상단에 자주색 리플이 있습니다

그리고 이들은 몇 가지 예입니다 이 라이브러리에서 제공하는 다른 구성 요소 중 우리는 여러 종류의 칩을 가지고 있습니다 채우기 및 개요가있는 텍스트 필드가 있습니다 스타일, 암호 표시 및 숨기기 기능 및 문자 계수기 그런 다음 매우 맞춤 설정할 수있는 탭 레이아웃이 있습니다

게다가 CAMERON KETCHAM : 좋습니다 이제는 테마에 대해 조금 있습니다 MDC는 Android의 기본 테마에 크게 의존합니다 테마 및 스타일이 작동하는 방식을 간단하게 다시 살펴 보겠습니다

XML의 뷰에 직접 적용된 것은 먼저 사용됩니다 여기에서 속성을 변경하면 단일보기를 변경하십시오 스타일을 업데이트 할 수도 있습니다 따라서 스타일에 속성을 설정하면 이 스타일은이 스타일을 사용하는 모든보기에 영향을줍니다 스타일에 정의되지 않았거나 스타일이 설정되어 있지 않은 경우, 기본 스타일로 돌아갑니다

그래서 여기에서, 당신이 길을 바꾸고 싶다면 전체 구성 요소 그룹이 보입니다 기본 스타일을 설정할 수 있습니다 마지막으로 속성이 다른 곳에 정의되지 않은 경우, 테마를 살펴볼 것입니다 Material Theming이 정상적으로 작동하는 방식 최상위 수준의 속성 집합이 있습니다 당신은 타이포그래피, 색, 모양 등등

또한 모든 구성 요소의 기본 스타일입니다 그러나 더 세분화 된 제어가 필요한 경우, 당신은이 층들 중 어느 곳에서나 연결할 수 있습니다 단일보기의 색상 만 변경하고, 또는 특정 구성 요소 전체의 색상 만 표시 할 수 있습니다 여기에 우리의 Chip 스타일 라이브러리 예제가 있습니다 테마 속성을 참조하는 몇 가지 값을 정의합니다

그리고이 디자인의 힘은 사실에서 나온 것입니다 우리 도서관의 다른 스타일들이 참고할 수있는 것들 이 같은 속성 여기에 Button의 예제가 있습니다 그리고 이것들 둘 다 같은 모양의 외관을 가지고 있습니다 이것은 작은 컴포넌트 모양 모양입니다

즉, 우리가 룩을 업데이트하고자한다면 이 모양에 대한 우리의 응용 프로그램의 느낌 – 이 작은 구성 요소들에 대해서는 우리가해야 할 모든 것 이 속성을 테마의 한 위치에서 업데이트합니다 그리고 우리는 당신에게 그것을 조금하는 방법의 예를 보여줄 것입니다 각 테마 속성의 효과는 무엇입니까? 불행히도, 그것은 완전히 간단하지 않습니다 우리는 의미있는 방식으로 테마 속성을 적용하려고합니다 그러나 그것은 확실히 가능합니다

서로 다른 색상의 값을 선택합니다 같이 잘 어울리지 않을 수도 있습니다 아마 각 구성 요소에 대해 materialio를 확인해야합니다 어떻게 반응하는지 볼 수 있습니다

그러나 가능한 또 다른 간단한 것은 – 당신이 할 수있는 또 다른 간단한 해결책, 잠재적으로 디버그 테마를 만드는 것입니다 엉뚱한 값을 다른 속성으로 설정합니다 그리고 사물이 어떻게 보이는지보십시오 예를 들어 BottomAppBar 페이지가 있습니다 material

io 사이트에 있습니다 컨테이너 자체가 표면이라는 것을 알 수 있습니다 아이콘은 On Surface입니다 그리고 우리는 어떤 속성들에 대해서 이야기 할 것입니다 밖을 내다 볼 수있을뿐만 아니라 수정할 수 있습니다

다음 섹션에서 따라서 서브 시스템을 테마로합니다 우리는 현재 3 개의 테마 서브 시스템 인 Type, Color, 및 모양 그리고 이것들은 당신이 개발자로서, 앱을 테마로 조정해야합니다 다행히도 대부분의 사람들은 텍스트 출현에 익숙합니다

그러나 우리는 Material Theming, 테마 속성을 사용하여이 텍스트를 참조합니다 형세 다음은 툴바 예제입니다 이는 스타일이 아닌 Headline Six 속성을 사용합니다 직접

그리고 Body 1 속성을 사용하는 사본이 있습니다 이들은 우리가 정의한 유형 속성입니다 그래서 당신이 당신의 주제에서 이것들을 오버라이드한다면, 앱의 스타일과 모양을 설정할 수 있습니다 색상은 또 하나입니다 그리고 아마도 AppCompat Color에 익숙 할 것입니다

기본 및 색상 악센트 Material Theming의 경우, 우리는 더 넓은 범위의 색상을 가지고 있습니다 색상을보다 잘 제어 할 수 있습니다 앱의 다른 부분에 대해 확장 된 팔레트 색상의 의미 론적 이름입니다 Color Theming에서 작동합니다

맨 위에는 기본, 기본 변형, 2 차, 2 차 변형 그것들은 모두 브랜드 컬러입니다 그것들은 당신이 일반적으로 주제가되어야하는 것들입니다 앱 스타일 배경, 표면 및 오류 색상도 있습니다

스타일을 지정할 수 있지만 꼭 그렇게 할 필요는 없습니다 그리고 나서, On Primary, On Secondary– 색상의 변형에 관한 것 – 그들이 그릴 때 접근 가능해야한다 다른 색상 위에 그래서 예를 들어, On Primary는 원색 위에 그려 질 것입니다 따라서 위에 표시된 텍스트가있는 경우 기본 배경색은 기본 색상이어야합니다

이것들은 우리가 정의한 색상 속성입니다 새로운 것을 많이 볼 수 있습니다 우리는 AppCompat에서 나온 일부를 재사용하려고했습니다 그리고 우리는 우리가 사용하는 안드로이드 컬러 배경을 가지고 있습니다 그냥 일반 Android입니다

그 속성의 버전 모양은 당신이 테마로 할 수있는 또 다른 하위 시스템입니다 그리고 모든 것은 MaterialShapeDrawable에서 발생합니다 그래서 우리는 MaterialShapeDrawable 형상 가능한 구성 요소의 배경으로, 단추, 카드, FAB, BottomAppBar, BottomSheet, 칩, 등등 그리고 그것이 작동하는 방식은 모서리 및 코너 처리입니다

그래서 우리는 가장자리와 모서리 처리가 있습니다 둥근 모서리와 절삭 모서리에 대해 정의 된 거의 모든 버튼 또는 상호 작용 가능한 구성 요소입니다 당신이 찾을 수있는 그러나 당신은 언제나 당신 만의 것을 만들 수 있습니다 여기 코 틀린 코드의 예가 있습니다 둥근 모서리 처리를 정의합니다

그리고 그것을 MaterialShapeDrawable에 설정합니다 모든 것에 둥근 모서리를 적용하는 것 그리고 XML 버전도 있습니다 그래서 XML로하고 싶다면 우리는 Shape Appearance라는 새로운 속성이 있습니다 그리고 Text Appearance와 비슷합니다

여기에있는 속성은 코너 패밀리와 모서리입니다 크기 그리고 이것은 반경이 24dp 인 둥근 모서리로 설정됩니다 그리고 개별 구석을 무시할 수 있습니다 여기서는 왼쪽 상단을 재정의하는 것입니다

자르고 오른쪽 하단 구석에 구석 크기가 0입니다 XML에서도 동일한 작업을 수행 할 수 있습니다 한 가지주의해야 할 것은 우리가 Shape Appearance 여기에 오버레이, 기본적으로 동일한 것입니다 우리는 단지 속성을 정의한다 우리가 재정의하려는 따라서 테마 오버레이와 비슷합니다

즉, 소재가 버튼 자체는 기본적으로 모양 모양을 이미 가지고 있습니다 그리고 여기, 우리는 단지 좌상단을 설정하고 있습니다 오른쪽 상단 모서리가 0이되도록 dp로 자릅니다 다른 모든 것은 스타일에서 상속됩니다 버튼의 Material Theming의 핵심 아이디어 중 하나는 앱에 일관성을 부여합니다

그래서 우리는 이러한 모양 매핑을 정의했습니다 이들은 서로 다른 구성 요소 그룹입니다 앱의 일관성있는 모양을 유지하는 데 도움이 될 수 있습니다 모양을 통해 표면을 연결하여 느낌을 느낄 수 있습니다 따라서 작고, 중간이고, 큰 구성 요소가 있습니다

그리고 이것들은 당신이 당신의 테마에 설정할 수있는 속성입니다 따라서 모든 작은 구성 요소를 다시 정렬하려면 잘라낸 오른쪽 구석이나 다른 것을 가지고 있다면, 그렇게 할 수 있습니다 여기에 내가 말했던 것처럼, 우리는 작은 컴포넌트 스타일을 재정의하고 있습니다 그래서 우리는 작은 외양을 재정의했습니다 테마의 작은 컴포넌트 모양 모양 우리 스타일로

그리고 여기, 우리는 우상을 세울 것이다 그리고 우리는 여기에 부모를두고 있습니다 그래서 다른 모든 것을 상속 받게됩니다 다른 부분의 둥근 모서리 그림자는 우리가 언급하고 싶은 것입니다

볼록한 모양에 대해 기본 표고가 지원됩니다 API 21 이상을위한 롤리팝 사용 하지만 우리는 그림자를 모두 오목한 15의 API로 백 포트하고 있습니다 일반적인 경우의 볼록한 모양, 둥근 모서리 또는 절단 모서리뿐만 아니라 BottomAppBar의 경우 이것은 내부에 컷 아웃이 있기 때문에, 네이티브 쉐도우를 얻지 못할 것입니다 그래서 우리는 그라디언트로 그림자를 가짜로 만듭니다 GAUTHAM SAJITH : 이제 우리는 우리의 테마 서브 시스템에 대해 조금 들었습니다

앱에 실제로 적용하는 방법을 살펴 보겠습니다 다시이 시나리오로 돌아옵니다 이 AppCompat 앱을 적용하고 싶다고 가정 해 보겠습니다 이러한 테마 하위 시스템 중 그래서 우리는 무언가를 건설 할 것입니다

저렇게 조금 생겼어 그리고 분명히, 자신의 앱을 만들 때, 이보다 훨씬 더 아름답고 응집되어 보일 것입니다 그러나 우리는 우리만큼 많은 손잡이를 조정하고 있습니다 우리가 만든 기능의 일부를 보여줄 수 있습니다 그래서 당신이해야 할 첫 번째 일은 AppCompat Light No Action Bar 테마를 사용하는 경우, 머티리얼 구성 요소 테마로 전환 할 수 있습니다

이 경우 Bridge 테마를 사용하고 있음을 알 수 있습니다 이러한 구성 요소를 사용하기로 선택하기 때문에 하나씩 하지만 일반적으로 전체 테마, 일반 테마, 다리를 시험해보기 전에 먼저 어떻게 보이는지 보아라 테마 그러니 가장 먼저하는 일은 당신은이 테마 색 속성을 설정합니다

그래서 당신이 이미 알고있는 기존의 것들 중 일부 색상 1 차 및 색상 2 차입니다 그것들은 여전히 ​​존재합니다 그런 다음 새로운 테마 색 속성 중 일부 (예 : 색상) 1 차, 2 차, 컬러 서피스 및 컬러 서페이스 또한 설정됩니다 이 Color Secondary가 실제로 어디에도 나타나지 않습니다 귀하의 애플 리케이션에 아직,하지만 그렇게됩니다

다음으로 우리가하고 싶은 일은 머티리얼 버튼을 얻는 것입니다 그래서 우리는 AppCompat 버튼을 사용하기 전에 그리고 나서 테마에 Material Button 스타일을 설정하면, 모든 버튼이 머티리얼 버튼으로 바뀌어야합니다 XML 태그를 변경할 때 앞에서 언급했듯이, 전체 테마를 사용하고 있다면, 이 인플레이션은 자동으로 발생합니다 따라서 실제로이 XML을 전혀 변경하지 않아도됩니다

우리는 다른 기본 스타일들을 가지고있다 우리가 여기에 제시 한 것 모든 구성 요소에는 기본 스타일이 있습니다 테마로 설정할 수 있습니다 일반적으로 구성 요소 이름과 스타일에 불과합니다

예를 들어, 카드 스타일을 설정하려면, 테마에 Material Card View Style을 설정합니다 그리고 나서, 우리는 카드보기를 변경해야합니다 이 경우 XML의 Material Card View로 이동하십시오 그리고 나서 우리는 몇 가지 속성을 적용 할 것입니다 이 카드들에

예를 들어, 카드 높이, 스트로크 색상, 및 획 폭 그리고 그것은 모든 카드에 표시됩니다 기본 스타일을 설정하기 때문입니다 모든 카드는이 기본 스타일을 봅니다 그리고 기지를 바꾸고 싶다고 해

모든 버튼의 스타일 당신은 당신 자신의 Button 스타일을 정의하고 그것의 부모를 설정할 것입니다 기본 스타일 중 하나 인 아웃 라인 버튼으로 그러면 모든 단추가 개요 단추로 변경됩니다 이제 모든 버튼에 모양 테마를 적용 할 수 있습니다 그래서이 모양을 정의 할 것입니다

모양 모양 버튼 스타일 그리고 그 버튼 스타일에서는 오른쪽 모서리를 자르고 왼쪽 모서리를 설정하려면 반올림 그리고 코너 크기를 설정합니다 그리고 이제, 당신은이 화살 모양의 버튼을 가지고 있습니다 또한 Shape Appearance Overlay를 사용하여이 작업을 수행 할 수 있습니다

버튼에는 기본적으로 둥근 모서리가 있기 때문입니다 당신은 둥근 것을 설정할 필요가 없습니다 왼쪽 모서리 따라서 모양 모양 오버레이를 사용하는 경우, 당신은 변화하고있는 것을 설정할 수 있습니다 정상적으로 적용됩니다

그리고 나서, 우리는 아이콘 버튼을 갖고 싶다고 말합니다 이 아이콘 버튼 스타일을 정의 할 수 있습니다 패딩과 분 너비를 원하는대로 설정하십시오 그리고 이것을 XML로 직접 Button에 적용하고, 아이콘 및 컨텐트 설명을 설정할 수 있습니다 그리고이 공유 아이콘 버튼이 있습니다

그 공유 텍스트 버튼 BottomAppBar로 전환 할 수도 있습니다 그래서 BottomAppBar를 설정해야합니다 당신의 주제에 스타일 그런 다음 XML 레이아웃에서 최상위 앱 표시 줄을 제거하십시오

이 BottomAppBar를 여기에 추가하십시오 플로팅 액션 버튼을 추가 할 수도 있습니다 떠있는 동작을 추가하여이 BottomAppBar에 넣습니다 버튼을 레이아웃에 추가하십시오 그런 다음 Layout Anchor를 설정합니다

BottomAppBar의 ID를 가리키는 특성 이 FAB에는 AppCompat의 청록색이 있습니다 우리가 기본 부동 작업을 설정하지 않았기 때문입니다 버튼 스타일 한 번 설정하면 이제 그걸 볼 수 있습니다 컬러 보조 및 컬러 보조를 사용합니다

그리고 리플 효과도 있습니다 그런 다음 우리 카드의 내용에 대해 텍스트 스타일을 적용 할 수 있습니다 모든 텍스트를 Color On Surface, 이전에 있었던 것보다 우리는 소재 테마를 사용하려고합니다 오버레이, 잠시 후에 얘기하겠습니다

하지만이 소재의 테마 오버레이는 거의 해당 구성 요소의 모든 내용에 대한 테마를 설정합니다 따라서이 경우에는 Color Primary라는 텍스트를 설정합니다 Tertiary에서 텍스트의 색을 설정합니다 그래서 소재 테마 오버레이, 당신 Android 테마에 대해 들어 보셨을 것입니다 그것은 뷰의 하위 섹션을 스타일링 할 수있는 방법입니다

계층 그리고 이것의 한 가지 일반적인 사용법은 스타일에 있습니다 앱에서 어두운 색의 툴바라고 말하면됩니다 Android 테마의 단점은 기본 스타일에서는 작동하지 않습니다 예를 들어, 모든 카드 스타일을 지정하려면, 당신은 정말로 안드로이드 테마를 설정할 수 없습니다

따라서 소재 테마 오버레이는 속성입니다 우리가 정의한 것은 구성 요소가 지원하는 것입니다 기본 스타일로 작동합니다 그래서 이것을 기본 스타일로 설정할 수 있습니다 귀하의 구성 요소

그리고 구성 요소의 하위 뷰를 주제로 삼으십시오 마지막으로 TextAppearance 테마를 적용 해 보겠습니다 이전에는 제목에 하드 코딩 된 텍스트 모양이있었습니다 스타일 이제 우리는 새로운 TextAppearance로 전환 할 것입니다

속성 그리고 비슷하게, 본문도 마찬가지입니다 그리고 나서, 우리는 이것을 약간의 스타일에 적용 할 수 있습니다 예를 들어, Headline Six 예를 들어 코믹 샌즈가되기 위해서는 변경할 수 있습니다 앱에서 Headline Six를 사용하면 다음과 같이 보입니다

그렇다면 왜이 일을하는 데 문제가 있습니까? 최상위 속성을 사용하는 데 어려움을 겪는 이유 당신의 스타일 전반에 걸쳐? 이유가 뭐야? 그리고 일반적으로 우리는 이렇게합니다 앱 전체를 스타일링 할 수 있기를 원한다 이러한 최상위 속성 예를 들어, 팀원이 당신에게 다가 갔다고 말하십시오 "어이, 우리 브랜드의 색깔이 바뀌고있다 그래서 실제로 우리는이 블루스 대신이 적갈색을 원합니다

우리가 가진 것 "이라고 말했다 당신이해야 할 일은 이러한 최상위 색상 속성 중 하나입니다 그리고 당신의 전체 앱이 다시 열립니다 마찬가지로, 어두운 테마 또는 가짜 어두운 테마를 원한다면 일종의, 당신이해야 할 일은 변화입니다 이 두 가지 다른 색상 속성

그리고 구성 요소는 모두 적절하게 응답해야합니다 그리고 다른 모양의 앱이 있습니다 CAMERON KETCHAM : 이제 우리는 조금 이야기 할 것입니다 맞춤 구성 요소 및 만든 일부 구성 요소에서 스타일을 사용할 수 있습니다 방법에 관하여 진짜로 불가사의 한 아무것도 우리 구성 요소는 테마를 사용합니다

모든 기본적인 Android 테마입니다 따라서 구성 요소에서도 사용할 수 있습니다 기본 스타일을 만들어야합니다 그 기본 스타일 속성 전달하기 생성자에 입력하고 스타일 속성 가져 오기를 사용하십시오 그럼 그걸 살펴 봅시다

여기에는 테마 및 일부 속성에 대한 정의가 있습니다 여기에서는 기본 스타일 속성을 만듭니다 그것을 우리의 테마로 설정하십시오 그래서 우리는 내 사용자 정의보기 스타일을 가지고 있습니다 그리고 우리는이 widget

mycustomview 스타일로 설정합니다 우리는 우리 테마의 어딘가에서 정의했습니다 따라서 이것은 사용하는 모든 구성 요소가 이 내 사용자 정의보기 – 또는 이러한 내 사용자 정의보기는 기본적으로이 스타일을 사용합니다 또한 스타일을 지정할 수 있습니다 몇 가지 다른 속성

그리고 생성자에서 이들을 사용할 필요가 있습니다 다음은보기에 대한 생성자의 예제입니다 여기에서는 기본 스타일을 사용합니다 우리는 전에 만들었습니다 그리고 우리는 이것을 여기에 전달하여 그 밖의 아무것도 설정되지 않은 경우 기본 스타일을 선택할 수 있습니다

그런 다음 스타일 속성 가져 오기를 시작합니다 그리고 우리가 방금 만든 스타일러스를 전달합니다 원래의 스타일 속성뿐만 아니라 생성자에 전달됩니다 마지막으로 대체 스타일 인 속성을 찾기위한 최후의 수단으로 사용될 수 있습니다 그리고 나서, 그것들을 읽으십시오

이것이 구성 요소가 작동하는 방식입니다 그래서 당신은 분명히 스스로 할 수 있습니다 또한 사용 사례에 맞게 시스템을 확장하십시오 경우에 따라 더 많은 속성이 필요한 경우처럼, 당신은 그것들을 분명히 추가 할 수 있습니다 그것은 당신의 부분에 조금 더 많은 작업일지도 모른다

스타일을 업데이트해야하기 때문에 당신이 가진 모든 구성 요소 이러한 속성을 참조하기 위해 사용하는 경우, 우리가 작성한 구성 요소 그것들을 참조하지 않을 것입니다 그러나 당신이 그것을 필요로한다면, 당신은 확실히 그것을 할 수 있습니다 다음은 속성의 예입니다 그냥 만들어서 자신의 스타일로 정의하십시오 그런 다음 참조하십시오

테마에 정의한 다음 그것을 스타일이나 다른 곳에서 참조하십시오 그리고 지금, 우리의 과정에 대해 조금 있습니다 우리는 몇 가지 릴리스를했습니다 10은 7 월에 나갔다 – 7 월 20 일에 삭제되었다

그리고 그것은 잠시있었습니다 그러나 이제 Android X Jetpack 리팩터링 마무리로, 우리는 더 자주 석방 할 수 있습니다 지원 라이브러리에 묶여 있지 않기 때문입니다 그래서 우리는 우리의 방출을 가속화하려고 노력하고 있습니다 그리고 마침내 우리는 1

1 알파 1 10 월 31 일 잘라 그리고 우리는이 일을 더 자주하려고 노력하고 있습니다 적어도 한 달에 한 번 11 Alpha는 타입 테마, 컬러 테마, 우리가 말한 다크 테마 이것에 대해, 많은 버그 수정과 성능 향상 개량

향후 출시 될 예정인 내가 말했던 모양 주제를 가지고있는 것 11 Alpha에서는 Shape 테마 서브 시스템이 존재하지만, 실제로 구성 요소 중 어느 것도 응답하지 않습니다 그 주제 속성에 아직 그러나 다음 릴리스에서는 반드시 있어야합니다

우리는 대화 상자, 하단 시트 메뉴, 그런 종류의 것들이 모두오고 있습니다 그리고 문제를 제기하고 제출하는 한, GitHub은 코드가있는 곳입니다 따라서 당신이보기에 흥미있는 경우에, 그냥 GitHub에가 모든 코드를 살펴볼 수 있습니다 그것은 오픈 소스입니다

또한 GitHub에서 지침을 확인할 수 있습니다 버그 리포트를 제출하는 방법 우리는 무엇이 가장 잘 작동하는지 알아 내려고 노력 중입니다 지금 당장은 버그보고를하고 있습니다 이 issuetracker

google buginizer 구성 요소 그러나 우리는 다른 방법을 찾고있다 우리가 작업하고있는 것을 더 분명하게하기 위해서입니다 커뮤니티와 더 많은 것을 통합하려고합니다 여기 몇 가지 리소스가 있습니다

Materialio 사이트는 특히 Android 섹션에서 훌륭합니다 확실히 불화에서 우리를 확인하십시오 우리와 채팅하는 데 관심이 있다면, 또는 우리가 홍보를하도록 돕는 데 관심이 있습니다 – 무엇이든을위한 아이디어 와서 우리와 채팅하십시오

Stack Overflow에 태그가 있습니다 따라서 구현에 대해 질문이있는 경우, 너는 거기에 무엇인가 물어볼 수있다 우리는 그것을 지켜보고 있으며, 우리는 이에 응할 것입니다 그리고 우리는 몇 개의 코드 랩을 가지고 있습니다 이 GitHub 페이지에서 해당 코드 랩에 대한 링크를 찾을 수 있습니다

그리고 그것은 꽤 많이 있습니다 와줘서 고마워 GAUTHAM SAJITH : 감사합니다 [박수 갈채] [음악 재생]

Deep Dive into Android Studio Profilers (Android Dev Summit '18)

[음악 재생] 안녕, 모두들 Android Studio Profilers에 대해 자세히 알고 싶습니다

세션 나는 데이비드 허먼이야 SHUKANG ZHOU : 저는 Shukang Zhou입니다 우리는 프로파일 러의 엔지니어입니다 Android Studio의 팀 그래서 우리가 실제로 그것에 들어가기 전에, 우리는 당신에게 모든 개요를주고 싶었습니다

이 이야기에서 무엇을 기대할 것인가 높은 개관에서 오는 것의 종류 대신에, 대신에 우리는 좀 더 집중적으로 집중할 것입니다 우리가 당신이 더 나은 것을 얻을 수 있다고 생각하는 몇 가지 특징들 모든 코드베이스에서 처리하십시오 우리는 또한 길을 따라 몇 가지 팁과 트릭을 버릴 것입니다 우리는 실제 응용 프로그램 인 Santa Tracker를 프로파일 링합니다

Santa Tracker는 Google의 앱입니다 사용자는 자신의 코스에서 산타를 추적 할 수 있습니다 크리스마스 이브에 전세계 이 앱에는 게임과 몇 가지 다른 추가 기능이 포함되어 있습니다 그들은 매년 새로운 앱을 출시합니다

우리는 다음 중 하나를 사용하려고합니다 GitHub에서 공개적으로 사용 가능합니다 마지막으로, 프로파일 러에 관한 두 가지 대화를 말씀 드리고 싶습니다 Google I / O에서 올해 한 번, 더 높은 수준의 프로파일 러를 말한, Android Studio의 새로운 기능 소개 프로파일 러 32

그리고 안드로이드 게임 개발사에서 또 하나 Summit, 게임 프로파일 링에 대해 그 이야기는 좀 더 초점을 맞추고 있습니다 성능, 원시 코드, 관련 도구, 그런 것들 YouTube에서 해당 동영상을 찾을 수 있습니다 이 온라인을보고 계시다면 동영상 설명에 해당 동영상 링크가 포함되어 있습니다

이하 프로파일 러에 대해 처음 배우는 분이라면 – 너는 단지 호기심이 많다 여기에 아주 간단한 개요가 있습니다 Studio Profilers 기능이 나뉩니다 4 개의 메인 프로파일 러, 하나는 CPU, 하나는 메모리, 하나는 네트워크 용이고 다른 하나는 배터리 용입니다

또한 이벤트 프로파일 러가 있습니다 항상 당신이 물건을 볼 수있는 상단에 탭, 키보드 이벤트, 화면과 같은 사용자 이벤트 회전 및 라이프 사이클 이벤트 – 그래서 당신이 파편 일 때 활동이 시작되고 중지됩니다 어쨌든, 그 정도면 충분합니다 데모로 뛰어 들어 봅시다 SHUKANG ZHOU : 좋아, 데모를 시작 해보자

먼저이 버튼을 한 번 클릭하여 앱을 시작할 수 있습니다 프로파일 러를 시작하십시오 오늘은 Android Studio를 사용하고 있습니다 34 Canary 3, 그것이 우리가 가지고있는 것 중 가장 최신이기 때문입니다

이것은 Canary 릴리즈이기 때문에 아직 안정적인 릴리즈는 아닙니다 그래서 몇 가지 버그가있을 수 있습니다 흥미로운 일이 오늘 일어나면 우리와 함께하시기 바랍니다 우리가 오늘 사용하고있는 app 인 Santa Tracker, Java 코드 만 들어 있습니다 따라서 Java 응용 프로그램은 오늘날의 대화의 초점이 될 것입니다

따라서 프로파일 러에서 볼 수 있듯이, 우리는 4 개의 프로파일 러, CPU, 메모리, 네트워크 및 에너지를 가지고 있습니다 그 중 하나를 클릭하면 더 자세한 데이터를 얻을 수 있습니다 해당 프로파일 러에서 CPU 프로파일 러로 건너 뛰십시오 여기서는 CPU 프로파일에서 볼 수 있듯이, CPU 사용률과 스레드 상태를 볼 수 있습니다

언제 알려주는 것이 유용할까요? 귀하의 응용 프로그램은 CPU를 기반으로합니다 두 개의 관련 스레드를 검사하는 경우 한 가지 트릭이 있습니다 이리– 원하는 방식으로 스레드를 재정렬 할 수 있습니다 코드의 어느 부분에 대한 추가 데이터 정보를 알고 싶습니다 실행 중인지, 실행 중인지, CPU 기록이 필요합니다

그리고 조금 더 많은 공간을 갖도록하겠습니다 여기에서 볼 수 있듯이 4 종류의 CPU 녹화 첫 번째로가 봅시다 그것은 샘플 Java 메소드입니다 이것에 대한 간단한 녹음을 시작합시다

따라서 이러한 유형의 CPU 기록 중에, Java 가상 머신을 주기적으로 다른 모든 자바 쓰레드의 콜 스택을 수집한다 귀하의 프로세스에서 그런 다음 스택을 표시합니다 이 부분에서는 녹음의 세부 사항입니다 그리고 녹음이 완료되면, 녹음 전체 자동으로 선택됩니다

더 자세히 살펴보고 싶다면, 선택 영역 확대 (Zoom to Selection)라는 버튼이 있습니다 그래서 그것을 클릭하면 전체 화면을 채울 것입니다 그리고 녹음의 하위 범위를보고 싶다면, 마우스를 사용하여 선택할 수 있습니다 전체 녹음을 다시 선택하려면, 여기서 작은 시계 아이콘을 클릭 할 수 있습니다 그리고 때로는 매우 특정한 점을보고 싶을뿐입니다

이 경우이 영역에서 한 번 클릭 할 수 있습니다 여기에서 자동으로 항목을 선택합니다 이제 여기서 호출 스택을 살펴 보겠습니다 그리고이 범위를 선택합시다 그게 더 재미 있을지도 몰라

보시다시피, 프로파일 러는 오렌지색 안드로이드 플랫폼의 비용을 색상으로 표시 자바 언어에서 파란색으로, 그리고 그것은 또한 코드 및 라이브러리 코드를 녹색으로 색칠하십시오 그래서 코드에서 어떤 메소드가 필요한지 알고 싶다면 실행중인 경우, 당신은 녹색 물건을 찾고있을 것입니다 그래서 여기서 우리는 여기에 녹색 물건을 볼 수 있습니다 그리고 여기에서 볼 수 있으면 onDraw 메소드입니다 빌리지 뷰 클래스에서

그리고 쉽게 볼 수있는 것처럼 코드베이스를 보면, 방문 [비 숙주]는 구름을 그릴 책임이 있습니다 이 화면에 있습니다 샘플링에 대해 이야기하고 싶은 또 다른 점은 이 녹음 유형에 대해 몇 가지 맞춤 설정을 할 수 있습니까? 따라서이 Edit Configuration 항목을 클릭하면, 이 더하기 기호를 클릭 할 수 있습니다 사용자 정의 된 CPU 구성을 작성할 수 있습니다 이 샘플 Java 메소드 기록 유형의 경우, 샘플링 간격을 변경할 수 있습니다

대부분의 샘플링 기술이 진행됨에 따라, 샘플 수집 빈도가 높을수록 데이터가 대표성을 갖습니다 그러나 이로 인해 더 많은 오버 헤드가 발생합니다 때로는 유스 케이스에 따라, 여러 번 시도해 볼 수도 있습니다 달콤한 자리를 찾기 전에 우리가 보았 듯이 샘플 Java 메소드 높은 수준의 그림을 얻으려면 매우 유용합니다

실행중인 코드의 일부 다른 시나리오에서는 원하는 경우 더 작은 영역에 집중하기 위해, 두 번째 유형 레코딩, 추적 Java 메소드, 더 흥미로울 것입니다 그래서 다른 사례를 모으게하십시오 따라서 이런 유형의 CPU 기록에서, Java Virtual Machine은 매번 데이터를 수집하고 있습니다 실행이 메소드에 들어가거나 메소드를 종료 할 때

따라서 더 많은 데이터가 수집됩니다 예를 들어, 실제로 시도하고 이해하려는 경우 정확히 내 코드에서 어떤 메소드가 실행 중인지, 나는 녹색 물건을 여기에서 찾을 것이다 그리고 많은 것들이 있다는 것을 알 수 있습니다 그리고 확대하고 싶을 수도 있습니다 따라서 WASD 키를 사용하여 확대 할 수 있습니다

따라서 W가 확대됩니다 보시다시피, 열쇠입니다 S가 축소됩니다 D가 오른쪽으로 이동합니다 A가 왼쪽으로 이동합니다

따라서 게이머라면 이미 알고있을 것입니다 확대하면 계속 확대 할 수 있습니다 이 녹색 물건이 무엇인지 알기 위해 그래서 여기에서 우리는 이것을 보았습니다 우리가 방금 전에 본 것입니다

Village View의 onDraw 메소드입니다 그들은 구름을 그리는 책임이 있습니다 여기는 Snowflake View 클래스의 onDraw 메서드입니다 이 모든 눈송이를 그릴 책임이 있습니다 주위에 떠있다

그리고 가까이서 보면 아주 작은 초록색 선이 많이 있습니다 이리 따라서 확대 할 수 있습니다 추가로 확대 할 수 있습니다 따라서 이것이 onDraw 메소드임을 알 수 있습니다

Snowflake 클래스에서 이것은 또한 눈송이 반에서 온 것입니다 이것은 또한 Snowflake 클래스의 것입니다 그래서 당신은이 수업이 정확히 어떤 것인지보기를 원할 것입니다 그래서 여기를 마우스 오른쪽 버튼으로 클릭하면 메뉴를 볼 수 있습니다

소스 코드로 이동합니다 그래서 당신은 여기에서 볼 수 있습니다,이 Snowflake 수업에서, 이 onDraw 메서드에서 우리는 속도에 대한 계산, 각도에 대한 계산, 크기에 대해서 그런 다음 원을 그립니다 그러면이 스크린의 모든 눈송이가 이 메소드가 실행됩니다 그래서 우리는이 방법에 대한 많은 호출을보고 있습니다

따라서 볼 수 있듯이 Java 메소드를 추적하십시오 그 여부를 확인하는 데 매우 유용합니다 메소드가 실행되었습니다 메소드가 실행되는 빈도를 확인하는 것도 유용합니다 내가 여기서 이야기하고 싶은 또 다른 것 여기 네 개의 모자에 관한 것입니다

첫 번째 차트는 콜 차트입니다 우리가 말했듯이 콜 차트는 CPU 기록 중 모든 호출 스택을 나타냅니다 그래서 왼쪽에있는 것들 – 자, 전체 범위를 선택합시다 당신은 그것을 볼 수 있습니다 그래서 호출 스택은 왼쪽을 보여주고, 이 녹음에서 처음으로 발생합니다

오른쪽의 것들은 나중에이 녹음에서 일어날 것입니다 프레임 차트에서 호출과 비슷합니다 스택,하지만 그것은 거꾸로입니다 그래서 뿌리는 바닥에 있습니다 또한 식별 된 호출 스택이 여기에 집계됩니다

따라서 메소드의 총 시간을 보는 것은 매우 쉽습니다 실행되었습니다 위에서 아래로 [INAUDIBLE]은 (는) 정확히 동일한 데이터를가집니다 프레임 차트로 It7s은 다른 시각으로 나타납니다

그럼이 견해에 대한 좋은 점은 당신은 시간에 따라이 방법들을 정렬 할 수 있습니다 따라서 저장 시간은 실행 시간입니다 이 방법 자체로 자식은 서브 루틴에 의해 실행 된 시간입니다 이 메서드에 의해 불려갑니다

그리고 전체 열은이 둘의 조합입니다 상향식은 발신자에게 전화 스택을 위쪽으로보고 있으며, 기본적으로 메서드에서 다른 함수로 를 호출 여기에서 매우 유용합니다 확장하면 매우 유용합니다 이 메소드가 호출 된 곳을 보려면, 이 메소드가 실행되었을 때 실행 된 시간 특정 호출자가 호출합니다

그리고 세 번째 유형의 CPU 기록이 있습니다 즉 샘플 네이티브 함수 – C 또는 C ++ 함수 여기 또 다른 짧은 추적을 해봅시다 그리고 당신이 기억한다면, 나는이 응용 프로그램, 산타 트래커, Java 전용 코드가 들어 있습니다 따라서 호출 스택은 호출 스택을 가정하고 이 녹음 유형으로 수집 별로 흥미롭지 않습니다

대부분 시스템 호출입니다 그들 중 일부는 안드로이드 프레임 워크 네이티브 코드를 사용합니다 그러나 앱에 기본 구성 요소가있는 경우, 이 유형의 녹음은 매우 편리합니다 추적 시스템이라고하는 또 다른 유형의 CPU 기록이 있습니다 우리의 부름에 그러나 내가 그 세부 사항에 들어가기 전에, 나는 Dave에게 데모를 돌려 줄 것이다

데이빗 허먼 : 훌륭합니다 따라서 CPU 기록은 매우 유용합니다 그러나 때로는 정확한 기능이 있거나 어쩌면 단지 분석하고자하는 몇 가지 기능 그리고 기록하기에 조금 부정확합니다 앱에서 녹화를 중지 한 다음 확대합니다

그것을 검색하십시오 다행히도 우리는이를 위해 매우 간단한 솔루션을 제공합니다 그리고 이미 코드를 추가했습니다 그럼 그것에 대해 이야기 해 봅시다 따라서 디버그 클래스는 실제로 Android API의 일부입니다

그리고 디버그 클래스와 그 메소드의 많은 부분 사실 Android API에있었습니다 이 두 가지를 포함한 첫 번째 버전부터 시작 메소드 추적 기능이하는 일 시스템에 추적을 요청하는 것인가, 당신이 제공 한 파일 이름으로 저장하고, 그것을 넣는다 나중에 장치를 뺄 수있는 폴더에서 검사합니다 정말 좋지만 Studio 프로필러에서는 우리는 너의 등을 맞았다

우리는 당신을 위해 모든 일을 할 것입니다 따라서 수동으로 수행하는 경우, 당신은 아마도 당신이 선택한 이름에 대해 매우 조심해야 할 것입니다 그리고 여러 개의 흔적을 남기고 있다면, 고유 한 이름을 선택하면 서로를 덮어 쓰지 않았다 이 경우 Studio에서 이름이 표시되지 않습니다 우리는 그것에 대해별로 신경 쓰지 않습니다

그래서 당신이 원하는대로 부르세요 여기, 녹음을하기 시작합니다 이 함수를 중심으로 그래서 내가이 경우에 대해 궁금한 점은, Santa Tracker에는 City Quiz라는 활동이 있습니다 그리고 City Quiz는 디스크에서 파일을로드합니다 그것은 대개 정말로 좋은 것입니다, 얼마나 오래 걸릴지 알고 싶다면, 의심스러운 일이라면 어쩌면 그렇지 않을 수도 있습니다

우리는 한번 살펴 보겠습니다 그러나 내가 언급하고 싶은 한 가지는 이 시작 메소드 추적 함수를 호출 할 때, 그것은 당신의 코드를 추적하고 있습니다 이것은 더 비싸고 정확하며 상세한 것입니다 그래서 나는 아주 조심 스러울거야 나는 많은 양의 코드 주위에서 이것을하지 않을 것이다

그냥 그것이 걸리지 않도록 예상보다 오래 걸릴 수도 있습니다 좋아, 실제로 시티 퀴즈에 들어가 보자 여기 아래 있습니다 무슨 일이 일어나는 지보십시오 자,이 일을하기 전에, 네가 여기서 눈을 떼지 않으면 안되

세션 패널에 그리고 당신은 Play를 누르십시오 It7s는 안으로 달릴 것이다 그리고 자동으로 기록됩니다 나는 아무것도 할 필요가 없었다 정말 끝내주는 군

다시 돌려 보내 줘 여기에서 볼 수 있듯이 새로운 것은 없습니다 이것은 바로 Shukang이 전에 당신에게 보여준 것입니다 그것은 또 다른 흔적입니다 그러나 당신은 그것을 스스로 기록 할 필요가 없었습니다

나는 이것이 좋은 순간이라고 생각한다 내가 말한 라이프 사이클 이벤트 이야기 시작 부분 보시다시피, 우리는 여기에 하중을 가하고 있습니다 우리는 이전 활동을 떠났습니다 이제 우리는이 새로운 활동에 들어갑니다

마우스를 활동에 올리면 다음과 같이 볼 수 있습니다 Android Studio 33의 경우, 그 시간 동안 활성화되어 있습니다 그래서 그것은 당신에게 유용 할 수 있습니다 하지만 여기 있습니다

우리는 여전히이 공간에 있습니다 우리가 실제로 활동에 들어가기 전에 또 다른 멋진 기능이 있습니다 이 필터 버튼을 보여 드리겠습니다 필터 버튼을 누르면 검색 창이 나타납니다 나는 그것을 입력 할 수 있습니다

이제 JSON에 대한 readLiteral 함수 그럼 그걸 타이핑 해 보겠습니다 이제 여기에서 알아 차릴 수있는 한 가지 내 콜 차트의이 부분이 희미 해졌습니다 여기 모든 부분은 어둡지 않습니다 그들은 여전히 ​​정상적인 색깔입니다

그러니 내가 확대 할 수 있는지 찾아 보겠습니다 그래서 거기에 우리가 간다 그래서 우리는이 readLiteral 함수의 일부 인스턴스를 볼 수 있습니다 기본적으로 내 기능이 정확히 일치하면 굵게 표시됩니다 함수 중 하나를 호출하는 함수 인 경우 또는 간접적으로 그 기능으로부터 불려지는 경우, 색상은 동일하게 유지됩니다

그리고 그렇지 않으면 흐려질 것입니다 그리고 get을 정렬하는 것이 정말 유용합니다 얼마나 많은 시간을 가졌는지에 대한 좋은 개요 함수에 코드 사용하기 당신이 걱정하는 것과 대 주의를 기울일 필요가 없다 모든 CPU 세부보기가이를 지원합니다 그래서 화염 차트에는 이와 비슷한 디밍이 있습니다

하향식 및 상향식은 해당 기능을 제거합니다 희미 해졌다 그래서 당신이 어떤 종류의 방법을 조사하려고 시도한다면, 너는 정말로 그걸 좁히고있어 필터 옵션을 시도하십시오, 보고있는 것에 집중할 수 있는지 확인하십시오 이제 여기서주의해야 할 마지막 사항은 우리가 한 모든 흔적들이다

그 위에 마우스를 올려 놓으면 여기에 저장 버튼이 있습니다 따라서 실제로 추적을 내보낼 수 있습니다 그렇게하면 동료에게 줄 수 있습니다 그것을 버그에 붙여라 그런 유용한 것들

누군가가 추적 파일을 제공하거나 파일을로드하는 경우, 여기 더하기 버튼을 눌러로드 할 수 있습니다 파일에서 괜찮아 그래요 좋아요 SHUKANG ZHOU : 이제 이야기 할 것입니다

마지막으로 기록한 CPU 기록 유형, 추적 시스템이 호출합니다 이 기능을 사용하면 시스템 호출을 추적 할 수 있습니다 Android 32에 도입되었습니다 세분화 된 시스템 이벤트를 수집합니다

이는 앱 성능과 관련이 있습니다 따라서 앱이 시스템과 상호 작용하는 방식을 조사 할 수 있습니다 리소스가 시스템 추적이됩니다 그래서 한 가지, 다시 말해서 클릭하여 확대 / 축소 버튼을 사용하고 있습니다 여기에 아주 쉽게 볼 수 있습니다

내가 여기서 너에게 보여주고 싶은 한 가지는 – 내가 너에게 보여주고 싶은 첫 번째 일 이 스레드 상태보기에 있습니다 따라서 범위를 클릭하면 해당 선택 항목이 다시 확대되고, 여기를 클릭하겠습니다 [알아들을 수 없는] 여기에서 볼 수 있듯이 마우스를 사용하거나 마우스를 올려 놓거나 당신은이 스레드 상태가 실행 가능하다는 것을 알 수 있고, 실행되고, 실행 가능 해져서 다시 뛰게됩니다 보시다시피, 우리는 모든 CPU 스케줄링을 수집하고 있습니다 조작

따라서이 수준의 세부 사항에서는 매우 쉽습니다 스레드가 차단되는시기를 정확하게 파악할 수 있습니다 스레딩 문제가있는 경우 유용 할 수 있습니다 추적 시스템 비용을 사용하여 보여주고 싶은 또 다른 점 느린 UI jank를 조사하는 것입니다 너무 느린 UI 렌더링은 일부 사람들이 jank라고 부른 것으로, 아시다시피, 그것은 [INAUDIBLE] UI입니다

작업은 두 단계로 이루어집니다 첫 번째 단계는 주 스레드에서 발생합니다 그것은 화면에 무엇이 있는지를 결정합니다 레이아웃과 [INAUDIBLE]을 (를) 포함하여 그것은 모든 UI를 실행하여 무엇을 결정합니다 요소 (예 : 앱의 모든보기 클래스) 그래서 메인 쓰레드가 무엇을 생성했는지, 그들은 원시 렌더 스레드로 전달됩니다

렌더 스레드는 어떻게 그리는지를 알아낼 것입니다 그런 다음 표면 핑거 시스템으로 전달 될 것입니다 프로세스 및 실제 하드웨어 도면을 수행합니다 그래서 그 배경을 제공합니다 그래서 우리는 프레임 영역 아래에서 볼 수 있습니다

우리는 메인 스레드를 나타내는이 메인을 가지며, 렌더링은 렌더링 스레드를 나타냅니다 그래서 조금 축소 시키십시오 여기서 볼 수 있습니다 이것이 첫 번째 단계입니다 그리고 이에 해당하는 두 번째 단계가 여기에 있습니다

부드러운 UI를 목표로 삼고 있다면 – 초당 60 프레임의 부드러운 애니메이션, 이것은 프레임 당 약 16 밀리 초입니다 그래서 두 단계가 결합되었습니다 16 프레임 미만이어야합니다 프로파일 길이가 그보다 길면 프로파일 러 해당 프레임을 빨간색으로 표시합니다 알다시피, 이것은 느린 것입니다

따라서 더 많이 축소하면 많은 프레임을 볼 수 있습니다 오늘은 모두 빨간색이라고 생각합니다 즉, 모든 사람이 초과한다는 의미입니다 16 밀리 초 임계 값 한 가지 요소는 에뮬레이터를 사용하는 것입니다 에뮬레이터가 시스템과 상호 작용하는 방식 때문에, 더 많은 빨간색 프레임을 보게 될 것입니다

우리의 실제 장치보다 오늘 이야기하기 전에 나는 다른 흔적을 수집했다 실제 물리적 장치를 사용합니다 그리고 그 추적을 파일로 내 보냈습니다 그리고 이제 그 흔적을 가져 와서 보여주고 싶습니다

Dave가 전에 말했듯이이 더하기 기호를 사용할 수 있습니다 추적을 가져 오려면 그 흔적이 있네 시스템 호출을 추적 할 때, 시스템 전체의 이벤트가 수집됩니다 따라서 제공자에게 당신이보고 싶어하는 과정

그래서 우리는 산타 추적자를보고 싶습니다 그리고 아시다시피, 시스템 관점에서 볼 때 리눅스는, 모든 프로세스 또는 모든 스레드, 귀하의 이름 15자를 초과 할 수 없습니다 그래서 이것이 실제로 santatrackerdebug 어떤 이유로 시스템은 이것이 이름이라고 생각합니다

따라서이 항목을 선택하면이 추적을 가져 오게됩니다 여기 실제 장치에서 볼 수 있습니다 대부분의 프레임은 회색으로 표시됩니다 이는 16 밀리 초 임계 값 미만임을 나타냅니다 그리고 프레임의 so6e는 빨간색에 있습니다

그것들은 그 문턱을 초과하기 때문입니다 프로파일 러가 어떻게 알 수 있을지 궁금해 할 수 있습니다 이 단계가 오래 걸리나요? 그것은 추적 지점에서입니다 Android 플랫폼 엔지니어는 일부 중요 업무에 건물 추적 점 추가 Android 시스템에서 여기 예제는 메인 스레드를 클릭하면, 이 이벤트는 여기서 추적 이벤트에서 표시됩니다 그래서 내가 여기 zoo6하면, 당신은 이것을 볼 수 있습니다

이들은 Choreographer doFra6e라고하는 추적 이벤트입니다 이것이 우리가 방금 이야기 한 첫 번째 단계입니다 UI 렌더링에서 그것은 주 스레드에서 발생합니다 렌더 스레드를 클릭하면 drawFra6e라는 이벤트가 있음을 알 수 있습니다

이것이 두 번째 단계입니다 그리고 다른 사람이 있음을 알 수 있습니다 추적 포인트 그들은 모두 syste6을 구축하고 있습니다 그래서 그들은 모든 안드로이드 폰에서 이용 가능하며, 그들이 건물이기 때문에

타이밍 정보를 얻는 데 매우 유용합니다 일부 특정 작업 실제로 추적 지점을 가질 수도 있습니다 여기에서 데모 할 것입니다 그래서 오늘 – 그래서 여기, 우리가 정상에 들어가면 응용 프로그램 의이보기로 돌아와서, 우리는 구름이 있습니다

우리에게는 눈송이가 있습니다 나는 6y 코드가 얼마나 오래 그것들에 합류하는데 소비되는지를 알고 싶다 구름 때문에 나는 마을보기로 간다 따라서 onDraw 메서드가 있어야합니다 그래서 방법의 시작 부분에, 나는 계기를 추가합니다

추적 beginSection, 당신은 문자열을 제공해야합니다, 섹션의 이름입니다 메소드 끝에서이 추적 이벤트를 종료합니다 눈송이의 경우 Snowflake View로 이동합니다 다시 말하지만, onDraw 메서드에 있어야합니다 섹션 이름을 지적하고 싶습니다

당신은 6 개의 이름을 골라야합니다 감각을 통해 언제인지 알 수 있습니다 당신은 CPU 녹화를하고 있습니다 그래서 우리는 Snowflake Android Dev Su66it을하고 있습니다 2018 오늘날의 데모에서는 이것이 의미가 있습니다

이제 수동 계측을 추가했습니다 그래서 나는이 응용 프로그램을 다시 작성하고 다시 프로파일 링합니다 따라서 빌드를 기다리는 동안 궁금해 할 수 있습니다 두 가지 방법이 얼마나 오래 걸리는지 알고 싶다면, 왜 추적 Java 메소드를 사용하지 않습니까? 잠깐 얘기하고있는 그 종류의 CPU 녹화? 그래서 나는 추적 자바 방법이 매우 강력하다고 말할 것이다 사용하기가 매우 쉽습니다

하지만 상당한 오버 헤드가 있습니다 Java Virtual 실행이 시작될 때마다 머신이 데이터를 수집하고 있습니다 메소드 및 메소드 실행이 메소드를 종료 할 때마다 호출됩니다 그래서 자주 호출하는 방법이 많다면, 그 오버 헤드는 신속하게 합쳐져 매우 비싸게됩니다 6 가지 계기를 사용하는 경우, 예를 들어 추적 API를 사용하는 것처럼, 데이터 수집시기와 장소를 완벽하게 제어 할 수 있습니다

따라서 현명하게 사용하면 오버 헤드가 훨씬 줄어 듭니다 결과적으로 수집 한 데이터 더 정확해질 것입니다 그럼 우리가 가진 도구를 검증 해 봅시다 따라서 CPU 프로파일 러로 이동하십시오 추적 시스템 호출 추적을 수집합니다

그리고 여기, 우리는 zoo6에서 안무가 doFra6e, 우리는 다시이 사건을 봅니다 이것은 모든 UI를 담당하는 주 스레드에서 온 것입니다 집단 동물원을 계속 가면 볼 수 있습니다

이것이 방금 추가 한 프레임, Village View입니다 클라우드에 합류했습니다 그리고 이것은 Snowflake View, ATS 2018입니다 그것은 눈송이에 합류하는 책임이있는 물건입니다 따라서 트레이스 시스템을 사용하여 CPU 기록을 호출하는 방법입니다

따라서 systrace라는 비슷한 도구에 대해 들어 보셨을 것입니다 그래서 실제로 내 Google 동료 [INAUDIBLE] 어제 systrace에서 번개 이야기를했다 그래서 매우 강력한 도구입니다 하지만 systrace의 학습 곡선 Android Studio Profiler보다 조금 가파르다 따라서 사용자는 자신의 필요에 가장 적합한 도구를 선택할 수 있습니다

OK, 이는 추적 CPU 기록 용입니다 나는 Dave에게 다시 데모를 넘겨 줄 것이다 알겠습니다 CPU 프로파일 러를 뒤로두고 뛰어 넘다 메모리 프로파일 러에 연결하십시오

우선, 나는 모두의 관심을 끌어 들이고 싶다 이 할당 추적 풀다운에 여기에 간략히 기록한 안드로이드 스튜디오 30에서, O 이상을 사용하여 Android 기기를 타겟팅 할 때 우리가 한 일 모든 단일 할당에 대해 호출 스택을 수집합니까? 귀하의 앱이 만든 것입니다 우리는 그것을 사용하는 것이 매우 편리 할 것이기 때문에 그것을했습니다 그 역사를 가지고 있습니다

그러나 일부 사용자는 프로필러 그들의 애플 리케이션을 늦추고 있었다 우리가 조사한 후에, 그것은이 특징으로 밝혀졌습니다 그래서 Android Studio 33부터는, 우리는 이제 이것을 구성하는 옵션을 제공합니다 내가 여기 가서 보도록하겠습니다

그래서 우리는 아무도, 샘플을 채우지 않았고, 가득 차있었습니다 None은 기능을 비활성화하고, Full은 기능을 활성화하고, 샘플링 된 할당의 하위 집합을 수집합니다 그 종류의 당신에게 app7s 메모리가 어떻게 일반적인 모양을 제공합니다 행동은 실제로는 실적에 영향을 미치지 않지만 완전한 사람만큼이나 이제 Full이 앱에 영향을 주는지 여부 또는하지 않을 수 있습니다 호스트 컴퓨터에 의존 네가 뛰고 있든, 너 뛰고있어 장치 또는 에뮬레이터 타겟팅 또는 코드 작성 앱 코드에 많은 소규모 할당이있는 경우 산타 트래커처럼 그렇게 느려질 수 있습니다

하지만 기능을 가지고 놀아 보는 것이 좋습니다 나는 여기서 전진하고 Full을 켤 것이다 I76 여기에 살거야 그래서 내가 Full을 켜면, 이 할당 표시기가 나타나기 시작했습니다 나는 재미있는 일들을 원해

이제 장치를 회전시켜 보겠습니다 나는 너를 거기에 붙잡을지도 모른다 다시 회전하십시오 저기로 돌려 놓으세요 자 이제 살펴 보도록하겠습니다

그래서 내가해야 할 일은 바로 드래그하는 것뿐입니다 나는 모든 것을 볼 수있을거야 할당 및 할당 취소 그 범위에서 일어난 일 정말 가벼운 방법 일 수 있습니다 당신의 기억이 무엇을하고 있는지 빨리 알 수 있도록 정렬하십시오

할당 및 할당 해제 횟수가 있습니다 그래서 때로는 심지어 메모리 누수를 발견 할 수도 있습니다 그러는거야 그리고 다른 좋은 점은 아마 이걸 가지고 있다면, 너는 다른 일을하고있어 당신은 실제로 제 시간에 돌아가서 범위를 선택할 수 있습니다

여전히 당신의 기억에 어떤 변화가 있는지 봅니다 이제 저는 여기서 다시 나가서 다시 되돌릴 것입니다 그리고 할당량이 표시됨을 알게 될 것입니다 그것은 빈 원을 그리며 추적을 멈추었다 샘플링 모드를 수행하면 절반으로 채워진 원이 생깁니다

이제이 오브젝트들을보고, 한번 클릭하면, 현재 할당 된 모든 것을 볼 수 있습니다 또한 할당 된 위치도 포함됩니다 이것은 코드베이스에서 핸들을 얻는 데 매우 유용합니다 이 주위를 클릭하고 다른 개체가 어디에 있는지 볼 수 있습니다 에서 오는

그것이 말하게되면, 도움이되지 않을 수도 있습니다 왜 메모리 누수가 발생했는지, 왜 내 기억을 고수하고있다 당신이 그 정보를 얻고 싶다면, 여기서이 아이콘으로 가야 해 이것이 힙 덤프 아이콘입니다 힙 덤프를 클릭하십시오

그래서 제가 여기서 실제로하려고하는 것은 당신에게 알려주는 것입니다, 누출 된 활동이나 조각을 찾지 못했습니다 산타 트래커 애플 리케이션에서 그래서, 전체 공개, 나는 하나 추가했습니다 그리고 내가 한 것은 메모리 누수를 추가 한 것입니다 이 펭귄 수영 게임 여기에

그러니 실제로 실제로 활동에 들어 가자 그것을 남겨주세요 실제로 다른 힙 덤프를 수행하게하십시오 좋아, 그래서 우린 덤프 뭉치를 얻을거야 여기에 정보

그래서 저는이 활동의 ​​일부분을 알고 있습니다 수영 조각이라고합니다 CPU와 마찬가지로 필터 버튼이 있습니다 그리고 나는 다른 모든 물체를 걸러 내고, 그리고 그것을 발견한다, 긍정, 충분히,이 수영 조각 아직 살아있다 클릭하면 활성 인스턴스가 선택됩니다

여기에서 많은 일이 일어나고 있습니다 약간의 설명을하기 위해 잠시 시간을 할애합니다 한발 뒤로 물러나서 그것을 흡수하기 위해 잠시 시간을 내 보자 그래서이 깊이 아이디어가 무엇인지 설명하고 싶습니다 따라서 모든 Java 메모리를 상상해보십시오

이 힙에있는 가비지 수집기로 정리할 수 있습니다 특정 Java 객체가 있습니다 이 원 밖에서 살다 이러한 것을 GC 뿌리라고합니다 새 스레드를 만들면 기본적으로 이 특별한 GC 루트를 만든다

또는 정적 변수는 GC 루트의 인스턴스입니다 그래서 일어나는 일은 당신이 스레드에서, 그 클래스가 생성하는 클래스의 인스턴스를 생성한다 다른 클래스의 인스턴스이며, 차례 차례로 등등 근본적으로 당신이하고있는 일 너는이 긴 사슬의 사슬을 만들고있다 그 사슬의 각 항목은 더 나아가서 GC 루트의 깊이

이제 사이클에 문제가 없다는 소식을 들었을 것입니다 가비지 컬렉터에게 나는 너를 가리킬 수있다, 그리고 너는 너를 가리킨다 너는 나를 다시 가리킨다 그러나 우리가 모두 도달 할 수 없다면, 그것은 모두 가비지 수집기에서 제거됩니다

따라서 주목할 사항 중 하나는 힙 덤프를 가져갈 때입니다 너는 무서운 양의 것을 볼지도 모른다 내 인스턴스를 붙들고 있지만 많은 인스턴스는 무해합니다 이들 중 상당수가 잠재적으로 단순한 사이클입니다 그리고 당신이 알 수있는 한 가지 방법은 항상 사실이 아닙니다

하지만 좋은 경험적 방법입니다 깊이가 자신의 깊이보다 큰 경우입니다 왜 그런지 설명해 드리겠습니다 그래서 가비지 콜렉션 루트가 당신을 가리킨다 고 상상해보십시오 하위 인스턴스를 만듭니다

그리고 당신이하는 일 중 하나는이 포인터를주는 것입니다 그래서 그것은 당신을 가리키고 있습니다 그건 아주 흔한 일입니다 여기, 나를 다시 가리킨다 너는 내 자식이야

하지만 네 부모가 누군지 알지 그럼 내 깊이가 가고 있다는 뜻이야 이 포인터의 깊이에 추가됩니다 그래서 이것이 이러한 깊이의 일부인 이유입니다 여기에 당신이 문제가 아니라는 사실을 알게되면 여기에 주목하게됩니다

깊이 열에 이러한 항목이 몇 가지 있습니다 여기서 깊이는 비어 있습니다 그건 실제로 아무런 의미가 없다는 것을 의미합니다 모든 가비지 수집에서 현재 이들에 도달 뿌리 그래서 결국 정리 될 것입니다

지금은 힙 덤프에 나타나지만, 당신은 그것에 대해 걱정할 필요가 없습니다 그냥 무시하십시오 매립 된 것만 큼 좋습니다 우리가 이것을 조금 이해할 수 있도록, 구체적인 예를 들어, 나는 실제로 이 코드를 보게 될 것입니다 우리 메모리 누출의 원인

우리의 깊이는 1입니다 이 아이템의 깊이는 2입니다 이것은 어딘가에 있습니다 점수보기 클래스의 인스턴스가 있습니다 그리고 그 스코어 뷰 클래스에는 share라는 변수가 있습니다

ClickListener, 값은 me입니다 이제 수영 조각을 살펴 봅시다 그리고 getScore 뷰를 검색 할 것입니다 그래서 전에, 내가 이것을 보았을 때, 나는 노력했다 코드를 살펴 보겠습니다

나는 어떤 방법이 있어야한다고 말했다 저를 지적하는 점수보기를 얻을 것입니다 그리고이 getScore 뷰 메소드가 있습니다 내 수영 조각 안에 내가 그것에 뛰어 들면, 네가 보게 될 것은, 네, 우리는 하나를 만들고이 포인터를 전달합니다

그래서 거기에주기가있는 이유가 설명되어 있습니다 나는 그것에 대해 걱정할 필요는 없지만 최소한 왜 그것이 힙 덤프에 나타나는지 설명합니다 이제이 $ 0 기호가 많이 있음을 알 수 있습니다 여기서 뭐하는거야? 왜냐하면 당신은 그것을 많이 볼 것이기 때문입니다 당신은이 포인터가 무엇인지를 모두 알고 있습니다

하지만 당신이 내면의 계급이라면 – 당신이 중첩 된 계급이라면 외부 클래스의 필드에 액세스 할 수 있어야합니다 그것이 작동하는 방식은 컴파일러입니다 합성 변수를 생성합니다 그리고 이것을 호출하는 대신에, 이것을 취했기 때문에, 그것은이 $ 0이라고 부릅니다 그래서이 0 달러는 내 범위에서 벗어난 한 수준입니다

그리고 언제든지 내부 클래스를 만들 수 있습니다 그것의 외부 클래스에 대한 참조를 가지며, 또는 클로저, 익명 클래스 인스턴스를 만들거나, 그것은 그것을 가질 것입니다 따라서 코드에서 모두 람다를 사용한다면, 또는 익명 클래스를 사용하면 이 0을 많이 봅니다 이 값은 깊이가 0이므로 GC 루트임을 의미합니다 그건 정말 의심 스럽네

그럼 소스로 건너 뛰자 지금 바라건대 내가 이것을 볼지도 모르겠다 오, 나는이 장기 실행 과제를 썼다 보시다시피 정적 클래스는 아닙니다 그것은 최종 수업입니다

따라서 정적이 아니라면 참조를 붙잡을 것입니다 부모 클래스에 그게 여기서 일어나는 일입니다 그리고 저는 오랫동안이 장기적 과제를 말할 수 있습니다 나는 그것을 만들었지 만 그것을 취소하는 것을 잊었다

여기에 대해 살펴 보겠습니다 그래, 물론, 나는 그것을 주석으로 남겨 뒀다 아무 이유없이 거기에서 주석을 풀어주세요 그리고 다시 시작합시다

이제 우리가 할 일은 저장되었는지 확인하겠습니다 우리는 거기에 갈

지금 우리가 할 일은 재부팅입니다 사실이 수영 조각이 풀려 났는지 확인하십시오 시선을 사로 잡는 것 중 하나 당신이 메모리 누출 사냥을하고있을 때 정적 변수 또는 싱글 톤 클래스 수업을 들었거나 직접 등록하는 학생 청취자와 함께,하지만 그것을 제거하는 것을 잊지, 또는 어떤 이유에서든 이러한 내부 클래스 중 하나 멈추지 않을지도 모른다 그리고 활동을 계속하고 있지만 여전히 활동 중입니다 종료하려고합니다

여기서 프로파일 링하고 있습니까? 예, 우리는 여전히 가고 있습니다 그리고 내가 언급하고 싶은 또 다른 것 항상 쉬운 일은 아닙니다 당신은 항상이 명백한 범인을 가질 수는 없습니다 그래서 그 경우에, 당신이가는거야 하고 싶은 것은, 나는 말할 것이다

코드를 알아 내려고 노력하십시오 내가 말했던 것들을 찾는다 가자 들어가서 들어 가자 그리고 내가 이야기하는 동안 여기서 나가겠다

그리고 만약 당신이 그것을 청소 했더라도, 당신이 그것을 찾지 않아도 힙 덤프를 통해 힙 덤프 여전히 진리의 원천이 될 것입니다 그것은 여전히 ​​그 일이 될 것입니다 당신의 기억이 실제로 되찾아진다는 것을 보장합니다 그래서 나는 여기에 가서 다시 돌아갈거야 메모리 프로파일 러에 저장합니다

가비지 수집기를 클릭하겠습니다 따라서 이러한 쓰레기 수집 이벤트에 주목했을 것입니다 자동으로 하단에 예를 들어 거기에는 많은 것이 있습니다 그 때 가비지 컬렉터 자체적으로 수집하기로 결정했습니다

그러나 가비지 컬렉션 버튼을 클릭 할 수도 있습니다 수동으로 실행되도록합니다 이제 우리는 여전히 조각을 여기에서 볼 수 있습니다 깊이가 실제로 있는지 봅시다 그래서 당신이 볼 수 있듯이, 조각 조각 여전히 나타나고 있습니다

나는 긴장 할 수있다 어떻게 된 거예요? 그러나 여기서 깊이 란은 비어 있습니다 모든 것이 단지 기본적으로 기다리고 있습니다 가비지 컬렉터에 의해 픽업됩니다 가비지 컬렉터를 몇 번 더 누르면됩니다

제가하고 싶은 한 가지 트릭은 전화를 돌리는 것입니다 그런 다음 다시 회전하십시오 Android 휴대 전화를 돌릴 때마다 즐거운 일이 많이 있습니다 우연히 있다 가비지 컬렉터에게 일이 진행되고 있다고 알려줍니다

그래서이 경우 여기에 또 다른 힙 덤프를 실행 해 봅시다 우리가 수영 조각이 있는지 정말 잘 수집 드럼 롤이 붙어 있었으면 좋겠어 그리고 너 거기 간다 그것은 사라 졌어요

그래서 내가 빨리 이야기하고 싶은 마지막 것 당신이 힙 덤프를보고 있다면, 항상 메모리 누출을 반드시 찾아 다니는 것은 아닙니다 밖을 내다 보는 몇 가지 주요 수업을 알지 못할 수도 있습니다 그래서 얕은 크기와 보존 된 크기의 개념이 있습니다 그래서 얕은 크기는 어떤 클래스의 단일 인스턴스의 크기입니다 그게 할당되었습니다 유지 된 크기는 보유하고있는 모든 것입니다

그래서 네가하고 싶은게 사냥이야 너의 얕은 크기를 분류하고, 너의 유지 한 크기를 분류하고, 그게 있는지 알아보기 위해 조사 할거야 그곳에는 의심스러운 기억들, 또는 어쩌면 당신은 당신의 디자인을 정리할 수 있습니다 이전에 메모리를 일부 제거하십시오 어쨌든, 그건 우리 데모 끝이야

Shukang 등을 맞댄 그것 슬라이드로 가자 SHUKANG ZHOU : 좋습니다 요약하자면, 오늘 데모에서 우리는 CPU 프로파일 러와 메모리를 사용하도록 표시 프로파일 러를 사용하여 코드베이스에 대한 더 나은 이해 산타 트래커 애플 리케이션의 그리고 솔직히 말해서, Dave와 나는 그것에 대해 많이 모른다

우리가이 이야기를 준비하기 전에 그리고 우리는 또한 우리가 프로파일 러를 사용하여 성능 문제를 진단하십시오 또한 프로파일 러를 사용하여 이 응용 프로그램의 성능 앞서 말했듯이 네트워크와 에너지도 있습니다 Android Studio의 프로필러

그러나 불행히도, 우리는 오늘 그것을 감당할 시간이 없습니다 따라서 온라인 문서 및 협의를 참조하십시오 더 배우기 그래서 우리는 당신이 우리의 데모에서 몇 가지 트릭과 팁을 배웠 으면 좋겠습니다 오늘

접근 할 때 유용하게 사용되기를 바랍니다 귀하의 사이트에서 귀하의 Studio Profiler로 귀하의 코드베이스를 우리의 대화에 참석해 주셔서 대단히 감사합니다 [박수 갈채] [음악 재생]

Modern Android Notifications (Android Dev Summit ’18)

[음악 재생] JINGYU SHI : 안녕하세요 최신 Android 알림에 오신 것을 환영합니다

내 이름은 징이다 나는 파트너 개발자 팀의 개발자 옹호자입니다 Paul Matthews : 저는 Paul Matthews입니다 저는 런던에서 파트너 개발자 옹호자입니다 그래서 3 년 전이 단계에서, 시스템 UI의 안드로이드 엔지니어 인 크리스 렌 (Chris Wren) 이 따옴표를 썼다

그리고 그것은 빛나는 것이다 "사용자를 괴롭히지 마십시오 그들을 존경하십시오 능력을 키워라 그들을 기쁘게합니다

그들이 관심있는 사람들과 연결하십시오 " 그리고 이것은 오늘날에도 여전히 매우 사실입니다 채널을 살펴보고이를 사용하는 방법에 대해 알아 보겠습니다 앱에서 알림의 새로운 기능 및 마지막으로 디지털 웰빙,하지만 먼저 사용자를 존중하는 방법 따라서 사용자의주의를 존중하십시오

사용자를 괴롭히지 마십시오 그들을 존경하십시오 유용한 팁 – 사용자 설정을 존중하십시오 따라서 앱에서 나와 연락 한 경우 그들이 당신의 통보를위한 특정 설정을 원한다고, 그렇다면 그것을 존중해야합니다 시도하지 말고 무시하십시오

시도하지 말고 무시하십시오 보내는 알림을 확인해야합니다 막히지 않았고, 그들이 여전히 원하지 않는다 이러한 알림을 듣기 마지막으로 앱에서 역량이 있다면, 당신은 그들이했던 모든 설정을 백업해야합니다

알림에 대해 이야기했습니다 그리고 동기화되었는지 확인해야합니다 설치 및 장치 이상 잘 구조화 된 알림을 사용해야합니다 앱에서 우리가 제공하는 스타일을 사용하므로, MessagingStyle, InboxStyle, BigPictureStyle과 같은 메시지 형식입니다

알림을 확인해야합니다 적절하고시의 적절합니다 좋은 예는 우선 순위가 높은 FCM 메시지를 사용하는 것입니다 사용자가 의도 할 때 알림을 받도록하십시오 그 (것)들은 당신의 통지를 얻는다

알림 우선 게시 우선 순위를 정한 다음 더보기 좋게 만들어 다운로드하기 자산과 그런 종류의 것 일부는하지 말고 일부는 기본하지 말아야합니다 이러한 알림을 보내지 마십시오 그리고 그들에 대해 잊어 버리는 종류 따라서 우리는 플랫폼 기능을 사용하기를 원합니다

너를 돕기 위해있다 예를 들어, 자동 취소, 확인 당신이해야 할 때 당신의 통지가 사라진다 시간 초과는 알림입니다 4 시간 후에 관련이 있니? 그리고 장치를 통해 동기화 – 사용자가 여러 기기에서 앱을 사용한다는 것을 알고 있다면, 태블릿 및 데스크톱과 마찬가지로 그들이 하나를 기각하는 알림 또는 다른 사람을 가로 질러 읽습니다 실행할 수없는 알림을 보내지 마십시오

알림의 요지는 그들이 사용되어야한다는 것입니다 정의에 따르면, 사용자는 무엇인가, 그들은 일반적으로 무언가를해야한다는 것을 의미합니다 알림을 보내지 마세요 이봐, 그냥 우리에게 알려주지 백그라운드에서 몇 가지

이것은 최고의 알림 사용이 아닙니다 그리고 마지막으로 사용자를 괴롭히지 마십시오 그래서 당신이 그 (것)들에게 통지를 게시 할 때, 한 번 경고를 사용하고 그들이 미친 듯이 윙윙 거리지 않는다고, 그들이 무대에 서서 발표에 관해 발표 할 때 그룹 알림을 확인해야합니다 행동은 당신이 원하는 것을 대표합니다

채팅 앱인 경우 어린이 그룹 알림 행동, 요약 등을 포함 할 수 있습니다 따라서 사용자를 존중하십시오 그렇지 않으면 알림을 사용 중지 할 수 있습니다 그리고 나서 그들에게 의사 소통 할 수있는 방법이 없습니다 앱을 제거하도록 선택할 수 있습니다

훨씬 더 악화 될 것입니다 의도적으로 사용할 수있는 일부 플랫폼 기능이 있습니다 알림이 꺼져 있습니다 예를 들어 게시 된 알림을 여기에서 볼 수 있습니다 그리고 사용자는 그것을 계속 스쳐 지나갈 수도 있습니다

이제 P에서 우리는 사용자에게 프롬프트합니다 이 통지에 정말로 관심이 있으십니까? 이 콘텐츠를 정말로보고 싶습니까? 이것은 채널에서 작동합니다 따라서 채널을 정확하게 설명하지 않으면 그러면 이것은 약간의 혼란을 가져올 수 있습니다 일부 손실 된 알림 사용자 관점에서 알림 채널에 대해 더 자세히 이야기 해 봅시다

알림에 대한 세부적인 제어 기능을 제공합니다 사용자를위한 따라서 사용자에게 권한을 부여해야합니다 그리고 채널은 채널에 힘을 실어주는 방법입니다 그럼 어떻게 사용하는지 살펴 보겠습니다 무엇보다 먼저 모든 앱에서 필수 요소입니다

API 26에 필요합니다 그리고 그 모든 곳에서 널리 퍼져 있어야합니다 그들은 사용자가 도움이되는 알림을 분류하는 데 도움이됩니다 사용자가 그들과 상호 작용할 수 있습니다 그러나 곧 그것에 관해서

마지막으로 사용자가 설정을 사용자 정의 할 수 있습니다 그래서 사용자는 마지막 말을했습니다 그래서 뭔가가 중요하다고 생각한다면 그리고 그들은 그것이 있다고 생각하지 않습니다, 그들은 당신에게 이것을 말할 수 있습니다 그럼 모범 사례를 살펴 보겠습니다 다시 말하지만, 사용자에게 채널 생성을 통해 알림을 관리 할 수 ​​있습니다

어쩌면 설정에 딥 링크 할 수있게해야합니다 이러한 것들을 바꾸기 그들이 관심을 표명하는 경우 알림 채널 작업, 아마 그들은 변화 할 수 있기를 원한다 무언가의 중요성 따라서 알림의 올바른 중요도 수준 설정 채널이 명백한 것처럼 보입니다

간과하기 쉽습니다 마지막으로 사용자 설정 – 앞서 말했듯이 사용자 설정을 존중해야합니다 그러나 당신이 할 수있는 곳에 그들을 백업하고, 그들을 시도하고 학대하지 마라 삭제 및 재 작성 다른 사용 금지는 하나의 채널 만 사용합니다

원한다면 이것은 분명히 알려주는 냄새입니다 애플리케이션에 하나의 채널 만 있다면, 아마 당신이보고 있어야 할 다른 것이있을 것입니다 사용자에게 잘못된 설명을 제공하는 경우 그래서 그들은 정말로 이해하지 못한다 채널의 목적이 무엇인지, 그러면 그들은 최선을 다할 수 없을 것입니다 결정

또는 잘못되었거나 차단 된 채널을 사용하는 경우, 그러면 아마, 아마, 그들은 당신에게 그들이 이 콘텐츠가 마음에 들지 않습니다 그리고 당신은 그것을 존경해야합니다 마지막으로 알림 채널을 사용하여 사용자를 스팸 처리합니다 계속 진행하는 가장 좋은 방법은 아닙니다 따라서 채널 선택은 실제로 가능합니다

도움을 받아 채널을 신중하게 선택하십시오 당신은 정말로 사용자를 생각해야합니다 애플리케이션을 만들지 않고 채널을 만들 때 너의 건축 사용자와 사용자의 생각 앱과 상호 작용하고 싶습니다 예를 들어, 시도하고 생성하는 것은 나쁜 생각입니다

중요도 수준의 알림 채널 당신은 중요하다고 느낍니다 이봐,이게 가장 중요한 일이야 알림 채널이 아닌 것입니다 범주별로 그룹화해야합니다 예를 들어, 사진에서 태그 지정, 또는 좋아하는 게시물

사용자가 나와 다시 대화하게하십시오 해당 유형의 알림을 보는 방법 또한 알림을 작성할 때 더 많은 통제가 필요합니다 예를 들어, 채팅 앱을 사용 중입니다 그리고 모든 채팅 알림에 대한 일반 채널이 있습니다

온다 그러나 나는 통제에 관심을 나타내고, 가족 채팅 그룹처럼 그 지점의 채널을 표시하고 사용자가 더 깊이 잠수 할 수있게합니다 더 세밀하게 제어 할 수 있습니다 그리고 마지막으로, 게으른 생성, 그래서 다시 온다 너무 많은 채널이나 그룹을 만들지 않아야합니다

그리고 징우가 직접 메시지를받지 못한다면 앱을 통해, 아마도 당신은 필요 없어 그것을위한 채널을 만들 수 있습니다 그런 다음 사용자가 의견을 제공 할 수 있습니다 말하자면, 이것은 유용하거나 유용하지 않습니다 그리고 그 말을 들어야합니다

그래서 안드로이드 P에서 우리는 브로드 캐스트를 추가했습니다 차단 또는 변경 상태 청취를위한 알림 채널의 당신은 그것들을 이해해야합니다 그리고 당신은 그들에게 반응해야합니다 다음에 백업 할 때까지 백업해야합니다 다른 장치에 채널을 만들면 의미가 있습니다

마지막으로 런타임에 이러한 API를 쿼리 할 수 ​​있습니다 또한 사용자가 채널과 상호 작용하는 방식을 알아볼 수 있습니다 이제 알림의 새로운 기능을 살펴보십시오 JINGYU SHI : 폴 감사합니다 알림에서 새로운 점이 무엇인지 살펴 보겠습니다

Android 9에서 먼저 시각적 업데이트를 추가했습니다 알림을 더 쉽게 읽고 스캔 할 수 있도록합니다 아마 눈치 챘을 때, 더 많은 패딩을 추가했습니다 단일 통지

그리고 우리는 둥근 모서리를 사용하여 돌아갔습니다 상단과 하단에 우리가 정말로 좋아하는 또 다른 개선점 이 부드러운 앱을 여는 애니메이션입니까? 당신이 여기 슬라이드에서보고 있습니다 알림을 닫는 대신 앱을 열면 알림이 표시됩니다 앱으로 부드럽게 변환되어 속도를 높입니다

전환은 두 번 이상 그리고 당신은 물을 수도 있습니다, 이것을 갖기 위해 당신은 무엇을해야합니까? 당신이해야 할 일은 당신이 직접 활동을 시작한다는 것을 귀하의 활동이 빨리 시작됩니다 대부분의 사용자는 알림 그들은 가장 신경을 쓴다 그들이 관심을 가진 사람들과 그래서 우리는 메시징 스타일, 메시징을 향상 시켰습니다 새로운 사람을 추가하여 경험 클래스를 사용하면 API 28을 사용할 수 있습니다

알림에서 MessagingStyle을 사용하는 경우, 우리는 이제 사람들의 아바타를 옮겼다는 것을 알 수 있습니다 통지의 왼쪽에 그리고 당신은 setIcon 메서드를 사용하여 그 아바타를 설정할 수 있습니다 이미지와 스티커에 대한 지원도 추가했습니다 메시징 알림에서 사이트 데이터를 사용하여 이미지를 추가 할 수 있습니다 귀하의 메시징 통보에 직접 기재하십시오

안드로이드에서 내가 좋아하는 또 다른 특징은 바로 답장이다 하지만 때로는 알림에 회신 할 때, 우연히 알림을 탭합니다 그러면 앱이 열립니다 그리고 내 반응은 사라집니다 그러나 Android 9에서는이 기능을 사용하여 사용자를 도울 수 있습니다

이 여분에서 초안을 검색함으로써, 앱에서 응답을 채울 수 있습니다 따라서 사용자 경험을 더 좋게 만들고 즐겁게 만드십시오 이미 앱에서 스마트 답장을 지원하는 경우, setChoices API를 사용하는 것이 좋습니다 알림에 표시 할 수도 있습니다 알림에 회신하는 대신, 사용자는 이제 그 중 하나를 눌러 회신 할 수 있습니다

좋아, 여기에 우리가 만든 예제가있다 새로운 API를 사용하는 MessagingStyle 알림 먼저 인스턴스, person 인스턴스를 만들고, 이리 그래서 우리는 사람 제작자를 사용할 것입니다 보시다시피, 우리는 이름, URI, 이 사람을위한 아이콘

그리고 이것은 메시지에서 발신자를 나타낼 것입니다 그리고 나서 우리는 이것을이 메시지에 전달할 것입니다 우리가 여기서 만들고있는 것 보시다시피, 우리는 그 사람의 인물을 지나가고 있습니다 이전처럼 우리가 지나가던 곳이 아니야

그 사람의 이름 그리고이 메시지에서 우리는 또한 이미지를 포함하기를 원합니다 그래서 우리는 setData 메소드를 사용하여 그 이미지를 포함시킵니다 그 다음에는이 메시지를 추가합니다 또 다른 메시지

그래서이 MessagingStyle에 두 개의 메시지를 추가합니다 공고 그런 다음 스타일을 알림으로 설정합니다 좋아요, 그럼 여기에 몇 가지 사항을 간략히 요약하면 다음과 같습니다 MessagingStyle을 사용하고 있습니다

먼저 메시지에 MessagingStyle을 사용하십시오 그리고 이것은 여러분이 Android Auto 또는 Android Wear 용 건물 메시지 알림을 보내는 경우, MessagingStyle을 사용하십시오 과거에는 개발자를 보았습니다 MessagingStyle과 다른 스타일 간의 전환, 큰 이미지를 만들려면 BigPictureStyle처럼 확장 프리젠 테이션 하지만 이제 setData 메소드로 그렇게 할 필요가 없습니다

MessagingStyle 만 사용할 수 있습니다 그리고 이것은 일관된 경험을 창출 할 것입니다 사용자를위한 사람들을 위해 아이콘을 추가하는 것이 좋습니다 통지에 따라서 setIcon을 사용하여 해당 아바타를 추가하는 것이 좋습니다

아이콘을 설정하지 않으면 그 사람의 이름으로 이니셜을 사용합니다 시각적 인 프리젠 테이션을 만들 수 있습니다 마지막으로 앱이 스마트 응답을 지원하는 경우, 알림에 추가하십시오 그래서 당신은 사용자에게 더 나은 경험을 제공합니다 여기에 피해야 할 몇 가지 사항이 있습니다

자동차에는 많은 이유가 있습니다 사용자에게 깨끗한 상태를 제공하기 위해 알림을 취소하십시오 현재까지 통지 항아리 그러나 사용자가 알림에 응답하면 메시지 알림,이 경우 중 하나가 아닙니다 당신은 거기에 그 통보를 유지하기를 원할 것입니다

따라서 사용자가이 대화로 돌아가고 싶다면 그 후에 답장하십시오 그러니 그걸 취소하지 마세요 사용자가 언제든지 스 와이프하도록하세요 대화로 끝났다 우리가 과거에 본 다른 나쁜 행동 일부 개발자는이 빈 이름을 설정하고 있으며, 시각적 인 프리젠 테이션을 달성하기 위해 하지만 Android 9에서는 제발하지 마세요

두 가지 이유가 있습니다 하나는 프레젠테이션에서 Android 9에서 중단 될 것이기 때문입니다 그리고 다른 이유는 이름이없는 사람 진짜 사람이 아니야 그래서 지금까지 우리는 어떻게 당신은 사용자에게 다가 갈 수 있습니다 – 사용자가 사람들과 연락하는 데 도움을 줄 수있는 방법 그들은 관심을 가지며 알림을 더 잘 만들 수있는 방법 사용자를위한 경험 하지만 여기서 일시 중지하고 앱 사용을 살펴보고 싶습니다

다른 쪽에서 그 알림을 받고 싶어하는만큼 내 친구와 가족으로부터, 나는 아직도 장치에서 멀리 떨어져 있어야합니다 따라서 사용자를 돕기 위해 Digital Wellbeing I / O에서 올해 Android 9를 실행하는 [INAUDIBLE] 기기가있는 경우, Play에서 다운로드하는 것이 좋습니다 베타를 저장하고 가입하십시오

이것이 디지털 웰빙이 우리에게 보여줄 것입니다 앱 사용에 대한 개요를 제공합니다 시간 소비를 보여주는 대시 보드를 제공합니다 각 앱 및 알림 수에 대한 정보 우리가받은 것 나는 개인적으로 Digital Wellbeing을 배우는 것을 좋아한다

나는 내 시간을 보내고있다 하지만 때로는 그 하나 또는 두 개의 앱 예기치 않게 많은 알림을 보내고 있습니다 네가 가질 수있는 한 가지 질문은, 이러한 알림은 어떻게 계산됩니까? 아직 베타 버전이므로 계산 방법이 변경 될 수 있습니다 그러나 목표는 사용자 중단을 추적하는 것입니다 따라서 일반적으로 새로 생성 된 모든 알림 하나로서 계산됩니다

그리고 사용자가 볼 수있는 모든 업데이트 또한 1로 간주됩니다 차단 채널에 알림을 보내는 경우 여기에 계산되지 않습니다 그래서이 경우에이 앱이 나를 보내고있는 것을 보았습니다 많은 알림 그래서 나는 호기심이 생겼다

나는 대시 보드에 들어갔다 그리고 시간별 분석을하기 위해 그것을 열었습니다 여기에서 볼 수 있듯이 매시간 알림을받습니다 그 날 아침 4시에도 나는 8 통의 통보를 받았어

따라서 이러한 알림이 매우 중요하다면, 나는 한밤중에 깨어났다 그러나 고맙게도, 그렇지 않습니다 그러나 이러한 알림이 푸시 알림 인 경우, 우선 순위가 높은 FCM 메시지를 사용하여 전송됩니다 이 응용 프로그램이 지속적으로 깊은 복용량 장치를 깨우고 있다는 것을 의미합니다 아침에 좋은 배터리를 갖고 싶으면, 이 앱을 제거해도됩니다

그러나 지금 당장은 국방성 (DND), 방해 금지 (Do Not Disturb) 그래서 나는 방해받지 않는다 디지털 웰빙은 사용자를위한 길을 제공합니다 인터럽트를 분리하고 줄입니다 Pixel 3에서는 DND를 사용할 수도 있습니다 장치를 뒤집어서 편리하게 사용할 수 있습니다

그러나 이것이 매우 중요한 알림 인 경우에는 어떨까요? 사용자가 실제로 받기를 원한다면? 그래서 그 분들을 위해 몇 가지 조언을 드리겠습니다 먼저 알맞은 카테고리를 알림에 설정하십시오 do not disturb 설정에서 여기서 볼 수 있듯이, 사용자는 차단할 항목과 허용 할 항목을 선택할 수 있습니다 또한 통화, 메시지, 미리 알림, 및 이벤트 귀하의 통지가 그들 중 하나에 속하는 경우, 귀하의 신고서에 그러한 내용을 표기하십시오

여기에 몇 가지 카테고리가 나열되어 있습니다 다른 측면에서 이러한 예외에 해당합니다 내가 말했듯이, 귀하의 통지가 속한 경우 이 카테고리 중 하나로 태그를 붙여서 알 수 있습니다 우리가 가진 다른 충고는 다른 사람이 보낸 알림입니다 알림에 태그를 달아주세요

do not disturb 설정에서 여기에서 볼 수 있듯이, 사용자는 알림 수신자를 선택할 수 있으며, 그들의 연락처에서 알림에 해당 사용자를 추가하십시오 가능한 경우 관련 URI를 추가하십시오 이렇게하면 방해하지 않아도 우회 할 수 있습니다 하지만 사용자가 켜는 순간 항상 기억해야합니다

방해하지 말고, 그들은 정말로 방해 받고 싶지 않습니다 알림을 보내고 있다면 기대하지 않는다면, 그것은 정말로 그들을 귀찮게 할 것입니다 따라서 이러한 API를 악용하지 마십시오 우리가 처음에 가지고 있던 견적으로 돌아가서, 알림을 보낼 때마다 이것을 명심하십시오 사용자를 괴롭히지 말고, 존중하고, 권한을 부여하고, 그들을 기쁘게하고 관심있는 사람들과 연결시켜줍니다

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

Kotlin + Watch Faces (Android Dev Summit ’18)

[음악 재생] 예레미어 워커 : 좋습니다 안녕, 내 이름은 제레미 워커 야

저는 Google의 개발자 플랫폼 엔지니어입니다 그리고 나는 너에게 어떻게하면되는지 이야기하고 싶었다 나는 Kotlin을 사용하여 시계 생성 작업을 훨씬 쉽게 만든다 WEAR OS 그래서 시계 얼굴은 지금 일종의 힘든 일입니다

그리고 약 600 행의 코드를 작성해야합니다 Android 또는 WEAR OS에서 실행하는 멋진 앱과는 다릅니다 여기서 많은 UI를 XML 형식으로 선언 할 수 있습니다 실제로 모든 것을 수동으로 페인트해야합니다 그리고 나서 여러분은 많은 코드를 포함시켜야합니다

주변 모드에서 언제인지 확인하십시오 당신은 배터리 수명을 아프게하지 않습니다 그래서, 나는 생각을하려고 노력했다 우리가 발표 한 I / O에서이를 개선하고 작년에 Kotlin에 대한 공식 지원 그래서 나는 생각하기 시작했다

이것을 쉽게하기 위해 Kotlin을 사용합니까? 그리고 나는 모든 것을 개종 시켰어 코드 라인을 많이 줄인 Kotlin에게 하지만 코 틀린과 뭔가 다른 걸 찾았 어 그걸 더 멋있게 만들었 어 그리고 그것은 DSL이라고 불리는 것입니다

그렇다면 Kotlin DSL은 무엇입니까? 도메인 특정 언어가 무엇인지 이해하는 가장 좋은 방법은 정기적 인 프로그래밍 언어와 비교하는 것입니다 그래서, 다시 도메인 특정 언어 나를 위해, 그것은 정말로 도움이되지 않았다 그러나 일반적인 프로그래밍과 비교하면 Kotlin 또는 Java와 같은 언어 당신은 많은 키워드를 가지고 있고, 당신은 클래스, 메소드, 그리고 당신은 반대편에있는 멋진 큰 앱을 상대방에서 만들고, 특정 작업이나 도메인에 초점을 맞추는 DSL입니다 그래서, 그것은 많은 기능을 포기합니다

특정 작업을 수행 할 수있게 해줍니다 실제로는 외부 DSL을 사용했을 가능성이 높습니다 그것을 깨달았다 예 : SQL 데이터베이스 조작

그것은 DSL입니다 따라서 문자열 조작을위한 정규 표현식입니다 그래서 그들은 각각 독립적 인 구문을 가지고 있습니다 그들은 많은 기능을 감소시킵니다 메소드 나 클래스를 작동시키지 않아도됩니다

당신은 그들 중 하나에 응용 프로그램을 작성하지 않을거야 적어도, 나는 희망하지 않는다 SQL의 경우 첫 번째 키워드 종류는 동사로, 당신이 할 일을 나타냅니다 어쩌면 당신이 선택하거나 업데이트 할 것입니다 여기에서의 단점은 여러분도 아시다시피, 이것을 문자열 리터럴로 넣어야합니까? 그래서, 당신은기도하고 모든 것을 철자하기를 바랍니다

런타임까지 제대로 작동하지 않을 수도 있습니다 당신은 그것을 통해 해킹하고 무슨 일이 일어나고 있는지 알아 내야 만합니다 따라서 Kotlin DSL을 사용하면 실제로 문자열에서 추출됩니다 그리고 그것은 코드에서 올바르게 처리됩니다 유형 검사를 할 수 있습니다

코드 힌트와 모든 좋은 것들을 가지고있다 귀하의 IDE와 함께 제공됩니다 그래서, 당신은 그것이 무엇인지에 대한 아이디어를 가지게되었으므로, 정말 두 가지 구조를 보여주고 싶습니다 그리고 저는 후자를 사용합니다,하지만 하나는 "연결된 메소드 호출" 다른 하나는 "람다 둥지"입니다 DSL을 인식하는 것은 실제로 주관적입니다

당신이 그것을 볼 때 당신은 그것을 압니다 그럼, 어떤 것을 보자 그래서, 이것은 SQL 용 Kotlin DSL입니다 당신은 아마 그것을 볼 수 있고 SQL을 안다면, 너는 그것을 즉시 이해할 수있다 그리고 그것은 Slice와 같은 모든 동사입니다

그리고 나서 Select All, 그리고 나서 Group By, 그 다음에 Order By, 그리고 나서 I Limit 그리고 이것은 모든 유형을 검사하고 코드 힌트를 얻습니다 그래서 당신은 잘못된 것을 철자하지 않습니다 그리고 이것은 꽤 훌륭하고 이해할 수 있습니다 이것은 DSL입니다

그러나 내가 정말로 좋아했던 시계 얼굴을위한 DSL은, "중첩 된 람다"구조였습니다 따라서 시계 모드를 만드는 것입니다 바로보실 수 있습니다 시계 만들기는 동사입니다 하지만 당신이 내 구조를 보면, 당신은 아무것도 몰라요

시계를 만드는 것에 대해 알지 못할 수도 있습니다 그러나 당신은 아마 지금 무슨 일이 벌어지고 있는지 이해할 수있을 것입니다 아날로그 시계 얼굴 좋아, 디지털이 아니기 때문에 팔이있다 그림 물감

좋아, 그걸 알아낼 수있어 손의 치수, 시침, 분침, 초침 알았어 시계 얼굴 배경 이미지 그래서 그게 전부입니다

그것은 매우 선언적입니다 그래서 당신은 즉시 이해할 수 있습니다 그리고 이것은 모든 유형의 체크이며 코드 힌트를 얻습니다 그리고 모든 좋은 것들 그리고 결국 나는이 좋은 작은 시계 얼굴을 일없이 얻을 수 있습니다

이제 600 라인, 그들은 모두 사라지지 않았다 나는 그들을 도우미 수업에 넣고 그것을 결합했다 더 중요한 수업과 함께 이 DSL을 해석합니다 하지만 시계를 만들면 DSL에 대해서만 알면됩니다

그래서, 다음은 뭐야? 이것은 코드 랩으로 한 실험의 일종입니다 코드 랩을 확인하십시오 새로운 시계 모드를 만드는 데 15 분 밖에 걸리지 않습니다 Kotlin 시계 코드 만 검색하면됩니다 실험실 – 이런, 정말 길다

Google 코드 랩을 검색하면됩니다 WEAR OS 또는 Kotlin에서 검색합니다 시계 모드를 만드는 방법을 볼 수 있습니다 코드를 볼 수 있습니다 내가 DSL간에 어떻게 전이했는지에 대한 소스 코드 그것을 작은 시계면으로 해석했습니다

하지만 더 중요한 것은 희망이 있습니다 조금 DSL에 관심을 갖고 말하기를, 이봐, 이걸 내 프로젝트 중 하나에서 사용할 수있어 그것을 조금 더 좋게 만들기 위해서 또는 SQL 용 DSL과 같은 것을 사용할 수 있습니다 테스트 용으로 하나 있습니다

그리고 하나는 내 것과 더 비슷합니다 Kotlin 코딩에서 HDML을 수행하고 유형을 검사 할 수도 있습니다 어느 것이 내가 내가 모델링 한 것의 종류 이야기 해줘서 고마워요 내가 얘기하게

그리고 잘하면 내가 너를 잡을거야 DSL에 조금 관심이 있습니다 고맙습니다 [박수 갈채] [음악 재생]

3 Platforms in 5 Minutes with Kotlin (Android Dev Summit ’18)

[음악 재생] WOJTEK KALICINSKI : 안녕하세요 내 이름은 워텍입니다

그리고 나는 너에게 짧은 이야기를 나누고 싶었다 새로운 Kotlin 멀티 플랫폼 프로젝트 경험에 대해 Kotlin에서 13 그래서 우리가이 회의에 올 때, Android에 대해 이야기하고, Android에서 Kotlin을 실행하는 것에 대해 이야기하십시오 안드로이드 애플 리케이션을 만들기 위해, 우리가 정말로 의미하는 것은 Kotlin JVM입니다

그게 우리가 알고있는 코 틀린이야 Java 바이트 코드로 컴파일됩니다 그런 다음 dex 파일로 변환 할 수 있습니다 Android에서 실행하십시오

그러나 클라우드 서버, 데스크톱, 등등 이제 실제로 Kotlin의 두 가지 맛이 있습니다 또는 컴파일 타겟 첫 번째, Kotlin JS, 달리기 웹 브라우저 환경의 JavaScript 또는 클라우드 기능 또는 Nodejs와 같은 것입니다

그리고 나서 Kotlin native가 컴파일됩니다 네이티브 라이브러리의 코드를 처리하는 방법 다양한 플랫폼을 실행하거나 타겟팅 할 수 있으며, 심지어 IOS, 데스크톱 애플 리케이션, WebAssembly, 그리고 심지어 안드로이드와 같은 그러면 우리는 실제로 이것을 어떻게 시작해야할까요? 그래서 Kotlin 13은 새로운 프로젝트 구조를 도입했습니다 Kotlin 멀티 플랫폼이라고 불리는 새로운 플러그인입니다

그리고 만약 당신이 그것을 당신의 어떤 모듈에도 적용한다면, 그런 다음 프리셋 세트에서 선택할 수 있습니다 이러한 플랫폼을 타겟팅 할 수 있습니다 여기 예를 들어 Android 라이브러리를 타겟팅하고 있습니다 및 js 대상 이제 이것을 모듈에 추가하면, 자동으로 각 플랫폼에 대한 소스 세트를 생성합니다

특정 Kotlin 파일 따라서 Kotlin 파일을 js 메인 폴더에 넣으면, 그들은 컴파일되거나 자바 스크립트 파일로 변환됩니다 이제 Kotlin이 구체적으로 무엇을 의미합니까? 미안 해요 – 플랫폼 특유의 Kotlin? 이제 문서를 찾아보고 찾아 본다면 Kotlin 패키지 각각에 대한 페이지, 오른쪽 상단에있는 마우스로 마우스를 움직여보십시오 당신은이 다색 칩을 볼 수 있습니다 컴파일 대상을 알려줍니다

이 라이브러리를 사용할 수 있습니까? 그래서 여기, 예를 들어, Kotlin 브라우저 패키지 문서 및 창 인터페이스에 액세스 할 수있는 아마 웹 브라우저 환경에서만 js 대상에서 의미가 있습니다 그리고 그것이 그 방법입니다 이제 다행스럽게도 많은 핵심 요소가 라이브러리와 함수는 모두 사용할 수 있습니다 컴파일 대상 실제로, 네 번째를 볼 수 있습니다, Kotlin common, 이것은 순수한 코 틀린임을 의미합니다

플랫폼과 독립적으로 실행할 수있는 라이브러리 타겟팅 사실 멀티 플랫폼 플러그인을 추가하면 플랫폼 별 소스 세트와 함께 프로젝트에, 당신은 또한 공통 소스를 얻을 수있는 곳으로 설정합니다 플랫폼 독립적 인 코드를 넣으십시오 이제 플랫폼 독립적 인 코드에 관한 것은, 플랫폼 API를 호출 할 수 없습니다 그것은 특정 또는 안드로이드 특정 js를 호출 할 수 없습니다 아피스 물론 다른 방법은 효과가 있습니다

플랫폼 별 코드를 가질 수 있습니다 공유 라이브러리에 따라 달라집니다 또는 소스 세트 그래서 모든 것을 알고, 나는 단지 예제 애플 리케이션을 작성하기 시작했다 Kotlin 멀티 플랫폼에 대해 알아보십시오

그리고 나는 작은 스도쿠 게임을 만들기로 결정했다 이제 Kotlin 멀티 플랫폼에 대해 내가해야 할 한 가지는 앱을 한 번 작성하고 실행할 수있는 툴킷이 아닙니다 그것을 도처에 Android 앱을 만들 필요가 있습니다 안드로이드 특정 코드로, 평소처럼 그러면 JavaScript 코드가있는 웹 페이지가 나타납니다

항목을 초기화하기 만하면됩니다 내 애플 리케이션, 라이프 사이클 UI 등을 가리킨다 그런데, 내가하는 일은 나의 모든 공유 비즈니스 논리이다 제 경우에는 스도쿠 엔진입니다 나를 위해 Sudoku 보드를 해결하고 생성합니다

나는 그것을 꺼내서 공유에 넣는다 라이브러리는 Kotlin 공통을 사용합니다 사실,이 라이브러리에있는 유일한 소스 세트입니다 공통점이다 그래서 모든 코드를 거기에 넣었습니다

이는 모든 플랫폼에서 사용할 수 있음을 의미합니다 내가 목표로 정했던 승인 하지만 그때 나는 생각했다 좋아, 나는이 핵심 엔진을 가지고있다 내 Sudoku 코드를 해결하기 위해

그러나 나는 또한 보드를 스크린에 그려 넣고 싶다 그리고 왜 각 플랫폼에 대해 코드를 작성해야합니까? 개별적으로 동일하게 보일 경우 별도로? 그래서 나는 생각하지 않았다 화면에 그리기위한 API가 있다면 완전히 독립적 인 플랫폼, 뭔가 다중 플랫폼 캔버스가 될 수 있습니까? 하지만 내가하고 싶은 것은 실제로하고 싶다 각 플랫폼 구현에 위임하게하십시오 그래서 안드로이드 캔버스를 사용하고 싶습니다

HTML을 사용하는 동안 Android에서 그릴 수 있습니다 캔버스를 웹 사이트에서 그립니다 문제는, 방금 Kotlin 공통 코드가 모든 플랫폼 인터페이스를 호출하십시오 그래서 나는 이것들에 정말로 의지 할 수 없다 이 모듈에서 내보내십시오

그러면 Kotlin에서 어떻게 작동합니까? 음,이 기대와 실제 메커니즘이 있습니다 예상되는 클래스를 공통 코드로 선언 할 수있게 해줍니다 이것은 Java에서 인터페이스를 정의하는 것과 거의 흡사합니다 그리고 각 플랫폼 별 소스 세트에서, 나는 실제 구현을 제공한다 플랫폼 API를 사용하고 의존 할 수있는 Android 캔버스와 같은 이제, 내 공통 소스에서 그 의존성을 추가 할 때 다른 하나를 설정하면 다음과 같이 보입니다

하지만 사실, 특정 플랫폼 용으로 컴파일 할 때, 그러한 js, 이 종속성은 실제로 올바른 HTML5 캔버스를 사용합니다 [징] [킬킬 웃음] 좋아, 내가 프로젝트에 대한 링크 만 보여줄 수 있다면 모두가 그것을 볼 수 있도록, 그것은 좋을 것입니다 [웃음] 네 연설자 1 : [INAUDIBLE] [킬킬 웃음] [박수 갈채] WOJTEK KALICINSKI : 맞습니다 [음악 재생]

Re-stitching Plaid with Kotlin (Android Dev Summit ’18)

[음악 재생] FLORINA MUNTENESCU : 안녕하세요 내 이름은 Florina Muntenescu이고 나는 Google의 개발자 옹호자 그래서 지난 몇 달 동안 3 명과 함께 우리 동료들과 함께, 우리는 격자 무늬를 돌려 놓기 위해 노력해 왔습니다

유행에 그래서 더 정확하게, 격자 무늬는 응용 프로그램입니다 그것은 처음에 동료 인 Nick Butcher에 의해 개발되었습니다 재료 디자인을 보여주는 방법 그리고 여기서 보시는 것은 실제로 2016 년에 앱 상태가 꽤 좋았을 때, 격자 무늬의 영광의 날을 보자

그래서 Nick은 여기에 많은 API를 사용했습니다 애니메이션, 전환, 모든 메소드 벡터에서 drawables 그래서 이들 모두가 앱을 실제로 만들었습니다 그들은 실제로 사용자 경험을 향상 시켰습니다 그래서 Plaid [INAUDIBLE] 데이터는 세 가지 다른 출처에서 왔는데, 그리고 2016 년부터 지금까지의 이러한 자료들은, 음, 그 중 일부는 더 이상 사용되지 않습니다

그래서 그것은 세 가지 근원 중에서, 우리는 하나와 조금 남았습니다 그래서 우리가 가진 멋진 멋진 UI 기능들 모두에서, 우리는 거의 아무것도 남기지 않았습니다 우리는 꽤 지루한 응용 프로그램을 남겼습니다 그래서 우리는 우리가 이것을 좋아하지 않기를 결심했다 우리는이 깨진 기능을 수정하기로 결정했습니다

그러나 이것과 별개로 우리는 우리가 뭔가를 향해 가고 싶었던 아키텍처에서 모듈화되고 확장 가능합니다 관점 하지만 그 점은 Plaid가 UI 샘플로 개발되었지만 아키텍처 샘플로 그래서 당신은 모든 동점을보기 위해 놀랄 것입니다 코드의 종속성, 그리고 음, 실제로 조금 뒤떨어 진 코드입니다

왜냐하면 Nick 2014 년에이를 구축하기 시작했습니다 그 당시에는 앱 아키텍처에 대한 가이드가 없었습니다 우리가 작년에 발표 한 그리고 우리가 코 틀린을 가지고 있었지만, 우리는 실제로 그것을 사용하지 않았습니다 그래서 우리는 Plaid를 다시 만들고 싶다는 것을 알고있었습니다 그러나 우리는 그것을 올바른 방법으로 다시 만들고 싶었습니다

미래의 변화에 ​​대비하여 좋은 상태로 유지해야한다 우리가 만들고 싶었던 그래서이 이야기에서 우리가 배운 것을 말해주고 싶습니다 또한 우리 앱에서 Kotlin을 어떻게 활용할 수 있었는지를 보여줍니다 그래서 우리는이 독창적 인 가이드를 앱 아키텍처에 발표했습니다 그러나 당신이 그것을 읽으면, 당신은 그것이 또한다는 것을 볼 것입니다

여전히 매우 모호합니다 그래서 우리는이 주요 클래스들을 가지고 있습니다 우리는 우리의 응용 프로그램을 설계해야합니다 그러나 우리는 몇 가지 분명한 지침을 만들고 싶다고 결정했습니다 그래서 우리는 앱에서 몇 가지 주요 유형의 클래스를 정의했습니다

우리는 또한 일련의 규칙을 정의했다 각 클래스에 대해 그럼 이들이 어느 것이 었는지 봅시다 그래서 우리는 RemoteDataSource를 정의했습니다 실제로 요청 데이터를 구성하기 만하면됩니다 API 서비스에서 데이터를 가져와야합니다

정보 요청 만하면됩니다 응답이 수신되었습니다 다음으로 우리는 LocalDataSource를 가지며, LocalDataSource의 역할 디스크에 데이터를 저장하는 것입니다 따라서 공유 환경 설정에서이 작업을 수행 할 수도 있습니다 또는 데이터베이스에서

다음으로 저장소를 가지게 될 것이다 데이터를 가져오고 저장하는 것입니다 또한 선택적으로 인 메모리 캐시를 수행 할 수도 있습니다 따라서 저장소가 클래스가됩니다 이는 로컬 데이터 소스와 원격 데이터 소스를 중재합니다

비즈니스 로직이 매우 복잡했기 때문에, 우리는 다른 레이어를 추가하기로 결정했습니다 유스 케이스를 추가하기로 결정했습니다 따라서 유스 케이스의 역할은 데이터를 처리하는 것입니다 비즈니스 로직을 기반으로합니다 작고 가벼운 수업이 될 것입니다

그것도 재사용 될 수 있습니다 따라서 사용 사례는 리포지토리 및 / 또는 기타 용도에 따라 다릅니다 사례 다음에는 뷰 모델이 있습니다 따라서 ViewModel의 역할은 노출하는 것입니다

UI에 의해 표시 될 데이터 및 동작을 트리거하는 데이터 사용자의 작업에 따라 그리고 ViewModel은 유스 케이스에 의존한다 입력으로 ViewModel은 아마도 ID를 얻습니다 따라서 ID가 필요한 경우 예를 들어, 상세 화면 용 ViewModel입니다 그리고 물론, 그것은 사용자의 행동을 입력으로 받아 들일 것입니다 그리고 결과물로서 라이브 데이터를 반환합니다

다음으로, UI에서 우리는 활동과 XML로 작업 할 것입니다 따라서 이들의 역할은 데이터를 표시하는 것입니다 액션을 ViewModel에 전달할 수 있습니다 입력으로 그들은 선택적인 ID를 얻을 것입니다 및 사용자의 행동

그래서 우리는 우리의 애플리케이션이나 아키텍처를 살펴 보았습니다 우리는 이것을 세 개의 층으로 나누었습니다 데이터, 도메인 및 UI 레이어 우리는 한걸음 더 나아가서 좀 더 나아지기로 결정했습니다 우리가 사용하고있는 방식으로 비난 받았다 [? 데이터?] 또는 우리가 사용하고있는 도서관에서 그래서 우리는 LiveData가 실제로 그것이 활동이나 단편과 함께 사용될 때 빛난다

그래서 우리는 실제로 LiveData만을 유지하기로 결정했습니다 ViewModel과 UI 사이에 차이점이 있습니다 그리고 더 좋은 점은 좋은 통합 때문입니다 LiveData와 DataBinding 사이, 우리는 XML에서 DataBinding을 사용하기로 결정했습니다 그러나 다시, 이러한 모든 제약 조건들과 함께 우리가 설정 한 이러한 모든 지침은 우리가 실제로 구현할 수있는 많은 방법들이 있습니다

이런 종류의 건축 그리고 우리는 Kotlin과 Kotlin 언어 기능을 알고있었습니다 이 점을 개선하는 데 도움이 될 것입니다 그리고 더 정확하게, 우리가 특히 좋아할 것 Kotlin이 지원하는 기능적 구성 요소입니다 사실, 우리가 만들어야 할 첫 번째 결정 중 하나 비동기 작업을 처리하는 방법은 무엇입니까? 그리고 우리는 코 루틴으로 작업하기로 결정했습니다

우리 앱의 거의 백본으로 왜냐하면 코 루틴으로 시작하는 것이 쉽기 때문입니다 coroutines 및 응답을 처리합니다 그리고 더 정확하게, 우리가 좋아하는 것 코 루틴에 범위가 있다는 사실입니다 예를 들어, 활동을 시작한다고 가정 해 봅시다 네트워크 요청을 실행 중입니다

당신은 언제 당신이 그 활동을 뒤로 누르고 그 활동을 끝내고, 또한 해당 네트워크 요청을 취소합니다 그래서이 coroutines의 범위 지정 우리가 좋아했던 것이 었습니다 그래서 이것은 우리가 ViewModel에서 결정한 것을 의미합니다 우리가 시작하는 곳이 될거야 우리는 코 루틴을 취소하고 있습니다

coroutine과 LiveData 사이를 전환합니다 그러나 ViewModel 위의 다른 모든 레이어의 경우, 우리는 단지 서스펜션 기능을 사용합니다 그러나 이러한 중지 함수는 결과 클래스를 반환합니다 더 정확하게 말하자면이 결과에는 두 가지 유형이 있습니다 성공 또는 오류

우리가 확신하고 싶었 기 때문입니다 여기저기서 예외를 던지지 않을거야 오히려 이러한 예외, 오류, 국가를 대표한다 그래서 코 틀린에서 흥미로운 것은 클래스를 확장 할 수 있기를 원한다면, 그것을 오픈으로 표시해야합니다 따라서 이것은 기본적으로 클래스가 최종적이라는 것을 의미합니다

상속을 사용할 때는 고의적이어야합니다 그래서 이것은 Kotlin이 정말로이 아이디어를 지원한다는 것을 의미합니다 상속을 선호하는 구성 그러나 오픈 클래스를 사용하는 것보다 더 잘할 수 있습니다 봉인 된 클래스를 사용할 수 있습니다

봉인 된 클래스를 사용하면, 우리는 [INAUDIBLE] 클래스의 클래스를 제한 할 수 있습니다 이는이 파일 밖에서 클래스를 확장 할 수 없다는 것을 의미합니다 우리가이 결과 클래스를 사용할 때가 많았습니다 우리는 일반적으로 그것을 내부에서 사용할 것입니다 그래서, 우선 스마트 캐스트를 지원합니다

그래서 이것은 결과가 성공할 때 쉽게 할 수 있다는 것을 의미했습니다 뭔가해라 결과가 오류이면 다른 작업을 수행하십시오 그러나 우리가 그것을 사용할 때마다 우리가 항상 모든 사건을 다루고 있는지 확인하기를 원했습니다 우리는 실수로 알고 있다면, 우리는 무언가를 처리하지 않고, 컴파일러를 원했습니다

이봐, 너 뭔가 잊어 버렸어 오류 케이스를 처리하는 것을 잊었습니다 그래서 이것은 때가 철저해야한다는 것을 의미했습니다 그러나 식으로 사용할 때만 철저합니다 그래서 우리는 철저한 속성을 만들었습니다

그래서, 더 정확하게, 우리는 T에 확장 속성을 만들었습니다 여기서 우리는 단지 객체를 반환 할뿐입니다 우리가 가진 또 다른 문제가 있습니다 그래서 우리는 코멘트 클래스와 답글에 대한 코멘트를 가지고있었습니다 그래서이 둘의 차이점은 사실입니다

그 주석은 또한 사용자에 관한 정보를 보유하고있다 의견을 게시했습니다 그래서 그것은 표시 이름과 초상화 URL을 가지게 될 것이고, 답글을 사용하는 주석은 거의 트리 구조입니다 주석의 응답을 보유하고있는 그리고 답장의 응답 등등 하지만 우리가해야 할 일은 코멘트를 작성하는 것입니다 답글과 사용자 객체가있는 주석의 그래서 당신은 이렇게 말합니다

좋습니다 우리는 새로운 생성자를 만들 것입니다 우리에게 매개 변수, 사용자 및 답글에 대한 설명을 얻습니다 그리고 그게 다야 하지만 그 일은 우리가 실제로하지 않았기 때문입니다

클래스가 두 개의 서로 다른 레이어에 있기 때문에 이렇게합니다 그리고 코멘트가 답글에 대한 코멘트에 대해 알아야하는 이유는 무엇입니까? 왜 사용자에 대해 필연적으로 알아야합니까? 데이터가 어딘가에서 온 것일 수도 있습니다 이 API를 변경해야하는 이유는 무엇입니까? 그래서 우리가 사용하게 된 것은 확장 기능입니다 그래서, 더 정확하게, 우리는 확장 함수를 만들었습니다 사용자 개체를 기반으로 한 댓글에 대한 댓글에 그것은 주석을 작성합니다

따라서 확장 기능을 만들 때, 당신은 공개 필드에 액세스 할 수 있습니다 그래서 이것은 우리가 실수로, 개인 구현 데이터 액세스 또는 변경 그리고 그것은 우리가 수업에 집중할 수있게 해줍니다 그들이 그것을 연장하지 않고 무엇을하는지 집중했다 따라서 공용 API를 변경할 필요가 없다는 의미였습니다 개인 구현 세부 사항에 액세스하지 않아야합니다

그래서 데이터 클래스에 대해 좋아하는 것은 사실입니다 값 객체가 있다는 것을 테스트에서 사용하면 빛난다 그래서 예를 들어, 우리는 코멘트에 upvote 플래그를 가지고 있습니다 그래서 우리가 코멘트가 upvoted 여부를 확인하기 위해 테스트를 구축, upvoted 플래그를 false로 설정하여 주석을 작성합니다 어떤 의견이든간에, 우리는 예상 된 결과가 코멘트, 초기 코멘트, 하지만 그 upvoted 플래그와 함께 사실

그러나 그 일은 특히 우리의 경우에는 주석에 너무 많은 필드가 있기 때문에, 실수하기 쉽습니다 그리고 실제로 무엇이 빠졌는지 쉽게 알 수있었습니다 여기서 중요한 것은 upvoted 플래그가 변경되었다는 사실입니다 Kotlin을 사용하면 복사 방법을 사용할 수 있습니다 그리고 거기에서 우리는 객체의 복사본을 만들 것입니다

에 호출됩니다 그리고 우리는 깃발을 세우고 있습니다, 우리가 실제로 가지고있는 깃발 변화, 그리고 그게 전부 야 코드가 더 간결하고 읽기 쉽도록 끝나고, 더 이해하기 쉽다 그럼 다른 예를 들어 봅시다 우리의 응용 프로그램에서 우리는 원격 데이터 소스 의견을 게시 할 수 있습니다

그리고 여기서, 우리는 결과를 반환합니다 그리고이 방법 안에서, 우리는 새로운 코멘트 요청을 만들 것입니다 우리는 백 엔드에서 그 요청을 트리거 할 것입니다 우리는 그 반응을 기다릴 것이다 그리고 우리는 응답을 처리하고 결과 성공 또는 오류 결과, 필요한 것에 따라 그러나이 코드를 살펴보면 실제로 충분하지 않습니다

왜냐하면 당신의 장치가 오프라인 일 때, 이 코드는 충돌합니다 그래서 우리가 실제로해야 할 일은 모든 요청을 감싸는 것입니다 try-catch 내부 그리고 우리에게는 많은 요청이 있습니다 그래서 우리는 계속이 try-catch를 추가하고 추가하는 것을 보았습니다

사방에, 그리고 우리의 방법이로드되었습니다 그래서 우리는 무엇에 집중할 수 없었습니다 응답을 만드는 데 정말로 중요했습니다 요청을 트리거합니다 그래서 우리가 한 것은 최상위 함수를 만드는 것입니다

그래서 이것은 서스펜션 기능이 될 것입니다 그것은 우리에게 람다를 정지시키는 매개 변수와 오류를 줄 것입니다 메시지 그래서 여기에 전화가 걸립니다 try-catch 내부에 포장 한 다음 빌드합니다

예외의 경우, 결과 [INAUDIBLE]이 (가)있는 오류 메시지를 기반으로 오류가 발생했습니다 그래서 이것은 우리의 모드 데이터 소스에서, 안전한 API 호출을 만들 수 있습니다 실제로 우리에게 중요한 전화를하십시오 다른 함수 내부 이처럼 코드가 더 읽기 쉽고 더 쉬워졌습니다

이해하다 그래서이 안전한 API 호출은 말하고있었습니다 첫 번째 매개 변수로 호출이 있음 오류 메시지를 두 번째 오류 메시지로 보냅니다 그러나 Kotlin에서 메서드의 마지막 매개 변수 람다, 당신이 할 수 있다는 것을 의미합니다 이것을 후행 람다 (lambda)로 사용하십시오

그래서 이것은 당신이 이것을 부를 때, 이 두 매개 변수를 전달하는 대신, 우리는 단지 오류 메시지를 전달할 수 있습니다 함수의 매개 변수로 메서드를 호출하려면 후행 람다 구문을 사용하십시오 이와 같이 코드가보다 간결 해지고, 그러나 그것은 정말로 더 가독합니까? 그래서 우리가 이것을 보았을 때, 그것은 느꼈습니다 여기에서 가장 중요한 것은 오류 메시지입니다 정말로 그렇지 않습니다

우리에게 중요한 점은 이 게시물의 댓글입니다 그래서 우리는 코드가 더 간결하지만, 그것은 더 가독성을 의미하지는 않습니다 그래서 간결함이 반드시 좋은 것은 아닙니다 따라서 Kotlin이 이러한 모든 종류의 옵션을 제공하더라도 및 기능, 염두에두고 실제로 생각하는지 이 모든 것이 필요하거나 올바른 장소에서 사용하십시오 다른 예가 있습니다

그래서 우리가 코 틀린으로 전환하자마자, 특히 우리의 활동에서 우리가 한 첫 번째 일 우리의 모든 견해를 만들 [부적절] 왜냐하면 우리는이 null 가능성을 모두 처리하기를 원치 않았기 때문입니다 하지만 우리는 코드를 다시 살펴 봤습니다 우리는 이것을해서는 안된다는 것을 알았습니다 일부 견해, 예를 들면, 우리의 결과가없는 견해, 특정 조건이 충족 될 때만 팽창되었습니다 사실 null 허용은 좋았습니다

Nullability는 의미가 있습니다 무효 성은 우리에게 무언가가 빠져 있다는 것을 말해주었습니다 우리는 그것을 실제로 처리해야합니다 그래서 전반적으로, 우리는 코 틀린 (Kotlin) 코 루틴과 같은 불변성, 기능 시민, 우리의 응용 프로그램을 도울 수 있습니다 그리고 앱 아키텍처에 대한 가이드와 함께, 우리가 이것을 유지 보수 할 수 있도록 도와 줬다

신속한 개발 아키텍처 우리가 갖고 싶었던 것 고맙습니다 [박수 갈채] [음악 재생]

Getting the Most from the New Multi-Camera API (Android Dev Summit ’18)

안녕하세요, 모두들 새로운 멀티 카메라 API 세션에 오신 것을 환영합니다

내 이름은 Vinit Modi이고 저는 제품 관리자입니다 카메라 플랫폼에 이 잠시 후, 샌드 박스 영역 바깥으로 나 오세요 더 궁금한 점이 있으시면 새로운 API에 대해 이야기하기 전에, 카메라의 상태를 빠르게 업데이트하겠습니다 역사적으로 대부분의 카메라 앱은 기본 카메라 앱에 초점을 맞 춥니 다

장치와 함께 제공됩니다 그러나 금액의 두 배가 넘는 것으로 나타났습니다 카메라 사용량은 사용자가 구축 한 앱에서 발생합니다 그리고 당신이 새로운 기능을 지원합니다 새로운 Android API에서 사용할 수 있습니다

우리가 많은 개발자들과 이야기 할 때 우리가 찾은 것 가장 큰 문제는 카메라 2 API의 상태입니다 그리고 우리는 앞으로 나아갈 것입니다 우리는 열심히 노력해 왔습니다 Android P부터 시작하여 찾을 수있는 항목 거의 모든 새 장치가 camera2 및 HALv3을 지원합니다 이것이 의미하는 바는 카메라의 특성을 볼 때, 기기가 자체 광고를하는 것을 알게 될 것입니다

어느 한 점과 비슷한 camera2 LIMITED 촬영하고 카메라 2를 FULL로 설정하면 프레임 단위 제어와 같은 고급 기능, YUV 재 처리 및 RAW를 가능하게하는 LEVEL_3이 있습니다 또한 여러 OEM 업체와 협력 해 왔으며, 또는 제조업체가 출시 될 때 새로운 API를 열 수 있습니다 올해 Google Pixel 3 및 화웨이 메이트 20 시리즈 지원 새로운 멀티 카메라 API 자, 왜 물러서서 이유를 말해 줄까? 이 새로운 API는 매우 중요합니다 Android P 이전에는 개발자로서 물리적 센서 중 하나에 액세스 할 수 있습니다 네이티브 카메라 앱이 전체 하드웨어에 액세스합니다

능력 하지만 P로 시작하면 동일한 액세스 권한을 얻게됩니다 네이티브 카메라 앱으로 여기에는 모든 물리적 센서가 포함됩니다 논리적 인 카메라 더하기

논리적 인 카메라는 추상화입니다 당신이 쉽게 잡을 수있는 모든 물리적 센서들 하드웨어의 이점 몇 가지 새로운 사용 사례와 가능성이 있습니다 새로운 멀티 카메라 API로 오늘날 오스카 (Oscar)는 광학 줌 (optical zoom) 에밀리가 보케를 덮을거야 고맙습니다

오스카가 다음입니다 [박수 갈채] OSCAR WAHLTINEZ : 안녕하세요, 제 이름은 오스카입니다 저는 개발자 관계 팀에서 일하고 있습니다 라이브 데모에서 시작하겠습니다 무엇이 잘못 될 수 있습니까? [웃음] 그래서 여기에 메이트 20 전화가 있습니다

멀티 카메라 줌을 구현 중입니다 여기에서 우리가하고있는 일은 UI 레이어를 바꾸는 것입니다 두 카메라 스트림 나는 어떤 종류의 세부 확대 또는 자르기를하고 있지 않다 나는 단순히 시내를 교환하고있다

보시다시피, 거의 순간적입니다 내가 쓰러 뜨리면 찢어지지 않아 카메라 세션 그것은 단지 하나의 세션이고, 저는 두 대의 카메라를 교체하고 있습니다 스트림

아이디어는, 내가 말했듯이, 단일 카메라 세션입니다 – 두 개의 스트림 그리고 우리는 시내 사이에서 교환 할 것입니다, 이것이 어떻게 구축되었는지 보여 드리겠습니다 하지만 핵심 구성 요소는 동일한 코드를 사용한다는 것입니다 두 장치에서 실행 중입니다 많은 카메라 개발자들이 알고 있듯이, 그것은 아주 위업입니다 같은 다른 장치에서 동일한 코드를 실행하려면 특히 하드웨어에 묶여있는 것 그것이 멀티 카메라이기 때문에

먼저, 다중 카메라를 사용하는 방법에 대해 이야기 해 봅시다 동시에 스트림 프레임 워크가 제공하는 기본 보증 멀티 카메라 API에서 최소한 두 개의 실제 카메라를 사용할 수 있습니다 동시에 스트림 보증 된 스트림 구성을 생각해 내십시오

단일 카메라 장치 용 하드웨어 수준, 대상을 기반으로하는 일련의 규칙입니다 유형 및 대상 크기 멀티 카메라 API를 올바르게 사용한다면, 우리는이 규칙에 대한 예외를 얻을 수 있습니다 이것을 예제로 설명해 보겠습니다 YouTube에는 최대 크기의 단일 YUV 스트림이 있습니다

이전 표와 같이 하드웨어가 제한적인 장치 레벨은 단일 스트림을 사용할 수 있습니다 그 구성으로 멀티 카메라 API를 사용하면 실제로 동일한 구성의 두 스트림을 사용할 수 있습니다 기본 물리적 카메라에서 우리가해야 할 일을 따라 가자

이전에 데모 한 앱을 구현할 수 있습니다 우리는 5 단계로 나누었습니다 준비 되었나요? 1 단계 – 실제 카메라를 찾으십시오 물리적 카메라 쌍을 식별하여 시작합니다 동시에 열 수 있습니다

피사체로 카메라 문자를 사용하여, 우리는 [? 요청 기능] 논리적 인 멀티 카메라가 그들 중 하나라면, 우리는이 장치가 논리적 인 카메라라는 것을 압니다 논리적 인 카메라를 발견 했으므로 저장합니다 우리는 나중에 ID를 필요로 할 것입니다 그리고 우리는 그것과 관련된 물리적 인 카메라를 얻습니다 그런 다음 다음 단계로 넘어갈 수 있습니다

여기에 방금 설명한 내용을 시각화했습니다 우리는 논리적 인 카메라 ID를 가지고, 우리는 실제 카메라 ID를 가져오고 이제는 연관된 실제 카메라 검색 논리 카메라 그룹과 다음 단계로 논리 카메라를 엽니 다 두 번째 단계는 새로운 것이 아닙니다 우리는 카메라를 엽니 다

이전에 저장 한 논리적 카메라 ID를 상기하십시오 이것이 우리가 카메라 관리자에게 전달하는 유일한 방법입니다 다시 말하면 논리적 인 카메라 만 엽니 다 장치가 준비되면 단계 콜백이 트리거됩니다 논리적 인 카메라를 열었습니다

다음 단계에서는 출력 구성을 만듭니다 업데이트 카메라 세션을 만드는 데 사용됩니다 원하는 출력 목표마다 이전에 찾은 목록의 실제 카메라 ID가있을 수 있습니다 특정 하드웨어에서 프레임을 검색하려는 경우 카메라

자세한 내용을 살펴 보겠습니다 우리는 다음을 사용하여 출력 설정 객체를 생성합니다 우리가 원하는 출력 목표 그리고 만약 우리가 그 결과를 특정 실제 카메라를 사용하면 설정된 실제 카메라 ID API에서 ID를 전달하십시오 논리적 인 카메라를 사용하고 싶다면, 이 단계를 건너 뛸 수 있습니다

우리는 둘 다 조합 할 수도 있습니다 하루가 끝나면 목록이 있습니다 출력 구성 중 일부는 물리적 카메라와 관련이있을 수 있습니다 그 중 일부는 – 논리적 인 카메라 목표는 모든 구성을 넣는 것입니다

단일 세션 구성으로 방금 설명한대로 각 출력 구성 관련 출력 목표 및 선택적으로, 실제 카메라 ID 이제 캡처 세션을 만듭니다 새 세션을 사용하여 캡처 세션을 만드는 방법 구성 개체? 우리는 출력 구성 목록으로 시작합니다 우리가 방금 만든거야 이를 통해 세션 구성을 인스턴스화하고, 여기에는 캡처 세션 콜백이 포함됩니다 콜백에서 인스턴스를 가져옵니다

카메라 세션 만들기 우리는 그 세션 설정 객체 우리가 2 번에서 얻은 카메라 장치 논리적 인 카메라를 열었을 때 요청이있는 프레임을 보냅니다 원하는 구성으로 새 세션을 만듭니다 세션 구성 객체에서 제공되는 콜백 지금 방아쇠를 당길 것이다

그리고 나서 우리는 우리 카메라 세션을 사용할 준비가 될 것입니다 마지막 단계 요청을 캡처합니다 그런 일이 발생하면 프레임을 가져올 수 있습니다 카메라의 예를 들어 두 프레임에서 프레임을 캡처하려면 실제 카메라를 동시에 사용하면 우리가 전에 만든 세션을 가져 가라

한 쌍의 출력 대상 이 특별한 경우, 각 타겟 특정 카메라 ID와 연결됩니다 우리는 일반적으로 캡처 요청을 생성합니다 이 경우 템플릿 미리보기를 사용하십시오 우리는 평상시와 마찬가지로 출력 목표를 그것에 첨부합니다 이제 캡처 요청을 전달합니다

여기 다른 것은 없습니다 이 경우를 제외하고, 출력면 각각에서 이미지 데이터를 수신합니다 관련 실제 카메라의 캡처 요청 콜백은 한 번만 트리거됩니다 다시 한번, 캡처 요청과 같습니다 가장 큰 차이점은 완료 콜백 대신에 두 개의 시작 노출 타임 스탬프를 돌려 줄 것입니다

일반 캡처 요청에서 단 하나의 값만 가져옵니다 요점을 되짚어 보겠습니다 우리의 광학 줌 데모 우리는 물리적 카메라를 발견했습니다 우리는 그 그룹의 일부인 논리적 인 카메라를 열었습니다

출력 구성을 만들었습니다 우리 [? 인쇄?] 목록 캡처 세션을 만듭니다 그런 다음 캡처 요청을 보내 게됩니다 내가 만지고 싶었던 또 하나의 주제는 렌즈 왜곡이다

렌즈 왜곡의 고전적인 예는 어안 렌즈입니다 이것은 실제 사례가 아닙니다 설명의 목적으로 만 여기에 있습니다 모든 렌즈에는 약간의 왜곡이 있습니다 논리 카메라의 경우, 왜곡이 있다고 가정 할 수 있습니다

최소가 될 것입니다 대부분의 경우 드라이버에 의해 수정됩니다 그러나 실제 카메라의 경우 왜곡 꽤 중요 할 수 있습니다 실제 렌즈 왜곡이 설명됩니다 방사형 및 접선 계수 집합 계수는 렌즈 왜곡을 사용하여 쿼리 할 수 ​​있습니다

카메라 특성 키 관심이 있으시면 문서에 더 많은 세부 정보가 있습니다 좋은 소식은 왜곡을 수정하는 방법이 있다는 것입니다 수학을하지 않고 간단히 왜곡 보정 모드를 설정할 수 있습니다

캡처 요청에 OFF는 왜곡이 가해지지 않았 음을 의미합니다 우리가 원한다면 이것을 사용해야 할 수도 있습니다 [INAUDIBLE] 동기화와 같은 작업을 수행 할 수 있습니다 Emilie는 나중에 그것에 대해서 이야기 할 것입니다

FAST는 최선의 교정이 가능하다는 것을 의미합니다 광고 된 프레임 속도를 충족시키면서 적용됩니다 FAST 보정이 불가능할 경우, 이것은 OFF와 같을 수 있습니다 고화질은 왜곡을 의미합니다 렌즈가 허용하는만큼 수정 될 것이며 잠재적으로 프레임 속도의 비용으로

수정 모드를 지정하지 않은 경우, 그것은 FAST 또는 HIGH QUALITY 중 하나입니다 구현 세부 사항에 달려 있습니다 기본값입니다 당신은 개발자로서, 귀하의 캡처에 어느 것이 적용되었는지 확인하려면 쿼리 할 수 ​​있습니다 의뢰

시연하는 코드 스 니펫을 보자 이 렌즈 왜곡이 어떻게 고품질로 설정되었는지 우리가 정지 이미지 캡처를 원할 것입니다 우리가 이미 카메라 세션을 시작했다고 가정하면, 캡처 요청 빌더를 인스턴스화합니다 원하는 템플릿을 사용합니다이 경우, 내가 말했듯이, 이미지 캡처

그런 다음 카메라 특성을 사용합니다 고 품질 왜곡 보정을 결정하는 방법 모드를 사용할 수 있습니다 이제 우리는 우리가 높은 품질을 가지고 있음을 알게되었습니다 왜곡에 대한 수정, 우리는 캡처 요청에 그것을 설정, 그리고 우리는 항상 우리가하는 일을합니다 – 포획 요청을 파견하십시오 샘플 코드 및 기술 세부 사항은, 우리의 블로그 게시물을보십시오

우리는 이것과 그 이상을 다뤘습니다 우리는 이번 주 초에 그것을 출판했습니다 그리고 지금, 나는 Emilie에게 그것을 넘겨 줄 것이다 [박수 갈채] 고마워, 오스카 제 이름은 Emilie Roberts입니다

저는 파트너 개발자 옹호자입니다 멋진 데모를 보여 드리겠습니다 이 다중 카메라 API 중 일부를 사용합니다 픽셀 3에 보케 효과를 적용합니다 그래서 우리는 실제로 3 개의 – 잘, 2 개의 데모를 가지고 있습니다

25 데모 첫 번째는 하나의 캠 데모입니다 멀티 카메라가 전혀 없습니다 그러나 나는 그 메커니즘을 보여주기를 원했다

보케 효과를 만들기위한 것입니다 그런 다음 듀얼 캠 데모에 들어가면 정확히 볼 수 있습니다 – 멀티 카메라 측면에 집중할 수 있습니다 보케 효과 자체에 대해 그렇게 걱정하지 않아도됩니다 그리고 곧 출판 될 예정입니다 오픈 소스

너무 많은 코드를 낙서하는 것에 대해 걱정하지 마십시오 그럼이 전화에 갈 수 있을까요? 데모 실례합니다 오키 그래서 우리는 – 나는 이것을 올바르게 설정하지 않았다

좋아, 싱글 캠 보케 효과를 보자 셀카를 여기로 데려가 그리고 당신이 화면에서 볼 수 있다고 생각합니다 그것은 내 얼굴을 찾는 것입니다 그것은 그것을 절단하고 있습니다

최종 결과를 높이 보자 그리고 그것은 거기에 인물 사진 모드를 붙이는 것 이것은 거친 인물 사진 모드의 일종입니다 그리고 이것에 대한 최적화가 있습니다 그게 어떻게되는지 보자

여기서 출력 단계를 보여 드리겠습니다 그래서 전경을 찾는 더 나은 일을하려고합니다 이봐, 그렇게 나쁘지 않았어 전경 이미지, 배경, 그것은 단색이고 조금 흐려져 있습니다 어서, 애플 리케이션

우리를 실망시키지 마라 최종 결과에 붙여 넣기 한 대의 캠에 비해 그렇게 나쁘지 않습니다 듀얼 캠 데모를 사용해 봅시다 그리고이 무대 조명으로 저는 확신하지 못합니다

어서 이봐, 나쁘지 않아 우린 잘하고있어 따라서 왼쪽 하단에 깊이 맵이 생성 된 것을 볼 수 있습니다 전경에서 나를 감지하고있는 코너 너희 모두의 나머지는 조금 쭈그러 들었다

가까운 사람들이 회색임을 알 수 있습니다 그리고 나서 검은 색이 바로 뒤로갑니다 또한 혼란을 야기하는 빛을 볼 수 있습니다 마지막 결과를 보여 드리겠습니다 분명히 일어날 수있는 몇 가지 최적화가 있습니다

하지만 꽤 잘 작동합니다 다시 한번, 이는 Pixel 2에서 두 개의 전면 카메라를 사용하고 있습니다 한 번에 두 개의 스트림을 볼 수 있습니다 죄송합니다 이 연결이 다시 연결됩니까? 아니

어쨌든, 한 번에 두 스트림 광각 렌즈 및 법선 렌즈 같은 시간에 슬라이드로 돌아갈 수 있을까요? 그럼 우리가 어떻게하는지 이야기 해 봅시다 오, 우리가있다 어쨌든, 그래서 우리는 정상적인 카메라를 가졌습니다

광각 렌즈는 동시에 작동합니다 다시 말하지만, 우리는 이것을 아마도 GitHub에 게시 할 것입니다 오픈 소스이므로 소스 코드를 파헤쳐 최적화 할 수 있습니다 더 나아지게하십시오 첫 번째 경우는 단일 캠입니다

빨리 살펴 봅시다 떠 다니는 머리 보케 효과 나는 그것을 부릅니다 우리는 얼굴 탐지 장치로 사진을 찍을 것입니다 우리는 두 장을 만들 것입니다 그래서 배경, 전경이 있습니다

환상적인 배경 효과를 내기 그 플로팅 헤드를 속한 곳에 붙여 넣으십시오 Face2는 Camera2 API에 내장되어 있습니다 코드를 구현하는 것은 매우 쉽습니다 우리가하고 싶은 일은 카메라를 점검하는 것입니다 카메라 장치가 지원하는지 확인하기위한 특성 FaceDetect

그럴 경우 원하는 모드를 찾으십시오 떨어져 있고, 그 다음 간단하고, 가득하다, 카메라 장치에 따라 다릅니다 그런 다음 카메라 캡처 요청을 할 때, 우리는 요청에 그 것을 포함시킵니다 우리가 결과를 얻을 때, 당신은 모드가 설정된 경우 얼굴을 찾았습니까? 이 예에서는 검색 만합니다 그것이 찾은 첫 번째 얼굴은 제가 사용했던 얼굴입니다

우리는 이것을 확장하여 여러면을 가질 수 있다고 상상할 수 있습니다 그냥 메모 – FaceDetect 정말 얼굴을 잡아 그래서 나는 그 경계들을 조금씩 부딪쳤다 그래서 머리가 잘려나 간다 그것은 나쁘게 들린다

배경에 붙여 넣기되는 머리 재미있는 배경 효과에 대해 이야기 해 봅시다 그래서 여기서 원하는 것을 할 수 있습니다 나는 몇 가지 일을했다 먼저 RenderScript를 사용하여 배경에 흐리게했다

멀티 카메라 이야기이기 때문에, 일부 카메라에는 수동 줌이 있습니다 다중 캠으로 작업한다면, 당신은 다른 카메라로 배경을 할 수 있습니다 초점을 벗어나는 방식으로 확대 / 축소 할 수 있습니다 따라서 실제로 광학 흐림을 할 수 있습니다 멋지다

그리고 또한 멋지다 소프트웨어 단계를 저장하십시오 이 데모에서는 사용자 정의 소프트웨어 세피아 효과도 수행했습니다 RenderScript를 사용합니다 하지만 멀티캠을 다시 사용한다면 많은 카메라가 필요합니다

단색이나 세피아 같은 효과를 내장하고있다 캡처 요청에 쿼리하고 포함 할 수 있습니다 게다가 이전에 RenderScript를 사용하지 않았다면, 이런 식으로 보입니다 흐림 효과 때문에 우리는 가장 신경을 쓴다

중간 선 3 개 정도 그리고 내장 스크립트, 본질적인 흐림입니다 그것은 꽤 편리합니다 기본적으로 상자에서 작동합니다 이 경우 상자 외부에서 흐려집니다

상자가 흐릿하지 않기 때문에 세피아 효과를위한 사용자 지정 RenderScript 스크립트입니다 처음 세 줄에서 볼 수 있습니다 기본적으로 우리는 입력 빨강, 녹색, 및 파란 채널, 색깔을 음소거하는 종류, 그들을 조금 노랗게 만들고, 그들을 보내는 출력 채널에 연결합니다 오키

그래서 우리는 배경을 가지고 있습니다 이 멋진 보케 효과가 있습니다 포 그라운드로 무엇을할까요? FaceDetect에서 우리는 얼굴을 잘라 냈습니다 그리고 우리는 PorterDuff를 선형 그래디언트로 적용합니다 가장자리를 약간 부드럽게 만드십시오

그래서 우리가 그것을 붙여 넣을 때, 그것은 그 거친 라인이 아닙니다 그리고 타다 붙여 넣기하면 상황이 꽤 좋아 보입니다 몇 가지 최적화가 있습니다 하나는 GrabCut 알고리즘을 사용하여 본 것입니다

이것은 OpenCV, Open Computer Vision 라이브러리에 내장되어 있습니다 우리는 깊이 맵 데모를 위해 나중에 사용하고 있습니다 기본적으로 나는 얼굴을 발견했다 그리고 조금 더 큰 사각형을 선택했습니다 시체가 어디 있는지 추측하려고합니다

그리고 나서 그랩 컷이 최선을 다합니다 좋아하는 사진 편집기의 Magic Wand 도구처럼 – 전경을 실제 전경으로 축소시키는 것 범위 앞에서 언급했듯이 여러 얼굴을 추가 할 수도 있습니다 이제, 당신이 모두 기다리고있는 순간 깊이지도가있는 듀얼 캠 보케에 대해 이야기 해 봅시다

우리는 카메라에 동시에 사용할 것입니다 그리고 우리는 깊이를 만들 것입니다 지도, 어려운 부분입니다 나는 그것을 굵게 강조했다 그런 다음 동일한 메커니즘을 사용합니다

우리는 이미 이야기했다 오키 이게 어떻게 작동합니까? 우선, 이중 캡처 그래서, 왼쪽에, 나는 애완 동물과 어울리고있다 집에서

왼쪽은 Pixel 3 전면 카메라의 일반 카메라입니다 그리고 오른쪽은 광각 촬영입니다 그것을하기 위해서, 오스카가 걸었던 것처럼, 여러 출력 구성을 설정했습니다 그래서 각 렌즈에 대해 우리는 여기, 우리는 이전의 표면뿐만 아니라 이미지를 가지고있다 정상 렌즈 용 판독기

우리는 정상적인 렌즈에 설정된 실제 카메라 ID를 사용합니다 그리고 우리는 광각 렌즈에 대해서도 똑같은 작업을합니다 따라서 우리는 4 가지 출력 설정으로 끝납니다 우리의 구성에 투입 그때부터 – 또는 거기에서, 그것은 단지 캡처를위한 출력 목표를 선택해야합니다

이 경우, 우리는 그 사진들을 원한다 그래서 우리는 그들을 조작 할 수 있습니다 그래서 우리는 정상적인 렌즈에서 이미지 리더를 원한다고 말합니다 및 광각 렌즈를 포함한다 좋아, 그래서 우리는 우리의 이미지를 가지고있다

이제 수학과 마법을 다해야합니다 그 bokeh 효과가 일어나게하십시오 나는 스테레오 비전에 대해 간략히 소개하고자한다 우리가 모든 코드에 들어가기 전에 하지만 나는이 슬라이드를 보면서, 이 슬라이드를 작업하면서 조금 지루해졌습니다

나는 기하학을 좋아하지만, 그것은 많은 편지입니다 P는 어쨌든 무엇을 의미합니까? 분명히, 그것은 초콜릿 더미입니다 P는 초콜릿 더미를 나타냅니다 그리고 이것이 우리가 집중하게 될 것입니다 이 데모의 나머지 부분에 관해서

그리고 카메라 하나는 조금 지루한 카메라입니다 여기 S는 상어로 바꿀 것입니다 내 친구, Pepper the Shark입니다 그리고 H는 하마입니다 그래서 이들은 우리의 도우미입니다

우리가 스테레오 비전에 관해 이야기하는 것을 도울 것입니다 왼쪽 카메라, 보통 렌즈는 상어 후추입니다 광각 렌즈는 소파 하마 인 Susie Loo입니다 그리고 그들은 그 두꺼운 초콜릿 뭉치에 두 가지 모두 들어가고 있습니다 그리고 이미, 그것은 훨씬 더 재미 있습니다

나는 당신이 동의하기를 바랍니다 그래서 그곳에는 왜곡 된 직사각형들이 있습니다 그것은 2D 표면입니다 그것은 카메라가 포착 할 이미지와 같습니다 즉, 2D 표현 우리가 가진 실제 살아있는 3D 물체의 어떻게 생겼는지 살펴 보겠습니다

상어의 시선이 바로 거기에 있습니다 아몬드, 바다 소금, 다크 초콜릿, 하마 캠은 라스베리 크런치에 집중합니다 그래서 그들은 같은 3D 객체를보고 있습니다 그러나 그들은이 2D 표현을 가지고 있습니다 우리가 정말로하고 싶은 것은 별도의 견해를 취하는 것입니다

그들을 결합 할 수 있으니 조금만 더 그 2D보기보다 더 많은 정보 훌륭한 깊이 맵을 만들 수 있어야합니다 그래서 우리는 다시 정상적인 시야, 넓은 시야각을 갖습니다 이 경우에는 둘 다 정상입니다 그러나 왼쪽, 오른쪽 오버레이 서로에게 당신은 그런 종류의 3D 눈금자 효과를 얻습니다 내가 희망하는 초등학교에서

당신은 어린 시절 즐겁게 지내야합니다 그리고 거기에서 우리는 깊이 맵을 만들 수 있습니다 당신이 굉장한 bokeh와 같은 정말로 시원한 물건을하는 것을 허락하는 효과뿐만 아니라 초콜릿이 얼마나 멀리 있는지 알 수 있습니다 그래서 분명히 손을 뻗어 잡을 수 있습니다 오키

그 두 대의 카메라, 두 장의 사진, 서로 다른 방향에있다 그리고 그들은 공간에서 분리되어 있습니다 그래서 우리는 서로를 꼭대기에 올려야합니다 이것이 우리가 카메라 외재라고 부르는 것입니다 두 카메라가 서로 어떻게 관련되어 있는지

그래서 우리는 각각의 이미지들을 회전시키고 번역 할 필요가 있습니다 그래서 그들은 서로의 위에 나타납니다 일반적으로 우리는 일반적으로 회전 및 평행 이동 매개 변수를 제공합니다 세계와 관련된 카메라 카메라 1 대 세계 대신, 우리는 상어와 세계와 하마가있다

그러나 우리가 스테레오 비전을 수행 할 때 우리가 실제로 Shark to Hippo는 걱정할 필요가 있습니다 그렇다면이 두 카메라는 어떻게 서로 관련이 있습니까? 좋은 엔지니어처럼, 내가 아는 전부는 나는 하마를 World to Hippo로 전환해야합니다 그리고 이제 저는 상어에서부터 세계에 이르기까지 하피에 이르는 통로가 있습니다 그게 수학에 대한 재미있는 소개 였으면 좋겠어 위키피디아에 대한 모든 것을 읽을 수 있습니다

이런 모습 회전 행렬을 얻으려면 카메라 2의 회전 행렬을 역으로 변환하려고합니다 카메라 1과 교차 곱합니다 그리고 번역을 위해, 그것은 이와 같은 것입니다 내부 제품을 가지고 빼십시오

Wikipedia 또는 다른 출처에서이 모든 것을 읽을 수 있습니다 그래서 내가 지적하고 싶은 것은 이 일을 직접하고 있다면 번역이 있습니다 일반 카메라의 픽셀 3에 대한 행렬 와이드 카메라 이것은 내가 꺼낸 것입니다 그것에 대해 무엇을 눈치 챘 을까요? 카메라들 사이의 9 밀리미터 간격 약 오른쪽에 보인다

전화를 보면, 좋은 점이 있다는 것을 알 수 있습니다 미국인은 뭐니? 좋은 어쨌든 좋은 9 밀리미터가 있습니다

그 카메라들 사이에 그건 완벽하게 이해가됩니다 하지만 내가 눈치 채지 못한 것은 약 1 주일의 시간을 들여야합니다 그것이 y 좌표에있는 것입니다 그래서 카메라는 서로 위에 있습니다

그래서 저는이 전화로 일하는 동안, 서로 옆에있는 두 대의 카메라를보고, 나는 그들이 분명히 그들이라고 생각했다 수평으로 옮겨졌다 중요한 점은, 깊이 맵 기능 내가 사용하고있는 것은 그들이 서로 옆에있을거야 수평 이동을 가정합니다 그래서 당신은 – 왜냐하면

오, 나는 중요한 부분을 말하지 않았어 카메라 센서는 종종 풍경, 그것은 의미가 있습니다 잘못했을 경우 깊이지도가 작동하지 않습니다

너는 머리카락을 꺼내 내가 한 것처럼 위대한 주를 보내 셨습니다 어쨌든, 만약 당신이 이것을 구현한다면 단지 메모 그래서 우리는 카메라 외재를 가지고 있습니다 우리가 서로의 위에 카메라로부터 그림을 얻는 방법, 서로 어떻게 관련되어 있는지

카메라 내장 함수는 카메라 자체의 속성입니다 그래서 우리는 일반 렌즈와 광각 렌즈를 가지고 있다는 것을 알고 있습니다 그리고 그들은 다른 속성을 가지고 있습니다 그래서 두 가지가 있습니다 하나는 카메라의 특성입니다

이것은 초점 길이, 주축, 그리고 그 축이 어떤 이유로 왜곡 된 경우 이것은 종종 3 행 3 행렬에 나타납니다 그리고 왜곡 – 광각 렌즈와 광각 렌즈 – 특히 가장자리 근처에서 약간의 왜곡이 생길 것입니다 우리가 매핑 할 때 고려해야 할 사항이 있습니다 두 이미지는 서로에게

또 다른 메모 – 그래서 우리는 내장 된 왜곡을 사용할 것입니다 이미지를 왜곡되지 않게하기위한 렌즈의 특성 그러나 오스카가 우리에게 말했듯이, 기본적으로, 카메라가 이미지를 왜곡시킵니다 그래서 우리는 그것을 찌그러 뜨릴 것입니다 reundistort, 그것은 우리가 실제로 그것을 왜곡 할 것이라는 것을 의미합니다, 그것은 나쁜 소식입니다

따라서 실제로 왜곡 보정을 해제해야합니다 당신이 깊이지도를 원한다면 카메라 요청으로 충분히 쉽습니다 왜곡 모드가 해제되어 있는지 확인합니다 오키

여기 네 가지가 있습니다 회전, 평행 이동, 카메라 특성 행렬, 및 렌즈 왜곡 이 속성들을 어떻게 얻습니까? 꽤 쉽습니다 너는 오후 내내, 바둑판 용지를 인쇄해라 이 방에서 전에 이걸 했니? 카메라 라

– 응? 재미 있겠지? 카메라 교정 두 카메라 모두에서 일련의 사진을 찍으십시오 당신은 많은 알고리즘을 실행합니다 이 네 가지 카메라 특성을 알아 냈습니다

그리고 그때부터 깊이지도를 만들기 시작할 수 있습니다 카메라에서 당신은 내 쾌활한 얼굴에서 말할 수 있습니다 실제로 그 재미가 아닙니다 하지 마

별로 좋지 않다 다행히 카메라 2 멀티 카메라 API에서, 우리는이 위대한 들판을 가지고 있습니다 회전, 평행 이동, 교정 및 왜곡 따라서 API를 바로 사용할 수 있습니다 네가 간다면 몇 마디 만 말해 줄께

자신을 구현합니다 그래서 카메라의 특성, 초점 거리, 액세스 정보는 다섯 개의 매개 변수로 제공됩니다 이것은 Android 설명서에 있습니다 그러나 3×3 행렬을 생성하려면, 당신은 단지 문서를 따라야 만합니다 번호를 플러그인하십시오

너를 버릴지도 모르는 또 다른 일 왜곡 계수는 다시 5 가지 값입니다 그러나 OpenCV 라이브러리는 다른 순서로 사용합니다 API에서 얻은 값보다 따라서 0, 1, 3, 4, 2가되는지 알아야합니다 희소식은 당신이 0, 1, 2, 3, 4 주문, 당신이 이미지를 왜곡하지 않을 때, 그들은 마치 소용돌이에 빠져있는 것처럼 보입니다

따라서 여러분은 이러한 계수에 잘못된 것이 있다는 것을 확신합니다 어쨌든, 일단 우리가 모든 매개 변수를 갖게되면, 우리는 우리 이미지를 준비하기 시작할 수 있습니다 깊이 맵 비교를 할 수 있습니다 이건 내 부엌에있는 나야 그리고 네가 거기에서 볼 수 있는지 모르겠다

하지만 천장을 보시면 거기에 어떤 종류의 커브가 있음을 주목하십시오 우리는 재미있는 집에 살지 않습니다 우리가 말하고있는 왜곡 효과입니다 왜곡 보정 기능이 해제 된 광각 렌즈를 사용하십시오 두 이미지를 비교할 때도 마찬가지입니다

직선들 – 우물과 곡선 선들 – 각 이미지에 줄을서야합니다 당신이 깊이지도를 만들 때 우리는 그것을 정류라고 부릅니다 그리고 우리는 카메라 특성을 사용합니다 그것은 구부러진 지붕을 보여주는 것입니다

이 모든 기능은 OpenCV 라이브러리에 있습니다 Open 컴퓨터 비전 라이브러리 첫 번째는 Stereo Rectify입니다 이것은 우리에게 일련의 매개 변수를 가져옵니다 이 계산을 수행하는 데 사용할 수 있습니다

그래서 우리는 – 죄송합니다 API에서 얻은 값, 카메라 매트릭스, 왜곡 계수, 회전 및 평행 이동 우리가 전에 계산 한 것 우리는 이러한 매개 변수를 제거하고, 우리는 변형되지 않은 수정 맵을 호출합니다 우리에게 말하는 방법을 알려주는지도를 만든다 이 두 개의 서로 다른 카메라에서 두 개의 이미지를 가져올 수 있습니다

그들을 서로에 매핑하십시오 그리고 Remap 기능은 바로 이것을합니다 그럼 그게 우리에게주는 것을 보자 여기 왼쪽에서 다시 정상적인 캠, 앞쪽 캠, Pixel 3의 광각 렌즈 및 Pixel 3의 광각 렌즈 당신은 그들이 꽤 잘 어울리는 것을 볼 수 있습니다

상어 줄이 줄 지어 있습니다 작물에 대한 권리입니다 넓은 각도에는 더 많은 수확 지역이 있습니다 그게 전부 줄 지어있다 지붕 라인, 도어 라인은 직선입니다

엉뚱한 왜곡이 없습니다 그리고 실제로, 나는 당신이 앉아있는 곳에서, 당신은 아마 밀접하게보아야 만합니다 왼쪽 그림이 조금 더 가깝다는 것을 알기 위해 프레임의 왼쪽에 그래서 그들은 실제로 조금씩 상쇄됩니다 두 대의 카메라가 있다면 무엇을 기대할 것인가 9 밀리미터 간격

그래서 우리는 이미지를 얻었다 우리는 왜곡되지 않았습니다 우리는 그들을 바로 잡았습니다 우리는 깊이 맵을 작성하는 데 아주 가깝습니다 깊이 맵 기능을 호출하면됩니다

우리는 stereoBM 또는 stereoSGBM을 사용합니다 하나는 다른 것보다 몇 가지 매개 변수가 있습니다 오픈 소스 데모로 게임을 할 때, 이 매개 변수가 어떻게 작동 하는지를 볼 수 있고, 최적화, 변경 사항 커밋, 그 앱을 더 잘 만드는 데 도움이됩니다 그리고 우리는 계산을 호출하고이 깊이 맵을 만듭니다 그리고 그렇게하면 놀라운 사진을 얻을 수 있습니다

이렇게 실제로, 때로는 그것보다 훨씬 나아 보입니다 하지만 어쨌든 이것은 우리가 함께 일하기를 원하는 것이 아닙니다 우리가 정말로하고 싶은 것은 필터입니다

이 경우, 가중치 최소 제곱 필터를 사용하여 그것을 부드럽게하고 조금 더 유용한 깊이를줍니다 지도 따라서 우리가 데모에서 본 어두운 픽셀은, 더 먼 사람들입니다 흰색 픽셀이 가까운 픽셀입니다 그리고 아마도 조금보기가 어려울 것입니다

상어의 주둥이와 하마의 주둥이를 볼 수 있습니다 조금 회색으로 변했다 그래서 실제로 어느 정도 거기에서 일하고 있습니다 필터를 호출하는 방법입니다 OpenCV 라이브러리에도 포함되어 있습니다

기여 모듈에서 그것은 모두 오픈 소스입니다 그리고 정말 멋집니다 완벽한 깊이 맵을 얻으면 기분이 좋아집니다 좋아, 여기서 우리는 깊이 맵을 가지고있다

우리는 무엇을 할 것인가? 따라서이 깊이 맵을 마스크로 적용 할 수 있습니다 그리고 검은 영역, 우리는 페이드 아웃하고 싶습니다 전경을 강조하고 싶습니다 PorterDuff을 사용하면 꽤 쉽습니다 결과는 이와 같습니다

실제로 전경이 더 많이 존재합니다 그런 다음 배경이 희미합니다 개인적으로 나는 높은 기준을 가지고있다 반투명 플로팅처럼 보입니다 내 어깨 너머에 상어

내 얼굴이 조금 희미 해지고 내 안구가 없어 졌어 그래서 저는 이것을 통해 큰 또 하나의 붉은 색 X를 넣고 말할 것입니다 충분하지 않습니다 좋은 시작입니다 그러나 우리가 정말로 원하는 것은 이것과 같은 깊이 맵입니다

그래서 우리는 깊이 맵에 어려운 문턱을 놓을 것입니다 전경, 배경을 결정합니다 다른 앱에서는 비슷한 것을하고 싶을 수 있습니다 그러나 어쩌면 그렇게 가혹한 차이는 아닙니다 더 부드러운 곡선이 될 수 있습니다

이를 위해 OpenCV 함수 인 임계 값을 사용할 수 있습니다 우리는 그만한 가치를 부여합니다 앱의 경우 255 개에서 80 ~ 140 개 정도입니다 그리고 그것은 무엇인가가 고려되는 바로 그 한계입니다 전경 또는 배경

너를 위해 이것의 구현 내가 너에게 보여준 것처럼 마스크를 적용했을 때, 당신은 실제로 그 검은 픽셀을 돌릴 필요가 있습니다 투명 픽셀로 따라서이 함수는 모든 검은 색을 투명하게 변환합니다 우리가 간다

거의 다 왔어 그래서 저는이 슬라이드에서 한 가지만 기억하고 싶었습니다 중간 그림 – 내 눈이 조금 어둡다는 것을 알 수 있습니다 3 개의 슬라이드 이상을 기억하십시오 그래서 우리는 초기 그림을 가지고 깊이지도를 얻었습니다

우리는 그것에 대한이 어려운 문턱을합니다 그리고 배경을 다시 만들 수 있습니다 첫 번째 데모에서했던 것처럼, 그것을 흐리게하고 단색으로 그 전경을 잘라냅니다 붙여 넣기에 필요한 모든 조각이 있습니다 그리고 이것은 우리의 놀라운, 마지막, 인물 사진입니다, 그것은 꽤 좋다

나는 그것을 자랑스럽게 생각합니다 그럼 최적화에 대해 이야기 해 봅시다 내가 말하고있는 안구를 기억해? 그래서 어떤 종류의 반짝 반짝 빛나는 이 현재 반복에서 엉망이 될 수있다 응용 프로그램의 또는 밝은 빛이 깊이 맵 생성을 버릴 수 있습니다 그래서 최적화를 한 번했습니다

FaceDetect 영역이 있어야합니다 나는 전경에서 얼굴을 원한다고 확신한다 그래서 나는 그것을 사용하고 그것을 단호하게 잘라 말했습니다 얼굴에있는 모든 것이 전경에있게 될 것입니다 그래서 내 이빨과 내 눈처럼 보호 받았다

그 마스킹 아웃 효과에서 네가 알아 차렸는지 모르겠다 내가 돌아갈 수 있을까? 내 퍼지 붉은 머리카락과 빨간 소파 – 거기 우리는 간다 그들은 종류가 섞여있다 그리 블 컷을 사용할 수 있다고 생각합니다

정확하게 알아내는 것의 조금 더 나은 일을하는 것 전경에 뭐가 있는지 고마워 우리는 이것이 당신에게 깊은 잠수함을 준 것을 정말로 희망합니다 카메라 2와 멀티 카메라 API를 사용하여, 당신에게 흥미 진진한 창의적인 아이디어를 제공합니다

우리는 당신의 아이디어를 정말로 듣고 싶습니다 우리는 앱에서 그들을보고 싶습니다 그리고 우리는 또한 당신이 찾고있는 기능을 알고 싶습니다 우리는 그들이 위대하다고 생각합니다 카메라 생태계를 계속 추진하고 정말 생태계가 점점 더 커지고 있습니다

다시 한번 고마워 그리고 샌드 박스, 카메라 샌드 박스, 질문이 있으시면 후속 조치를 원할 경우이 앱을 사용해보고 싶습니다 작동하는지 확인하십시오 그리고 곧 오픈 소스를 찾으십시오 고마워

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

Introduction to Maps API on Android Wear (100 Days of Google Dev)

HOI LAM : Android Wear는 멋진 제품입니다 신속하고 눈에 잘 띄는 정보 당신이 연결되어있는 동안 현재에 머무를 수있게 해줍니다

자연스럽게 가장 많이 요청한 기능은지도에 위치를 표시하는 것입니다 저는 Hoi Lam이고 최신 Google Play 서비스 업데이트로, Google Maps API가 Android Wear에 도착했습니다 이것은 클래스 매핑 기능이 최고라는 것을 의미합니다 단 몇 줄의 코드 만 남기고 이 Tech Byte에서는 몇 가지 일반적인 사용 방법을 설명합니다 Android Wear에서지도 API에 대한 사례, 이를 구현하는 방법에 대한 첫 걸음을 제공합니다

시작하기 전에 좋은 소식이 있습니다 Android Wear의 Google Maps API Android 휴대 전화 및 태블릿과 동일한 API를 기반으로합니다 결과적으로 Android에서 Google Maps API를 사용한 경우 전에, 집에서 바로 느낄거야 가장 일반적인 사용 사례 중 하나는 단순히지도를 표시하는 것입니다 앱에서 획기적인 마크를 표시해야 할 수도 있습니다

또는 실행중인 경로를 표시 할 수 있습니다 이 경우, Map Fragment 또는 Map View에 사용할 수 있습니다 Google Maps API 키를 신청하십시오 필요한 경우 마커 및 폴리 라인을 추가합니다 이 모든 기능을 사용할 수 있습니다

이미 동일한지도 API를 사용하고 있습니다 Android에서 잘 알고 있지만 단 한 가지주의 사항 만 있습니다 Android Wear가 제스처를 예약합니다 해고를 위해 왼쪽에서 오른쪽으로 스 와이프하는 중 현재 응용 프로그램 주위를 둘러 볼 맵이 필요하지 않은 경우, 이것은 계속 작동 할 것입니다

그러나 주위를 돌아 다니며 이동하려는지도가 필요한 경우, 이 특정 해제 동작을 무시해야합니다 혼란을 줄이고 실제로 사용자가 앱을 나가게하십시오 이렇게하려면 Overly Dismissing을 구현해야합니다 보기, 십자가와 함께이 빨간색 동그라미, 긴 클릭 이벤트에 첨부하십시오 뷰는 닫는 동작을 처리합니다

또 다른 일반적인 사용 사례는지도에서 위치를 선택하는 것입니다 친구 또는 택시가 당신을 거기에서 만날 수 있도록 이를 구현하기 위해 마커를 배치 할 수 있습니다 화면의 한가운데에 놓고 사용자가 주변에서 놀 수있게하십시오 지도

이것은 맵 조각 내에서 선택된 위치를 나타냅니다 요소 그런 다음 Google지도 onCameraChange 리스너를 사용하십시오 사용자가지도 주변에서 이동했는지 여부를 감지합니다 새 위치는 다음을 통해 액세스 할 수 있습니다

cameraPositiontargetlatitude 그리고 경도 그런 다음이 정보를 수신자에게 보낼 수 있습니다 친구 나 택시 운전사가 되십시오

사용 방법을 구현하는 방법에 대한 자세한 기술 정보는 우리가이 기술 바이트에서 설명한 경우, Maps API 블로그 게시물로 이동하십시오 또한 심층적 인 참조 정보 Google 개발자에게 제공됩니다 이 두 번째 링크를 통해 나는 Hoi Lam입니다 Android Wear는 사용자를 위해 설계되었습니다 이동 중에도 연결 상태를 유지할 수 있습니다

Android Wear의 Google지도 API를 사용하면 개발자는 Google지도에 힘 입어 강력한 도구를 갖추고 있습니다 따라서 실제 사용자를 계속 움직여 보겠습니다

New APIs in M for Android for Work (100 Days of Google Dev)

JESSICA : 작년에 Android for Work, 안드로이드를 멋지게 만드는 새로운 방법 직원 및 비즈니스를위한 롤리팝에서는 설탕으로 덮인 노력을했습니다 Android 기기를 관리 대상으로 만들기 배포

이제 IT 관리자는 회사 소유 장치를 안전하게 배포 할 수 있습니다 그들은 또한 자신의 장치 또는 "BYOD"를 가져올 수 있습니다 나는 제시카 야 Android for Work를 어떻게 개선했는지 알려 드리겠습니다 M 릴리스에서는 장치 관리를위한 더 많은 API가 제공되므로, 더 나은, 더 세련된 BYOD 경험, 그리고 완전히 "COSU"라는 장치를 배포하는 새로운 방법 나중에 자세히 설명해 드리지만 앱을 제작하거나 배포하는 경우 비즈니스 용으로이 비디오를보고 싶을 것입니다

여기 당신을위한 간단한 요약 Android for Work에 대해 이미 모르는 사람들 수백만 명의 사람들이 자체 장치를 가져오고 있습니다 직장에 Android Lollipop에서는 안전한 업무용 프로필을 설정할 수 있습니다 IT 관리자가 관리합니다 업무용 프로필에는 별도로 관리합니다

사용자는 회사의 엔터프라이즈 모빌리티를 설치하기 만하면됩니다 관리 앱 및 로그인 만세 또 다른 두문자어 – "EMM" 우리는 위대한 EMM과 제휴했습니다 Android for Work 솔루션을 출시했습니다

우리는 또한 기업을위한 방법을 추가했습니다 기업 소유의 장치를 L 이 모델을 기기 소유자라고합니다 IT 부서가 요구할 때 완벽합니다 전체 장치를 제어 할 수 있습니다

이 모든 것은 직원에게 평소와 같이 꽤 사업 적입니다 일단 그들이 그들의 개인 장치를 등록하면, 워크 벤치 버전의 Play 스토어를 볼 수 있습니다 여기에서 기업용 앱을 다운로드 할 수 있습니다 고용주가 승인 한 개인용 및 업무용 앱을 사용할 수 있습니다 런처에서 나란히

업무용 앱과 알림은 일괄 처리되어 있으므로 즉시 알아볼 수있는 이제 M 릴리스의 새 API로 이동해 보겠습니다 IT 관리자는 모바일 데이터의 양을 관리해야합니다 직장 앱이 사용하고 있습니다 그래서 우리는 작업 프로필에 대한 새로운 네트워크 사용 API를 추가했습니다

IT는 응용 프로그램별로 데이터 사용량을 세분화 할 수도 있습니다 관리자는 엄청난 돈을 쓸 수 있습니다 기업 자원에 대한 액세스를 구성하는 시간 각 장치에 대해 새 API로이 문제를 해결했습니다 IT 승인 앱에서 인증서를 설치할 수 있습니다 이제 사용자는 기업 자격 증명을 한 번만 입력하면됩니다

및 작업 응용 프로그램에 필요한 인증서가 있습니다 리소스에 안전하게 액세스 할 수 있습니다 IT 부서의 업무를보다 쉽게하기 위해 그들은 지금 읽기 전용 Wi-Fi 구성을 추가 할 수 있어야합니다 기업 소유 기기에서 이렇게하면 장치를 확보 할 수 있습니다

번거 로움없이 기업 네트워크에 올라 타라 또는 우발적 인 삭제 또한 지원 요청 량이 줄어 듭니다 일을 결코 사용하지 말아야한다 당신이 알고 사랑하는 장치

그래서 우리는 약간의 개선 작업을했습니다 프로파일을 사용하여 M에서 BYOD 경험을 향상시킬 수 있습니다 첫째, 동일한 기기에 개인용 앱과 업무용 앱이 모두있는 경우, 사용자가 상태 표시 줄에 작업 아이콘을 볼 수 있습니다 그래서 그들은 그들이 일하는 앱에 언제 있는지 알고 있습니다 둘째, 가상 사설망을 설정하는 앱 소비자에게 인기가 높으며 비즈니스에 사용됩니다

IT 부서는 종종 업무용 프로필에 VPN 앱을 배포합니다 기업 서비스에 대한 보안 액세스를 제공합니다 이제 VPN 앱이 통합 설정 제어판에 나타납니다 Google은 사용자 경험을 개선했습니다 따라서 기업 VPN 애플리케이션은 분명합니다

개인적인 것들과 나란히 표시됩니다 마지막으로 연락처 공급자를 개선했습니다 이제 직장 연락처 이름을 시스템 앱에서 사용할 수있게되었습니다 그래서 당신의 상사로부터 신비가 더 이상 전화하지 않습니다 당신은 단지 숫자 대신 사장님의 이름을 보게 될 것입니다

지금까지 우리는 IT 관리자가보다 쉽게 ​​생활 할 수있는 방법을 모색했습니다 사용자에게 더 좋습니다 이제 Android 기기에 흥미로운 새로운 용도에 대해 이야기 해 보겠습니다 비행기에 탑승 해 체크인했는지, 차를 렌트했는지, 또는 주문 된 룸 서비스? 네가 할 수 있다면 좋지 않을까? 터미널에서 안전하게 관리되는 Android 기기에서이를 수행하고, 키오스크 또는 호텔 방에서? 이제 Android for Work를 통해 IT 부서에서 이러한 기기를 관리 할 수 ​​있습니다 우리는 이것을 COSU라고 부릅니다

기업 소유의 단일 사용 장치 NFC 범프와 같은 단일 프로비저닝 단계에서, 이제 IT 부서에서 새 기기를 설정하고 앱에 고정 할 수 있습니다 기기 소유자는 새로운 API를 사용하여 기기에서 앱을 관리 할 수 ​​있습니다 공공 장소에서 이것들을 좋아하십시오 Android 용 Work in M에서 업데이트 한 내용입니다

나는이 일과 관련된 좋은 것들이 당신을 흥분하게 만들길 바래요 우리는 그렇습니다 우리의 일은 당신의 직업을 조금 더 쉽게 만들어주는 것입니다 Android를 직장에서 더욱 맛있게 만들어줍니다 내 이름은 제시카 야

지켜봐 줘서 고마워 나는 그걸로 돌아가는 게 좋을거야 [음악 재생]