안드로이드 최적화하는 분석 콜드 시작

머리말

이틀 자신을 최적화하기 위해 시도하기 전에 차가운 시작 속도가 문제의 평균보다 낮은 제안, 특정 테스트 구름 이동 라인에 계약 이전 이벤트 만에 효과가 추구로, 매우 명확하지 않다 발견 개발자들은 약간의 자유 시간을 활용하는 것은 콜드 스타트 ​​최적화 문제에서주의 깊게 볼 수 있습니다.

앱 시작 과정

우리는 응용 프로그램을 시작하는 "응용 프로그램 시작 시간"을 설명하는 공식 문서를 볼 수 있습니다. 감기 시작, 핫 스타트, 웜 스타트로 응용 프로그램 실행. 콜드 스타트는 더 복잡한 지식을 포함 처음부터 응용 프로그램입니다. 주로 분석 및 최적화를위한 콜드 스타트 ​​응용 프로그램에이 시간 우리. 콜드 스타트에서 응용 프로그램, 당신은 다음과 같은 세 가지 작업을 수행해야합니다 :

  • 로드 및 시작 응용 프로그램;
  • 즉시 응용 프로그램이 시작 시작 후 빈 창을 보여;
  • 응용 프로그램 생성 처리 순서;

수행 할 수있는 세 가지 작업, 시스템은 응용 프로그램 프로세스를 생성 한 후, 신청 절차는 다음 단계가 될 것입니다 :

  • 응용 프로그램은 객체를 생성;
  • 주 스레드를 시작합니다;
  • 활동 시작 페이지를 생성하는 단계;
  • 보기를로드;
  • 화면 구성;
  • 초기 그리기;

초기 응용 프로그램 프로세스 매핑이 완료되면, 시스템 프로세스는 현재 표시된 페이지의 활동과 배경 화면이 시작 사용자가 응용 프로그램을 사용할 수있는이 시간을 대체 할 수 있습니다. 다음 그림을 보여줍니다 워크 플로우 시스템과 응용 프로그램.

위의 단계 우리는 응용 프로그램 프로세스가 생성, 볼 수있는 그림에서, 그것은 확실히 우리의 실행됩니다 응용 프로그램 수명주기를 응용 프로그램 프로세스가 응용 프로그램을 만들 때, 메인 스레드는 우리의 첫 페이지 MainActivity 및 초기화합니다, 실행 MainActivity를 라이프 사이클 . 나는 일부러 굵은 초점, 이것은 우리가 최적화 부분에 시작할 수 있습니다 것입니다. 분석을 최적화하는 방법, 우리가 처음보고하기 전에, 우리의 응용 프로그램은 콜드 시동을 최적화 할 필요가 없습니다.

추신 : 사실,이 우리가, 우리가 Zygote의 포크 특정 프로세스 ActivityManagerService 소스 코드를 분석하는거야 바닥에 도착하기 위해 완료해야하는 경우 우리가 표면을 볼 수있는 일을하고 있으며, 우리는 거기에 책을 추천하고,이 장에서 자세히 설명하지 않을 루오 일의 "안드로이드 시스템의 소스 코드를 시나리오 분석", 리우 왕 슈 "안드로이드 고급 암호 해독."

시작 시간 감지

그래서를 시작하는 적절한시기는 얼마입니까? 5 초 이상에 감기 시작은 안드로이드 바이탈는 콜드 스타트를 최적화와 관련된 응용 프로그램 요구 사항을 고려할 때 공식 문서에서 설명하는. 그러나 안드로이드 바이탈은 구글 플레이 품질 테스트 도구에 대한 응용 프로그램은 알리 클라우드가 제공하는, 우리 모두 나처럼,하지만 당신은 모바일 테스트의 알리 클라우드를 사용할 수 있다는 것을 알고, 데이터이며, 업종 지수 평균 콜드 시작은 4875.67입니다 적절한 MS, 우리는 비교할 수 있습니다. 음, 여기에 우리는 우리가 감기 응용 프로그램 시작 시간을 감지하는 경우에 대해 이야기.

표시 시간

표시 시간으로는, 안드로이드 4.4 (API 레벨 19)과 나중에 로그 캣 기록이 표시된 값이라는 정보는 상기 부트 프로세스가 완료 나타내고 화면에 각 활동 사이에 경과 된 드로잉 포함 된도 1에 나타내 시간의 양.

ADB 명령

 

adb shell am start -W [packageName]/[packageName.MainActivity]

로그 인쇄 스테이션을 사용하여 시간 표시 방법, 우리는 우리가 [여기서 packageName] / [packageName.MainActivity], 우리가 직접 사본을 사용할 수 있습니다 필요한 것은 다음과 다음, 로그에 표시보고, 우리는 터미널 AS에 갇혀 우리가 지정된 페이지를 시작할 시간 데이터입니다 인쇄 할 수 있습니다.

 

Status: ok
Activity: com.xx.xxx/com.xx.xxxx.welcome.view.WelcomeActivity
ThisTime: 242
TotalTime: 242
WaitTime: 288
Complete

  • ThisTime : 그것은이 활동을 호출 startActivityAndWait의 끝으로 마지막 활동 시작 시간을 호출하는 과정을 의미한다;
  • TOTALTIME : 마지막 활동 startActivityAndWait의 끝으로 첫 활동 시작 시간을 호출하는 과정을 의미한다.
  • 있는 waittime : startActivityAndWait이 방법은 시간이 많이 소요되는 전화입니다

reportFullyDrawn

특별한 장면에서, 우리는 페이지 완료 콜백 시간, 우리는 우리가 reportFullyDrawn을 사용할 수 있습니다, 시작 화면 광고 인터페이스 데이터 페이지가 완전한 성공 콜백 시간을 고려 후에도 시작할 필요 충분 그리기를 시작할 수 없습니다

 

public class WelcomeActivity extends MvpActivity<WelcomePresenter> implements WelcomeMvp.View {
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_welcome);
 // 请求数据
 mvpPresenter.config();

 }
 @Override
 public void finishRequest() {
 // 数据回调
 reportFullyDrawn();
 }
}

PS :이 방법의 minSdkVersion 필요에 API19 +는, 그래서 SDK 버전이나 판단으로 설정합니다.

Traceview

Traceview 안드로이드 장치에 대한 아주 쉬운 사용 성능 분석 도구, 그것은 프로그램의 성능을 추적하기 위해 우리가 할 수있는 세부적인 인터페이스가 될 수 있고, 분명 시간이 많이 소요의 수를보고 각 함수를 호출 할 수 있습니다.

은 Systrace

은 Systrace 매우 직관적 인 디스플레이 API에 시간이 많이 걸리는 경우 위의 각 스레드에 대한 호출 순서.

Traceview과은 Systrace는 DDMS 도구 패널,하지만 지금은 AS3.0 버전이 더 이상 권장보다 더, 그래서 학생들이 관심이 있다면, 당신은 내 이전 기사는 "부드러운 최적화의 안드로이드 응용 프로그램을 읽을 수 있습니다, 여기에 정교한 않을 것입니다 구체적으로이 두 도구의 사용을 설명했다 실제 동작 "의.

휴고

github.com/JakeWharton...

우리는 주석의 방법에 의해 소비되는 클래스 또는 함수에 해당하는 JakeWharton 휴고, 획득 시간을 사용할 수 있습니다. 우리는 세부 사항을 당겨 페이지의 활동주기를 시작하는 데 사용할 수 있습니다.

시작 최적화 실제 운영

사용자 경험 최적화

콜드 스타트에 최적화 된 경험으로 개인적으로 검은 색과 흰색 / 검은 색 첫 인상에 대해 사용자가 Caton 느리기 때문에, 시작시 주요 검은 색과 흰색 / 검은 색 화면의 제거라고 생각합니다. 우리는 그들의 목표를 달성하기 위해 시작 페이지 테마를 설정할 수 있습니다.

 

<style name="WelcomeTheme" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
 <item name="android:windowBackground">@drawable/shape_welcome</item>
 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

windowDrawsSystemBarBackgrounds 부는 열 시스템 동작이 제공된다. 이것은 레이아웃 창 배경색 뒤에;

 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
 <item android:drawable="@android:color/white"/>
 <item>
 <bitmap
 android:src="@drawable/welcome_bg"
 android:gravity="center"/>
 </item>
</layer-list>

광고는 홈페이지에 완벽한 점프를 표시하는 페이지를 시작하고 우리는 우리의 일반적인 스타일이 매니페스트 파일의 코드에서 설정할 수 있습니다 다시 설정;

 

<activity
 ···
 android:theme="@style/AppBaseFrameTheme"/>

발사 페이지의 테마를 설정하여, 그들은 신속에 사용자가 생성 시작할 수 있도록, 삭제, 앱의 화면에 아이콘을 사용자가 클릭 그리기 시작 블랙 / 흑백 될 것 "환상." 동시에 그래서 시작 페이지 및 홈 페이지 사이의 전환 자연, 거기에 애니메이션을 적용 할 수 있습니다.

응용 프로그램 시작 최적화

분석이지도에 요약되어에서, 나는 지점 응용 프로그램 라이프 사이클을 최적화하기위한 굵은 팁, 그리고 우리가 작동 다시 최적화의이 부분에 온다.

응용 프로그램 #의 attachBaseContext ()

응용 프로그램이 시작됩니다 후 attachBaseContext () ->에서 onCreate (); 우리가 무엇을 attachBaseContext에서 수명주기의 생각이 때? 예 MultiDex 하도급 메커니즘입니다. 우리는 하도급 처리 방법의 수는 65535을 초과하기 때문에 다음 확실히 우리는 검은 색과 흰색 / 검은 화면 문제가 메커니즘을 하도급하는 것은 이제 플러그 중심의 접근 방식을 사용하여 응용 프로그램의 일부 감기로 이어지는 중요한 이유는 느린 시작, 그리고, 발생 시작, 발견 할 것이다 이 방법이지만, 개발 비용이 많은 응용 프로그램에 대한 필요가 너무 높지만 MultiDex는 흑백으로 인한 문제를 방지 할 수 있습니다. 먼저 MultiDex의 컴파일 시간과 두 부분의 실행으로 나눌 수 있습니다 MultiDex의 최적화에 대한하자의 이야기 :

  • 컴파일 앱 클래스에 순서대로 전략이 덱스도 포함 덱스 최초의 메인 클래스의 수를 줄이기 위해 여러 덱스에 걸쳐 분할하는 단계;
  • 런타임 : 응용 프로그램이 시작될 때, 가상 머신이 클래스에만 주요 덱스를로드합니다. 앱 후에 다른 변형을 반사하여 dexElements 덱스 클래스 로더를로드, Multidex.install 사용을 시작;

온라인 많은 기사의 실제 분석에서, 그들은 주로 비동기 모드에서 사용. 응용 프로그램은 우리가 하청 작업을 처리 할 수있는 자유를 갖게 될 것이다, 주 덱스 패키지 이후 첫 시작을로드합니다, 우리는 주요 덱스 패키지의 좋은 점을 달성하기 위해 덱스의 주요 클래스 홈 페이지 및 필요한 라이브러리, 구성 요소 및 기타 주요 포인트를 시작합니다 크기, 표현의 특정 작업, 온라인 MultiDex 시작 최적화 문서를 참조 할 수 있지만, 우리는 주요 하위 덱스의 과정에서 점에 유의해야한다, 최적화 작업의 우리의 범위를 통해 주요 덱스 증가를 주요 덱스의 크기를 줄이고, 따라서 우리는 최적화 테스트 작업에서 좋은 작업을 수행해야하므로이 때 이상 할 수있다 NoClassDefFoundError를, 우리의 응용 프로그램을 시작하지 못했습니다 위험으로 이어질 것입니다.

응용 프로그램 #에서 onCreate ()

에서 onCreate () 수명주기 후 attachBaseContext () 후, 아마 대부분의 우리의 응용 프로그램을 여기에 타사 라이브러리 및 구성 요소의 우리의 사용을위한 작업에 초기화됩니다. 연속 반복 버전으로 인해 타사 라이브러리, 라이프 사이클을 주도 초기 작업의 큰 숫자가 너무 무겁)에서 onCreate (직접 기입 초기화, 우리는 이러한 타사 라이브러리를 분류해야한다. 여기에 우리의 직무 분류 응용 프로그램이 시작 내 마감은 다음과 같습니다

지도를 보았다, 타사 도구 및 비즈니스 로직 초기화 초기화의 다양한 시작 시간에 영향을 미칩니다. 그들이 네 부분으로 분할하자.

  • 당신은에서 onCreate (될) 및 주요 프로세스 초기화에 있어야합니다
  • 그것은 지연 될 수 있지만 필요는 응용 프로그램에서 초기화 할
  • 초기화 콜백은 라이프 사이클의 시작 페이지까지 지연 될 수 있습니다
  • 재 초기화하는 시간 지연

우리는 먼저 나열 자신의 프로젝트에 따라하는 것은 자신에게 모든 프로젝트를 초기화 할 수있는 다음 분류. 내가 여기에 특정 작업 코드를 게시하지 않은 있지만, 나는 새 스레드를 생각하거나 말을 너무 쉽게 IntentService를 만들 수 없습니다, 그러나 여기에서 전체 감기의 최적화가 시작 것들 그가 밟은 때문에 여기에 주목해야 할 필요가 없습니다 구덩이. 예를 들어, GrowingIO은 GIO의 아주 오래된 버전을 사용하여 프로젝트, GIO 다음 자식 스레드 작업에서 초기화 될 때, 전에 갑자기 운영 부서 승 느낌의 컴파일 및 실행 한 후 GIO를, 업그레이드 버전의 요구를 SDK, 계약 새 버전의 데이터에 동그라미를하지 않았다 후 검사가 GIO의 새 버전이 자식 스레드에서 초기화되지 계시 후 아무것도 라인에 직접 포장, 운영 피드백을 할 수 없습니다. 이 과정에서 학생들은 당신이 감기 시작을 최적화에 관심이 있기 때문에, 몇 복사 및 특정 조건에있는 코드를 붙여 확실히 나쁘지 않다 생각합니다. 날 요약 보자 초점을

  • 더 뇌 열린 스레드하지 않습니다, 천천히 시작하고 빈에 코드를 연결, 당신은 바로 약을 필요로;
  • 열기 스레드는 과학, 스레드가있는 ThreadPoolExecutor는, AsyncTask를, IntentService가 정확히 무엇을 선택입니다;
  • 당신에게 좋은 새 스레드를 가정하지만, 단지 파고 동안 구덩이를 기입하지, 좋은 메모리 누수를 고려하지 않았다;
  • SDK는 메인 스레드에서 초기화 할 필요가 일부 타사합니다;
  • 응용 프로그램이 멀티 프로세스가 인식하는 경우 일부 타사 SDK, 당신은 이름이 같은 과정을 패키지에 초기화 할 필요가;
  • 사실, 코드의 반복 버전의 년 그 이전 코드를 마무리하지 후, 코드 분류 및 요구 사항을 구성하는 데 쓸모가 많은 프로젝트가있다;

활동 시작 페이지 최적화

  1. 우리는 컨트롤,지도 컨트롤 시작 화면 광고, 비디오 광고 시작 화면 제어, 처음으로 설치를 위해 도입 된지도 컨트롤을 그리기 시작 포함 페이지 레이아웃 최적화 작업을 시작합니다. 레이아웃 최적화를 위해, 이외에 다른 응용 프로그램 제어를 시작할 때, 우리는 ViewStub을 사용하여 초기화 할 수 없습니다, 컨트롤을 그리기 시작합니다. 특정 비즈니스 시나리오의 경우, 지정된 컨트롤을 초기화합니다.
  2. I을 피 / O 작업을 우리가 I / O 작업이 같은 데이터베이스를 읽기 및 쓰기로 실시간 아니라는 것을 알고, 된 SharedPreferences 번호 적용 (). 우리는이 작업을 수행하기 위해 메인 스레드를 차단하지 않은 점에 유의해야하고, 우리는 우리가 제대로없는 디스크 읽기 및 쓰기가없는 시작했을 때 감지 할 수 있습니다 StrictMode 엄격 모드, 활용할 수 있습니다.
  3. 참고 사진 비트 맵 로딩 속도와 우리가 알 수있는 형식을 인코딩, 대부분의 경우 페이지가 사진을 표시 시작, 그럼 어떻게 우리는 그것을이 점에서 사진을 세부 사항을 당겨, 그리고 타사 이미지의 다양한 라이브러리를로드 할 수있는 선택을 할 글라이드, 피카소, 프레스코 등이 PREFER_ARGB_8888는 PREFER_RGB_565 선택의 문제, 우리는 자신의 프로젝트의 경우를 선택할 수있다.
  4. 벡터 그래픽 VectorDrawable 객체를 사용하여 벡터의 핵심은 공간에 저장, 시간을 절약하는 것입니다. 일부 사용자의 경우, 그림을 그리기 시작되지 않을 수 있습니다, 그냥 로고, 우리가 벡터 그래픽의 사용을 고려할 수있는이 시간, 매우 간단합니다.
  5. 콜백 시작 라이프 사이클 우리의 응용 프로그램 #에서 onCreate () 최적화, 매우 필요하지 특정 네트워크 요청에서 활동하고 시작 페이지로 이동하지만, 우리가 직접 직접 시작 페이지로 복사 네트워크 요청을 작동 할 수 있습니다 에서 onCreate ()가, 우리가 능숙 이것이 당신이 콜백을 초기화 컨트롤 모든 사실, 활동주기 활동 번호가 onWindowFocusChanged (부울 hasFocus)를 사용할 수 있습니다, 우리는 물론, 우리는 또한 서비스를 사용할 수 있습니다, 여기에 네트워크에서 작동 할 수 있습니다.

최적화 요약 콜드 시작

복사 레이아웃 최적화 루틴이 너무입니다 달리 차가운 시작을 최적화하기 위해, 우리는 너무 많은 시간이 용어 병목 병목 현상이 공식 문서에 표시 단계 분석에 의해 단계를 이동해야하는 수준없는 땅, 우리가해야합니다 콜드 스타트를 최적화하는 우리의 방법을 설명합니다 안드로이드 스튜디오의 CPU 프로파일을 잘 활용 Traceview과은 Systrace하지만이 온라인을 요약 많은이 업그레이드 AS3.0 버전에서 삭제 되었기 때문에, 우리는 지상의 측면을 반영 할, (우리는 세부 사항이 기능의 사용 분석 할 수있는 기회를 가질 수) 하지 누군가 다른 사람의 번역 분석을 통해, 변화를 생각하는 첫 안드로이드 각도, 공식 문서를 참조하십시오. 마지막으로, 우리는 오늘날의 안드로이드 시장에서 경쟁력이 무엇인지 서로를 격려, 경쟁 제품과 달리 승리하는 방법, 우리는 또한 완벽하게 할 수있는 잘 세부의 한 단계에 의해 단계가 필요합니다.

비중이 좋은 환영의 관심을 느낄 수 있다는 것입니다, 후자는 안드로이드 기술과 첨단 정보 및 기타 건조 상품을 공유하는 계속

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

추천

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