상세 컨텐츠

본문 제목

안드로이드(AOSP) 소스코드 모델별로 분리 방법

개발이야기/안드로이드 시스템, 장비

by mycatdid0 2022. 6. 10. 12:51

본문

반응형

(포스팅 2022.08.01)

 

 

본인은 안드로이드폰의 커널 개발팀에서 일했었습니다. 그때 작업했던 내용 중 일부를 공유하고자 합니다.

 


하나의 소스코드에서 HW/SW가 여러가지로 나뉘는 경우

 

제가 근무한 2005회사에서는 다양한 안드로이드폰을 출시하였습니다. 폰마다 다양하게 HW스펙 및 SW기능을 가지고 있습니다. 이렇게 다양한 폰을 만드는데 소스코드 관리는 어떻게 했을까요? 제가 알고 있는 정보는 5년 이상 지난 정보이지만 공유해 보고자 합니다.

 

이번 포스팅은 하나의 모델에서 HW/SW가 변경되는 경우입니다. 하나의 소스코드를 가지고 대응해야 합니다.

 

- 주요 예제
개발 버전별로 HW 스펙이 달라지는 경우
판매처가 여러 곳이고 SW 요구사항이 다른 경우

- 필요조건
소스코드는 하나로 유지한다.

 

편의상 아래의 용어를 사용하겠습니다.

  • 원소스 : 하나의 소스코드만 사용한다는 뜻
  • 원바이너리 : 하나의 바이너리만 사용한다는 뜻

기본지식

 

여러 버전의 HW/SW를 대응하는 가장 쉬운 방법은, 하나의 바이너리에 모든 기능을 넣고 필요한 코드만 활성화시키는 것입니다. 안드로이드폰의 바이너리가 부팅하면서 HW스펙과 SW요구사항을 파악하여 스스로 셋팅을 완료하는 것입니다.

 

원바이너리로 모든 것을 대응할 수 없다면, 필요한 경우의 수만큼 바이너리를 따로 만들어야 합니다. 원소스 환경에서 여러종류의 바이너리를 생성하려면, 빌드 명령을 입력할 때 옵션으로 필요한 요구사항을 추가하는 방식을 사용하게 됩니다.

 

 

 


원바이너리로 HW/SW 분리 방법

 

 

 

원바이너리로 HW/SW 분리를 한다는 것은, 바이너리가 부팅하면서 보드의 정보를 파악하여 자신의 셋팅값을 바꾸는 것을 의미합니다.

 

  • HW 설계 당시, 필요한 값을 전달할 수 있도록 회로를 준비합니다.
  • 부트로더는 부팅하자마자 회로의 값들을 읽어서 자신이 어떤 보드인지 파악합니다.
  • 부트로더는 최소한의 디바이스만 (화면+버튼+터치)만 켜고 커널로 정보를 전달하고 종료합니다.
  • 부트로더가 커널로 정보를 전달하는 방법은 DeviceTree와 CMDLINE 이 있습니다.
  • 때로는 커널에서 필요한 정보를 부트로더의 NV 값에 저장하기도 합니다.
  • 커널은 부트로더로부터 받은 정보를 바탕으로 보드를 파악하여 부팅합니다.
  • 때로는 최초 초기화 시점에 gpio 등을 읽어서 추가 정보를 얻기도 합니다.
  • 커널 초기화가 완료되면 플랫폼이 부팅합니다.
  • 커널은 주로 sysfs 또는 property 값을 사용하여 플랫폼에 정보를 전달합니다.
  • 플랫폼은 커널로부터 받은 정보를 바탕으로 부팅합니다.

 

하나의 바이너리에서 모든 경우에 대응하도록 소스코드를 구성하면 이상적일 것입니다. 그러나 사용자 공간을 가능한 넓게 확보하려면 바이너리의 크기가 작을 수록 좋으므로, 꼭 필요한 기능들만 바이너리에 포함시키게 됩니다.


별도의 바이너리를 만들어 분리하는 방법

 

원소스에서 여러가지 종류의 바이너리를 빌드하려면, 빌드 시작시에 설정값을 넣어주어야 합니다. 이런 설정작업을 GUI 또는 전용 툴을 이용하면 편리하겠습니다만, 필요시 빌드를 자동화해야 하는 등 여러 조건을 충족시며야 하므로 별도의 도구를 사용하긴 어렵습니다. 대부분 빌드 명령에 옵션을 주는 방식으로 이루어집니다.

 

 

빌드명령의 옵션에 따라 바이너리 빌드시 다음의 일들이 일어납니다.

  • 소스코드의 선언문(예 : #define)이 옵션에 따라 코드를 활성화/비활성화 시킵니다.
  • 빌드스크립트가 옵션에 반응하여 특정 파일을 교체합니다.
  • 빌드스크립트가 옵션에 반응하여 특정 모듈을 추가하거나 제거합니다.

 

 


마치며

 

안드로이드 폰을 사용하시거나 앱을 개발하시는 분은 많지만, 안드로이드 소스코드를 빌드하시는 분은 많지 않을 것 같습니다.

 

제가 그동안 배우고 익혀온 내용을 풀어보려 해도, 어느 정도 깊이를 주어야 할 지 잘 모르겠네요.

 

추가 내용을 원하시는 분은, 질문글을 달아주시면 포스팅을 하겠습니다.

 

 

언제나 감사드립니다.

반응형

관련글 더보기

댓글 영역