...

ソースコードから読み解く Androidの実像

by user

on
Category: Documents
31

views

Report

Comments

Transcript

ソースコードから読み解く Androidの実像
ソースコードから読み解く
Androidの実像
2008/12/11
KyotoMicroComputer Co.,Ltd.
Kunihiko Tsuji
はじめに
• 2008年10月22日についにAndroidのソース
コードが公開されました
• このソースをざっと見渡した印象についてお
話します
• 印象は僕だけでなく、一緒に仕事をしている
小林哲之や、また彼と共に活動している日本
Androidの会の方の意見も大いに参考にさせ
ていただいてます
京都マイクロコンピュータについて
• 設立
• CEO
• 所在地
1985年
山本 彰一
本社 京都市 西京区
支店 東京都 港区
• 主要製品
– ICE「PARTNERシリーズ」
– gccコンパイラ「exeGCCシリーズ」
– 評価ボード「KZシリーズ」
• 設立以来、一貫して組み込み向け開発環
境のオリジナル商品の開発、販売を行う
• 従業員数
20人
僕のこと
• 組み込み業界で20年ぐらい仕事をしている42歳のエンジ
ニア(??)です
– たまにはソースを書くこともあるので、一応エンジニアという事
で・・・・・
• 2003/4から現職(KMC)でデバッガ関連の仕事をしてます
– KMCでは主に組み込みLinuxのデバッグ環境の開発に携わりま
した
• その前は、某A社で組み込みJava実行環境の開発と、その
マネジメントをしていました
– 主なビジネスドメインは、携帯電話向けのJava実行環境です
– 1997年から組み込みJavaの開発に携わり、当初は携帯電話向
けだけでなく、JavaとRTOS(主にITRON)をハイブリッドさせた組
み込み向けプラットフォームを開発していました
なぜ僕が、またKMCがAndroidを?
• なぜ僕が?
– 単純に「Java」「携帯」「Linux」というキーワードで
引っかかっただけでしょう(^_^;
• なぜKMCが
– Linuxなどハイエンド組み込みに強いツールベン
ダなので、ツールを使って何か分かるかも??
• 自社製ARM11ボードでAndroidを動かす
• シミュレータのAndroidをデバッグする
• デバッガを使って、Androidの動きを見る
本日お話すること
•
•
•
•
•
全体的な特徴
Linuxとの関係
ソースコードとビルドの概要
QEMUシミュレータ
まとめ
6
Androidプラットフォームの構造
各種アプリケーション
ブラウザ
GoogleMAP
メール
・・・
Java仮想マシン(Dalvik VM)
各種ミドルウェア
Linux Kernel
携帯電話H/W
libc
Webkit
SQLite
OpenGL EL
・・・
Androidプラットフォームの構造
Java
Code
各種アプリケーション
ブラウザ
GoogleMAP
メール
・・・
Java仮想マシン(Dalvik VM)
ARM
Code
各種ミドルウェア
Linux Kernel
携帯電話ハードウェア
libc
Webkit
SQLite
OpenGL EL
・・・
Androidプラットフォームの構造
シミュレータの場合
Java
Code
各種アプリケーション
ブラウザ
GoogleMAP
メール
・・・
Java仮想マシン(Dalvik VM)
ARM
Code
各種ミドルウェア
Linux Kernel
QEMUシミュレータ
x86
Code
Windows
libc
Webkit
SQLite
OpenGL EL
・・・
プラットフォームとしての特徴
• オープンソース
– 殆ど全てのソースコードが開示されました
• Linuxカーネルのみを使用
– libcやルートファイルシステムは、通常の組み込みLinuxで
使われている物と異なる
• アプリケーションレイヤはJavaで開発
– ネイティブコードで記述されたミドルウェアと、上位アプリ
ケーションの分離
• QEMUシミュレータの採用
– PC上でARM CPUのバイナリ互換を実現
プラットフォームとしての特徴
• レイヤに応じて異なる安全性を確保
– カーネルレイヤ
• 安全性に関する特別な仕掛けはない
– ミドルウェアレイヤ
• プロセスによる空間保護
– 他プロセスやカーネル空間へはアクセスできない
– アプリケーションレイヤ
• Java言語による安全性確保
– プロセスの空間保護に加え、仮想マシン採用による安全性
確保
LINUXカーネルのみの使用
AndroidのLinux環境
• 本当にカーネルしか使っていない!!
• 通常のLinux的な(UNIXライク)な初期化も無い
– init.rcなどのスクリプトでの初期化が少ない
– /initで小さな初期化をしたら、殆どすぐアプリケション
実行環境へ
– ネットワーク関係など、簡単な初期化のみ
• ルートファイルシステムも特徴的
• libcなどの標準ライブラリもLinuxでよく使われる
glibcやuClibcでなく、BSD( FreeBSD, OpenBSD,
NetBSDなど)のlibcを利用
Androidはカーネルのみ利用
今までの多くの組
み込みLiunux
広義のLinux
ツールチェイン(コンパイラなど…)
各種ミドルウェア(XやGTKなど)
ルートファイルシステム(各種コマンドなど)
libcなどライブラリ群
狭義のLinux
Androidで
使っているLinux
Linuxカーネル
初期化プロセスのソース(抜粋)
int main(int argc, char **argv)
{
int device_fd = -1;
int property_set_fd = -1;
int signal_recv_fd = -1;
int s[2];
int fd;
struct sigaction act;
char tmp[PROP_VALUE_MAX];
struct pollfd ufds[4];
char *tmpdev;
プロセスID=1(init)のソース
カーネルの初期化が完了して、一番最初に
動作するプロセス
system/core/init/init.c
act.sa_handler = sigchld_handler;
act.sa_flags = SA_NOCLDSTOP;
act.sa_mask = 0;
act.sa_restorer = NULL;
sigaction(SIGCHLD, &act, 0);
/* clear the umask */
umask(0);
/* Get the basic filesystem setup we need put
* together in the initramdisk on / and then we'll
* let the rc file figure out the rest.
*/
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
通常ならスクリプト処理するよう内容を、
C言語で記述して処理の簡略化
15
ユーザー空間のメモリマップ
0x00000000
0x00008000
Androidの場合
app_process
0x40000000
Javaアプリケーションや
リソースデータなど
*.apk,*.jar,*.ttfなど
ネイティブコードの共
有ライブラリ
libcやlibwecoreなど
*.soファイル
0xB0000000
/system/bin/linker
スタック
0xBEFFFFFF
実行属性のメモリは存在しない
ファイルマッピング方向
実行属性のメモリが存在する
ファイルマッピング方向
ユーザー空間のメモリマップ
0x00000000
0x00008000
0x40000000
一般的なLinuxの場合
プロセス本体
ld.so
ネイティブコードの共
有イブラリ
libcなど各種の
*.soファイル
スタック
0xBEFFFFFF
実行属性のメモリが存在する
ファイルマッピング方向
prelinkの利用
•
共有ライブラリ初期化のprelink技術の活用
– 一般的には実行時に行うライブラリのアドレス解決を、ビルド時に事前に行う事で起動時間
の高速化を行える技術
– Androidではメモリ利用の効率化を狙ってる???
build/core/prelink-linux-arm.map より
#
#
#
#
#
#
#
#
#
0xC0000000
0xB0100000
0xB0000000
0xA0000000
0x90000000
0x80000000
0x40000000
0x10000000
0x00000000
-
0xFFFFFFFF
0xBFFFFFFF
0xB00FFFFF
0xBFFFFFFF
0x9FFFFFFF
0x8FFFFFFF
0x7FFFFFFF
0x3FFFFFFF
0x0FFFFFFF
Kernel
Thread 0 Stack
Linker
Prelinked System Libraries
Prelinked App Libraries
Non-prelinked Libraries
mmap'd stuff
Thread Stacks
.text / .data / heap
初期化までを動的分析
• KMC製ツールを使って、実行結果を分析
– ARM11ボード(KZM-ARM11-01)に移植
– JTAGエミュレータ「PARTNER-Jet」で実行、トレース
取得
– トレース解析ツール「QProbe」で分析
QProbeでの分析
エミュレータで実行命令の履歴を取得する。
約20秒間の実行命令を保持(数十億命令)。
実行アドレスを以下のように分類し集計
0xC0000000-0xFFFFFFFF KERNEL
0xAD000000-0xAD9FFFFF DALVIKVM
その他
USER
実行アドレス
デバッガ
Androidが動作するターゲットボード
QProbeで見てみましょう
ざっくり分かった事
• 以外にカーネル実行時間が長い?
– 初期画面が出るまでの約70%がカーネル空間を実行して
いる時間
– VM処理が多くなる初期化後半部分でも、50%はカーネル
空間の時間
– ファイルシステムやデバイスドライバの処理が多いの
か?
• ただし、今回のボードはファイルシステムにNFSを使っている事は
考慮する必要あり(アイドル時間もカーネルに含まれる)
• ユーザー空間は、ほとんどDalvikVM関連
– というか、それ以外のアドレスは、ほとんど実行されてな
い
メモリの使われ方
この数字は2007年秋にリリースされたSDKでの計測です!!
PARTNER-デバッガのTOPコマンド(Linux対応機能)で調べてみました。
•
初期画面
MemTotal:
•
43160 K
94648 K,
MemUsed
57172 K,
MemFree:
37476 K
94648 K,
MemUsed
63284 K,
MemFree:
31364 K
94648 K,
66500 K,
MemFree:
28148 K
MemUsed
73248 K,
MemFree:
21400 K
MemUsed
73828 K,
MemFree:
20820 K
MemUsed
MAPで東京にスクロール移動して拡大
MemTotal:
•
MemFree:
MAP起動(アメリカ大陸が表示)
MemTotal:
•
51488 K,
CELFページへ移動
MemTotal:
•
MemUsed
ブラウザ起動(www.google.com)
MemTotal:
•
94648 K,
94648 K,
MAPで東京をサテライト表示
MemTotal:
94648 K,
ソースコードとビルドについて
ソースのある場所
• ここ
– http://source.android.com/
• gitとそのラッパースクリプト(repo)を使用して
ソースをダウンロードする。
• ブラウザで閲覧するならここ
– http://git.source.android.com/
26
何が含まれている?
• Android SDKを再ビルドに必要なものが全て。
• Linux カーネル、デバイスドライバ、標準Cライブラリ、
コンパイラツールチェイン、Dalvik VM、2D/3Dグラフィッ
クライブラリ、コーデック、アプリケーションフレーム
ワーク、webkit(WEBブラウザ)、 ....
• ただし、MAPアプリケーションは含まれていない
• HTC G1のソース? (デフォルトではダウンロードされないがリポジトリに存
在する。けっこう頻繁に更新。)
– kernel/msm.git
– platform/hardware/msm7k.git
– platform/vender/htc/dream.git
27
全てのソースがあるのか?
• コンパイラツールチェインと一部のライブラリ
はバイナリで入っている。
– $(TOP)/prebuilt 以下
• それらをリビルドするために必要なソースの
ありかが明記されている。
– 各ディレクトリのREBUILTというファイルに
28
全部で何行?
$ find . ! –path ‘*/.git/*’ -type f |xargs cat | wc
22998555 81705021 996249064
$
つまり2300万行
Linuxカーネルが1000万行
external(外部ライブラリ、ツール)で800万行
残りが500万行。
frameworks 100万行
dalvikvm 100万行
29
ライセンス条件は?
• 基本はApache 2.0
• 多数のオープンソースの成果を利用している
ので、それはそれぞれのライセンス条件
• モジュールごとに MODULE_LICENSE_*** とい
うファイルがあり、簡単に確認できるように整
備されている
• また、それぞれライセンス表示のための
NOTICEというファイルがおかれている
30
$ find . -name "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/latencytop/MODULE_LICENSE_APACHE2
...
$ find . -name "MODULE_LICENSE_*" |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
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
1 MODULE_LICENSE_AFL_AND_GPL
31
ちなみにGPLのものは
$ find . -name "MODULE_LICENSE_*" |grep GPL
./external/iptables/MODULE_LICENSE_GPL
./external/elfcopy/MODULE_LICENSE_GPL
./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/oprofile/MODULE_LICENSE_GPL
./prebuilt/windows/sdl/MODULE_LICENSE_LGPL
./prebuilt/windows/ccache/MODULE_LICENSE_GPL
./prebuilt/darwin-x86/sdl/MODULE_LICENSE_LGPL
./prebuilt/darwin-x86/toolchain/i686-apple-darwin84.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
./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
./prebuilt/linux-x86/sdl/MODULE_LICENSE_LGPL
./prebuilt/linux-x86/toolchain/i686-linux-gnu3.4.6/MODULE_LICENSE_LGPL_AND_GPL
./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/MODULE_LICENSE_LGPL_AND_GPL
./prebuilt/linux-x86/ccache/MODULE_LICENSE_GPL
32
ビルドのしかた
• Linux (ubuntu), MacOS(intel)でのビルドがサポートされ
ている
– http://source.android.com/download
– 他に必要なライブラリ
– sudo apt-get install zlib1g-dev libncruses5-dev unzip
• 手軽な方法
– VMWare 上にubuntu 8.04 i386をクリーンインストール
– 無料のVMWare player利用可能
– ビルド時間 40分くらい?
• 困った時はネットで検索
• make sdk でSDK一式が再ビルド
33
ビルド環境も無償で構築可能
• 一般的なLinuxディストリビューション
– Ubuntu8.10を使いました
• 僕はWindows上の仮想マシン(VMWare)を使ってます
– コンパイラなどツールチェインも付属
• ビルド済みが付属するが、ソースコードも入手可能
– 別途JDKをインストールする必要あり
• JDKも無償で手に入ります
– シミュレータQEMUもオープンソース
• Windowsで動作するシミュレータもMinGW/gccでビルドできるので、
こちらも無償環境でビルド可能
一般的なWindows PCが一台持あれば、誰でも直ぐに試せます
他アーキテクチャへの移植性?
• ターゲットCPUは現在はARMのみ。
– armv5t (ARM926以降、Xscale)
• パス名に’arm’を含むファイルが多いもの
–
–
–
–
–
–
bionic
dalvik
external/opencore
external/sonivox
external/qemu
external/openssl
• これらの移植に目途がつけば、他のCPUでもいけそう。
35
KMCでのボードへの移植
• Linux2.6.25をボードで動作させる
• Linux2.6.25にAndroid関係の機能を移植する
• あとは、ビルドされたルートファイルシステム
をマウントして起動するだけ
• 以外(というより、予想通りですが)あっさり初
期画面まで出ました
Linux Kernel
• 2.6.25
• Android特有の部分
– binder
– ashmem
• ユーザー空間デバイスドライバ?
– libhardware
• thumbやEABI、またARM v5対応などコンフィ
グレーションの設定は必要
37
binder
• プロセス間通信
• OpenBinder.org のものをベースにしてい
たが今は互換性はない。
• Androidのアプリケーションフレームワー
クの根幹をなす。
• 上位層は AIDL につながっている。
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_pin_region(int fd, size_t offset, size_t len)
int ashmem_unpin_region(int fd, size_t offset, size_t len)
• ‘pin’ していないメモリはカーネルが回収して再利用
• Javaの weak reference に似ている概念。キャッシュ
の実装に便利。
• Javaから利用するときはandroid.os.MemoryFile
39
QEMUシミュレータの利用
QEMU
• オープンソースのシミュレータ
– CPUとH/Wのシミュレーション
– 対応CPU
• alpha, arm, cris, i386, m68k, mips, ppc, sh4, sparc
– JIT(Just-In-Time Compilation)による高速化
• ターゲットCPU命令をx86命令に変換
– H/Wシミュレータも存在
• 一般のPCハードウェア的な物
• USBサポートなどもあり
• コントローラで独立している物も(LAN SMC91C111.cなど)
http://fabrice.bellard.free.fr/qemu/
QEMU ARM CPU対応
• 最新安定版(ver0.90)
– ~ARMv5をサポート
– VFPサポートあり
• 最新版(20071220のCVSツリー)
– ~ARMv7をサポート
– neonの実装もあり
– thumb2は未調査
• CP15などコプロセッサもサポート
– デバッグ用などのCP14関係は不完全でした
• 当然ですがMMUもちゃんとサポートされています
• ARM用GCCで有名なCodeSourcery社のクレジットが各所にあり
AndroidでのQEMU
Linux Kernel
QEMU
ARM CPU
シミュレータ
qemu/hw/platfom_xxx
などのソースコード
goldfish
H/Wシミュレータ
• 携帯電話を想定した’goldfish’仮想ハードウェア
– 画面、キーなどインプットデバイス、テレフォニー、メモリカード
など
– LANなどqemuオリジナルの仮想ハードウェアも利用
• QEMUに独自のプロファイル機能を追加実装
QEMUを利用するメリット
• PC上のシミュレータで、バイナリ互換で開発
– 処理速度的にも、今のPCであれば問題なし
– カーネルから下を差し替えるだけで、実H/Wでも
動作させる事を実現
• シミュレータならではの解析機能
– シミュレータに手を入れる事で、実CPUには存在
しないパフォーマンス解析機能などを利用可能
実ハードウェアへの移植コストが小さい
Java
Code
各種アプリケーション
Java仮想マシン(Dalvik VM)
ARM
Code
各種ミドルウェア
Linux Kernel
QEMUシミュレータ
x86
Code
Windows
対応したカーネル
に変更
実ハードウェアへの移植コストが小さい
Java
Code
各種アプリケーション
Java仮想マシン(Dalvik VM)
ARM
Code
各種ミドルウェア
Linux Kernel
携帯電話ハードウェア
対応したカーネル
に変更
まとめ
今のAndroid見て感じた事
• 動かすだけだったら、比較的簡単に動きそう
– QEMUというシミュレータを上手く使っている
– 不必要な物を一切使わず、必要なものだけのシンプルな構成
• Linuxは本当にカーネルだけだったんだ
– 今までの組み込みLinuxでも、多くは残っていたUNIX的な匂いが殆どしない
– GPL回避だけでなく、より組み込みシステムに適合するソフトウェアプラット
フォームという事を考えたのではないか?
• 扱いやすいライセンス
• オープンソースを使い倒す
– シミュレータQEMUはじめ、開発環境も全てオープンソースで手に入る
Androidに関する将来の想像
• もしかすると、PCの水平分業モデルが成立するかも
– 各レイヤの分離がハッキリしている。
– また他のハードウェアの移植コストが小さい
• 実際にオーストラリアのKogan Technologiesが「Kogan」ブランドで製造/販売
が2009年1月から始まる予定
• 設立2年の新しい企業でも可能、またOHAにも加入していない
• 上位アプリケーションの開発コミュニティが出来る可能性がある
– ミドルウェア含めて、ソフトウェアが流通する可能性もあり
• 採用したオープンソースの質が向上
– QEMUふくめ使われたオープンソースがさらに進化する可能性がある
• 応用は携帯電話に限らない
オープンソースである可能性
• やはり進化にたいして有利なのでは?
– マルチコアを意識したJITを搭載するVMなど
– 他CPUへの移植
– ツールの進化
– コミュ二ティの成長
• 例えば、今日のお話しもソース開示がないと
出来なかった部分がありますね
開発環境へのインパクト
• エンジニアのスキルに応じて、担当分野を選
択する事が出来る
– 正しくC言語が扱えない(メモリが見えない)エンジ
ニアは、Javaでアプリケーションを開発
– エキスパートは、ドライバやカーネルを開発
– ミドルウェアは開発しても良いが、Androidが普及
すればミドルウェアが流通する可能性もあり
• シミュレータを用いた効率的な開発環境
– QEMUは比較的高速なので、ストレスなく使える
Android SDKから学べる事
• 適材適所や必要性を極める
– Linuxをカーネルしか使わないという、潔い選択
• 今までの既存の組み込みLinuxにとらわれず、Linuxの必要
な部分だけを採用した
– 組み込みに必要な資源に最適化
• カーネルだけの採用、ライブラリやリンカーで再構築。
• 既存のLinuxから削ったのではなく、新規に必要な物を組み
合わせた、という感じ
– 過去の互換性にとらわれていない
• 既存の携帯電話用のJava(J2ME)を使っていない
– 携帯電話用プラットフォームと言われているが、既存のJ2MEは
力不足(目的も違いますが….)と判断したのか、完全に切り捨て
Android SDKから学べる事
• カーネル、ミドルウェア、アプリケーションのレイヤ分離
の重要性
– 同等機能のカーネルが動作すれば、異なるH/Wでも比較
的簡単に動作した
• Javaの活用
– 重要な機能の実装は、ミドルウェア化する事で、汎用化と
高速化の両方を実現
• シミュレータの活用
– オープンソースのシミュレータでも、ここまで使える
– シミュレータを改造する事で、独自の解析機能などを追加
• オープンソースの積極採用
– Linux, Webkit, SQLite, QEMU ……
Androidとオープンソースでのビジネス
• アプリケーションは流通するだろう
– そこはAndroid Marketもあるし
• オープンソースベースのビジネス
– お金をかけたからこそ、出来たのではないか?
– オープンソースでGPLが少ないから、このプラット
フォームを強化するソフトウェアでビジネスが出来る
かもしれないが・・・・
– プラットフォームの成長には、ビジネスとしてお金が
動く仕組みも必要かと思うが
– テクノロジをお金に・・・
Thank you
Kyoto Microcomputer Co., Ltd.
http://www.kmckk.co.jp/
Fly UP