블로그 이미지
소프트웨어 개발 경험을 공유하고 싶은 재밌게 사는 소프트웨어 엔지니어입니다^^

카테고리

Chungha Story (46)
Agile Experience (22)
My Family (4)
Life Style (8)
Programming (8)
Android (3)
Total128,101
Today109
Yesterday102
심히 객체지향적인 오픈플래폼, 안드로이드

안드로이드의 소스는 심히 객체지향적으로 구현되어 있습니다. 우선 애플리케이션을 구현하는 언어가 자바로 되어 있습니다.
또한 프로세스간 통신을 지원하는 Binder, 멀티미디어 프레임웍(OpenCore and StageFright), 서비스 및 서비스 프로바이더, 오디오/디스플레이 서브 시스템(AudioFlinger, SurfaceFlinger) 등등 대부분의 코드는 매우 객체지향적인 C++로 구현되어 있습니다. OpenCore의 경우 너무 객체지향적이어서 안드로이드 2.2 Froyo에서는 좀더 간단한(?) 구조의 StageFright가 정식 릴리즈 되기도 했습니다. (GingerBread에서는 OpenCore가 없어진다는 소문과 함께..)

Why are You Still Using C?

성능이 중요한 Embedded System에서 C언어를 사용하는 것은 일반적인 관례였습니다. 우리는 C++의 Polymorphism, Virtual Table 등으로 인해 성능이 저하될 수 있다는 편견과 컴파일러에 대한 불신등으로 인해 하드웨어의 성능이 크게 개선되었음에도 불구하고 C언어를 계속 사용하고 있었습니다. 꼭 C언어가 나쁜것은 아니지만 호환성, 유지보수성 또는 확장성 측면에서 어려운 점들이 있었던것은 사실이었습니다.

객체지향과 안드로이드 그리고 휴대폰 제조사

객체지향적으로 구현한다고 해서 호환성, 확장성등이 좋아지진 않습니다. 하지만 객체지향의 몇가지 원칙만 잘 지킨다면 좀 더 개선된 결과를 얻을 수 있습니다. 안드로이드는 객체지향을 통해 오픈플래폼으로써 지녀야할 호환성 및 확장성을 구현하였습니다. 그리고 구글은 당연히 휴대폰 제조사들도 객체지향적으로 접근할 것이라 생각했나 봅니다. 하지만 휴대폰 제조사의 개발 패러다임은 아직 많은 부분에서 객체지향적이지 못한 부분들이 있었습니다. 그리고 안드로이드의 소스를 수정(modification)하였습니다. 결국 애플리케이션의 호환성, 플래폼의 안정성 등에서 적지않은 문제가 발생했습니다.

Open-Close Principle

Robert C. Martin이 제안한 객체지향의 원칙중 하나인 Open-Close Principle의 정의는 다음과 같습니다.
SOFTWARE ENTITIES (CLASSES, MODULES, FUNCTIONS, ETC.) SHOULD BE OPEN FOR EXTENSION,
BUT
CLOSED FOR MODIFICATION.
휴대폰 제조사는 자신들만의 기능(feature)을 안드로이드의 소스에 확장(extension)해야 합니다. 구글에서 릴리즈한 소스를 수정(modification)해서는 안됩니다. (최소화 해야합니다.) 그래야 구글과 휴대폰 제조사가 윈-윈할 수 있습니다. 그리고 구글이 원하는 OTA(On-The-Air)도 구현할 수 있습니다.

구글은 결국 폐쇄적으로 갈것인가?

안드로이드 2.3 GingerBread에서는 구글이 휴대폰 제조사의 Built-in GUI 탑제를 제한하겠다는 소문이 돌고 있습니다. 하지만 그것이 정답은 아니라는 것을 구글도 알 것입니다. 오픈플래폼은 구글 혼자서 만들수 있는 것이 아니라는 것도 알 것입니다.
LG전자, 삼성전자가 그들의 개발 패러다임을 뛰어 넘는다면, 그들은 폐쇄적으로 갈 이유가 없습니다. (정치적인 이슈는 제외...)
개인적으로 LG전자가 뛰어넘었으면 좋겠습니다.^--------------------^
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 윤청하

댓글을 달아 주세요

  1. 2010.07.30 17:11 신고 뇨릉  댓글주소  수정/삭제  댓글쓰기

    LG, 삼성에서 안드로이드와 대적할만한 OS를 만들고 있는건가요?? (잘 몰라서..)
    삼성의 바다가 라고는 들어봤지만,,, LG도 자체 OS가 있는건가요? 잘 몰라도.. 저도 저희 나라 기업을 응원해봅니다^^ ㅋ
    그리고 객체지향 커널이라니.. 정말 어떤지 궁금하네요 ㅎㅎ

    • 2010.08.01 22:26 신고 윤청하  댓글주소  수정/삭제

      LG에서 개발하는 자체 OS는 현재 없는걸로 알고 있습니다^^;;
      제가 단어를 잘못쓴것 같습니다~ 안드로이드는 커널이 아니라 플래폼입니다.;;
      그래서 글을 수정했습니다. 정확한 지적 감사드립니다!^^

  2. 2010.08.03 08:53 신고 뇨릉  댓글주소  수정/삭제  댓글쓰기

    커널이란 용어는.. 제가 지적해드리려고 했던건 아니라..
    정말 객체지향 커널인줄 알고 말씀드린건데 플랫폼이였군요^^; ㅋ

SurfaceView의 역할

Android Application에서 View의 내용은 GDI Thread를 통해 Surface에 그려지게 됩니다.
만약 View에 동영상 또는 카메라 프리뷰와 같이 그려지는 양이 매우 많거나 빠른 화면 변화를 원한다면 SurfaceView를 사용해야 합니다. SurfaceView의 내용은 GDI Thread를 통해서 Surface에 그려지지 않고 다른 Thread를 통해서 그려지기 때문입니다.
SurfaceView는 아래 그림과 같이 Window의 아래쪽에 위치하며, Window를 뚫어서(punched) 자신이 보여지게끔 합니다.
단, 해당 Window 위에 다른 View가 있는 경우 블렌딩(blended)이 되어 보여지게 됩니다.

동영상 재생과 SurfaceView

아래 그림은 동영상이 재생되는 SurfaceView를 묘사한 것입니다.

동영상 재생을 담당하는 PVPlayer (Packet Video Player)에서 SurfaceView에 연결된 Surface에 동영상을 그립니다.
그려진 Surface와 다른 내용(ex. GUI)을 담고 있는 View의 Surface들을 모두 합쳐서(composition) 하나의 화면으로 FrameBuffer에 쓰는 역활을 하는 것이 SurfaceFlinger service입니다. SurfaceFlinger service는 연산량이 많기 때문에 독립적인 process로 존재합니다. 동영상의 화면이 크고 그 위에 블랜딩 되어야 하는 GUI가 많은 경우 오버레이를 위한 하드웨어 가속기를 사용하기도 합니다.
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 윤청하

댓글을 달아 주세요

  1. 2011.03.30 20:44  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2011.04.30 04:04 신고 Douglas  댓글주소  수정/삭제  댓글쓰기

    SurfaceView-Thread 에서 Intent 로 다른 Activity 넘어갈 때 생기는 에러...

    예전부터 생겼던 에러인데요..
    대충 System.exit(0); 로 처리하고 넘기곤 했는데...
    제대로 처리하고 싶어서요.

    surfaceView 에 Thread 로 게임을 만들었는데요.

    run 안에 Rect 로 범위를 정하고 그 범위를 Click 하면 다음 Activity 로 넘어가는 것을 하려고 합니다.

    그냥 intent 를 쓰면 다음 Activity가 Screen에 나타나고 곧바로 원래 게임 화면으로 돌아옵니다.

    그래서 이전에는 startActivity(intent) 한 후에 System.exit(0); 으로 아예 게임 Activity 를 강제로 종료시키는 방법을 썼었는데.. 좋은 방법이 아닌것 같아서요.
    그리고 이렇게 처리하면 게임 중에 전화가 온 후 다시 실행 될 때 전화 올 때의 게임 화면이 아니라 그 이전 화면으로 다시 돌아가더라구요.

    surfaceView 에 Thread로 만든 View 에서 에러 없이 intent 를 사용하려면 어떻게 해야 하죠?


    P.S.

    Thread는 run = true 일 때만 돌아가도록 했고
    surfaceDestroyed() 에서는 run 을 false로 고치고
    while(done) {
    try{
    Thread.join();
    done=false;
    } catch() {
    }

    이런식으로 Thread 처리 하도록 하고 있습니다.

    • 2011.05.03 08:48 신고 윤청하  댓글주소  수정/삭제

      제가 정확히 해보지 않아서 답변이 될지는 모르겠지만...
      범위를 클릭했을떄 다음 Activity로 넘어가는 구현을 Surface가 Destroy될떄 쓰레드를 수동적으로 종료시키는 것이 아니라,
      Activity를 넘기기 전에 능동적으로 쓰레드를 완전히 종료시킨뒤에
      넘어가시는 것으로 하는건 어떠신가요? (쓰레드를 종료하기 전에 이전 화면을 저장하는 것도 좋습니다.)
      그리고 복귀했을때는 쓰레드를 동작시키신뒤 이전 화면을 바로 렌더링 해주는 것은 어떨까요?
      ^^

  3. 2011.08.30 20:56 신고 로미  댓글주소  수정/삭제  댓글쓰기

    SurfaceFlinger 디적거리다가 여기까지 오게됐네. Sozu~! 내일 회사서 봅세 ㅋㅋㅋ

  4. 2012.03.06 03:31 신고 gogazago  댓글주소  수정/삭제  댓글쓰기

    잘보고 감니다 ;) 안드로이드 그래픽쪽에서 일하다 보니깐 여기까지 오게 되었네요 ㅎㅎ;
    감사합니다~

  5. 2012.09.26 21:39 신고 김창중  댓글주소  수정/삭제  댓글쓰기

    SurfaceView 관련해서 그림좀 참고 하고 싶어서 블로그에 가져가려고 하는데 괜찮겠습니까?

  6. 2012.11.07 12:08 신고 김종대  댓글주소  수정/삭제  댓글쓰기

    SurfaceView의 역할에 관한 그림을 교과서에 인용을 하고 싶습니다. 괜찮을 까요?

티스토리 툴바