bionic
「bionic」の意味・「bionic」とは
「bionic」とは、生物学的な機能や構造を人工的に模倣または強化したものを指す英語の形容詞である。この言葉は、生物学(biology)と電子工学(electronics)の組み合わせから生まれた造語である。例えば、人間の身体の一部を補完または強化するための人工的な装置や、生物の機能を模倣したロボットなどを「bionic」と表現することができる。「bionic」の発音・読み方
「bionic」の発音は、IPA表記では /baɪˈɒnɪk/ となる。IPAのカタカナ読みでは「バイオニック」、日本人が発音するカタカナ英語では「バイオニック」と読む。この単語は発音によって意味や品詞が変わるものではない。「bionic」の定義を英語で解説
「bionic」は、"relating to or denoting an artificial body part or device that mimics or enhances a biological function or structure"と定義される。つまり、生物の機能や構造を模倣または強化する人工的な身体部位や装置に関連するという意味である。「bionic」の類語
「bionic」の類語としては、「cybernetic」や「robotic」がある。これらの単語も、人間の身体や機能を人工的に模倣または強化するという概念を表す。「bionic」に関連する用語・表現
「bionic」に関連する用語としては、「bionic limb」(バイオニックリム)や「bionic eye」(バイオニックアイ)などがある。これらは、それぞれ人工的に作られた肢体や視覚装置を指す。「bionic」の例文
1. He lost his leg in an accident, but now he can walk again with a bionic limb.(彼は事故で足を失ったが、バイオニックリムにより再び歩くことができるようになった。)2. The bionic eye allows the blind to see again.(バイオニックアイは、視覚を失った人々が再び見ることを可能にする。)
3. The bionic technology has greatly improved the quality of life for many disabled people.(バイオニック技術は、多くの障害者の生活の質を大幅に向上させている。)
4. The bionic arm can mimic the movements of a real arm.(バイオニックアームは、実際の腕の動きを模倣することができる。)
5. The bionic suit helps the elderly to move more easily.(バイオニックスーツは、高齢者がより容易に動くのを助ける。)
6. The bionic heart is a breakthrough in medical technology.(バイオニックハートは医療技術の画期的な進歩である。)
7. The bionic ear enables deaf people to hear sounds.(バイオニックイヤーは、聴覚を失った人々が音を聞くことを可能にする。)
8. The bionic hand can grip objects just like a real hand.(バイオニックハンドは、実際の手と同じように物をつかむことができる。)
9. The bionic leg allows the amputee to run again.(バイオニックレッグは、切断者が再び走ることを可能にする。)
10. The bionic skin can sense touch just like real skin.(バイオニックスキンは、実際の肌と同じように触感を感じることができる。)
Bionic
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/09/24 08:40 UTC 版)
![]() |
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2025年9月)
|
Bionicは、Googleが開発したAndroidオペレーティングシステム (OS) 用標準Cライブラリ実装である。このライブラリはGNU Cライブラリ (glibc) とは違い、一般的Linuxシステムよりも少ないメモリや低性能なプロセッサを搭載するデバイス向けに設計されている。Bionicは新規のコードと、BSDライセンスに基づきリリースされたFreeBSD、NetBSDおよびOpenBSDから取り込んだコードとを組み合わせたものである。静的リンクが一般的だったAndroid初期の時点においては、コードがglibcが利用するGNU Lesser General Public Licenseではなく、BSDライセンスに基づくことが重要であった。なぜならBionicは独自のアプリケーションバイナリインタフェース (ABI) を持っているため、既存のアプリを壊さないと標準CライブラリをBionicへ置き換えられないからである。
BionicはLinuxカーネルと共に使用するためのCライブラリであり、libc、libdl、そしてlibmを提供する(libpthreadの機能はlibcの一部で、他のシステムのように独立したライブラリではない)。BSD libcとBionicはコードを共有するが、BSDカーネルを必要とする点がBionicと異なる。
当初の目標
Bionicについて公表された当初の目標を以下に示す[1][2]:
- BSDライセンス:Googleはプロプライエタリなユーザー空間とアプリによるエコシステムを作成するために、コピーレフトなライセンスをAndroidから排除することを望んでいた[3]。しかし:
- AndroidのベースはLinuxカーネルだが、これはコピーレフトなライセンスであるGNU General Public License (GPL) バージョン2に従う。
- 最も普及しているLinuxカーネル用標準CライブラリはGNU Cライブラリ (glibc) だが、これもコピーレフトなライセンスのGNU Lesser General Public License (LGPL) に従う。LGPLはGPLに比べて明示的に動的リンクを許可してはいるが、ソースコードやリンク可能なオブジェクトファイルを提供しないプロプライエタリソフトウェアとの静的リンクは許可していない。
- パーミッシブなBSDライセンスはコピーレフトなライセンスではないが、コピーレフトなライセンスと双方向で互換性がある。glibcのBSDライセンスによる代替物は、コピーレフトであるコア(カーネル)とコピーレフトではないアプリとの間に存在する層の役目を果たすことが可能なため、GoogleはBionicをglibcの代替として選んだ[4]。
- 小サイズ:BionicのサイズはGNU Cライブラリと比べ小さい。必要なメモリが少ないことは現在でも重要である。
- 速度:Bionicは比較的低いクロック周波数のCPU向けに設計された。
サポートするアーキテクチャ
BionicはLinuxカーネルのみをサポートするが、現時点でサポートするアーキテクチャはarm、arm64、riscv64、x86、およびx86-64である。Androidプラットフォーム自体はMarshmallow以降、NEON搭載のarmv7が必要[5]だが、Android Native Development Kit (NDK) はr16までarmv5(通称armeabi)のサポートを続けていた。armv7のサポートは続いているが、r24からNEONを搭載していないarmv7のサポートは中止された。Androidプラットフォームは歴史的に一部のSH-4をサポートしていたが、SH-4を搭載したデバイスが出荷されたことがないためこのサポートは削除された。NDKではSH-4のサポートは一切なく、MIPSおよびMIPS64のサポートはr17でNDKから削除された。
コンポーネント
stdioなどlibcソースの部分のいくつかはBSD(主にOpenBSD)発祥であるが、pthread実装などそれ以外の部分はスクラッチで書かれた。
動的メモリアロケータの実装は時代と共に変化していった。Lollipopより前は単一のネイティブメモリアロケータである、Doug Leaのdlmallocが存在し、LollipopからMarshmallowまではdlmallocとjemallocという2つの実装が存在した。jemallocはdlmallocより高いパフォーマンスを提供するが、代償としてブックキーピング用として余分なメモリが必要となる。ほとんどのデバイスがjemallocを利用したが、低メモリデバイスでは依然としてdlmallocを利用した。NougatからAndroid 10に掛けて、全てのデバイスがjemallocを利用するようになった。低メモリデバイスではjemallocの "svelte" 設定を利用してtcacheを無効にすることで、jemallocの速度をほとんど維持しつつもdlmallocの低メモリオーバーヘッドへうまく適合させられる。Android 11で、ほとんどのデバイス向けメモリアロケータはScudoに置き換えられた。これはjemallocの高パフォーマンスをある程度犠牲にして、セキュリティ強化機能を追加したものである[6]。しかしながら、低メモリデバイスでは未だにjemallocの利用が許可されている[7]。
Nexus 9など64ビットデバイスの中には、64ビットポインタの追加スペース要求と2つのZygote(Zygoteは全てのAndroidアプリプロセスの親となる、Androidシステムサービスのこと[8])のホスティングにより、実質的に低メモリデバイスとなるものもある。
libmソースは主にFreeBSD発祥であるが、様々なSoCベンダーからの寄付による最適化されたアセンブラが搭載されている。
動的リンカ(およびlibdl)はスクラッチで書かれた。
Bionicにはlibthread_db(gdbserverにより使用される)が含まれていないが、NDKには含まれていた。Androidプラットフォームには静的リンクされたgdbserverが含まれていたため、開発者は古いデバイスでも最新のgdbを利用できた。ただしAndroidはgdbサポートを中止しLLDBに切り替えたため、libthread_dbとAndroidの関係は最早ない。
Androidにおいてlibpthread、libresolv、およびlibrtは独立しておらず、それらは全てlibc内の機能である。libpthreadについては、サードパーティー製コードの最初の命令の実行前から既にアプリはマルチスレッド環境内に存在するため、シングルスレッド状態向けに最適化が試みられることは一切ない。
Androidプラットフォームは標準C++ライブラリとしてlibc++を使用する(Lollipopを含むリリースまではstlportを使用)。NDKでは歴史的にstlportとGNU libstdc++を提供していたが、NDK r18よりそれらは削除された[9]。Androidアプリ内でネイティブコードがC++を使用する場合、全てのC++が同じSTLを使用する必要があることに注意すること。AndroidはオペレーティングシステムがSTLを提供しないので、アプリ一つ一つにSTLをバンドルする必要がある。
POSIXとの相違点
BionicはC11とPOSIXの全てを実装することを目標としているが、(Android 15時点において)libcのPOSIX関数のうち約11個が未だに存在しない[10] 。endpwent/getpwent/setpwentファミリーなどのPOSIX関数は存在こそしているが、passwdデータベースが欠落しているためAndroidには適用できない。libm実装はOreo時点で完了した。
セキュリティ上の理由から、POSIXや標準Cライブラリの実装へ意図的に従わない関数も存在する。例えばprintfでは%n
書式指定文字列をサポートしていない[11]。
Bionicには最も利用されるGNU拡張はほとんど実装されており、同様に様々なBSD拡張も実装されている。
NDKとの関係
AndroidプラットフォームのコードはBionicを直接使用するが、サードパーティーの開発者はAndroid Native Development Kit (NDK) を使用する。サードパーティーの開発者の大半は未だに古いOSを対象としているため、Bionicには多くの機能が欠落していると思い込んでしまっている。Gingerbreadはlibcから803個の関数がエクスポートされたが、Oreoでは(1.6倍増の)1278個の関数がエクスポートされた[10]。
歴史的にNDKとAndroidプラットフォームは分離されていたが、NDK r11以降、NDKフォークはその時点で最新のAndroidプラットフォーム相当なものへ置き換えられている。この作業は当初、GCCやClangコンパイラに焦点が当てられていた。
「統一された」ヘッダがオプトインを原則として最初に提供されたNDK r14以前、NDKが持つフォークされたプラットフォームヘッダのコピーはAPIレベルが異なっていた。これはNDKユーザーのほとんどがヘッダファイルのみの修正(例えば定数や構造体の定義の修正など)を利用できないことを意味していた。なぜなら彼らは古いAPIレベルを対象としているのに、プラットフォームの修正はその時点で最新のプラットフォーム向けヘッダにしか入っていないからである。Oreo開発期間中にプラットフォームのヘッダへAPIレベル情報がアノテーションされたことで、全てのAPIレベルで同じヘッダ群が利用可能となり、開発者が対象とするAPIレベルで利用可能な関数のみが表示されるようになった。これらがいわゆる「統一された」ヘッダで、NDK r15以降ではデフォルトとなっている。
NDK r16より前、NDKはlibc++を使うコードにlibandroid_support.aと呼ばれるライブラリをリンクしていた。これは古いOSリリースには存在しないがlibc++には必要な関数を提供するためである。libandroid_support.aがリンクされたコードはプラットフォームで使われるコードと同じではないため、多くのバグ(libc++を使用する任意のコードでprintfファミリの位置引数が壊れるなど)をもたらすこととなった。NDK r16からr25までlibandroid_support.aはまだ存在していたが、NDKのビルド時点で最新のプラットフォームのソースから直接ビルドされるようになった。NDK r26以降よりlibandroid_support.aは存在しなくなったが、これはNDKによりサポートされているOSバージョン全てで、libc++が必要な全てのものが含まれるようになったためである。
ソースの要塞化
Android Jelly Bean MR1 (4.2) 以降より、Bionicはglibcの_FORTIFY_SOURCE
と類似した機能をサポートする[12]。これは安全でない文字列やメモリ関数(strcpy()
、strcat()
、およびmemcpy()
など)にバッファオーバーランのチェックを含める機能である。このチェックはバッファサイズをコンパイル時に決められる場合はコンパイル時に、そうでない場合はランタイムで行われる。要塞化はlibcによるランタイムサポートに依存するので、古いAndroidリリースへの移植性には制限がある[13]。プラットフォーム自体は_FORTIFY_SOURCE
を有効にしてビルドされている。
歴史的に要塞化の欠点の1つは、それがGCCと密接に結び付いていたことであったため、ClangなどGCC以外のコンパイラのサポートがとても困難であった。このことはAnrdoidがデフォルトのコンパイラをClangに切り替えた際[14]、Bionicの要塞化実装の有用性が大幅に低下することを意味していた。Android Oreo (8.0) において、Bionicの要塞化はClangを念頭に置いてオーバーホールされ[15]、Clang上の要塞化はGCC上のそれとほぼ互角な体験を提供するようになった。このオーバーホールによりglibcを上回るチェックが追加されたため、未定義な振る舞いを引き起こすとは限らなくとも明らかに誤ったコードを検出するようになった。新しい実装はlibcのサポートを以前より必要としなくなったため、Clang独自の強化はOreo以前のAndroidバージョンを目標としたアプリで利用可能となった。
論争
Bionicの作成のため、GoogleはGPLv2でライセンスされたLinuxカーネルのヘッダファイルを使用した。GoogleはGPL排除のため、ヘッダファイルからGPLで保護された部分を取り除き、それらをGPLで保護されない「事物」にしたと主張した[16][17]。Linux創設者であるリーナス・トーバルズはGoogleの行動は受け入れられると主張した[17]が、ヒューストン大学ロー・センターのレイモンド・ニマー教授[18]などはGoogleによるGPLの解釈に異議を唱えている。
関連項目
脚注
- ^ Burnette, Ed (2008年6月4日). “Patrick Brady dissects Android”. ZDNet. 2025年9月24日閲覧。
- ^ Turner, David (2009年2月7日). “Questions about Bionic”. 2025年9月24日閲覧。 “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, p. 36, オリジナルの2016-04-08時点におけるアーカイブ。 2017年7月15日閲覧, "License: we want to keep GPL out of user-space"
- ^ Florian Mueller. “FOSS Patents”. 2025年9月24日閲覧。
- ^ “Android 6.0 Compatibility Definition”. 2025年9月24日閲覧。
- ^ “System hardening in Android 11” (英語). Android Developers Blog. 2020年12月20日閲覧。
- ^ “Scudo” (英語). Android Open Source Project. 2020年12月20日閲覧。
- ^ “Zygote”. Anatomy of Android. 2016年3月15日時点のオリジナルよりアーカイブ。2016年3月14日閲覧。
- ^ “NDK Revision History | Android NDK”. 2025年9月24日閲覧。
- ^ a b “Android bionic status”. 2025年9月24日閲覧。
- ^ Elliott Hughes. “libc: #define to remove support for %n from printf(3)?”. 2025年9月24日閲覧。
- ^ “Android 4.2 Jelly Bean Release Notes”. Android Developers. android.com. 2013年12月27日閲覧。
- ^ “Android 4.2 and FORTIFY_SOURCE”. Android Security Discussions. 2013年12月27日閲覧。
- ^ “Android NDK changelog”. Android NDK. android.googlesource.com. 2017年8月28日閲覧。
- ^ “FORTIFY in Android”. Android Developers Blog. android-developers.googleblog.com. 2017年8月28日閲覧。
- ^ Google android and the linux headers - The Register (2011)
- ^ a b Android: Sued by Microsoft, not by Linux Archived 2016-01-13 at the Wayback Machine. "Microsoft launches new Android suit, Linus Torvalds' take on Linux kernel headers and Android" - ITworld (March 21, 2011)
- ^ Infringement and disclosure risk in development on copyleft platforms on ipinfoblog.com by Raymond Nimmer (2011)
外部リンク
- bionicのページへのリンク