안드로이드 개발 성능 최적화 사례 (2) 응용 프로그램 Caton 최적화

머리말

기사의이 시리즈의 성능 최적화 :
1, 설명의 방법으로 이해하기 쉽게, 기술의 실제 값 설명
이 상세한로 작성된 소스 추적, 소스 캡처, 구조 그리기 클래스를 구체적으로 탐구 과정의 원리를 설명하려고
(3) 실행할 수있는 데모 Github에서 프로젝트를 제공하지만, 더 많은 아이디어, 더 좋은 아이디어를 제공하는 코드를 제공하고, 제발 이력서 적절한,
4, 또는 데모의 일부 구덩이를 탐험하는 과정의 동작 원리시주의 사항 세트를 마무리
5, GIF를 사용하여도는 가장 직관적 인 운영 결과는 ** 데모 보여

당신이 세부 사항이 너무 얇은 생각한다면, 당신은 결론을보고 건너 뛸 수 있습니다.
설명은 부적절 발견해야 제한 용량, 메시지 비판을 환영합니다.

 

기사에 연결 : 속도 최적화를 시작합니다

바디 개요

  • DDMS
  • 은 Systrace
  • TraceView
  • 오버 드로 소개

본문

DDMS

DDMS는 달빅 디버그 모니터 서비스, 안드로이드 개발 환경 달빅 [가상 머신] 디버그 모니터 서비스를 의미합니다

이전에 사용 eclipse거기 DDMS를 열고 직접 입장이지만, 안드로이드 스튜디오를 사용하기 때문에, 입구는하지 않았다 ....하지만 실제로 SDK 디렉토리는 여전히 존재 안에, 시간을.

오프닝 DDMS 후 :

특히 나중에 말을 어둡게.

은 Systrace

은 Systrace은 명령 SDK를, 그리고 그것은 단지 파이썬 2.7을 현재 사용은 Systrace 명령에, 리드 우리를 python2.7를 사용했는데, 파이썬으로 작성, 나중에 3.0 구글이 명령을 업데이트하지 않았습니다 파이썬 업데이트됩니다 버전, 라인, 공식 웹 사이트 다운로드에 2.7.16의 최신 2.7 버전으로 정상적인 상황 아래.

어디은 Systrace 명령?

전제

우선 우리가 제대로 파이썬 명령을 사용할 수있을 때까지 (환경 변수를 설정 한 후 좋은의 python2.7.16를 설치하려면,이 기능을 사용하려면

은 Systrace는 일정 기간 동안 안드로이드 장치에 인덱스 데이터에 대한 크롤러, 나는대로 이해 : 장비 운영 로그, 그러나 이것은 텍스트 로그 아니지만, HTML 파일, 당신은 구글의 브라우저 사용할 필요가  크롬 : // 추적 / 플러그인가 열립니다. : 특정 단계는 다음입니다
은 Systrace 디렉토리를 입력 1. CMD :

입력합니다  python systrace.py -b 32768 -t 5 -o mytrace.html wm gfx input view sched freq, 다음 Enter
명령의 캐릭터를 설명하기 위해 本文不做systrace命令的详解,这些东西都是死命令,百度即可()

  • python 파이썬 스크립트가 실행되는
  • systrace.py 각본 명칭
  • -b 버퍼 크기를 설정
  • -t 크롤링 오초 로그
  • -o 이 내 파일에 mytrace.html 출력
  • wm 창 관리자 내에서 로그 정보 창 관리자를 포함
  • gfx 그래픽 로그 렌더링 정보 그래픽을 포함
  • input 입력 로그 정보 입력 장치를 포함
  • view 보기 로그 정보 시스템보기 시스템에 포함
  • sched CPU 스케줄링 정보를 예약하는 것은 CPU 로그를 포함
  • freq CPU 주파수의 로그 정보가 포함되어 있습니다

여기에 구덩이입니다 :

진짜 시스템에서, 예를 들면 vivo X7, 그것은 생성 html파일이 어떻게 든, 실패, 나는 잘 시뮬레이터를 변경, 아직 실제 기계는 다른 모델을 테스트.

NetEase는 내가, 나는 다음과 같은 결과를 얻을 실험 시뮬레이터를 사용 mumu :

 

3. 파일을 획득 한 후, 구글 브라우저를 엽니 주소 표시 줄에  chrome://tracing/ 다음 바로로드) 파일 당신 :( 또는 HTML 파일을 두 번 클릭

우리는 CPU, 멀티 코어 CPU 스케줄링 상황, UI 메인 스레드, 스레드 렌더링 등의 빨간색 표시 글꼴 사용 위의 이미지를 포함하여 성과 지표를 많이 얻을 수 있지만, 우리는 큰 문제를 해결하기 위해 응용 프로그램 계층을 개발 4, 응용 프로그램 Caton입니다 일반적으로 단지에 초점을 맞출 필요가  메인 UI 스레드掉帧情况 다음 그림에 따라 할 수 있습니다 :

이것 좀 봐 상세한 带圈的F:

  • 전체 좌표, 가로축은 시간이고, 시간이 지남에 따라 표시 대신에, 왼쪽에서 오른쪽으로 시간 스케일 증가
  • 带圈的F : 녹색, 노란색과 빨간색. 녹색 정상 무승부를 나타내는 경우, 우리가 관리 할 필요가 없습니다, 관심은 노란색과 빨간색, 특히 빨간색입니다.
  • 마우스는 빨간색 F를 클릭 한 다음 키보드를 눌러 G키를있을 것입니다 红色的竖线긴 상호간의 빨간색 선 대표 (휴대 전화의 화면 재생 빈도의 대부분에 대한 각 도면, 그래서 아직 60 16.67MS이 F) 이것은 UI가 기간 내에 완료 할 수없는 경우 긴 그려진 UI가 훨씬 더 하나보다 떨어졌다 프레임을 초래할 것이기 때문에 이유는, 빨간색, 한 번 사용자의 인식에서, 드롭 된 프레임이다 Caton .
  • 봐 :

.

드래그 앤 드롭으로 마우스를 사용, 당신은 그것을 그리는 데 걸리는 시간이있는 그래픽 인터페이스를 통해 볼 수에116.868ms

  • 다음과 같은 경고 열에서 의심 발견 掉帧범인을

 

여기에 우리의 반영 bitmap프레임 떨어져 주도 업로드 된보기를.
우리는 다음 두 개의 화살표를 계속 확장, 당신은 볼 수 있습니다 :

여기에 영어 설명, 내가 아마이 구절을 번역 우리에게 조언을 제공하는 구글 엔지니어이다 :

제 단락 description수단 :修改/新绘制的位图必须上传到GPU。因为如果上传的总像素量很大,这是很昂贵的,所以每帧减少这个动画/上下文中位图的波动量。

둘째 단락 description수단 :生成这个帧的工作被重新调度了几毫秒,这是jank的功劳。确保UI线程上的代码不会阻塞其他线程上的工作,并且后台线程(例如网络或位图加载)在android.os上运行。进程#THREAD_PRIORITY_BACKGROUND或更低,因此它们不太可能中断UI线程。这些后台线程应该在内核进程的调度部分以130或更高的优先级出现。

일반적으로,입니다 Bitmap的使用不当导致掉帧,이 솔루션은 아마도 : 너무 큰 비트 맵 부하에 적당한 크기 또는 백그라운드 스레드로 컷으로
보다 구체적인 경우 다른 솔루션을 드롭 된 프레임에 관해서는, 특정의 만남에 따라 사건을 조사 할 필요가있다 데이터.

Trace.beginSection 및 Trace.endSection 소개

이 API는 androidSdk이 역할은 Systrace 플러스 태그이며,이다와 함께 온다, 태그를 추가, 그것은 구현이은 Systrace 그래픽 코드의 우리 두 API를 조각 사이에 포함되어 반영됩니다.
간단하게이 같은 Trace.beginSection 및 Trace.endSection, 코드 조각 주위 플러스 넣어 :

그래서, 당신은 Systrace 그래픽에이를 찾을 수 있습니다.

가시은 시간이 많이 소요되는 등 우리의 코드의 구현에 반영 될 수 systrace는있을 것, 지역 위의 빨간색 상자를 클릭, 그래픽 systrace화면의 하단에서 발견 :

당신이 태그 코드 실행이 긴 (16.67MS)보다 더 걸리는 추가 한 다음 프레임에서 메인 UI 스레드를 발생하는 코드의 조각, 사용자는 가능성이 Caton을 느낄 것입니다.

여기에 구덩이입니다

당신이 trace.beginSection 및 ENDSECTION의 상단에 추가하는 경우, 당신은 여전히, 다음은 Systrace 명령을 확인, 자신의 최대 그래픽 태그 세트에 표시하지 않는 더 -a [응용 프로그램 패키지 이름]을 증가하지 않습니다

결론 수

위의 예, 그래서 여기에, 콜드 스타트은 Systrace을 잡은 문제의 코드를 작성 감기 시작의 반사로, 드롭 된 프레임 응용 프로그램을 사용합니다. 은 Systrace이 시작된 후 다음 응용 프로그램을 작동해야합니다, 너무 오래 그 횡령은 Systrace 시간을합니다.

문제를 완전히 해결되지는 않았지만 떨어 프레임의 발견 후, 찾고 경고는, 구글이 우리의 응용 프로그램에 최적화 제안의 방향을 제시 볼 수 있지만 적어도 결정하는 기본 방향을 아마 어떤 질문 중 코드의 조각을 알고,.


TraceView

코드 앱에 추가  Debug.startMethodTracing("/sdCard/zhouzhou");하고, Debug.stopMethodTracing();위의 코드는 두 개의 코드가 구현되도록하기 위해 수행 할 수 있습니다, 다음 응용 프로그램을 실행합니다. 예를 들어,이 같은 :

분화구

당신이 직접 던져 후 예외를 실행을 추가하면 위의 코드는, 당신이 추가 할 수있는 권한이 없습니다 있는지 확인하십시오 :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

다음으로, 컴퓨터에 내 보낸 파일을 찾을 수 :

그리고 우리가 처음 우리가 처음 DDMS를 열고 DDMS를 사용한다고 말했다, 파일 - openFile은 .trace입니다 파일을 엽니 다

이것은 모든 메소드 호출이 코드가 포함되어 있습니다.

표 쇼

테이블 상단은 다음과 같이 각 항목에 대한 설명은,있다 :

우리는 모두 해당 할 수없는 많은 일들이, 두에 초점을 맞출 필요가있다 :

  • Cpu Time/Call 긴 평균 시간 함수 실행 함수 (긴 함수)
  • Call+Recur Calls/Total통화의 수를 매우 자주하는 기능.

당신은 위의 두 가지 지표 특별한이, 특히 통화의 수, 각 통화 후 기본적으로는 최적의 포인트를 확인할 수 있습니다, 우리 자신의 방법을 쓸 수 또한 특히 시간이 오래 걸립니다, 그리고 것을 발견합니다.

오버 드로 소개

개념 :如果屏幕的一片区域,在渲染的过程中,被绘制了太多次,则称为过度绘制 .
확인하는 방법 :

그림은 mumu 에뮬레이터 설정 인터페이스, 우리가 클릭 显示过度绘制区域하면 인터페이스를 찾을 수 있습니다, 색상을 변경했습니다 :

색상 얕은에서 깊은로, 깊은, 드로잉 전이가 더 심각한 것이다. 일반적으로 다음과 같은 색상을 가지고 :

  1. 화이트 : 없음 오버 드로.
  2. 블루 : 오버 드로는 두 배. 픽셀은 받아 두 번 그려하지만 전체 인터페이스가 파란색 경우, 다음 쇼는 여전히 하나 무승부를 저장할 수 있습니다 낭비가 그려집니다.
  3. 녹색 : 오버 드로를 두 번 누릅니다. 최적화하려고합니다.
  4. 표시등이 빨간색 : 초과 인출을 세 번.
  5. 다크 : 오버 드로 네 번. 매우 심각하고 최적화해야합니다.

어떻게 전환이 그려 최적화?

  1. 경우 복잡한 레이아웃 디스플레이 오버 드로 많은 수의 과도한 무승부를 확인하고 발견하여 코드, 그것은 고려되어야한다  用自定义View自己去绘制.
  2. 레이아웃 XML 경우, 중첩이 많이있다 생각 去掉某些 background 에는 배경이 없기 때문에, UI 스레드 그릴이 시간을하지 않을 것이다,
  3. 당신이 레이아웃이 배경을 사용해야하는 경우 비즈니스 요구를 충족하면서 다음을 고려 减少一定的层级.

발문

위의 세 가지 도구를 사용해야합니다 우리의 응용 프로그램의 성능 최적화를 사용하여. 다음과 같이 아마 생각은

.html 중에서 파일, 그래픽 관찰을 잡고 1은 Systrace 프레임의 대략적인 위치를 알아내는
2. Trace.beginSection 및 Trace.endSection 정확한 코드 블록 결정, 추정을 반복
열린 DDMS 3. traceView 잡고 .trace입니다 로그를 떨어 프레임의 정확한 원인을 확인하기 위해 매우 긴 시간이 소요되는 기능 또는 주파수의 함수를 찾고

세 가지 도구가 잘못 갔다 구체적으로 무엇을 우리의 응용 프로그램을 결정하기 위해 함께 사용되어야합니다.

주제를 확장

이 문서는 일반적인 아이디어를 제공하기 때문에 잠재적 인 성능 최적화를 너무 자주하는 데모를주지 않았다, 우리는 결과를 자신의 도구가 감지 이동 한 후에 만 ​​일어날 무슨 일이 있었는지 구체적를 표시 할 수 없습니다 추론, 해결하기 위해 입증한다.

성능 최적화는 끝이 항상 최적화 공간에 있습니다. 이 문서는 특히 최적화에 어느 정도에 불과 대략적인 방향을 제공, 모두 자기 수리를 위해 당신에 따라 달라집니다.

성능 최적화를 위해 사용하지만, 자신의 역할뿐만 아니라 성능을 최적화하는 것입니다 수있는 위의 세 가지 도구는 나무를 볼 수 없습니다. 예를 들어,은 Systrace를 들어이 일, 난 단지 Caton 프레임을 떨어 위의 문서 상황을 확인하는 데 사용하지만, 실제로는 멀티 코어 할당의 CPU 및 CPU 스케줄링을 볼 수 있습니다, 스레드는 스위치 등의 메인 쓰레드의 상태를 확인할 수 있습니다.

다음 :内存抖动和泄漏的优化

게시 56 개 원래 기사 · 원 찬양 한 · 전망 2919

추천

출처blog.csdn.net/chuhe1989/article/details/104478146