안드로이드 성능 최적화 사례 (1) 시작 속도 최적화

머리말

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

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

 

뇌관

애플리케이션 성능 최적화, 모든 개발자는 높은 수준의 기술을 가지고 있어야합니다,하지만 지금은 기록되지 않습니다 대부분의 경우에서 네트워크 성능 최적화 기사 및 대한 지식 소개, 사람들은 학습을 시작할 수 없습니다이 기술을 이해할 필요가 있도록. 기사의이 시리즈는 처음 사건을 설명하고 당신이 효과를 볼 수 있도록 한 다음 작동하는 그래서, 세부 사항을 설명합니다. 내가 도와주고 싶어요.

경우

애플리케이션 성능 최적화, 자연적으로 어떻게 이러한 문제를 진단하는 최적화, 이전에 문제가 있나요? 자연적인 방법이있다.

Q : 어떻게 우리가 우리 자신의 응용 프로그램은이 소요 된 시간 시작하는 것이 알 수 있습니까?
A : ADB 명령. 다음 단계 :

  • 장치가 컴퓨터에 접속되었는지 확인;
  • 시작 cmd를 창
  • 다음을 입력합니다 adb shell am start -W [app包名]/[launcherActivity的全类名]
    android29 시뮬레이터에 대한 결과는 다음과 같습니다

실제 기계를 생체 내, 결과는 다음과 같습니다

여기에 세 시간이 될 것입니다 :

thisTime: 오전 시작 명령은 여러 활동을 시작할 수 있습니다 여러 시작하면 시작이 하나, 다음 thisTime 동일한 TOTALTIME 경우, thisTime 마지막 작업의 시작 시간을 의미합니다.

TotalTime: 새로운 활동 응용 프로그램 시작 시간이 많이 소요.

WaitTime: 다음 AMS의 현재 활동 onResume onPause에서 변화, 그리고있는 waittime 너무 이상 TOTALTIME보다는 TOTALTIME 포함을 포함, 새 응용 프로그램 활동 총 시간을 시작합니다.

물론, 당신은 또한 -R (10) -S는, 연속 10 회를 시작 추가 한 다음 자신의 시작의 평균 지속 시간을 계산할 수 있습니다.

adb shell am start -S -R 10 -W packagename/.MainActivity

여기에 세 번, 우리는 아마 그들이 그것을 소요 된 시간 특정 응용 프로그램을 시작하는 것을 볼 수 있습니다. 육안하지만 특정 정확한 수치 값, 또는 명령 라인을 사용할 필요가 얻어 평상시. 당신이 그런 극단적 인 경우 같은 시간이 소요가 좋지 않은 응용 프로그램의 시작을 찾을 경우 문제는, 우리는 활동에서 onCreate에 약간의 시간이 소요되는 작업을 추가

또는 당신은 onResume에 시간이 많이 걸리는 작업에 넣어 :

그런 다음 :

여기 전체 4000MS이 느려지 며 시작 시간입니다.

이는 아날로그 I UI 스레드 시간 소모적 동작을 수행하는 극단적 인 경우를 초과. 실제 프로젝트에서, 이러한 시간이 많이 걸리는 작업 활동 시작 시간의 일부 복잡한, 시간이 어떻게 처리해야되는 속도를 느리게 할 수있다?
네 가지 범주로 두 가지 차원의 모든 시작 작업 :
必要예를 들어, 우리의 실행은 WelcomeActivity은 자동으로 종료됩니다,이며, 사전에 어떤 매개 변수 이러한 매개 변수의 다음 인수를 얻기 위해 필요한 MainActivity 필요가있는 경우 그 다음 하나는 MainActivity이며, 작업은 필수 작업입니다.
耗时: 시간의 길이는 대략 나누어 섭취하는 것처럼, 아니 시간이 소요되는, 보통 계산이 주 스레드에서 신속하게 낭비하지 않은 너무 많은 시간을 수행 할 수 있습니다 추적. 시간이 많이 소요, 일반적으로 타사 SDK 초기화 또는 네트워크 요청을 수행합니다.

이 네 가지 치료했다 :

  • 필요하고 시간이 많이 소요되는
    이 타사 SDK 초기화, 예를 들어 Tinker, 시작 페이지,이 필수인지 여부를 합병 패치 알아야합니다, 그리고 시간이 많이 걸리는, 또는 오로라 푸시 SDK 초기화. 이 사용하는 것과 비슷 异步线程처리하는 스레드 풀은 시간이 많이 소요 될 것입니다 초기화되지 새 스레드의 Runnable으로 수행 할 수 있기 때문에, 여기에, 오히려 스레드 풀과 내부에 시작 활동보다, 직접 새로운 스레드를 수행하는 것이 좋습니다.
    비동기 실행을 장점은 UI 스레드에서 지연을 가져올 사용자에게 더 나은 경험의 시작 페이지를 제공하는 시간이 아니다.
  • 아니 시간이 소요되는 필요 없음
    이, 또는에서 onCreate onResume 어쨌든 내부.
  • 불필요한 소모없이
    이 필요하지만,하지에 대해 우리는 절약 저장, 시작 시간, 더 잘 수행이 활동을 시작 참을 만, 여전히 새로운 Thread로 갈 수있는, 시간이 많이 소요.
  • 불필요한 시간이 많이 소요
    예를 들어, 데이터가 SDK 초기화를보고, 당신은 초기화해야한다는 요구하지 않는 다음 작업이 완료됩니다. 시작 활동에 넣지 마십시오. 직접 이동하는 최초의 초기화 코드에 의해보고 된 데이터에.

또한, 엄지 손가락의 규칙 : 필요한 시간이 많이 걸리는 수가 실행하지만, 페이지 활동도 오랫동안 남아있을 것입니다 시작하는 직접 스레드와 매우 큰 경우,이 시간은 모든 작업에 대한 구별 하나가 될 수 있습니다, 작업을 轻重缓急하는 중요한 임무를 완료, 그 후, 우리는 중요하지 않은 작업의 결과를 기다리지 않고, 다음 활동으로 이동합니다. (이 아이디어에 따르면, 나는 차례의 목소리를하지 않습니다, 당신이 당신의 자신의 갱스터 구현 코드를 작성할 수 있다고 생각합니다).


마지막으로 어떤 경우는 응용 프로그램을 시작으로, 중요한있을 것이다, 언급 白屏다시 우리는 UI 레이아웃을 쓰기. AMS의 우리의 활동의 시작 시간에, 먼저 기본 흰색 창을 표시하기 때문입니다, 우리는 응용 프로그램 자체가 걸리는 시작하는 경우 때문에 다시 우리는 너무 검정색과 흰색의 긴 경험을 결과 너무 한, UI 레이아웃 쓰기 그것은 매우 나쁘다. 이 두 가지 솔루션이 있습니다 :

1, 테마 활동 세트, 투명 배경 색상.

 

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
</style>

2, 테마의 활동을 사진으로 설정하지만, 가장 배경 시작 페이지와 일치하고, 페이지를 시작하거나 실제의 UI의 경우에 더 갑작스러운 것이다.

 

<style name="splash" parent="AppTheme.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splash</item>
        <item name="android:windowFullscreen">true</item>
</style>


발문

시작 속도 최적화, 그것은 우리의 응용 프로그램의 사용자 경험에 직접 업그레이드를 할 것, 첫 번째 문에 최적화 된 응용 프로그램의 경험이다. 그러나, 정말 우리는 단순한보다 훨씬 더 많은 일을 할 수 있습니다. 예를 들어 시작 페이지 UI가 더 복잡한 경우도, 나쁜 경험도 Caton을 시간 리드를 취하는 UI에 그리기, 그러나 이것은 UI 호감 요구, 우리는 국가를 변경할 수 없습니다? 추첨에 스스로를 방어하기 위해 몇 가지 최적화를 수행합니다. 자세한 기사 다음 세트.

 

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

추천

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