바이오닉 (소프트웨어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Bionic은 안드로이드 운영 체제에서 사용되는 C 표준 라이브러리이다. BSD 라이선스를 채택하여 카피레프트 라이선스의 영향을 받지 않는 독점 소프트웨어 환경을 구축하고, 작은 크기와 빠른 속도를 목표로 개발되었다. Bionic은 arm, arm64, riscv64, x86 및 x86-64 아키텍처를 지원하며, libc, 동적 메모리 할당자, libm, 동적 링커, C++ 표준 라이브러리 등의 구성 요소를 포함한다. POSIX 표준과의 차이점, NDK와의 관계, 그리고 Fortify Source 기능에 대한 지원을 제공하며, 구글의 GPL 라이선스 관련 논란이 있었다.
더 읽어볼만한 페이지
- 리눅스 커널 인터페이스 - 장치 파일
유닉스 및 유닉스 계열 운영 체제에서 하드웨어 장치 접근을 위해 사용되는 특수 파일 시스템 객체인 장치 파일은 문자 장치와 블록 장치로 나뉘며 주 번호와 부 번호로 식별되고, 물리 장치 외에 가상 장치도 존재하며 다른 운영 체제에서도 유사한 개념으로 특정 포트와 장치에 접근하는 데 사용된다. - 리눅스 커널 인터페이스 - 리눅스 기본 규격
리눅스 기본 규격(LSB)은 리눅스 배포판 간 호환성 증진을 목표로 하는 표준으로, 다양한 발전을 거쳤으나 비판과 제한적인 적용 사례가 있다. - C 표준 라이브러리 - 파일 끝
파일 끝(EOF)은 데이터 소스에서 더 이상 읽을 데이터가 없음을 나타내는 조건이다. - C 표준 라이브러리 - C 자료형
C 자료형은 C 언어에서 데이터 형태를 정의하는 기본 요소로, 다양한 크기와 속성을 가진 산술, 부울 자료형과 구조체, 공용체 등을 제공하며, 컴파일러 및 시스템 아키텍처에 따라 크기와 동작 방식이 달라질 수 있다. - 안드로이드 (운영체제) - 구글 어시스턴트
구글 어시스턴트는 2016년 구글에서 개발한 인공지능 음성 비서 서비스로, 양방향 대화 지원, 다양한 기기 및 플랫폼 확장성, 인터넷 검색, 일정 관리, 홈 오토메이션 제어 등의 기능을 제공하지만 개인정보 보호 문제에 대한 비판도 존재한다. - 안드로이드 (운영체제) - 웨어 OS
웨어 OS는 구글이 개발한 스마트워치용 운영 체제로, 구글 서비스 통합, 음성 제어, 피트니스 추적 등의 기능을 제공하며 안드로이드 및 iOS 기기와 연동되고, 핏비트 인수 후 디자인 개선 및 피트니스 기능 통합, 삼성 갤럭시 워치 시리즈 탑재 등을 통해 지속적으로 발전하고 있다.
바이오닉 (소프트웨어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
이름 | 바이오닉 |
종류 | C 표준 라이브러리 |
운영 체제 | 안드로이드 |
개발 | 오픈 핸드셋 얼라이언스 |
최초 릴리스 | 2008년 9월 23일 |
라이선스 | 3-clause BSD 허가서 |
플랫폼 | X86, X86-64, ARM, ARM 아키텍처, MIPS, MIPS 아키텍처 |
2. 개발 목표
Bionic은 안드로이드 플랫폼의 특성과 요구에 맞춰 다음과 같은 주요 목표를 가지고 개발되었다.[1][2]
- BSD 라이선스: (하위 섹션 "BSD 라이선스" 참조)
- 작은 크기: (하위 섹션 "작은 크기" 참조)
- 속도: (하위 섹션 "속도" 참조)
2. 1. BSD 라이선스
BSD 라이선스는 구글이 카피레프트 라이선스의 영향을 받지 않도록 안드로이드 애플리케이션을 분리하여 독점 소프트웨어 사용자 공간 및 애플리케이션 생태계를 만들기 위해 채택한 라이선스이다.[3]- 안드로이드는 카피레프트 GNU 일반 공중 사용 허가서(GPL) 버전 2를 따르는 리눅스 커널을 기반으로 한다.
- 리눅스 커널에서 가장 널리 사용되는 표준 C 라이브러리는 GNU C 라이브러리(glibc)이며, 이는 GNU 약소 일반 공중 사용 허가서(LGPL)를 따른다. LGPL은 GPL과 달리 동적 연결을 명시적으로 허용하지만, 소스 코드 또는 연결 가능한 개체 파일을 제공하지 않고는 독점 소프트웨어의 정적 라이브러리 정적 연결을 허용하지 않는다.
- 허가형 BSD 라이선스는 양방향으로 라이선스 호환성을 갖는 비-카피레프트 라이선스이다. BSD 라이선스 glibc 대체물은 카피레프트 코어(커널)와 비-카피레프트 애플리케이션 사이의 격리 계층 역할을 할 수 있으므로, 구글은 Bionic을 glibc 대체물로 선택했다.[4]
2. 2. 작은 크기
Bionic은 GNU C 라이브러리보다 훨씬 작고, 메모리 요구 사항이 (지금도) 훨씬 낮았다.[1][2] 이는 제한된 자원을 가진 모바일 장치에 적합하다.2. 3. 속도
Bionic은 비교적 낮은 클럭 주파수의 CPU를 가진 장치에서 빠르게 작동하도록 설계되었다.[1][2]3. 지원 아키텍처
바이오닉은 리눅스 커널만 지원하지만 현재 arm, arm64, riscv64, x86 및 x86-64 아키텍처를 지원한다. 플랫폼 자체는 마시멜로우 이후로 Neon을 사용한 armv7을 필요로 했다.[5] Android 네이티브 개발 키트(NDK)는 NDK r16까지 armv5 (armeabi라고 불림)를 계속 지원했으며, NDK r24에서는 비-Neon 지원이 중단되었으나 여전히 armv7은 지원한다. 역사적으로 플랫폼에 부분적인 SH-4 지원이 있었지만, 출시된 기기는 없었고 이후 지원이 제거되었다. NDK는 SH-4를 지원한 적이 없으며, MIPS 및 MIPS64 지원은 r17에서 NDK에서 제거되었다.
4. 구성 요소
Bionic은 libc, libm, 동적 링커(libdl) 등 다양한 구성 요소를 포함한다. libc의 경우 stdio 소스 코드 일부는 BSD에서 가져왔고, pthread 구현 등은 새로 작성되었다. libm은 FreeBSD 소스를 기반으로 하되, 여러 SoC 업체가 기여한 최적화된 어셈블러를 사용한다. 동적 링커는 처음부터 다시 작성되었다.[6]
Bionic은 libthread_db를 포함하지 않지만, NDK에는 포함되어 있었다. Android는 gdb 지원을 중단하고 lldb로 전환하면서 libthread_db는 더 이상 관련이 없다. Android에는 별도의 libpthread, libresolv, librt가 없으며, 모든 기능이 libc에 통합되어 있다.[6]
Android 플랫폼은 C++ 표준 라이브러리로 libc++을 사용하며, 이전에는 stlport를 사용했다. NDK는 과거 stlport 및 GNU libstdc++을 제공했지만, NDK r18부터는 제거되었다.[9]
4. 1. libc
stdio와 같은 libc 소스 코드의 일부는 BSD(주로 OpenBSD)에서 가져왔으며, pthread 구현과 같은 다른 부분은 처음부터 다시 작성되었다.[6]동적 메모리 할당자 구현은 시간이 지남에 따라 변경되었다. Lollipop 이전에는 듀그 리(Doug Lea)의 dlmalloc이라는 단일 네이티브 메모리 할당자가 있었다. Lollipop과 Marshmallow에서는 dlmalloc과 jemalloc의 두 가지 구현이 있었다. jemalloc은 dlmalloc보다 훨씬 높은 성능을 제공하지만, 부기 처리에 필요한 추가 메모리가 소모된다. 대부분의 기기는 jemalloc을 사용했지만, 저 메모리 기기는 여전히 dlmalloc을 사용했다. Nougat부터 Android 10까지 모든 기기는 jemalloc을 사용한다. 저 메모리 기기는 jemalloc의 "svelte" 구성을 사용하여 tcache를 비활성화하여 jemalloc의 속도를 대부분 유지하면서 dlmalloc의 낮은 메모리 오버헤드에 거의 맞춘다. Android 11에서는 대부분 기기의 메모리 할당자가 Scudo로 전환되었으며, jemalloc의 높은 성능을 일부 희생하여 추가 보안 강화 기능을 제공한다.[6] 하지만 저 메모리 기기는 여전히 jemalloc을 사용할 수 있다.[7]
Nexus 9와 같은 일부 64비트 기기는 64비트 포인터의 추가 공간 요구 사항과 두 개의 자이곳(zygote) 호스팅으로 인해 사실상 저 메모리 기기이다. ('''자이곳'''은 모든 Android 애플리케이션 프로세스의 부모인 Android 시스템 서비스이다.[8])
Android에는 별도의 libpthread, libresolv 또는 librt가 없으며, 모든 기능이 libc에 있다. libpthread의 경우, 앱은 타사 코드의 첫 번째 명령이 실행되기 전에도 이미 다중 스레드 환경에 있기 때문에 단일 스레드 케이스에 대한 최적화를 시도하지 않는다.
4. 2. 동적 메모리 할당자
Bionic의 동적 메모리 할당자 구현은 시간이 지남에 따라 변경되었다. Lollipop 이전에는 듀그 리(Doug Lea)의 dlmalloc이라는 단일 네이티브 메모리 할당자가 있었다. Lollipop과 Marshmallow에서는 dlmalloc과 jemalloc의 두 가지 구현이 있었다. jemalloc은 dlmalloc보다 훨씬 높은 성능을 제공하지만, 부기 처리에 필요한 추가 메모리가 소모된다. 대부분의 기기는 jemalloc을 사용했지만, 저 메모리 기기는 여전히 dlmalloc을 사용했다. Nougat부터 Android 10까지 모든 기기는 jemalloc을 사용한다. 저 메모리 기기는 jemalloc의 "svelte" 구성을 사용하여 tcache를 비활성화하여 jemalloc의 속도를 대부분 유지하면서 dlmalloc의 낮은 메모리 오버헤드에 거의 맞춘다. Android 11에서는 대부분의 기기의 메모리 할당자가 Scudo로 전환되었으며, jemalloc의 높은 성능을 일부 희생하여 추가 보안 강화 기능을 제공한다.[6] 하지만 저 메모리 기기는 여전히 jemalloc을 사용할 수 있다.[7]Nexus 9와 같은 일부 64비트 기기는 64비트 포인터의 추가 공간 요구 사항과 두 개의 자이곳(zygote) 호스팅으로 인해 사실상 저 메모리 기기이다. ('''자이곳'''은 모든 Android 애플리케이션 프로세스의 부모인 Android 시스템 서비스이다.[8])
4. 3. libm
libm 소스는 대체로 FreeBSD의 것이지만, 다양한 SoC 공급업체가 기여한 최적화된 어셈블러를 사용한다.[6]4. 4. 동적 링커 (libdl)
동적 링커(및 libdl)는 처음부터 다시 작성되었다.[6]4. 5. libthread_db
Bionic은 libthread_db(gdbserver에서 사용)를 포함하지 않지만, NDK는 포함했다. Android 플랫폼은 정적으로 링크된 gdbserver를 포함하여 개발자가 오래된 기기에서도 최신 gdb를 사용할 수 있도록 했다. Android가 gdb 지원을 중단하고 lldb로 전환하면서, 더 이상 관련이 없다.[6]4. 6. libpthread, libresolv, librt
Android에는 별도의 libpthread, libresolv 또는 librt가 없으며, 모든 기능이 libc에 있다.[6] libpthread의 경우, 앱은 타사 코드의 첫 번째 명령이 실행되기 전에도 이미 다중 스레드 환경에 있기 때문에 단일 스레드 케이스에 대한 최적화를 시도하지 않는다.4. 7. C++ 표준 라이브러리
Android 플랫폼은 C++ 표준 라이브러리에 libc++을 사용한다(Lollipop을 포함한 이전 릴리스에서는 stlport를 사용했다).[9] NDK는 과거 stlport 및 GNU libstdc++을 제공했지만, NDK r18부터 제거되었다.[9] Android 앱의 네이티브 코드에서 C++을 사용하는 경우, 모든 C++은 ''동일한'' STL을 사용해야 한다. STL은 Android OS에서 제공되지 않으며, 각 앱과 함께 제공되어야 한다.5. POSIX와의 차이점
바이오닉은 C11 및 POSIX를 모두 구현하는 것을 목표로 하지만, (오레오 기준) libc에서 약 70개의 POSIX 함수가 누락되어 있다.[10] 또한, passwd 데이터베이스가 없기 때문에 endpwent/getpwent/setpwent 계열과 같은 POSIX 함수는 안드로이드에 적용할 수 없다. 오레오 기준으로 libm은 완전하다.
일부 함수는 보안상의 이유로 POSIX 또는 C 표준을 의도적으로 준수하지 않는데, 예를 들어 %n영어 형식 문자열을 지원하지 않는 printf가 있다.[11]
가장 많이 사용되는 GNU 확장 기능 중 다수가 바이오닉에 구현되어 있으며, 다양한 BSD 확장 기능도 구현되어 있다.
6. NDK와의 관계
플랫폼 코드는 바이오닉을 직접 사용하지만, 타사 개발자는 안드로이드 네이티브 개발 키트(NDK)를 사용한다.[10] 많은 타사 개발자가 여전히 이전 OS 릴리스를 대상으로 하고 있어, 바이오닉이 많은 기능을 갖추지 못했다는 광범위한 믿음이 있다.[10] 진저브레드는 libc에서 803개의 함수를 내보냈지만, 오레오는 1278개를 내보내 1.6배 증가했다.[10]
역사적으로 NDK와 플랫폼은 분리되었지만, NDK r11 이후 버전은 NDK 포크를 현재 플랫폼과 동일한 기능으로 대체했다. 이 작업은 초기에 GCC 및 Clang 컴파일러에 집중되었다.
NDK r14 이전에는 "통합" 헤더가 옵트인 방식으로 처음 제공되었으며, NDK는 서로 다른 API 레벨에 대한 플랫폼 헤더의 포크된 복사본을 가지고 있었다. 이는 헤더 전용 수정 사항(예: 상수 또는 구조체 정의에 대한 수정 사항)이 대부분의 NDK 사용자에게 제공되지 않았음을 의미한다. 이전 API 레벨을 대상으로 하더라도 플랫폼 수정 사항은 현재 플랫폼 헤더에만 적용되었다. 오레오 개발 기간 동안 플랫폼 헤더는 API 레벨 정보로 주석 처리되어 동일한 헤더 세트를 모든 API 레벨에 사용할 수 있게 되었으며, 개발자가 대상 API 레벨에서 사용할 수 있는 함수만 표시되었다. 이는 소위 "통합" 헤더이며, NDK r15부터 기본값으로 사용되었다.
NDK r16 이전에는 NDK가 libc++를 사용하여 코드를 연결하는 libandroid_support.a라는 라이브러리를 연결하여 이전 OS 릴리스에 없는 libc++에 필요한 기능을 제공했다. 이는 플랫폼에서 사용되는 코드와 동일하지 않아, 수많은 버그(예: libc++를 사용한 모든 코드에서 printf 패밀리에 대한 위치 인수가 깨지는 등)를 발생시켰다. NDK r16부터 r25까지 libandroid_support.a는 여전히 존재했지만, 각 NDK가 빌드될 당시의 현재 플랫폼 소스에서 직접 빌드되었다. NDK r26부터 libandroid_support.a는 더 이상 존재하지 않는데, NDK에서 여전히 지원하는 모든 OS 버전에 libc++에 필요한 모든 것이 포함되어 있기 때문이다.
7. Fortify Source
안드로이드 젤리 빈 MR1 (4.2)부터 Bionic은 glibc의 `_FORTIFY_SOURCE`와 유사한 기능을 지원한다.[12] 이는 `strcpy()`, `strcat()`, `memcpy()`와 같이 안전하지 않은 문자열 및 메모리 함수에 버퍼 오버런 검사를 포함하는 기능이다. 이러한 검사는 버퍼 크기를 컴파일 시간에 결정할 수 있는 경우 컴파일 시간에 수행되며, 그렇지 않은 경우 런타임에 수행된다. Fortify는 libc의 런타임 지원에 의존하기 때문에 이전 안드로이드 릴리스로의 이식성은 제한적이다.[13] 플랫폼 자체는 `_FORTIFY_SOURCE`를 활성화하여 빌드된다.
역사적으로 fortify의 단점 중 하나는 GCC와 밀접하게 연결되어 있어 Clang과 같은 다른 컴파일러에서 제대로 지원하기가 매우 어렵다는 점이었다. 이는 안드로이드가 기본 컴파일러로 Clang으로 전환했을 때,[14] Bionic의 fortify 구현이 실질적으로 덜 유용해졌음을 의미했다. 안드로이드 오레오(8.0)에서 Bionic의 fortify가 Clang을 염두에 두고 개편되었으며,[15] 그 결과 Clang에서의 fortify는 GCC에서의 fortify와 동등한 경험을 제공하게 되었다. 이 개편 이후, 정의되지 않은 동작을 유발하지는 않지만 명백히 잘못된 코드를 포착하기 위해 glibc의 기능을 넘어선 일부 검사가 추가되었다. 이 새로운 구현은 이전 구현보다 더 많은 libc 지원이 필요하지 않기 때문에, Clang 관련 개선 사항은 오레오 이전 안드로이드 버전을 대상으로 하는 애플리케이션에서도 사용할 수 있다.
8. 논란
Bionic을 개발하기 위해 구글은 GPLv2 라이선스 기반의 리눅스 커널 헤더 파일을 사용했다. 구글은 GPL로부터 벗어나기 위해 해당 헤더 파일에서 저작권이 있는 부분을 제거하고, 이를 저작권이 없는 "사실"로 축소했다고 주장했다.[16][17] 리누스 토르발스는 구글의 이러한 행위를 용인할 수 있다고 여겼지만,[17] 구글의 GPL 해석은 휴스턴 대학교 법학 센터의 법학 교수 레이먼드 니머를 비롯한 여러 측으로부터 이의가 제기되었다.[18]
참조
[1]
웹사이트
Patrick Brady dissects Android
https://www.zdnet.co[...]
ZDNet
2008-06-04
[2]
웹사이트
Questions about Bionic
https://groups.googl[...]
2009-02-07
[3]
간행물
Android Anatomy and Physiology
https://web.archive.[...]
2017-07-15
[4]
웹사이트
FOSS Patents
http://www.fosspaten[...]
[5]
웹사이트
Android 6.0 Compatibility Definition
https://source.andro[...]
[6]
웹사이트
System hardening in Android 11
https://android-deve[...]
2020-12-20
[7]
웹사이트
Scudo
https://source.andro[...]
2020-12-20
[8]
웹사이트
Zygote
https://web.archive.[...]
2016-03-14
[9]
웹사이트
NDK Revision History | Android NDK
https://developer.an[...]
[10]
웹사이트
Android bionic status
https://android.goog[...]
[11]
웹사이트
libc: #define to remove support for %n from printf(3)?
https://marc.info/?l[...]
[12]
웹사이트
Android 4.2 Jelly Bean Release Notes
https://developer.an[...]
android.com
2013-12-27
[13]
웹사이트
Android 4.2 and FORTIFY_SOURCE
https://groups.googl[...]
2013-12-27
[14]
웹사이트
Android NDK changelog
https://android.goog[...]
android.googlesource.com
2017-08-28
[15]
웹사이트
FORTIFY in Android
https://android-deve[...]
android-developers.googleblog.com
2017-08-28
[16]
뉴스
Google android and the linux headers
https://www.theregis[...]
theregister.com
2011
[17]
뉴스
Android: Sued by Microsoft, not by Linux
http://www.itworld.c[...]
ITworld
2011-03-21
[18]
뉴스
Infringement and disclosure risk in development on copyleft platforms
https://web.archive.[...]
ipinfoblog.com
2011
[19]
웹인용
Announcing the Android 1.0 SDK, release 1
http://android-devel[...]
2008-09-09
[20]
웹인용
Android Anatomy and Physiology
http://androidteam.g[...]
2008-05-28
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com