자세 한 내용 VirtualApk 시작 플러그 인 Activity
7607 단어 VirtualApkActivity
Instrymentation.checkStartActivityResult
플러그 인 Activity 의 시작 을 실현 하려 면 다음 과 같은 문 제 를 해결 해 야 합 니 다.
1.플러그 인의 Activity 는 숙주 의 AndroidManifest.xml 에 등록 해 야 합 니 다.
2.플러그 인 활동 은 수명 주기 가 있어 야 하 며,onPause onResume onStart 에 응답 할 수 있 습 니 다. onDestroy 등 생명주기 함수.
이 두 가지 문 제 를 가지 고 Activity 의 시작 과정 을 살 펴 보 겠 습 니 다.
Activity 시작 프로 세 스
startActivity 를 호출 한 후 Activity.onCreate 를 호출 하면 다음 절 차 를 거 칩 니 다.
1.Instrumentation.execStartActivity 호출
execStartActivity
이 방법 은 먼저 AMS.startActivity 를 호출 하여 대응 하 는 Activity 를 시작 한 다음 checkStartActivity Result 를 통 해 시작 결 과 를 검사 합 니 다.AndroidManifest.xml 에 이 Activity 를 등록 하지 않 으 면 Activity NotFoundException 의 오 류 를 보고 합 니 다.AMS.startActivity 를 호출 하 는 것 은 사실 binder 방식 으로 원 격 인 터 페 이 스 를 호출 하 는 것 이다.
2.AMS.startActivity 호출
AMS.startActivity 는 Acctivity Stack Supervisor.startActivity MayWait 함 수 를 호출 합 니 다.그리고 Acctivity Stack Supervisor.startActivity Locked 를 호출 합 니 다.이어서 AcctivityStackSupervisor.startActivityUncheckedLocked 를 호출 합 니 다.최종 적 으로 Acctivity Stack Supervisor.startSpecific Activity Locked 를 호출 했 습 니 다.
startSpecificActivityLocked
startSpecific Activity Locked 에서 app 이 비어 있 는 지 여 부 를 판단 합 니 다.app 의 실제 유형 은 ProcessRecord 이 고 Activity 가 속 한 프로 세 스 정 보 를 대표 합 니 다.비어 있 으 면 AMS.startProcessLocked 를 호출 하여 프로 세 스 를 만 듭 니 다.
realStart Activity Locked 의 실현
프로 세 스 가 존재 한다 면 realStart Activity Locked 함 수 를 호출 합 니 다.realStart Activity Locked 는 app.thread.scheduleLaunchActivity,app.thread 시 IApplicationThread 를 호출 합 니 다.이것 은 도대체 무엇 입 니까?
저 희 는 AMS 가 SystemServer 프로 세 스에 서 실행 되 고 시작 할 Activity 가 APP 프로 세 스에 서 실행 되 는 것 을 알 고 있 습 니 다.SystemServer 프로 세 스 가 APP 프로 세 스 의 Activity 를 시작 하려 면 binder 방식 으로 작업 해 야 합 니 다.이때 AMS 는 Client 에 해당 하고 APP 는 Server 에 해당 하 며 ApplicationThread 는 AMS 프로 세 스 가 APP 프로 세 스 를 호출 하 는 다리 입 니 다.ApplicationThread 는 앱 프로 세 스 가 시 작 될 때 만 들 어 졌 습 니 다.
AMS.startProcessLocked 가 APP 프로 세 스 를 만 들 것 이라는 것 을 알 고 있 습 니 다.
startProcessLocked
startProcessLocked 에 서 는 Process.start 를 호출 하여 앱 프로 세 스 를 만 듭 니 다.
Process.start
Process.start 는 최종 적 으로 Zygote 를 통 해 프로 세 스 를 만 들 고 프로 세 스 의 입구 클래스 Activity Thread.main 함 수 를 실행 합 니 다.애플 리 케 이 션 스 레 드 는 여기 서 만 들 었 습 니 다.
ActivityThread.main
main 함수 에 서 는 메 인 스 레 드 에 Looper 대상 을 만 들 었 고 thread.attach 는 applicationThread 대상 을 AMS 에 전달 했다.
ActivityThread.attach
mAppThread 는 ApplicationThread 형식 이 고 mgr 는 AMS 의 로 컬 에이전트 입 니 다.mgr.attachApplication 은 mAppThread 를 AMS 에 전송 하면 AMS 는 APP 프로 세 스 와 상호작용 을 할 수 있 습 니 다.
ApplicationThread
응용 프로그램 Thread 는 Ativity Service 를 시작 하 는 등 여러 가지 방법 을 제공 합 니 다.
3、ApplicationThread.scheduleLaunchActivity
Activity 생 성 은 앱 프로 세 스에 서 이 루어 졌 으 며,scheduleLaunchActivity 는 H 형식의 Handler 에 메 시 지 를 보 내 고,최종 적 으로 Activity Thread.performLaunchActivity 를 호출 했다.
ActivityThread.performLaunchActivity
Activity Thread.performLaunchActivity 는 Ativity 인 스 턴 스 의 로드 와 onCreate 호출 을 완료 합 니 다.여기까지 액 티 비 티 생 성 이 완료 되 었 습 니 다.
글 은 처음에 도 플러그 인 Activity 를 시작 하 는 두 가지 문 제 를 언급 했다.Activity 의 시작 과정 을 이해 한 후에 우 리 는 다음 과 같은 방식 으로 Activity NotFound 의 문 제 를 해결 할 수 있다.
1.숙주 APP 의 AndroidManifest.xml 등록 점 갱 Activity
2.Hook 에서 Activity Thread 를 조정 하 는 Instrumentation 대상 은 startActivity 가 플러그 인 Activity 를 시작 하 는 것 을 감지 하면 대상 Activity 를 숙주 가 구 덩이 를 차지 하 는 Activity 로 교체 하여 Activity NotFound 문 제 를 돌아 갑 니 다.
3.hook 은 Activity Thread 의 mInstrumentation 대상 의 new Activity 함 수 를 조정 합 니 다.이렇게 하면 숙주 가 구 덩이 를 차지 하 는 Activity 를 시작 할 때 숙주 가 구 덩이 를 차지 하 는 Activity 를 플러그 인 Activity 로 바 꾸 고 ClassLoader 는 실제 플러그 인의 Activity 대상 을 불 러 옵 니 다.
사실 Virtual Apk 는 이렇게 했 어 요.
숙주 점 갱 활동
숙주 AndroidManifest.xml 에는 각종 시작 모드 의 점 갱 Activity 가 설정 되 어 있 습 니 다.
PluginManager.hookInstrumentationAndHandler
PluginManager.hookInstrumentationAndHandler,앱 프로 세 스 의 Activity Thread 의 Instrumentation 대상 을 hook 제거 합 니 다.
Instrumentation.execStartActivity
exec Start Activity 는 ContextImpl.startActivity 가 호출 하 는 첫 번 째 함수 입 니 다.VirtualApk 는 hook 이라는 함 수 를 통 해 markIntentIfNeeded 함 수 는 플러그 인 을 시작 하 는 Intent 를 구 덩이 를 차지 하 는 Activity 로 변환 합 니 다.
변환 인 텐트
dispatchStudActivity 는 플러그 인 Activity 와 숙주 Activity 의 전환 을 완료 합 니 다.
mInstrumentation.exec Start Activity 호출
변환 이 완료 되면 원래 mInstrumentation 대상 의 exec Start Activity 함 수 를 계속 호출 하고 AMS 와 관련 된 방법 을 계속 호출 합 니 다.
newActivity
방금 너구리 가 태 자 를 바 꾸 고 Activity NotFound 검 사 를 마 쳤 습 니 다.new Activity 가 Activity 대상 을 만 들 때 다시 바 꿔 야 합 니 다.즉,숙주 가 구 덩이 를 차지 하 는 Activity 호출 을 실제 플러그 인 Activity 로 바 꾸 는 것 입 니 다.
callActivityOnCreate
newActivity 에서 플러그 인 을 불 러 오 면 Activity 는 callActivity OnCreate 를 호출 합 니 다.그러나 이 때 플러그 인 Activity 대상 의 resource 자원,context 는 모두 숙주 입 니 다.hook 에서 callActivity OnCreate 는 플러그 인의 Resources Context 등 정 보 를 스스로 설정 할 수 있 습 니 다.
여기까지 플러그 인 을 불 러 오 는 첫 번 째 문제(Activity NotFound)를 해결 하 였 습 니 다.이렇게 만 든 Activity 는 생명주기 가 있 습 니까?onPause onResume 등 생명주기 방법 에 응답 할 수 있 습 니까?
답 은 긍정 적 이다.우 리 는 onPause 방법 을 예 로 들 자.
Activity.onPause 를 호출 할 때 호출 절 차 는 다음 과 같 습 니 다.AMS.activityPause-->Activity Stack.activityPausedLocked-->....................................
ActivityThread.performPauseActivity
Activity Thread.performPauseActivity 는 token 에 따라 pause 할 Activity 를 찾 습 니 다.그러면 이 token 은 어디서 났 습 니까?
ActivityThread.performLaunchActivity
추적 코드 는 Activity Thread.performLaunchActivity 가 Activity 대상 을 만 들 때 mActivities 를 저장 한 것 을 발견 했다.r.token 은 Activity Client Record 의 token 대상 으로 AMS 에서 전 달 된 것 입 니 다.이 token 은 Activity 클래스 와 상 관 없 이 token 과 Activity 의 대응 관 계 를 찾 을 수 있 으 면 됩 니 다.따라서 액 티 비 티 의 라 이 프 사이클 에는 영향 을 주지 않 는 다.
이로써 플러그 인 액 티 비 티 를 시작 하 는 두 가지 문 제 를 해결 했다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fragment에 대해 알아보자 | Android Study한 줄로 요약하면, Activity 에서 처리하는 임무들을 Fragment 가 대신 일부를 처리해주는 것이다. Fragment 는 독립적일 수 없다. Fragment 는 자체적으로 생명주기를 가진다. 이 클래스를 통...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.