안 드 로 이 드(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)개발 에 관 한 통계 앱 의 시작 시간 에 관 한 모든 내용 입 니 다.본 논문 의 내용 은 작은 편집 이 중요 하 다 고 생각 합 니까?아니면 그 말 입 니까?일 을 잘 하려 면 먼저 그 기 구 를 이 롭 게 하고 준 비 를 충분히 하 며 일 을 하 는 것 은 자연히 근거 가 있 습 니 다.본문의 내용 이 모두 에 게 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.