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로 귀하의 코드베이스를 우리의 대화에 참석해 주셔서 대단히 감사합니다 [박수 갈채] [음악 재생]