바이오닉(소프트웨어)
Bionic (software)개발자 | 오픈 핸드셋 얼라이언스 |
---|---|
초기 릴리즈 | 2008년 9월 [1] | , 전(
저장소 | |
운영 체제 | 안드로이드[2] |
플랫폼 | ARM, ARM64, x86, x86-64 |
유형 | C 표준 라이브러리 |
면허증. | 3절 BSD 라이선스 |
웹 사이트 | developer![]() |
바이오닉은 구글이 안드로이드 [2]운영체제용으로 개발한 표준 C 라이브러리를 구현한 것입니다.GNU C 라이브러리(glibc)와는 달리 일반적인 Linux 시스템보다 메모리와 프로세서의 파워가 낮은 디바이스용으로 설계되어 있습니다.GNU Lesser General Public [3]License를 사용하는 glibc가 아닌 BSD 라이선스로 출시된 FreeBSD, NetBSD 및 OpenBSD의 새로운 코드와 코드를 조합한 것입니다.이 차이는 정적 링크가 일반적이던 Android 초기에도 중요했으며, 독점 운영체제에 익숙한 소프트웨어 회사에 Android를 도입하는 데 여전히 도움이 되며, LGPL을 경계할 수 있고, GNU General Public License(GPL)와 GNU General Public License(GPL)의 차이점에 대해 불분명합니다.
바이오닉은 Linux 커널과 함께 사용하는 C 라이브러리이며 libc, libdl 및 libm을 제공합니다(libpthread 기능은 libc의 일부이며 다른 시스템과 같이 별도의 라이브러리가 아닙니다).이는 BSD 커널이 필요하기 때문에 바이오닉이 코드를 공유하는 BSD C 라이브러리와 다릅니다.
당초의 목표
- BSD 라이선스:Google은 Android 애플리케이션을 카피레프트 라이선스의 영향에서 분리하여 독점적인 사용자 공간과 애플리케이션 [6]생태계를 구축하고자 했습니다.
- Android는 Linux 커널을 기반으로 하며, GNU General Public License(GPL) 버전 2의 적용을 받습니다.
- Linux 커널에 가장 널리 사용되는 표준 C 라이브러리는 GNU C 라이브러리(glibc)로, GNU Lesser General Public License(LGPL)의 적용을 받습니다.또, 카피레프트 라이센스이기도 합니다.GPL과는 대조적으로 LGPL은 명시적으로 동적 링크를 허용하지만 소스 코드나 링크 가능한 객체 파일을 제공하지 않는 한 독점 소프트웨어의 정적 링크는 허용하지 않습니다.
- 허가 BSD 라이선스는 양방향으로 호환되는 비복사 라이선스입니다.BSD 라이선스의 glibc 대체물은 카피레프트 코어(커널)와 비카피레프트 애플리케이션 사이의 절연층으로서 기능할 수 있기 때문에 구글은 바이오닉을 glibc [7]대체물로 선택했다.
- 스몰 사이즈:바이오닉은 GNU C 라이브러리보다 훨씬 작았고, 더 중요한 것은 메모리 요구 사항이 훨씬 낮았다(그리고 여전히).
- 속도: 바이오닉은 비교적 낮은 클럭 주파수의 CPU용으로 설계되었습니다.
지원되는 아키텍처
바이오닉은 Linux 커널만 지원하지만 현재는 Arm, arm64, x86 및 x86-64 아키텍처를 지원합니다.Android [8]Native Development Kit(NDK)는 NDK r16까지 armv5(아르메아비)를 계속 지원했지만, 플랫폼 자체는 마시멜로 이후 Neon을 탑재한 armv7을 필요로 했다.NDK는 Neon의 유무에 관계없이 armv7을 지원합니다.지금까지 플랫폼에서는 SH-4의 부분 지원이 있었지만 디바이스는 출하되지 않았으며 지원도 폐지되었습니다.NDK는 SH-4를 지원하지 않으며 R17에서는 MIPS 및 MIPS64 지원이 NDK에서 삭제되었습니다.
컴포넌트
stdio와 같은 libc 소스의 일부는 BSD(주로 OpenBSD)에서 온 것이며, pthread 구현과 같은 다른 부분은 처음부터 작성된 것입니다.
동적 메모리 할당기 구현은 시간이 지남에 따라 변경되었습니다.롤리팝 이전에는 Doug Lea의 dlmalloc이라는 단일 네이티브 메모리 할당기가 있었습니다.롤리팝과 마시멜로에는 dlmalloc과 jemalloc의 두 가지 구현이 있었습니다.jemalloc은 dlmalloc보다 훨씬 높은 성능을 제공하지만 부기에 필요한 추가 메모리가 필요합니다.대부분의 디바이스는 젬몰록을 사용했지만 저메모리 디바이스는 여전히 dlmalloc을 사용했습니다.Nougat부터 Android 10까지 모든 기기에서 jemalloc을 사용합니다.저메모리 디바이스에서는 tcache를 dlmalloc의 낮은 메모리 오버헤드와 거의 일치하도록 디세블로 하는 jemalloc의 "svelte" 구성을 사용합니다.Android 11에서는 대부분의 디바이스의 메모리 할당기가 Scudo로 바뀌어 보안 강화 [9]기능을 추가하기 위해 젬알록의 고성능을 일부 희생했습니다.단, 저메모리 디바이스는 여전히 젬알록을 [10]사용할 수 있습니다.
Nexus 9와 같은 일부 64비트 디바이스는 64비트 포인터와 2개의 접합자 호스팅의 추가 공간 요건 때문에 사실상 저메모리 디바이스입니다.(Zygote는 모든 Android 애플리케이션 프로세스의 모태가 되는 Android 시스템 서비스입니다.)[11]
libm 소스는 대부분 FreeB입니다.SD는 다양한 SoC 벤더가 제공하는 최적화된 어셈블러에 의해 제공됩니다.
다이내믹 링커(및 libdl)는 처음부터 작성되었습니다.
Bionic에는 libthread_db(gdbserver에서 사용)는 포함되어 있지 않지만 NDK는 포함되어 있습니다.Android 플랫폼에는 정적으로 링크된 gdbserver가 포함되어 있어 개발자는 오래된 디바이스에서도 최신 gdb를 사용할 수 있습니다.
Android에는 별도의 libpthread, libresolv 또는 librt가 없습니다.기능은 모두 libc로 되어 있습니다.libpthread의 경우 타사 코드의 첫 번째 명령이 실행되기도 전에 앱이 멀티 스레드 환경에 있기 때문에 단일 스레드 사례에 맞게 최적화하려는 시도는 없습니다.
Android 플랫폼은 C++ 표준 라이브러리용으로 libc++를 사용합니다(Lollipop 사용 stlport까지 제공).NDK는 지금까지 stlport와 GNU libstdc++를 제공했지만 NDK r18에서 [12]삭제되었습니다.Android 앱의 네이티브 코드가 C++를 사용하는 경우 모든 C++가 동일한 STL을 사용해야 합니다.STL은 Android OS에서 제공되지 않으므로 각 앱에 번들로 제공되어야 합니다.
POSIX와의 차이점
바이오닉은 C11과 POSIX를 모두 구현하는 것을 목표로 하고 있지만 libc에는 (Oreo 현재) 약 70개의 POSIX 기능이[13] 누락되어 있다.또한 패스워드 데이터베이스가 없기 때문에 Android에 적용할 수 없는 POSIX 기능(endpasswd / getpwent / setpwent family 。Oreo 현재 libm은 완료되었습니다.
일부 기능은 보안상의 이유로 의도적으로 POSIX 또는 C 표준을 준수하지 않습니다. 예를 들어 printf는%n
포맷 [14]문자열
가장 많이 사용되는 GNU 확장의 대부분은 다양한 BSD 확장과 마찬가지로 바이오닉으로 구현됩니다.
NDK와의 관계
플랫폼 코드는 Bionic을 직접 사용하지만 타사 개발자는 Android Native Development Kit(NDK)를 사용합니다.많은 서드파티 개발자들은 여전히 오래된 OS 릴리스를 목표로 하고 있으며, 이는 바이오닉이 많은 기능이 부족하다는 널리 알려진 믿음에 기여하고 있습니다.진저브레드는 libc에서 803개의 기능을 수출했지만 오레오는 1278개를 수출했다.[13]
이전에는 NDK와 플랫폼이 다른데 NDK r11 이후에서는 NDK 포크가 현재의 플랫폼과 동등한 것으로 대체되었습니다.이 작업은 처음에 GCC 및 Clang 컴파일러에 초점을 맞췄습니다.
NDK r14 이전에는 "통합" 헤더가 옵트인 기준으로 처음 제공되었을 때 NDK는 다른 API 수준의 플랫폼헤더 복사본을 포크하고 있었습니다.즉, 대부분의 NDK 사용자는 오래된 API 수준을 대상으로 하기 때문에 헤더 전용 수정(예를 들어 고정 또는 구조 정의에 대한 수정)을 사용할 수 없었지만 플랫폼 수정은 현재 플랫폼 헤더에만 적용되었습니다.Oreo 개발 기간 동안 플랫폼 헤더에 API 레벨 정보가 추가되어 모든 API 레벨에서 동일한 헤더 세트를 사용할 수 있으며 개발자의 목표 API 레벨에서 사용할 수 있는 기능만 볼 수 있습니다.이들은 이른바 '통합' 헤더로 NDK r15 이후 기본값이 되어 있습니다.
NDK r16 이전에 NDK는 libandroid_support.a라는 라이브러리를 libc++를 사용하여 코드에 링크했습니다.이는 이전 OS 릴리즈에는 없었던 libc++에 필요한 기능을 제공했습니다.이는 플랫폼에서 사용되는 코드와 동일하지 않으며 수많은 버그(libc++를 사용한 코드에서 printf 패밀리에 대한 위치 인수를 깨는 등)를 발생시켰습니다.NDK r16 libandroid_support.a에는 아직 존재하지만 현재는 플랫폼소스(NDK 구축 시점의 현재)에서 직접 구축되어 있습니다.
소스 강화
Android Jelly Bean MR1(4.2)에서 바이오닉은 glibc와 유사한 기능을 지원합니다._FORTIFY_SOURCE
안전하지 않은 문자열과 메모리가 기능하는 기능입니다([15]예:strcpy()
,strcat()
,그리고.memcpy()
)에는 버퍼 오버런 체크가 포함되어 있습니다.이러한 체크는 컴파일 시에 버퍼 사이즈를 결정할 수 있는 경우는 컴파일시에, 그렇지 않은 경우는 런타임에 실행됩니다.fortify는 libc의 런타임 지원에 의존하기 때문에 이전 Android 릴리스로의 이식성은 제한됩니다.[16]플랫폼 자체에는_FORTIFY_SOURCE
가능한.
역사적으로 fortify의 단점 중 하나는 GCC와 밀접하게 연계되어 있기 때문에 Clang과 같은 다른 컴파일러에서 잘 지원하기가 매우 어렵습니다.이는 안드로이드가 기본 [17]컴파일러인 Clang으로 전환했을 때 Bionic의 강화 구현이 상당히 유용하지 않게 되었다는 것을 의미합니다.Android Oreo(8.0)에서는 Bionic의 요새화가 Clang을 염두에 두고 정비되어[18] Clang을 요새화함으로써 GCC에서의 요새화와 동등한 경험을 얻을 수 있었습니다.이 오버홀 이후 glibc의 위와 그 너머에 몇 가지 체크가 추가되어 정의되지 않은 동작을 일으키지는 않지만 명백히 잘못된 코드를 포착했습니다.이 새로운 구현에서는 이전 버전보다 더 많은 libc 지원이 필요하지 않기 때문에 Clang 고유의 확장 기능은 Oreo 이전 버전의 Android를 대상으로 하는 애플리케이션에 사용할 수 있습니다.
논쟁
바이오닉을 만들기 위해 구글은 GPLv2 라이선스 Linux 커널 헤더 파일을 사용했습니다.구글은 GPL을 없애기 위해 헤더 파일을 저작권이 있는 저작물에서 삭제해 저작권이 없는 "사실"[19][20]로 만들었다고 주장했다.Linux의 제작자인 Linus Torvalds는 구글의 행동을 [20]용인할 수 있다고 생각했지만, 예를 들어 휴스턴 대학 법률 [21]센터의 법학과 교수인 Raymond Nimmer에 의해 GPL에 대한 구글의 해석에 이의를 제기해 왔다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Announcing the Android 1.0 SDK, release 1". September 9, 2008. Archived from the original on September 19, 2015. Retrieved September 21, 2012.
- ^ a b "Android Anatomy and Physiology" (PDF). Google I/O. 2008-05-28. Archived from the original (PDF) on 2016-04-08. Retrieved 2014-05-23.
- ^ "Android's C Library Has 173 Files of Unchanged OpenBSD Code". Retrieved 8 October 2018.
- ^ Burnette, Ed (June 4, 2008). "Patrick Brady dissects Android". ZDNet.
- ^ Turner, David (2009-02-07). "Questions about Bionic".
The name "Bionic" comes from the fact that it is part-BSD and part-Linux: its source code consists in a mix of BSD C library pieces with custom Linux-specific bits used to deal with threads, processes, signals and a few others things.
- ^ Android Anatomy and Physiology (PDF), p. 36, archived from the original (PDF) on 2016-04-08, retrieved 2017-07-15,
License: we want to keep GPL out of user-space
- ^ Florian Mueller. "FOSS Patents".
- ^ "Android 6.0 Compatibility Definition".
- ^ "System hardening in Android 11". Android Developers Blog. Retrieved 2020-12-20.
- ^ "Scudo". Android Open Source Project. Retrieved 2020-12-20.
- ^ "Zygote". Anatomy of Android. Archived from the original on 2016-03-15. Retrieved 2016-03-14.
- ^ "NDK Revision History Android NDK".
- ^ a b "Android bionic status".
- ^ Elliott Hughes. "libc: #define to remove support for %n from printf(3)?".
- ^ "Jelly Bean". Android Developers. android.com. Retrieved 2013-12-27.
- ^ "Android 4.2 and FORTIFY_SOURCE". Android Security Discussions. Retrieved 2013-12-27.
- ^ "Android NDK changelog". Android NDK. android.googlesource.com. Retrieved 2017-08-28.
- ^ "FORTIFY in Android". Android Developers Blog. android-developers.googleblog.com. Retrieved 2017-08-28.
- ^ Google Android 및 theregister.com의 Linux 헤더(2011년)
- ^ a b 안드로이드: Wayback Machine에서 Linux Archived 2016-01-13이 아닌 Microsoft가 소송을 제기하여 "Microsoft가 새로운 Android 소송 출시, Linux 커널 헤더와 Android에 대한 Linus Torvalds의 대응" (2011년 3월 21일)
- ^ Raymond Nimmer(2011)의 ipinfoblog.com 카피레프트 플랫폼 개발 시 침해 및 공개 리스크