ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

【MB-3】Android 高度 方法指南 - Google Developer Day 2009

Androidプラットフォームでの以下の3つの開発方法
 ・Dalvikバーチャルマシン上のJavaアプリ
 ・Ajax
 ・ネイティブコード
で、どのように機能提供するのか、特徴、メリットデメリットなど
手法の評価のお話です。

コンピュータとアルゴリズムの専門用語が多かったからか同時翻訳が少しまずかったです。
つくづく英語を直接聞いて理解できればと思いました。

Android 高度 方法指南
Google ジェイソン チェン 氏

Androidとは?
	いつものLayerCakeの説明
		最下層にLinux、次にLibなど…(つまらないので省略しましょう
		(会場笑い)

	開発者にとってAndroidとはなんでしょうか?
		電話をするためのコードの塊であり、
		ネットワークスタックであり、インターネットクライアント
		コードを走らせるためのプラットフォーム

アンドロイドはアプリケーションのプラットフォームであるということ
	ただし、Androidをつかって携帯を独占したいわけではない
	よりよいモバイルを提供することが重要

Androidでの開発手法紹介
	3つのタイプのアプリケーションプラットフォームである。
	それぞれの開発手法の利用統計や、将来の開発方針を紹介します。

現在、存在する3つの開発手法

	・Managed Code
		Dalvikバーチャルマシンで動くJavaアプリ
		(ちなみにDalvikはアイスランドの地名で、スタッフの故郷がそこだったから)

	・Ajax
		Javascript,CSS,HTMLでWebブラウザで動作するアプリ

	・NativeCode
		ARMプロセッサのネイティブコードC/C++で書かれているアプリ

事例として、3つの方法で違いがみられるものを紹介します

	例としてK-MEANSクラスタリングの実装。
		K-means法は点をグルーピングするアルゴリズム

Dalvikの場合
	Dalvikバーチャルマシンはライフサイクルの管理を行っています。
	開発では組込マシン用に1から作り、レジスタベース(スタックベースではない)です。

	JITCでJavaを変換して実行する。

	OpenGLなどの部分はネイティブコード(C/C++)によって書かれている。
	このあたりの動作はDalvikでやると遅くなるため、APIはJNIを経由して実行されている。
	
	Javaの開発環境として一般的なEclipsceプラグインを使えるようになっています

	Dalvikは何を提供できるのか
		- リッチなUI
		- BackGroundでのアプリ動作(サービス)
		- 共有コンポーネントやシステムイベント、UIを提供している。

		スピードが問題であればネイティブコードの方が最もいいかもしれない。
		基本的には用途によって、最適かどうかを判断すべき。
		
		JavaでのKMEANSクラスタリングの実行DEMO
		(そこそこのスピードで動く。ただしカクカクとはしてました)

	Dalvik上のアプリ開発事例
		Coreとなるシステム用アプリ、
		スカイマップ(星座をみることができる)など多岐にわたります

	Dalvikの今後
		ガベージコレクションの改良
		JastInTime変換処理の向上
		CoreLibrariesの更新
		今後も新しい機能を提供します。 Bluetooth、P2Pメッセージなど。


Ajaxの場合
	Ajaxとは
		AnroidのブラウザはWebKit+SquirrelFishを利用。
		Ver 528.5、Gears 0.5.17.0、Canvasタグのサポート

	できること
		ウェブページの表示、DOM、CANVAS、Gears
	できないこと
		HTML5やバックグラウンド動作ができません

	AjaxでのK-MEANS法
		Javaと同じアルゴリズムをJavascriptで。
		Dalvikより非常に遅い

	アプリ例
		Google Reader For Mobile
		Gmail(Web 版)
		その他のWebkit上で動くアプリなどはたくさん

	将来
		HTML5への対応(Androidでも)
		拡張Ajaxへの対応
			JavaオブジェクトとJavaScriptを橋渡しして、
			Ajaxを拡張する。

NativeCode
	ARM ELFなど
	Native Development Kitを開発中(まだ提供段階ではない
	時間的に重要な処理をできるし、バーチャルマシンをカスタマイズすることもできる
		
	サポートしないもの
		ユーザ独自のライブラリへの参照は正式サポートしていません。
		現在提供しているAPIはlibm,libcに限られている。

		ネイティブコードはAndroidシステムを把握できない。

	JNIからProxyを経由してネイティブライブラリを呼び出す
	→ 同じアルゴリズムでも高速に動作する

	ネイティブコードでできること
		過去資産の流用:非常に古いゲームの利用 SCUMMVM
		負荷の問題    :音楽ストリーミング	Spotify
		※いずれもJNI経由で使う必要がある

	現在、ライブラリの追加を計画中
		リクエストがあれば教えてください★

今後やらないこと
	ネイティブコードで独立したアプリケーション作成できないのは変わりません。
	今後もサポート予定無し
	
Javascriptの今後
	拡張Ajaxと呼ばれるモノを使えばAndroidシステムのAPIに
	JavaScriptからアクセス可能(JSからでもネイティブコードを利用可能)
	オープンソースとしてデモを公開中です。 http://code.google.com/p/dhict/

それぞれの方法の比較
	レンダリングタイム
	Javascriptが最も遅い。Dalvikでは処理時間がNativeの5倍かかる。
	
	スピードだけが観点ではないので
	みなさまのアプリケーションに最適なものを選んでください

	フローチャートを表示
	・既存のWebサイトがあるならAjaxでREST Serviceにしちゃえば?
	・APLの速度が必要か?	
	…
	(沢山の選択肢)
	…
	→ 頭痛のタネですね。(会場笑い)

	Androidでは複数の方法を用意しています。
	ユーザは選択肢から最適なモノを選んでください。


質疑応答	
	AndroidシステムはNativeCodeを検証(Verify)しますか?
	→ しません。

	Android MarketでのNativeCodeを使うかを確認していますか?
	→ いいえ。
		NativeCodeをアプリケーションにいれるのはユーザに委ねられている。
		Android Marketは端末側で対応しているアーキテクチャごとに
		アプリケーションを取捨選択してリストを作るのみ。

	LinuxへのModule追加はApplicationに含めることはできますか?
		セキュリティの問題があるのでカーネル変更するのは無理。
		AndroidのSandBoxに影響が出てしまいます。

今後の予定
	次はOpenGLのネイティブコードアクセスが実現される