본문 바로가기

옥탑방주인/-D

Android library - Bionic(libc)에 대해 알아보자.

 대학원 수업을 수강중에 Android library 파트에 libc에 대해 조사할 기회가 생겼다.

libc의 위치는 밑에 그림의 빨간색으로 표시해뒀다.


 먼저 안드로이드는 리눅스커널 기반으로 만들어진 운영체제이다.

리눅스에서는 거의 표준으로 사용하는 GNU C Library(glibc)라는것을 사용하지만, 안드로이드에서는 Bionic(libc)라는 라이브러리를 사용한다. 왜 안드로이드에서는 glibc를 사용하지 않고 bionic을 사용할까? 그 이유를 한번 찾아보았고 그것을 바탕으로 3가지 이유로 서술해 보려 한다.



1) 라이선스(License)

리눅스에서 사용되는 glibc는 LGPL 라이선스로 배포되고 있다. 여기서 LGPL이란 여기에 서술해놓았다.

안드로이드에서 glibc를 사용하지 않는 이유는 LGPL 라이선스가 포함된 코드를 수정 또는 파생된 라이브러리를 개발한 경우에는 소스코드 전체를 공개해야되는데(원본 그대로를 사용하였으면 공개할 의무가 없고, 단순히 LGPL 코드를 사용했다는것을 명시하기만 하면 된다), 안드로이드 입장에서는 자신의 소스코드를 공개하기가 싫었던 것이다(나같아도 안할듯). 그래서 구글은 LGPL 라이선스를 회피하기 위한 목적으로 BSD라이선스를 준수하는 Bionic이라는 커스텀 C라이브러리를 개발하였다. 

 

2) 크기(Size)

안드로이드에서는 C 표준 라이브러리가 어플리케이션마다 독립적으로 로드되는 것 같다. 이렇게 어플리케이션마다 library가 독립적으로 실행되면 불필요하게 메모리가 낭비될 수 있는데, glibc보다 크기가 절반정도 작은 bionic이란 커스텀 라이브러리를 개발하여 불필요한 메모리 상주를 줄임. bionic의 크기는 대략 200KBytes라고 하는데 현재 크기는 정확히 모름.


3) 속도(Speed)

안드로이드는 PC작업환경이 아니고 임베디드 작업환경이다. 그러므로 메모리와 CPU에 할당된 파워는 제한되어있다. 제한된 환경에서 빠르게 동작하려면 크기가 작아야 되고 코드 간의 이동이 빨라야 된다. bionic은 경량화된 pthread를 구현하여서 이러한 문제들을 해결하였다.


Bionic Library & Utils 

 libc.so, libstc++.so, libdl.so, libm.so, libcutils.so


Bionic은 glibc와 호환되지 않으며 POSIX를 준수하지도 않는다. 그리고 모든 native 프로그램은 bionic과 함께 빌드되어야만 고성능&경량이 된다.


다음과 같은 순서로 프로그램이 실행된다고 한다.

_start -> __libc_init ( ) -> __libc_init_common ( ) -> main ( )