안 드 로 이 드(Android)개발 의 통계 앱 시작 시간

머리말
Android 개발 자로 서 작 동 속도 최적화 와 관련 된 일 을 많이 접 하지 않 을 것 입 니 다.사용자 가 많아 지면 제품 의 기능 도 점점 많아 지고 앱 이 비대 해 지 는 것 은 흔히 볼 수 있 는 현상 입 니 다.심지어 피 할 수 없 는 현상 이 라 고 할 수 있 습 니 다.이에 따 른 작업 은 바로 앱 성능 을 최적화 하 는 것 입 니 다.그 중에서 가장 중요 한 것 은 시동 속도 최적화 이다.그러나 본 논문 의 주인공 은 작 동 속도 최적화 가 아니 라 작 동 시간 통계 이다.
시작 형식
일 을 잘 하려 면 반드시 그 그릇 을 먼저 이 롭 게 해 야 한다.앱 의 시작 속 도 를 최적화 하려 면 시작 시간 을 정확하게 평가 하 는 방법 이 있어 야 한다.그렇지 않 으 면 최적화 가 끝 난 후에 효과 가 어떤 지 자신 도 모 르 고 다른 사람 도 믿 지 않 는 다.앱 시작 시간 통 계 를 하기 전에 어떤 시작 유형,모든 시작 유형의 특징 이 있 는 지 알 아야 합 니 다.일반적으로 안 드 로 이 드 에서 사용 하 는 시작 방식 은 다음 과 같은 몇 가지 로 나 뉜 다.
1.콜 드 시작:프로그램 을 시작 할 때 배경 에 응용 프로 세 스 가 없습니다.이 때 시스템 은 새로운 프로 세 스 를 다시 만 들 고 이 프로그램 에 할당 합 니 다.이 시작 방식 은 콜 드 시작 입 니 다.콜 드 시작 은 시스템 이 새로운 프로 세 스 를 다시 만 들 기 때문에 먼저Application 클래스 를 만 들 고 초기 화MainActivity 클래스 를 만 들 고 초기 화Application 클래스 를 만 들 고 마지막 으로 인터페이스 에 표 시 됩 니 다.
2.열 시작:프로그램 을 시작 할 때 배경 에 이 프로 세 스 가 있 습 니 다(예:back 키,home 키 를 누 르 면 프로그램 이 종 료 됩 니 다.그러나 이 프로 세 스 는 배경 에 남아 있 고 작업 목록 에 들 어가 볼 수 있 습 니 다).따라서 기 존 프로 세 스 의 경우 기 존 프로 세 스 에서 시작 합 니 다.이 방식 을 열 시작 이 라 고 합 니 다.열 시작 은 기 존 프로 세 스에 서 시작 되 기 때문에 열 시작 은MainActivity이 단 계 를 걷 지 않 고Application바로 갑 니 다.따라서 열 시작 과정 은 만 들 거나 초기 화 할 필요 가 없습니다Application .새로운 프로 세 스 의 생 성에 서 프로 세 스 의 소각 에 이 르 기 까지WaitTime 한 번 만 초기 화 됩 니 다.
3.첫 번 째 시작:첫 번 째 시작 은 엄 밀 히 말 하면 콜 드 시작 입 니 다.첫 번 째 시작 을 따로 열거 하 는 이 유 는 일반적으로 첫 번 째 시작 시간 이 첫 번 째 시작 이 아 닌 것 보다 오래 걸 리 고 첫 번 째 시작 은 캐 시 디 렉 터 리 의 생산,데이터 베이스 의 구축,Shared Preference 의 초기 화 등 시스템 초기 화 작업 을 합 니 다.만약 에 다 dex 와 플러그 인 이 존재 한다 면첫 번 째 시작 은 처리 해 야 할 논리 가 있 고 시작 속도 에 큰 영향 을 미 치기 때문에 첫 번 째 시작 속 도 는 매우 중요 합 니 다.사용자 가 App 에 대한 첫 번 째 이미지 에 영향 을 주기 때 문 입 니 다.
2.로 컬 시작 시간의 통계 방식
로 컬 디 버 깅 이 라면 시작 시간 을 집계 하 는 것 은 간단 합 니 다.명령 행 방식 을 통 해 가능 합 니 다.

adb shell am start -w packagename/activity
출력 결 과 는 다음 과 같 습 니 다:

$ adb shell am start -W com.speed.test/com.speed.test.HomeActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.speed.test/.HomeActivity }
Status: ok
Activity: com.speed.test/.HomeActivity
ThisTime: 496
TotalTime: 496
WaitTime: 503
Complete
startActivity Activity pause에서 응용 첫 번 째 프레임 까지 이 시간 을 완전히 표시 합 니 다.바로 전체적인 시간 입 니 다.이전 응용ThisTime 의 시간 과 새로운 응용 이 시작 되 는 시간 을 포함 합 니 다.Activity 일련의 시작Activity 의 마지막TotalTime 의 시작 시간 을 나타 낸다.Activity 새 애플 리 케 이 션 이 시작 되 는 데 걸 리 는 시간 은 새 프로 세 스 의 시작 과Activity 의 시작 을 포함 하지만 이전 애플 리 케 이 션Launcher pause 의 시간 은 포함 되 지 않 습 니 다.
개발 자 들 은 보통 Total Time 에 관심 을 가지 면 됩 니 다.이 시간 이 야 말로 자신 이 진정 으로 시작 하 는 데 걸 리 는 시간 입 니 다.
3.온라인 가동 시간의 통계 방식
앱 이 온라인 에 올 라 오 면 앱 이 사용자 휴대 전화 에서 작 동 하 는 속 도 를 집계 하려 면 명령 행 을 통 해 집계 할 수 없 으 며 기본적으로 로그 로 작 동 시간 을 전송 한다.그러면 어떤 위치 에 시작 시간 통 계 를 추가 하 는 로그 가 특히 중요 하 다.로그 에 추 가 된 위 치 는 시작 시간 통계 의 정확 여 부 를 직접적 으로 결정 하고 시작 속도 최적화 효과 에 대한 판단 에 도 영향 을 줄 수 있다.시작 시간 을 정확하게 기록 할 수 있 는 로 그 를 찾 으 려 면 애플 리 케 이 션 의 시작 절차 와 각 라 이 프 사이클 함수 의 호출 순 서 를 알 아야 합 니 다.어떤 위치 에서 로그 기록 을 시작 하 는 시간 이 적당 한 지 분석 해 보 겠 습 니 다.
응용 주요 시작 프로 세 스
App 시작 프로 세 스에 관 한 글 이 많 습 니 다.글 밑 에 시작 프로 세 스 와 관련 된 참고 글 이 있 습 니 다.여 기 는 다음 과 같은 절차 만 보 여 줍 니 다.
    1.Launcher 을 통 해 응용 프로그램 을 시작 할 때 응용 아이콘 을 클릭 한 후startActivity 호출Launcher Activity 을 통 해 응용 프로그램 을 시작 합 니 다.
    2.Instrumentation 최종 호출execStartActivity Instrumentation 을 사용 하여 응용 을 시작 합 니 다.
    3.ActivityManagerProxy 호출startActivity (Activity Manager Service 가 응용 프로 세 스 의 프 록 시 대상)대상Activity방법 으로 시작Launcher .
    4.지금까지 모든 과정 이ActivityManagerProxy 프로 세 스 에서 실 행 됐 습 니 다.그 다음ActivityManagerService 대상 의 크로스 프로 세 스 호출startActivity (system 에서 실 행 됩 니 다.server 프로 세 스)의ActivityManagerService 방법 으로 프로그램 을 시작 합 니 다.
    5.startActivity zygoteSendArgsAndGetResult 방법 은 일련의 호출 을 거 쳐 마지막 으로 호출socket zygote 을 통 해zygote 프로 세 스 에 보 내 고ActivityThread 프로 세 스 는 새로운 응용 프로 세 스 를 부화 시 킬 것 이다.
    6.zygote 프로 세 스 가 새로운 응용 프로 세 스 를 부화 시 킨 후에main 류 의Looper 방법 을 실행 합 니 다.이 방법 에 서 는 먼저attach 와 메시지 대기 열 을 준비 한 다음ActivityManagerService방법 으로 응용 프로 세 스 를loop 에 연결 한 다음ActivityManagerService 순환 에 들 어가 메시지 대기 열 에 있 는 메 시 지 를 계속 읽 고 메 시 지 를 보 냅 니 다.
    7.ActivityManagerService 응용 프로 세 스 의 프 록 시 대상 을 저장 한 다음Activity 프 록 시 대상 을 통 해 응용 프로 세 스 가 입구Launcher 를 만 드 는 인 스 턴 스 를 알 리 고 수명 주기 함 수 를 실행 합 니 다.
요약 과정 은 사용자 가ActivityManagerService 프로그램 에서 아이콘 을 클릭 할 때Activity응용 프로그램 을 시작 하 는 입구ActivityManagerService 를 알려 줍 니 다.Zygote 이 응용 프로그램 이 아직 시작 되 지 않 은 것 을 발견 하면ActivityThread 프로 세 스 가 응용 프로 세 스 를 부화 시 킨 다음 에 이 프로 세 스 에서 실행main 하 는ActivityManagerService 방법 을 알려 줍 니 다.응용 프로 세 스 다음 알림ActivityManagerService 응용 프로 세 스 가 시작 되 었 습 니 다.ActivityManagerService 응용 프로 세 스 의 프 록 시 대상 을 저장 합 니 다.그러면ActivityManagerService 이 프 록 시 대상 을 통 해 응용 프로 세 스 를 제어 한 다음ActivityManagerService 응용 프로 세 스 에 입구 Activity 의 인 스 턴 스 를 만 들 고 수명 주기 함 수 를 실행 할 수 있 습 니 다.
라 이 프 사이클 함수 실행 프로 세 스
위의 시작 절 차 는 Android 가 제공 하 는 메커니즘 입 니 다.개발 자로 서 우 리 는 그 과정 과 원 리 를 잘 알 아야 합 니 다.그러나 우 리 는 이 과정 에서 어떤 글 을 할 수 없습니다.우리 가 할 수 있 는 일 은 바로 상기 과정 에서 마지막 단계 입 니 다.즉,Activity 대리 대상 을 통 해 응용 프로 세 스 가 입 구 를 만 드 는 것Application.attachBaseContext()의 인 스 턴 스 를 알 리 는 것 입 니 다.그리고 그의 생명주기 함 수 를 실행 하기 시작 하면 우리 의 시작 시간 통계 와 시작 속도 최적화 도 여기 서부 터 시작한다.다음은 Main Activity 의 시작 프로 세 스 입 니 다.

-> Application     
-> Application.attachBaseContext()
-> Application.onCreate()
-> Activity     
-> Activity.setTheme()
-> Activity.onCreate()
-> Activity.onStart
-> Activity.onResume
-> Activity.onAttachedToWindow
-> Activity.onWindowFocusChanged
로그 로 앱 의 시작 시간 을 기록 하려 면 최소한 두 개의 점,시작 시간,끝 시간 을 기록 해 야 합 니 다.
시작 시점
시작 시간 은 비교적 기록 하기 쉽다.만약 에 콜 드 가동 시작 시간 을 기록 하면 보통Context 시작 하 는 위치 에서 시작 시간 을 기록 할 수 있다.그 전에Activity.onRestart() 초기 화 되 지 않 았 기 때문에 보통 아무것도 할 수 없다.물론 이것 은 구체 적 인 상황 에 따라 정 해 야 한다.사실 앱 의 구체 적 인 업무 논리 가 실행 되 기 전에 시작 시점 을 기록 하면 된다.열 가동 시작 시간 을 기록 하면Activity 에 시작 시간 을 기록 할 수 있다.
종료 시점
종료 시점 이론 상 앱 이 첫 번 째 화면 을 표시 할 때 를 선택해 야 하 는데 어느 위치 에서 앱 이 첫 번 째 화면 을 표시 합 니까?인터넷 에 많은 글 들 이onResume Activity 방법 이 실 행 된 후에Activity 사용자 에 게 보 여 주 었 다 고 말 했다.사실은 한onCreate onStart onResume 이 완 료 된 것Activity 이 아니 라 자신 을 응용 하 는 설정 만 완성 했다.예 를 들 어View 주제 가 window 속성 을 설정 하 는 설정View 나무의 구축 과 같다.하지만 그 뒤 에는 각각measure layout draw집행OnResume 등 이 필요 하 다.그래서Activity.onWindowFocusChanged에 종료 시간 을 기록 한 Log 가 정확 하지 않 습 니 다.위의 절차 에서 마지막 함수activity 를 주의 하 셔 도 됩 니 다.다음은 주석 입 니 다.

/**
*Called when the current {@link Window} of the activity gains or loses
* focus. This is the best indicator of whether this activity is visible
* to the user. The default implementation clears the key tracking
* state, so should always be called.
...
*/
주석 을 통 해 알 수 있 듯 이 이 함 수 는Activity.onWindowFocusChanged 보 이 는 가장 좋 은 위 치 를 판단 하 는 것 이기 때문에 우 리 는Activity 응용 이 시작 하 는 종료 시간 을 기록 할 수 있 지만 주의해 야 할 것 은 이 함수 입 니 다.(4567914)초점 이 변화 할 때 촉발 되 므 로 판단 을 잘 해서 필요 하지 않 은 상황 을 제거 해 야 합 니 다.
총결산
이상 은 안 드 로 이 드(Android)개발 에 관 한 통계 앱 의 시작 시간 에 관 한 모든 내용 입 니 다.본 논문 의 내용 은 작은 편집 이 중요 하 다 고 생각 합 니까?아니면 그 말 입 니까?일 을 잘 하려 면 먼저 그 기 구 를 이 롭 게 하고 준 비 를 충분히 하 며 일 을 하 는 것 은 자연히 근거 가 있 습 니 다.본문의 내용 이 모두 에 게 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기