More Related Content More from Tetsuyuki Kobayashi (20) Opensource Android2. はじめに
年
• 2008年10月22日についにAndroidのソース
コードが公開されました。
• Androidに関してはさまざまなトピックがありま
すが、今日はソースコードを主題とします。
すが 今日はソ スコ ドを主題とします
• 内容は発表者個人の主観に基づいています。
• 正確性については「無保障」です。 ☺
2
3. 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
4. 本日お話すること
Androidの概要について
•
ソースの概要について
•
ソ
ソースから読み取れること
読 取れる
•
ソースの活用方法
•
まとめ
•
4
6. Androidとは
社が主導 た携帯電話
• Google社が主導で開発した携帯電話用ソフト
ウェアプラットフォーム。
• 2008年11月にHTC社からAndroid搭載の携帯
電話 “G1” が発売されました。
G1 が発売されました
6
8. Androidプラットフォームの構造
ブラウザ
ラウザ
GoogleMAP
各種アプリケーション メール
・・・
Java仮想マシン(Dalvik VM)
libc
Webkit
各種ミドルウェア SQLite
OpenGL EL
・・・
Linux Kernel
携帯電話H/W
9. Androidプラットフォームの構造
ブラウザ
各種アプリケーション GoogleMAP
Java メール
Code ・・・
Java仮想マシン(Dalvik VM)
libc
Webkit
各種ミドルウェア SQLite
ARM
OpenGL EL
Code
・・・
Linux Kernel
携帯電話ハードウェア
10. Androidプラットフォ ムの構造
Androidプラットフォームの構造
シミュレータの場合
ブラウザ
各種アプリケーション GoogleMAP
Java メール
Code ・・・
Java仮想マシン(Dalvik VM)
libc
Webkit
各種ミドルウェア SQLite
ARM
OpenGL EL
Code
・・・
Linux Kernel
QEMUシミュレータ
x86
Code
Windows
11. プラットフォームとしての特徴
• オ プンソ ス
オープンソース
– 殆ど全てのソースコードが開示されました
カ ネルのみを使用
• Linuxカーネルのみを使用
– libcやルートファイルシステムは、通常の組み込みLinuxで
使われている物と異なる
• アプリケーションレイヤはJavaで開発
– ネイティブコ ドで記述されたミドルウ アと 上位アプリ
ネイティブコードで記述されたミドルウェアと、上位アプリ
ケーションの分離
QEMUシミュレ タの採用
• QEMUシミュレータの採用
– PC上でARM CPUのバイナリ互換を実現
13. ソースのある場所
• ここ
– http://source.android.com/
p // /
• gitとそのラッパースクリプト(repo)を使用して
ソースをダウンロードする。
ソ スをダウンロ ドする
– Googleのアカウント(GMAIL)が必要。無償。
• ブラウザで閲覧するならここ
– http://git source android com/
http://git.source.android.com/
13
14. 何が含まれている?
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
16. 全部で何行?
• ダウンロードしたファイルのうち、ファイル名の
末尾が .c .h .cpp .S .java のものだけを選んで
pp j
wc –l でカウントすると 約1600万行。
• このうちLinux kernelのソ スコ ドを除くと
kernelのソースコードを除くと
約770 万行。
• 詳細は
http://d.hatena.ne.jp/embedded/20081127/p1
16
17. Androidでの新規ソースは?
たくさ プ 成
• Androidではたくさんのオープンソースの成果
を利用している。
• では、Androidで新規に起こされたファイルは
どのくらいの規模か?
• /Copyright.*Android/ というパターンのある
ファイルだけを集計すると約160万行。
• 詳細
http://d.hatena.ne.jp/embedded/20081130/p1
17
18. ライセンス条件は?
• 基本
基本はApache 2.0
• 多数のオープンソースの成果を利用している
多数のオ プンソ スの成果を利用している
ので、それはそれぞれのライセンス条件
• モジ
モジュールごとに MODULE_LICENSE_*** とい
ルごとに *** とい
うファイルがあり、簡単に確認できるように整
備されている。
• また それぞれライセンス表示のための
また、それぞれライセンス表示のための
NOTICEというファイルがおかれている。
18
19. $ 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
20. ちなみに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
21. ビルドのしかた
( 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
22. ビルドのTips
ド 表
• make showcommands でコマンドライン表示
• ccache を使うためには環境変数
ccache を使うためには環境変数
USE_CCACHE=1
環境ではデフ ルト設定が無難
• VMWare環境ではデフォルト設定が無難
(512MBメモリ、プロセッサ1個)
• make sdk
– JDK6でなくJDK5でないとjavadocでエラ になる
JDK6でなくJDK5でないとjavadocでエラーになる
22
23. 移植性?
• タ ゲット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
24. 移植性?: 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
25. 移植性?: Dalvik VM
移植性?: Dalvik VM
ドのインタプリタが何種類か用意され
• DXコードのインタプリタが何種類か用意され
ている。
– 高速版 (アセンブラで書かれている)
– 移植用 (Cで書かれている)
(
– デバッグ用、プロファイル用
• それ以外のARM依存ファイルはABIを定義し
ているファイルのみ。
• とりあえずC版インタプリタを使えば移植は簡
単?
25
27. ここまでの感想
• 「本当に 全部のソ スが公開された
「本当に」全部のソースが公開された。
– iPhone との最大の違い。
• 扱いやすいライセンス。
• 用途は携帯電話に限定されない。
用途 携帯電話 限定されな 。
• まさに、Google 太っ腹!ここから直接収益を上
げることは全く考えていないようだ。「どうぞ、
げることは全く考えていないようだ。「どうぞ
使ってください」という感じ。
• 組み込みLinuxのメジャーなディストリビューショ
組み込みLinuxのメジャ なディストリビュ ショ
ンになるかも。
27
29. Bionic(標準Cライブラリ)
制約事
• CAVEATS(制約事項)
– $(TOP)/bionic/libc/CAVEATS
$( )/ //
– 基本はPOSIX準拠だが...
– C++の例外をサポ トしない 組み込みシステム
C++の例外をサポートしない。組み込みシステム
ではひどく遅いコードになるから。
h dのキ ンセル機能はサポ トしない
– pthreadのキャンセル機能はサポートしない。
– ロケールやワイドキャラクタはサポートしない。国
際化対応には代わりにICUを使う。
29
30. AndroidでのC++プログラミングの制限
• 例外は使用できない
例外は使用できない。
– newはmallocと同等。
– メモリがないときはNULLを返す。
• 実行時型情報は使用できない。
– type_info は空実装。
– pure virtual functionは使用できない。
• STL(標準テンプレートライブラリ)は使用できない。
– Vector.h, List.h はframeworks/base/include/utils にある。
• コンパイル時にはオプション –fno‐exceptions –
fno‐rtti をつける。
30
31. 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
32. ダイナミックリンク
• 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
33. 各ライブラリの配置アドレス
$ 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
34. Dalvik
• クラスライブラリはHarmonyプロジェクトの成
ブ プジ 成
果。(既存のCLASSPATHプロジェクトだとGPL)
( )
• アプリ起動時、zygoteというプロセスからfork
され、新しいプロセスのmainメソッドをDalvik
され 新しいプロセスのmainメソッドをDalvik
VMのレベルでインボークされる。exec システ
ムコールは使用していない。
ム は使用していない
– なるべく多くの共有メモリをzygoteから引き継ぐ。
yg
– アプリ起動時間の短縮にもなる。
34
35. DXコードインタプリタ
装備 な
• JIT(Just In Time compiler)は装備していない。
• 複数のインタープリタ実装
複数のインタ プリタ実装
– 高速版 (ARMのアセンブラで書いてある。)
– デバ グ プロフ イル用
デバッグ、プロファイル用
– 移植用 (C言語で書いてある。)
• ARMアセンブラではFPU命令が使われてい
ない。(ARM1136jf向けにチュ ンする余地)
ない (ARM1136jf向けにチューンする余地)
35
36. Linux Kernel
Linux Kernel
• 2.6.27
• Android特有の部分
– binder
– ashmem
• ユーザー空間デバイスドライバ?
ザ 空間デバイスドライバ?
– libhardware
36
37. binder
•ププロセス間通信
• OpenBinder org のものをベースにしてい
OpenBinder.org のものをベースにしてい
たが今は互換性はない。
• Androidのアプリケーションフレームワー
クの根幹をなす。
クの根幹をなす
• 上位層は AIDL につながっている。
AIDL に ながっている。
37
38. 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
40. ソースの活用方法
大部分
• Androidのソースの大部分はApachライセンス
で改変は自由。あらゆる活用方法が考えられ
改変 自由。あらゆる活用方法 考 られ
る。
– 自分の製品にそのまま移植して アプリケーショ
自分の製品にそのまま移植して、アプリケーショ
ンをJava言語で開発する。
– 分解して必要な部分だけ使用する
分解して必要な部分だけ使用する。
• いずれにせよ、ソースから学べることは多い。
40
41. Androidを部分的に利用するとしたら
• 最小システムで使う
使う
カ ネル , 標準 ライ ラリだけ
– Linuxカーネルとinit, toolbox, 標準Cライブラリだけ
,
– グラフィックスやDalvik VMをはずしてしまう
• 最小システム + スクリプト言語
スクリプト言語
– 例えば ruby。 C言語で実装されているものならば
移植は難しくない。
41
42. Dalvik VMを他のOSに移植?
Dalvik VMを他のOSに移植?
自身は があれば移植でき
• Dalvik VM自身はPOSIX APIがあれば移植でき
lk
そう。
• アプリケーションのフレームワークはbinderに
強 依存
強く依存している。binderはLinuxカーネルのド
。
ライバとして実装されていてGPLライセンス。
Android独自のカ ネルドライバ
• Android独自のカーネルドライバ binderや
ashmem をGPL以外のOSに移植するにはスク
ラッチから互換性のあるものを作る必要があ
る。
42
44. Androidの強み:
過去のしがらみがない
• 現在またはこの先利用できる技術を前提
– メモリ, CPUはJavaを動かすのに十分ある。
• アプリケーションは全てJavaで書く
アプリケーションは全てJavaで書く。
• アプリケーションフレームワークはJavaで統一されてネイティ
ブアプリケーションとの競合を考慮しなくてよい。
は 固定
– OSはLinux固定。
• 仮想メモリシステムを活用。
– GPUによる高速3D描画
GPUによる高速3D描画。
• 2DグラフィックスもOpenGLで。そのため2Dと3Dの重ね合わ
せの問題を考慮しなくてよい。
– 無料
無料のWiFi, 定額制の3Gパケット通信。
定額制 パケ 通信
• バックグランドでシームレスにネットワークの切り替え。
44
45. Androidの強み:
オープンソースであること
• 特別な契約なしで誰でもソースを見ることが
できる。
• Apacheライセンスは商用利用で扱いやすい。
• 無償のツ ルだけでビルド環境を構築できる
無償のツールだけでビルド環境を構築できる。
• このため世界中の優秀な技術者でにぎわう。
• にぎわう技術は急速に進歩する。
ぎわう技術は急速 進歩する
45
47. オープンソース
• 組み込みソフト開発でもオープンソースを避
けて通ることができなくなった。
• ソースは無償で入手できるが、それを読み解
き、活用するためには技術力が必要。
き 活用するためには技術力が必要
• 技術力の向上にはまず情報交換を。
• 日本A d idの会
日本Androidの会
– http://www.android‐group.jp/index.php?FrontPage
47