스터디 9주차 week09
이번 스터디는 팀원인 현아와 함께 진행하였다. 처음으로 살펴 볼 코드를 정하기 전, 지난 6월 1일 토요일 멘토링 때 각자 필기했던 내용을 취합하여 정리하고, 주제를 선정하였다.
week09 - 01 멘토링을 통한 안드로이드 프레임워크 이해
스마트 폰에서 화면 하나하나 단위가 Activity. 이들을 관리하는 것이 ActivityManager (줄여서 A.M).
A.M Service는 ActivtyThread(A.T) 단위로 처리. A.M은 자료구조를 Stack이나 List 사용.
생명주기 중요. Create -> Pause -> Resume -> Stop -> Destroyed
한 화면(Activity) 떠 있을 때 그 상태 Resume. 다른 Activity들은 Stop 상태.
Resume 은 화면을 보여주고 있는 상태, Stop 은 화면을 멈추고 다른 화면으로 전환할 때. 보이는 화면은 onResume 하나.
서비스 는 화면에 띄워져있지 않아도 동작중일 수 O. Activity로 보여지지 않고 안에서 서비스가 돌아야 되는 것.
Activity Stack Supervisor 가 Stack 관리. ActivityStack 안에 TaskRecord (하나의 app ex.카카오톡)
가 있고, TaskRecord 안에 ActivityRecord (그 app의 Activity들을 ArrayList로 관리 ex.카카오톡이 가지고 있는 모든 액티비티)
이 있음.
기존의 스택처럼 push, pop 기능을 따르지 X. 실제로 리스트인데 쌓아서 관리한단 개념으로 이름만 Stack으로 불림.
ServiceRecord : List 통해서 관리. 생명주기 거침.
서비스는 큐 자료구조 사용.
Broadcast: 인텐트 보내는 기능. 받으면 Broadcast Receiver.
스마트폰이 부팅을 하게되면 초기에 기본적으로 실행되어야 하는 앱들 O. 대표적으로 보안 앱들이 있는데, 이들은 따로 앱을 실행시키지 않아도 자동으로 실행이 되어야 함. 이들은 부트컴플리터를 사용하여 핸드폰이 부트되면 자동으로 실행 시켜줌.
Oreo (8 버전) 부터는 백그라운드로 무언가 과하게 돌면 notification으로 보여줌 (핸드폰 위에 내리면 상단바 알림창 같은 거) -> 6.0에도 이러한 notification이 있을까?
week09 - 02 주제 선정
멘토링을 진행하며 얻은 주제 선정에 있어서의 조언은 코드를 보면서 아이디어를 도출하는 것, 그중에서도 Common Framework에서 가장 기본적인 ActivityManager 를 중점으로 보고 서비스쪽 구조를 참고해서 전체적인 동작을 살피고 주제를 선정하라는 것이었다.
제시된 주제들은 아래와 같다.
1. 부팅 속도 개선. (스캐닝 시간 감소, 중복검사 있을 시 빼주기.)
2. AOSP commit 판단하여 개선(픽셀 or 넥서스 단말기면 더 쉬움)
3. 전체적인 최적화: start 부분이나 record 부분. 메모리에 올라와 있는 ActivityRecord 뜨는 시간 줄이기, Intent 전달 빠르게 하기, 프로세스 사용 정확히 하기, 불필요한 Background Process Kill 해서 없앨 거 없애기 -> 전체적으로 개선했다고 할 수 있음. 코드상 개선. 밀리세컨드 단위도 대단한 개선.
4. 배터리(전력): 서비스 & 백그라운드 제한.
5. 마시멜로우 멀티스택 화면분할 관리.
6. 7.0 버전 보고 6.0 버전에 개선된 부분 구현하며 개선해보기.
7. Privacy에 대한 개선: 몇 초 뒤에 퍼미션 권한 있는 앱 Kill 하는 방식으로.
8. 패키지매니저 스캐닝을 XML에서 하는데, 이 속도를 개선하기. (XML 파싱)
9. 앱 부팅 요소에 그래픽 효과 줄이기.
우리팀은 주제를 3. 전체적인 최적화 로 선정하였고, 전체적인 최적화인 만큼 기타 주제로 언급되었던 것들도 함께 시도해보며 최적화를 이루어내는 것을 목표로 한다.
week09 - 03 코드 선정 및 분석 시작 (ActivityManger.java 중 RunnigServiceInfo 클래스)
멘토님께서 중점으로 보라고 언급하신 ActivityManager 코드를 먼저 살펴보기로 하였다. ActivityManager는 앱의 실행 상태와 관련된 다양한 정보를 획득할 목적으로 사용되는 시스템 서비스이다.
파일 경로: \base-48b716a9b40f9b108704a46c8c4e3e303531e33b\core\java\android\app\ActivityManager.java
나는 이번 스터디로 ActivityManger 코드 중 서비스 목록과 관련된 부분을 보았다. 이 부분은 RunnigServiceInfo
클래스에서 확인 할 수있다.
-
getRunningServices()
라는 메소드로부터 현재 시스템에서 동작중인 서비스 목록을 얻어온다. -
이 함수의 리턴값인 RunnigServiceInfo 객체로 동작중인 서비스를 확인할 수 있다.
getRunningServices() 메소드의 리턴 객체인 RunnigServiceInfo
객체에 대해 알아보았다.
-
RunnigServiceInfo 객체는 현재 시스템에서 실행중인 특정 서비스에 대한 정보를 검색 가능하게 해 준다.
-
서비스 구성요소, 프로세스 ID, 유저 Id, 프로세스 이름, 포그라운드 동작 여부 등의 정보를 파악할 수 있다.
-
캡쳐된 부분 이외에 동작 플래그 등의 정보도 포함되어있다.
이러한 RunnigServiceInfo 객체는 아래 코드와 같은 방식으로 생성된다.
RunnigServiceInfo 클래스에 getRunningServicesControlPanel()
이라는 메소드도 정의되어 있는데, 이는 주어진 실행중인 서비스에 대한 제어판을 표시하기 위해 시작할 수있는 PendingIntent를 반환하는 메소드 라고 한다. 즉, 실행중인 서비스에 대한 PendingIntent를 반환하는 메소드이다.
-
PendingIntent
: Intent를 가지고 있는 클래스로, 기본 목적은 다른 애플리케이션(or 다른 프로세스)의 권한을 허가하여 가지고 있는 Intent를 마치 본인 앱의 프로세스에서 실행하는 것처럼 사용하게 하는 것. -
PendingIntent에 대한 설명: https://www.charlezz.com/?p=861
-
이 메소드가 왜 필수로 필요한지는 잘 모르겠다.
이로써 9주차 스터디를 마친다.
참고 링크: https://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo