Google Developer Day 2008 Japan - Android Dalvik VM の内側

All English で内容が非常にコアなため紙のメモしかとらず、通訳も聞かず。
皆さんよく理解してるなぁ・・・

Overview

携帯H/Wに適したVMがなかったので作っている。

  • CPUが貧弱、メモリも少ない、既存のOSとも異なる(ベンダーによって違う?)、そして「バッテリー」から電力を供給される

目指す最低動作環境

CPU x00MHz
メモリ64MB(40MBでスタートアップ、24MBで他のサービス)
実質、他のサービスが上がっていたら余裕はないだろうけど。。

specsheet見たほうがよい

Dalvik VM

レジスタベースのVMなので、classファイルからdex(dalvik executable?)に変換する。
dexのフォーマットは下記。

header
string_ids
type_ids
proto_ids
field_ids
method_ids
class_defs
data

jarは下記の連続

.class
定数プール
データ
定数プール
データ
....

dexだとどうなるか後で調べる

dexフォーマット中のmethod_idっていうのがObjectを参照?

Shared Constant Pool(共有定数プール)

Memory is Saved via.
サイズをちっちゃくできる。
jarからdexにする時に、class統合みたいなことをやってる

携帯アプリのサイズ圧縮でやるなぁ

ex)common system libraries

比率
jar 100
compressed jar 50
uncompress dex 48

軽い!

4 kinds of memory

メモリの扱い方。

clean:mmap() dirty:malloc()
shared common dex, app-specific dex
private

shared dirty

library "live" dex
shared copy-on-write heap

private dirty

app "live" dex structures // allocated
app heap

実行時に変わる部分は汚くなるので要領の無駄?

Zygote(接格子)

意味がわからなかった...orz

GC,Sharingの構造

プロセス、ヒープ、GCs....

0,Data
ObjectData
ObjectData
ObjectData
...

これが、

Parallel mark bits

で、avoid un-sharing page

いまいち。。

開発にあたって

  • Spec

CPU:250〜500MHz
Bus:100Mhz
data-chage:16〜32kb
appRam:20MB
このくらいはほしいとのこと

No JIT

ただし、ネイティブレベルでgraphicsとsoundはサポートする

Optimazation

byte-swapping and padding(on ARMは不要)
static linking
"inling" special native method

Register Machice

もしかしてJVMとの比較で言ってる?(スタックVM)

Why?
 avoid ...
Stats
 30% fewer instructions
 35% fewer code units
  more bytes in the instruction stream

レジスタVMのがいい。

dexのがよい

より少ないbyte, dispatches, read, writes

interpreters(インタプリタ?)

gccはなんか違う。ARM Assemblyがcleverらしい。

Android開発のアドバイス

  • TimeScale

Human interaction scale
 10〜30 interaction / sec

Human perception scale
 25〜30 image frames / sec

 continuous audio,synched within 100msec

人間の認知できるレベルは上記のスケール。タッチの間隔などの際は、上記のレベルで知覚されることをよく考えてアプリを作る。

と言っていた気がする

Loop Wisely

for,do-while はいっちばん効率の良い方法で書くこと。
listかなんかで回すなんてもってのほか。

メモが追い付かなかったが、1clockもムダにするなというニュアンスを感じた。

Avoid Alloc

short-lived objects need to be GCs.
long-lived objects take precious memory.

開発向け資料

http://code.google.com/intl/ja/android/

今のところ日本語訳でざっくり知りたければ下記
http://www.android-ja.net/modules/xpwiki/?Getting%20Started

  • 所感
    • バイトコードが出たあたりでしんどくなった。わからん。
    • ヒアリングが鈍っている。。。
    • mmap()とmalloc()あたりで、計算機知らないということを痛感。なんとなくはよくない
    • 質問者が英語でガンガン聞いていたのに驚愕。よく調べてるんでしょうが、やはりすごい
    • とりあえずメモリ回りの動きはきっちり抑えたい