Opensource Android
Upcoming SlideShare
Loading in...5
×
 

Opensource Android

on

  • 27,290 views

「オープンソースなAndroid」

「オープンソースなAndroid」
~ソースが公開されたAndroidをどのように活用するか~

Statistics

Views

Total Views
27,290
Slideshare-icon Views on SlideShare
25,509
Embed Views
1,781

Actions

Likes
3
Downloads
156
Comments
0

9 Embeds 1,781

http://d.hatena.ne.jp 1587
http://www.slideshare.net 159
http://s.deeeki.com 18
http://webcache.googleusercontent.com 5
http://74.125.153.132 4
http://www.slideee.com 3
http://d.hatena.ne.jp:80 2
http://150.gmodules.com 2
http://59.106.108.77 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Opensource Android Opensource Android Presentation Transcript

    • オープンソースなAndroid オ プンソ スなA d id ~ソースが公開されたAndroidを どのように活用するか~ 京都マイクロコンピュータ 小林哲之 1
    • はじめに 年 • 2008年10月22日についにAndroidのソース コードが公開されました。 • Androidに関してはさまざまなトピックがありま すが、今日はソースコードを主題とします。 すが 今日はソ スコ ドを主題とします • 内容は発表者個人の主観に基づいています。 • 正確性については「無保障」です。 ☺ 2
    • Who am I? Who am I? • 組み込み 筋 十年 組み込み一筋N十年。 – リアルタイムOS iTRON – 組み込み向けJava実行環境 – 組み込み向けLinux 組 込 向け – gcc クロスコンパイルツール • ブログ 「組み込みの人 」 「組み込みの人。」 – http://d.hatena.ne.jp/embedded/ • 京都マイクロ ンピ 京都マイクロコンピュータ 2008年3月入社 タ 年 月入社 – http://www.kmckk.co.jp/ 3
    • 本日お話すること Androidの概要について • ソースの概要について • ソ ソースから読み取れること 読 取れる • ソースの活用方法 • まとめ • 4
    • Androidの概要に いて • Androidの概要について 5
    • Androidとは 社が主導 た携帯電話 • Google社が主導で開発した携帯電話用ソフト ウェアプラットフォーム。 • 2008年11月にHTC社からAndroid搭載の携帯 電話 “G1” が発売されました。 G1 が発売されました 6
    • 出典: http://ja.wikipedia.org/wiki/Android_(%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0) 7
    • Androidプラットフォームの構造 ブラウザ ラウザ GoogleMAP 各種アプリケーション メール ・・・ Java仮想マシン(Dalvik VM) libc Webkit 各種ミドルウェア SQLite OpenGL EL ・・・ Linux Kernel 携帯電話H/W
    • Androidプラットフォームの構造 ブラウザ 各種アプリケーション GoogleMAP Java メール Code ・・・ Java仮想マシン(Dalvik VM) libc Webkit 各種ミドルウェア SQLite ARM OpenGL EL Code ・・・ Linux Kernel 携帯電話ハードウェア
    • Androidプラットフォ ムの構造 Androidプラットフォームの構造 シミュレータの場合 ブラウザ 各種アプリケーション GoogleMAP Java メール Code ・・・ Java仮想マシン(Dalvik VM) libc Webkit 各種ミドルウェア SQLite ARM OpenGL EL Code ・・・ Linux Kernel QEMUシミュレータ x86 Code Windows 
    • プラットフォームとしての特徴 • オ プンソ ス オープンソース – 殆ど全てのソースコードが開示されました カ ネルのみを使用 • Linuxカーネルのみを使用 – libcやルートファイルシステムは、通常の組み込みLinuxで 使われている物と異なる • アプリケーションレイヤはJavaで開発 – ネイティブコ ドで記述されたミドルウ アと 上位アプリ ネイティブコードで記述されたミドルウェアと、上位アプリ ケーションの分離 QEMUシミュレ タの採用 • QEMUシミュレータの採用 – PC上でARM CPUのバイナリ互換を実現
    • • ソースの概要について ソ スの概要に いて 12
    • ソースのある場所 • ここ – http://source.android.com/ p // / • gitとそのラッパースクリプト(repo)を使用して ソースをダウンロードする。 ソ スをダウンロ ドする – Googleのアカウント(GMAIL)が必要。無償。 • ブラウザで閲覧するならここ – http://git source android com/ http://git.source.android.com/ 13
    • 何が含まれている? d id S を再ビルドに必要なものが全て • Android SDKを再ビルドに必要なものが全て。 • Linux カーネル、デバイスドライバ、標準Cライブラリ、 コンパイラツールチェイン、Dalvik VM、2D/3Dグラフィッ コンパイラツ ルチ イン D l ik VM 2D/3Dグラフィッ クライブラリ、コーデック、アプリケーションフレーム ワ ク、webkit(WEBブラウザ)、 ワーク webkit(WEBブラウザ) .... • ただし、MAPアプリケーションは含まれていない。 HTC G1のソース? (デフォルトではダウンロードされないがリポジトリに存 • 在する。けっこう頻繁に更新。) – kernel/msm.git – platform/hardware/msm7k.git – platform/vender/htc/dream.git 14
    • 全てのソースがあるのか? • コンパイラツールチェインと一部のライブラリ はバイナリで入っている。 – $(TOP)/prebuilt 以下 • それらをリビルドするために必要なソ スの それらをリビルドするために必要なソースの ありかが明記されている。 – 各ディレクトリのREBUILTというファイルに 15
    • 全部で何行? • ダウンロードしたファイルのうち、ファイル名の 末尾が .c .h .cpp .S .java のものだけを選んで pp j wc –l でカウントすると 約1600万行。 • このうちLinux kernelのソ スコ ドを除くと kernelのソースコードを除くと 約770 万行。 • 詳細は http://d.hatena.ne.jp/embedded/20081127/p1 16
    • Androidでの新規ソースは? たくさ プ 成 • Androidではたくさんのオープンソースの成果 を利用している。 • では、Androidで新規に起こされたファイルは どのくらいの規模か? • /Copyright.*Android/ というパターンのある ファイルだけを集計すると約160万行。 • 詳細 http://d.hatena.ne.jp/embedded/20081130/p1 17
    • ライセンス条件は? • 基本 基本はApache 2.0 • 多数のオープンソースの成果を利用している 多数のオ プンソ スの成果を利用している ので、それはそれぞれのライセンス条件 • モジ モジュールごとに MODULE_LICENSE_*** とい ルごとに *** とい うファイルがあり、簡単に確認できるように整 備されている。 • また それぞれライセンス表示のための また、それぞれライセンス表示のための NOTICEというファイルがおかれている。 18
    • $ find . -name quot;MODULE_LICENSE_*“ ./system/extras/showmap/MODULE_LICENSE_APACHE2 ./system/extras/showslab/MODULE_LICENSE_APACHE2 ./system/extras/librank/MODULE_LICENSE_APACHE2 ./system/extras/procrank/MODULE_LICENSE_APACHE2 /system/extras/procrank/MODULE LICENSE APACHE2 ./system/extras/latencytop/MODULE_LICENSE_APACHE2 ... $ fi d . -name quot; find quot;MODULE_LICENSE_*quot; | d ' ^ */ *quot; |sed 's,^.*/,, ' |sort |uniq -c |sort -r 117 MODULE_LICENSE_APACHE2 24 MODULE_LICENSE_BSD_LIKE 11 MODULE_LICENSE_BSD 10 MODULE_LICENSE_GPL 9 MODULE_LICENSE_EPL 7 MODULE LICENSE LGPL MODULE_LICENSE_LGPL 4 MODULE_LICENSE_PUBLIC_DOMAIN 4 MODULE_LICENSE_LGPL_AND_GPL 2 MODULE_LICENSE_CPL 1 MODULE_LICENSE_W3C 1 MODULE_LICENSE_OSL1 1 MODULE_LICENSE_MIT 1 MODULE LICENSE HP MODULE_LICENSE_HP 1 MODULE_LICENSE_AFL_AND_GPL 19
    • ちなみにGPLのものは $ find . -name quot;MODULE_LICENSE_*quot; |grep GPL ./external/iptables/MODULE_LICENSE_GPL ./external/elfcopy/MODULE_LICENSE_GPL ./external/jdiff/MODULE_LICENSE_LGPL ./external/jdiff/MODULE LICENSE LGPL ./external/yaffs2/MODULE_LICENSE_GPL ./external/qemu/MODULE_LICENSE_GPL ./external/webkit/WebCore/MODULE_LICENSE_LGPL ./external/dbus/MODULE_LICENSE_AFL_AND_GPL ./external/dbus/MODULE LICENSE AFL AND GPL ./external/oprofile/MODULE_LICENSE_GPL ./prebuilt/windows/sdl/MODULE_LICENSE_LGPL ./prebuilt/windows/ccache/MODULE_LICENSE_GPL ./p ebu t/da w ./prebuilt/darwin-x86/sdl/MODULE_LICENSE_LGPL 86/sd / O U CS G ./prebuilt/darwin-x86/toolchain/i686-apple-darwin8- 4.0.1/MODULE_LICENSE_LGPL_AND_GPL ./prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/MODULE_LICENSE_LGPL_AND_GPL ./prebuilt/darwin-x86/ccache/MODULE_LICENSE_GPL /p / / / ./prebuilt/darwin-x86/make/MODULE_LICENSE_GPL ./prebuilt/common/jfreechart/MODULE_LICENSE_LGPL ./prebuilt/common/swing-worker/MODULE_LICENSE_LGPL ./prebuilt/common/netbeans-visual/MODULE_LICENSE_GPL /p / / / ./prebuilt/linux-x86/sdl/MODULE_LICENSE_LGPL ./prebuilt/linux-x86/toolchain/i686-linux-gnu- 3.4.6/MODULE_LICENSE_LGPL_AND_GPL ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/MODULE_LICENSE_LGPL_AND_GPL /p / / / / ./prebuilt/linux-x86/ccache/MODULE_LICENSE_GPL 20
    • ビルドのしかた ( b t ) M OS(i t l)でのビルドがサポ トされ • Li Linux (ubuntu), MacOS(intel)でのビルドがサポートされ ている。 – http://source.android.com/download – 他に必要なライブラリ – sudo apt‐get install zlib1g‐dev libncruses5‐dev unzip • 手軽な方法 – VMWare 上にubuntu 8 04 i386をクリ ンインスト ル 8.04 i386をクリーンインストール – 無料のVMWare player利用可能 – ビルド時間 40分くらい? 0分くらい • 困った時はネットで検索。☺ • make sdk でSDK一式が再ビルド。 21
    • ビルドのTips ド 表 • make showcommands でコマンドライン表示 • ccache を使うためには環境変数 ccache を使うためには環境変数 USE_CCACHE=1 環境ではデフ ルト設定が無難 • VMWare環境ではデフォルト設定が無難 (512MBメモリ、プロセッサ1個) • make sdk – JDK6でなくJDK5でないとjavadocでエラ になる JDK6でなくJDK5でないとjavadocでエラーになる 22
    • 移植性? • タ ゲットCPUはARMのみだ たが 2008年12月のアッ ターゲットCPUはARMのみだったが プデートでx86向けのビルドが追加された。 – armv5t (ARM926以降、Xscale) armv5t (ARM926以降、Xscale) • パス名に’arm’を含むファイルが多いもの bionic – dalvik – external/opencore – external/sonivox – external/qemu – external/openssl – • これらの移植に目途がつけば、他のCPUでもいけそう。 23
    • 移植性?: Bionic 移植性?: Bionic • 標準ライブラリとランタイムロ ダ 標準ライブラリとランタイムローダ – libc, libm, libdl, libthread_db, linker • F BSD O FreeBSD, OpenBSD, NetBSDからのファイルをベー BSD N tBSDからのファイルをベ スにしているようだ。 • アセンブラで書いてあるのは – カーネルのシステムコール呼び出し部分 – memcpyなどのアセンブラ版 • 現在はARM,x86用のものしかないが、同じように *BSDから持ってくれば他のCPU用のものも準備 BSDから持ってくれば他のCPU用のものも準備 できそう。 24
    • 移植性?: Dalvik VM 移植性?: Dalvik VM ドのインタプリタが何種類か用意され • DXコードのインタプリタが何種類か用意され ている。 – 高速版 (アセンブラで書かれている) – 移植用 (Cで書かれている) ( – デバッグ用、プロファイル用 • それ以外のARM依存ファイルはABIを定義し ているファイルのみ。 • とりあえずC版インタプリタを使えば移植は簡 単? 25
    • 互換性テスト • 各モジュールに単体テスト用のファイルらしき ものがあるが、システム全体に渡る互換性は ものがあるが システム全体に渡る互換性は どうなるのだろう... ? どうなるのだろう ? • キラーアプリ、キラーデバイスによるデファク キラ アプリ、キラ デバイスによるデファク トスタンダード? • サブセット化OK? 26
    • ここまでの感想 • 「本当に 全部のソ スが公開された 「本当に」全部のソースが公開された。 – iPhone との最大の違い。 • 扱いやすいライセンス。 • 用途は携帯電話に限定されない。 用途 携帯電話 限定されな 。 • まさに、Google 太っ腹!ここから直接収益を上 げることは全く考えていないようだ。「どうぞ、 げることは全く考えていないようだ。「どうぞ 使ってください」という感じ。 • 組み込みLinuxのメジャーなディストリビューショ 組み込みLinuxのメジャ なディストリビュ ショ ンになるかも。 27
    • • ソースから読み取れること ソ スから読み取れる と 28
    • Bionic(標準Cライブラリ) 制約事 • CAVEATS(制約事項) – $(TOP)/bionic/libc/CAVEATS $( )/ // – 基本はPOSIX準拠だが... – C++の例外をサポ トしない 組み込みシステム C++の例外をサポートしない。組み込みシステム ではひどく遅いコードになるから。 h dのキ ンセル機能はサポ トしない – pthreadのキャンセル機能はサポートしない。 – ロケールやワイドキャラクタはサポートしない。国 際化対応には代わりにICUを使う。 29
    • AndroidでのC++プログラミングの制限 • 例外は使用できない 例外は使用できない。 – newはmallocと同等。 – メモリがないときはNULLを返す。 • 実行時型情報は使用できない。 – type_info は空実装。 – pure virtual functionは使用できない。 • STL(標準テンプレートライブラリ)は使用できない。 – Vector.h, List.h はframeworks/base/include/utils にある。 • コンパイル時にはオプション –fno‐exceptions – fno‐rtti をつける。 30
    • libstdc++ の中身はたったこれだけ libstdc++ の中身はたったこれだけ。 $ nm -C out/target/product/generic/symbols/system/lib/libstdc++.so |grep ' [TDRB] ' 000019dd T type_info::type_info(type_info const&) 000019a5 T type_info::type_info() type info::type info() 000019dd T type_info::type_info(type_info const&) 000019a5 T type_info::type_info() 000019f5 T type_info::~type_info() 00001a19 T type_info::~type_info() 00001a19 T type_info::~type_info() i i 000019bd T type_info::name() const 000019d9 T type_info::before(type_info const&) const 000019d1 T type_info::operator==(type_info const&) const 000019d5 T type_info::operator!=(type_info const&) const 00001a30 R std::nothrow 00002000 D vtable for type_info 0000192d T operator delete[](void*) 0000190d T operator delete[](void*, std::nothrow_t const&) 0000193d T operator delete(void ) delete(void*) 0000191d T operator delete(void*, std::nothrow_t const&) 00001965 T operator new[](unsigned int) 0000194d T operator new[](unsigned int, std::nothrow_t const&) 00001971 T operator new(unsigned int) 00001959 T operator new(unsigned int, std::nothrow_t const&) t ( i dit td th t t) 0000189d T __cxa_guard_abort 000018d9 T __cxa_guard_acquire 000018b5 T __cxa_guard_release 0000197d T __cxa_pure_virtual __ _ _ $ 31
    • ダイナミックリンク • linker – ld.so ではない。Android 新規設計。 – libdlの機能はある。 dlsym, dlopen • prelink (apriori) prelink (apriori)  – ライブラリを固定アドレスにマッピング • build/core/prelink linux arm map build/core/prelink‐linux‐arm.map – 実行ファイル(executable)はprelinkしてない – 起動高速化というより共有メモリの効率化のため? • stripコマンドの代わりにsoslimコマンド 32
    • 各ライブラリの配置アドレス $ cat build/core/prelink-linux-arm.map # 0xC0000000 - 0xFFFFFFFF Kernel # 0xB0100000 - 0xBFFFFFFF Thread 0 Stack # 0xB0000000 - 0xB00FFFFF Linker # 0xA0000000 - 0xBFFFFFFF Prelinked System Libraries # 0x90000000 - 0x9FFFFFFF Prelinked App Libraries # 0x80000000 - 0x8FFFFFFF Non-prelinked Libraries i i i # 0x40000000 - 0x7FFFFFFF mmap'd stuff # 0x10000000 - 0x3FFFFFFF Thread Stacks # 0x00000000 - 0x0FFFFFFF .text / .data / heap # core system libraries libdl.so 0xAFF00000 libc.so 0xAFE00000 libstdc++.so 0xAFD00000 libm.so libm so 0xAFC00000 liblog.so 0xAFBC0000 libcutils.so 0xAFB00000 libthread_db.so 0xAFA00000 libz.so 0xAF900000 libevent.so lib t 0xAF800000 0 AF800000 libssl.so 0xAF700000 libcrypto.so 0xAF500000 .... 33
    • Dalvik • クラスライブラリはHarmonyプロジェクトの成 ブ プジ 成 果。(既存のCLASSPATHプロジェクトだとGPL) ( ) • アプリ起動時、zygoteというプロセスからfork  され、新しいプロセスのmainメソッドをDalvik  され 新しいプロセスのmainメソッドをDalvik VMのレベルでインボークされる。exec システ ムコールは使用していない。 ム は使用していない – なるべく多くの共有メモリをzygoteから引き継ぐ。 yg – アプリ起動時間の短縮にもなる。 34
    • DXコードインタプリタ 装備 な • JIT(Just In Time compiler)は装備していない。 • 複数のインタープリタ実装 複数のインタ プリタ実装 – 高速版 (ARMのアセンブラで書いてある。) – デバ グ プロフ イル用 デバッグ、プロファイル用 – 移植用 (C言語で書いてある。) • ARMアセンブラではFPU命令が使われてい ない。(ARM1136jf向けにチュ ンする余地) ない (ARM1136jf向けにチューンする余地) 35
    • Linux Kernel Linux Kernel • 2.6.27  • Android特有の部分 – binder – ashmem • ユーザー空間デバイスドライバ? ザ 空間デバイスドライバ? – libhardware 36
    • binder •ププロセス間通信 • OpenBinder org のものをベースにしてい OpenBinder.org のものをベースにしてい たが今は互換性はない。 • Androidのアプリケーションフレームワー クの根幹をなす。 クの根幹をなす • 上位層は AIDL につながっている。 AIDL に ながっている。 37
    • ashmem • Android / Anonymous SHared MEMory subsystem • $(TOP)/system/core/cutils/ashmem.h int ashmem_create_region(const char *name, size_t size) → returns fd – int ashmem_set_prot_region(int fd, int prot) – int ashmem_p _region(int fd, size_t offset, size_t len) pin g ( , , ) – int ashmem_unpin_region(int fd, size_t offset, size_t len) – • ‘pin’ していないメモリはカーネルが回収して再利用 • Javaの weak reference に似ている概念。キャッシュ の実装に便利。 実装 便利。 • Javaから利用するときはandroid.os.MemoryFile 38
    • • ソースの活用方法 ソ スの活用方法 39
    • ソースの活用方法 大部分 • Androidのソースの大部分はApachライセンス で改変は自由。あらゆる活用方法が考えられ 改変 自由。あらゆる活用方法 考 られ る。 – 自分の製品にそのまま移植して アプリケーショ 自分の製品にそのまま移植して、アプリケーショ ンをJava言語で開発する。 – 分解して必要な部分だけ使用する 分解して必要な部分だけ使用する。 • いずれにせよ、ソースから学べることは多い。 40
    • Androidを部分的に利用するとしたら • 最小システムで使う 使う カ ネル , 標準 ライ ラリだけ – Linuxカーネルとinit, toolbox, 標準Cライブラリだけ , – グラフィックスやDalvik VMをはずしてしまう • 最小システム + スクリプト言語 スクリプト言語 – 例えば ruby。 C言語で実装されているものならば 移植は難しくない。 41
    • Dalvik VMを他のOSに移植? Dalvik VMを他のOSに移植? 自身は があれば移植でき • Dalvik VM自身はPOSIX APIがあれば移植でき lk そう。 • アプリケーションのフレームワークはbinderに 強 依存 強く依存している。binderはLinuxカーネルのド 。 ライバとして実装されていてGPLライセンス。 Android独自のカ ネルドライバ • Android独自のカーネルドライバ binderや ashmem をGPL以外のOSに移植するにはスク ラッチから互換性のあるものを作る必要があ る。 42
    • • まとめ 43
    • Androidの強み: 過去のしがらみがない • 現在またはこの先利用できる技術を前提 – メモリ, CPUはJavaを動かすのに十分ある。 • アプリケーションは全てJavaで書く アプリケーションは全てJavaで書く。 • アプリケーションフレームワークはJavaで統一されてネイティ ブアプリケーションとの競合を考慮しなくてよい。 は 固定 – OSはLinux固定。 • 仮想メモリシステムを活用。 – GPUによる高速3D描画 GPUによる高速3D描画。 • 2DグラフィックスもOpenGLで。そのため2Dと3Dの重ね合わ せの問題を考慮しなくてよい。 – 無料 無料のWiFi, 定額制の3Gパケット通信。 定額制 パケ 通信 • バックグランドでシームレスにネットワークの切り替え。 44
    • Androidの強み: オープンソースであること • 特別な契約なしで誰でもソースを見ることが できる。 • Apacheライセンスは商用利用で扱いやすい。 • 無償のツ ルだけでビルド環境を構築できる 無償のツールだけでビルド環境を構築できる。 • このため世界中の優秀な技術者でにぎわう。 • にぎわう技術は急速に進歩する。 ぎわう技術は急速 進歩する 45
    • Androidのインパクト •組組み込みシステム開発にAndroidの与えるイ 与る ンパクトは少なくないだろう。 • 直接的インパクト – A d idを採用しての製品開発 Androidを採用しての製品開発 – Androidソースの部分利用 • 間接的インパクト – 他の組み込みプラットフォームもソース公開の流 れに 46
    • オープンソース • 組み込みソフト開発でもオープンソースを避 けて通ることができなくなった。 • ソースは無償で入手できるが、それを読み解 き、活用するためには技術力が必要。 き 活用するためには技術力が必要 • 技術力の向上にはまず情報交換を。 • 日本A d idの会 日本Androidの会 – http://www.android‐group.jp/index.php?FrontPage 47
    • ご静聴ありがとうございました。 48