정보공간_1

[6기 강남 송태현] 안드로이드 멀티 윈도우 오픈소스 분석(HALO) 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 송태현] 안드로이드 멀티 윈도우 오픈소스 분석(HALO)

알 수 없는 사용자 2014. 8. 10. 23:44

안녕하세요 엘리트회원 6기 강남멤버십 23-2 송태현 입니다.

이번 포스트는 파라노이드 안드로이드라는 안드로이드 오픈소스 프로젝트 팀에서 개발중인 안드로이드 멀티태스킹 솔루션중 하나인 HALO에 대해서 분석해 보겠습니다. 

안드로이드 플랫폼 오픈소스를 직접 다운받아 프레임워크를 수정하여 HALO오픈소스를 적용 하게 됩니다.

 

위 그림은 안드로이드 플랫폼에서 최종적으로 부팅이 끝나고 어떠한 APP을 실행하는 과정을 보여 줍니다.

여기서 주목해야 할 점은

지금 실행되고 있는 APP1 말고 APP2를 실행하였을시, Zygote는 새로운 프로세스를 fork()하여 연결시켜준다는 것입니다.

그렇게 되면 기존에 실행되고 있는 APP1은 액티비티 상태나 또는 프로세스들에 정보들이 지워지게 되고 서비스정보들만이

System Server로 연결이 됩니다.

 

즉, 컴퓨터에서 사용하는 멀티 윈도우처럼 이용할려면 결과적으로 2개 이상의 APP정보들을 저장해야 합니다.

여기서 APP의 정보들은 화면출력, APP과 연결된 service들 그리고 여러가지 메모리 정보들 입니다.

 

사용자 입장에서 가장 확연히 눈에 볼 수 있는 정보가 Display 정보입니다.

 다음 그림은 디스플레이 정보가 화면에 출력 되는 방식입니다.

어플리케이션에서 각각의 요소요소들을 Surface란 객체로 묶어서 최종적으로 합성하여 FrameBuffer라는 곳으로 보내주어

안드로이드 그래픽드라이버가 이를 LCD화면에 출력합니다.

 

HALO 멀티윈도우 솔루션에서는 FrameBuffer 로 들어가는 정보가 하나의 어플리케이션 Surface 정보가 아닌 여러 어플리케이션에 Surfcae정보들을 합성 하게끔 만들어 줍니다.

 

1. MultiActivity 부분

어플리케이션이 동시에 여러개 실행된다는것은, 액티비티가 여러개 있다는 것입니다. 다음 그림은 HALO에서 여러 액티비트를 유지하는 Flow입니다.

 

 

일반적으로 액티비티를 관련하는 안드로이드 프레임워크는 core/java/android/app/Activity.java 에 구현되어있습니다.

여기서 Activity의 Window들을 결정하는데, 이부분에서 멀티윈도우가 될 새로운 액티비티의 크기를 결정합니다.

그리고 Activity 생명주기에서 stop() 부분에 함수에서 최종적으로 Distory()가 되는것을 막습니다.

그렇게 되면 현재 메모리상에서 기존에 실행되었던 액티비티의 정보들이 저장이 되어있습니다.

 

그리고 액티비티가 전환될때 기본적으로 안드로이드에선 Intent를 하게 됩니다.

새로운 멀티 윈도우가 될 어플리케이션에서 Intent가 된다면 기존에 액티비티 정보들이 지워지게 되는데,

이 부분을 담당하는 프레임워크는 core/java/android/app/TaskStackBuilder.java 에서 기존 액티비티 정보들이 스택구조

상에서 사라지는것을 막습니다.

 

그리고 기존에 액티비티를 유지하고 새로운 액티비티 화면이 기존 화면에 OverLay가 되게 합니다.

 

2. 새로운 멀티 윈도우 어플리케이션의 정보(패키지, 프로세스 정보)들을 얻는 방법

기본적으로 어플리케이션들의 정보들은 private화 되어있습니다.

해당 어플리케이션을 실행시킬려면 PID정보 PKG정보들을 있어야 실행을 시킬수가 있는데, 안드로이드 소스상에선 그것을 막고 있습니다.

HALO 에서는 Notification을 통해 멀티윈도우를 동작하는 방식을 취하고 있습니다.

일반적으로 사용자들이 멀티윈도우를 썼을때 메시지나 SNS 알림등이 왔을때, 기존에 어플리케이션을 중지 하지 않고 동시에 쓰는 경우가 많다고 생각하여 HALO에서는 노티피케이션으로 오는 어플리케이션만 멀티 윈도우로 실행할 수 있게 합니다.

Notification객체를 통해 어플리케이션 정보를 얻을수 있도록 PKG, PID, TID등을 참조 할 수 있게 수정합니다.

                                                 APP  실행

그래서 위 그림과 같은 방식으로 새로운 액티비티가 출력되게 됩니다.

3. 멀티윈도우 사용 관련 UI

HALO에서는 다음과 같은 UI방식으로 멀티윈도우를 사용할 수 있게 합니다.

 

 

왼쪽 중간에 떠있는 원형 아이콘은 최상위 액티비티 뷰로써 지속적으로 동작하고 저 버튼을 통해 멀티윈도우를 사용할 수 있게 합니다.

 

최종적인 HALO 프로젝트에서 만든 멀티윈도우의 아키텍쳐는 다음과 같습니다.                                   

 

 

실행화면은 다음 그림과 같이 버튼을 통해 인터넷에서 동영상을 보는데, 꺼지지 않고 SNS메신저를 사용할 수 있게 됩니다.

 

이상 HALO 멀티윈도우 솔루션 분석이었습니다.

감사합니다.