Android4.1で何が新しくなったか

2012/9/29 45257hit

Nexus7が日本で発売されることで4.1を使う人が増えてくると思います。
そこで、JellyBeanで何が新しくなったかを紹介します

JellyBeanはアメリカのこういうお菓子です。
味は色に寄って違いますがどれもとても甘い。
甘いのが苦手な私はこれだけ食べるのにブラックコーヒー2杯を必要としました。

Android4.1の印象をまとめると下みたいな感じ。
0.1と言いながらかなりのバージョンアップで、これを0.1といってしまうあたりにAndroidチームのこだわりというか自慢のようなものを感じます。


What's new?

大きな見出しは
パフォーマンス、フレームワークの機能、画像とメディア
そしてAndroid4.1だけに限りませんが
SDKとツールや周辺サービスも変わっています。

ProjectButter

JellyBeanのパフォーマンスを表現する最も有名な言葉がProjectButterです。
これはバターのようにヌルヌルという事から名付けられていて、実際に4.1を触ると奇妙なほどヌルヌルしてます。
そのトリックが
60FPS,VSync,TripleBuffer

60FPS

Android4.1端末では原則60FPSで描画処理が行われます。処理が早く終わっても描画が速くなることはなく、
TripleBufferなどにより常に一定間隔で画面を更新することで速度のガタツキをなくしなめらか感を演出しています。

TripeBuffer

TripleBufferを説明する前にDoubleBufferについて説明します。
DoubleBufferは最近の描画では常識となっている画像の描画をディスプレイバッファに直接表示するのではなく、
一度別バッファに出力した後で描画が終わったタイミングでディスプレイ用のバッファと入れ替えるという仕組み。
この方法を使うと描画途中の段階が画面に表示されなくなるのでチラツキがなくなります。

例:画面にバッファAの情報を出力しているとき、描画処理はバッファBに対して行い、描画が全て終わった後でバッファBと入れ替えます。
バッファBが描画する間はすでに描画済みのバッファAが表示され、描画が終わったあとで画面を切り替えるため描画途中のデータが画面に表示されずチラツキがなくなります。

しかし、この方法では描画処理が遅くなると画面の更新が間に合わなくなります。
60fpsで処理するためには一回のフレームに使える時間はわずか16msだけです。
その間にCPUで画面を作って、GPUでレンダリングする必要がありました。

それを解消するのがTripleBuffer
DoubleBufferではCPUの処理が終わってGPUの処理が行われているとき、
画面がバッファAをGPUがバッファBを使っているためCPUは寝ている状態でした。
そこでバッファCを作り眠っているCPUで次のフレームを計算すれば、その後の描画が早くなるというわけです。
これによりCPU+GPUで16msしか使えなかったのが、CPUとGPUがそれぞれ16ms使うことが出来るようになります。
TripleBufferは描画が追いつかない時自動的に有効になります。


VSync

60FPSに合わせてタッチパネルのイベントタイミングも変わりました。
任意のタイミングでまとめるのではなく60fpsの描画ごとにまとめることで最悪でも32ms未満の遅延に抑えることができます。

Widget

ホーム画面に描画するWidgetもパワーアップしました。
サードメーカーのランチャーがWidgetの配置をバインド出来るようになりなりました。
サイズの変更を検知出来、リモートビューは縦横レイアウトを分けることが出来、メモリーに制限をつけることも出来るように
新しい部品としてGridLayout ViewStubがリモートビューで使えるようになります。

Wallpaper

ライブ壁紙が変更される時にACTION_CHANGE_LIVE_WALLPAPER intentが飛ぶようになりました。
これでライブ壁紙の選択画面を表示することもできます。

Animation

withLayout()メソッドの追加
ハードウェアレイヤーを使用
アニメーションパフォーマンスが改善

view.animate().rotationY(180).withLayer()  


withStartAction() と withEndAction() が追加され、アニメーションの前後で処理を行うのが簡単になりました。
例えば、ボタンを削除するときにアニメーション開始時にボタンを非活性として、画面の外にボタンが消えるアニメーションを行い、アニメーション終了後にボタンを削除するなどの処理が簡単に行えます。
TransactionTypeにChangeが追加されます。

その他パフォーマンスに関わる事項として

編集不可テキストビューのメモリ使用量が削減されました
長いテキストのパフォーマンスが改善されました。
クリップデータがテキストスタイルをサポート
システムを通じてメモリ管理が改善されています。
ActivityManager.getMyMemoryState()
ComponentCallbacks2.TRIM_*
これにより、メモリーの困窮度を細かく知ることが出来、早めにキャッシュを削除するなどしてシステムからプロセスがキルされるのを予防することができます。
GridLayout,TextureViewがサポートライブラリに追加されAndroid2.3以前でも使用可能になりました。。
データベースのクエリをキャンセル可能になり、時間のかかるクエリなどを実行中にユーザーが画面を戻った場合などに即座に処理を中断できます。

ActivityAnimation

アクティビティアニメーションを強化
Android.app.ActivityOption
zoomアニメーションの追加
アイコンから起動時はアイコン部分から
アプリが拡大するように実行され、
通知エリアから実行時は通知エリアからアプリが拡大するように実行されるようになりました。

Navigation

ActivityのAutomatic upナビゲーションがmanifestファイルの記載で実装できるようなりました。
サポートライブラリも利用可能になったので2.3以前の端末向けでも使えるようになりました。

新しいTaskStackビルダーは戻り先をセットしてActivityを起動できます
設定画面のように複数のActivityから開くような画面で重宝します。

XMLとJavaの整合性

レイアウトのメソッドをXMLとJavaで一貫性があるように整理されました。

国際化

新しい18地域の対応と追加フォント
アラビック・ヘブライ
右から左(RTL)言語の対応改善
(TextView EditText StaticLayout Canvas)
RTL言語でのパフォーマンス改善

Accessibility

全スクリーン要素上をジェスチャーで順に移動可能
ナビゲーションボタンを導入
現要素をダブルタップでアクティブ
単語・行・段落ごとの読み上げ
基本的なビューならプログラム不要でそのまま動く
特殊な場合はsetImportantForAccessibilityを使う
カスタムビューはgetAccessibilityNodeProvideをOverride
サポートライブラリ対応

ExternalStorageAccess

SDカードにアクセスするのに新しいPermissionが追加されます。
android.permission.READ_EXTERNAL_STORAGE 
現在は実装されていませんが、将来的に必要になるのでSDカードにアクセスするアプリは設定必須

ダウンロードの制限

ネットワークの使用が制限されているかチェック出来るのでWi-Fiに繋いでいない時はダウンロードしないとか出来る
ConnectivityManager.isActiveNetworkMetered()

Renderscript Compute

NEON(ARM向け並列計算命令セット)対応
-(#pragme rs_fp_relaxed)を使う
GPUが描画したFragmentをテクスチャーとしてサンプリング
-(rsSample)を使う
x86エミュレータとデバイス上でデバッグ対応
単一ファイルでMultiple root()-style

Media

低レイヤーコーデックデータへアクセスするAPIが出来ました

オーディオレイテンシーの改善

オーディオの遅延が大幅に改善されました。
・OpenSL
・soundpool
・tone generator
幾つかのデバイスでより重大なレイテンシーの改善が見込めます。
従来Androidは100ms単位の遅延があり音楽アプリが作りにくいと言われていたのですが
JellyBeanはGalaxyNexusで動かすと12msと一気に遅延が短くなりました。
ハードウェアメーカーにも訴えかけてこの遅延は今後あらゆる端末で短くすることを狙うようです。

NFC

Bluetoothと連携機能が出来ました。
端末を近づけるだけでBluetothのペアリングされファイルの転送を行ったりヘッドセット・スピーカーとペアリングしたり出来ます。

通知

ユーザ向けに強化されたのが通知
キーワードはpriority、bigContentView、Actions

Priority

priorityが高い通知は順番にかかわらず優先して表示されます。
緊急地震速報とか、着信とかは優先度上げてコール。
ツイッターのメッセージは優先度下げてコール という感じの使い方が想定されます。
スパム的に優先度が高い通知を飛ばしたらどうなるかというと?
通知からアプリケーション情報が見られるようになったのでそこからサクッとアンインストールされることになります。
目安は
Max とても重要/アクティブなタスク 電話の着信・今すぐ連絡したい要件・地震速報
High 重要なメール SMS/chat/widgets
Default それ以外(従来の通知は全てこれ)
Low ジャンクメール・おしゃべりアプリ
MIN 終わったメール サジェスト 詳細な情報 アプリ広告

bigContentView

従来の通知エリアサイズ(64dp)を1Uとして最大4Uまでの通知エリアを作ることができます。
メールが着信した場合はそこに本文を表示したり、スケジュールを通知する時は地図を表示したり出来ます。

Actions

bigContentViewに伴い、ボタンを置くことも出来るようになりました。
例えば着信履歴に対して返信したり、アラームのスヌーズをアプリを開くこと無く設定するなどが考えられます。


開発ツールの話

JellyBeanにあわせてSDKが20となりました。

エミュレータの性能向上

HardwareGLがICS(4.0.3)で使用できるようになりました。
・Intel HAXMが
WindowsとMacOS Xをサポートし
・LinuxはKVMを使うことでx86のイメージファイルをネイティブで動かすことが出来るようになりました。
x86イメージは4.0と2.3用に存在しています。(4.1は作成中)
従来のARMイメージとは比べ物にならない性能向上です・

Hardware emulation

PC本体や手持ちのスマートフォンに内蔵のセンサーを使ってエミュレータの処理を行う事ができるようになりました。
例えばマルチタッチアプリもスマートフォンでマルチタッチをするとエミュレータ上のタブレットがマルチタッチを認識するという具合
カメラもWebカメラの映像を持ってくるようになったのでARアプリが一気に作りやすく

ショートカット

Eclipseのショートカットが増えました

Ctrl+0

ソースコードから関数や変数を探す

Ctrl+Shift+P

開始タグへカーソルを移動します。

Ctrl+Shift+F

ソースコードを整形します。

ウィザードの更新


プロジェクトを作る際に手助けしてくれるウィザードが一気に強化されました。

簡単なアイコンエディタが付き開発時でもソコソコの個性を簡単に出せるようになりました。


スケルトンを作成してくれるようになり、タブを使ったアプリやリストとディテール形式のアプリなどの土台を作ってくれます

マニフェストの自動更新

Activityの追加など明らかにAndroidManifestを書き換えないといけないものは自動で書き換わるようになったり、警告を出すようになりました。

レイアウト

UIエディタも見やすくなったほか、パフォーマンスに貢献する階層の浅いレイアウトを作りやすくなりました。

また、開発用画面で任意のフラグメントを表示できるようにして、開発時の画面イメージが取りやすくなりました。

一覧プレビュー

画面レイアウト作成時に沢山の国などに紐付いて、様々な環境に対して一度にテストできるようになりました。

Lint

ソースコードのヒントを教えてくれるLintは少し賢くなり、もっと警告を出すようになります。

デバッグツール

OpenGLESに対応してました。これでAndroidでもアプリを作りやすくなるのでは

コーディング支援

Socketを使った場合にmanifestにインターネットアクセスがない場合警告するなど
manifestファイル漏れが減る仕組みができました。

NDK

NDK(C)のデバッグがEclipse上で出来るようになりました。

周辺サービスの話

GoogleI/Oに伴い周辺サービスもとても増えました。
特に影響が大きそうなのがGoogleCloud,Messaging
従来C2DMと言われていたものですが上限数の制限が撤廃されました。
これによりサーバープッシュがさかんになるものと考えられます。
また、同時に1000台まで同時に送信したり、小容量なら再度接続し直さなくてもデータを送ることが出来るようになりました。

サーバープッシュの仕組みは沢山あるけれど、GCMを使うメリットがあります。
GCMを使わない場合、各アプリが各サーバーに別々にアクセスを行います。


GCMを使うことでサーバー側はGCMサーバーを中継するようになり、クライアント側は同じPlatformを使用することで経路が一本になる。


3G通信はページとスタイルシートと画像をそれぞれ複数のファイルから取得していましたが、
そのたびにセッションを作るのはもったいないということでページを開いた後その後何もしなくても通信がつないだままになる仕組みが日本でもあります。
そのため、どんなに小さなファイルをダウンロードしてもバッテリーの影響は無視できません。

GCMを使って通信をまとめることで、複数のファイルで接続、切断の時間を共有できるのでバッテリーの節約になります。


PDK

プラットフォームを作る人のためにプラットフォームを作るための情報をまとめたPDKが公開されました。
これにより今後は極端に実速度性能が低かったり、古いバージョンのOSからアップデート出来ない端末が減っていくことが期待されます。

最後に

Flashが非対応になったことに伴い従来のFlash版Flashは読めなくなります。
代わりの高性能なAPIが実装予定となっています。
高性能なAPIでは従来表示できなかった広告付きの動画を表示したり、画面の回転に対応したりするようです。

前:Nexus7長期レビュー 次:モテるAndroidアプリ開発

関連キーワード

[Android][Java][モバイル][IT]

コメント

名前:名無しさん|投稿日:2012/10/02 10:22

「60fpsで処理するためには一回のフレームに使える時間はわずか16fpsだけです。」

となっていますが「16ms」の間違いのような気がする

名前:kenz|投稿日:2012/10/02 12:58

誤字です〜
ご指摘ありがとうございます

コメントを投稿する

名前URI
コメント