2010/09/30

GDD2010JP基調講演以外の適当なまとめ

Google Developer Day 2010基調講演以外のまとめ
もう眠いのでかなり適当、、

聴いてきたセッションは以下
・音声入力 API for Android
・高性能な Android アプリを作るには
・マーケットライセンシングを使って Android アプリケーションを守るには
・クールな Android アプリを作るには
・Android でリアルタイムゲームを開発する方法: リベンジ


音声入力API for Android (12:00-12:45)

Voice Search APIの紹介
お座り、伏せ、等の命令を認識するAndroidアプリのデモ
APIを使うことでこのようなアプリが簡単に作れる。


高性能なAndroidアプリを作るには (13:00-13:45)

・ユーザエクスペリエンスのためにスピードを求める
データベースのアップデート等の遅い処理はユーザに不快感をもたらす。
AndroidではUIスレッドがスクリーンの動きをコントロールするため、
このスレッドが遅いと、ユーザからの見た目が遅くなる。

・なぜこのようなことが起こるか、応答不能: ANR (App Not Responding)
UIスレッドの実行に200msでも掛かるとユーザは遅く感じるといわれている。
例えば
・ファイルの読み込み: 25ms
・ファイルの書き込み: 200ms
・3G経由でのPing: 100ms
Pingの例で分かる通りHTTP経由でのファイルの取得にはかなり時間がかかる、最低でも1秒程度。
書き込みに関しては絶対にUIスレッドで行ってはいけない。

・IOは遅い
スマートフォンで採用されているフラッシュでは、
磁気ディスクと違い経過年数や空き容量、デバイスの種類によって
特性にかなり違いが出る。それらによってアクセス速度が変わってしまう。

SQLiteと聞けば軽量なものだと想像するが、DBなので内部では
複雑な処理をしていることは変わりない。DBを使う場合は注意すること。
デバッグをするためにログを出すことがあるが、この時はSQLiteは使わないこと
普通のテキストファイルに書き出した方が速い。

・スレッドについて
UIスレッド以外に処理を書くのが基本になるが、その場合はasyncTaskという
ツールがあるので使うこと、別のスレッドで処理を行いつつ
UIスレッドのへプログレスバーのアップデートを通知する等の処理が簡単に書ける。
asyncTaskの注意点
・必ずUIスレッドから呼び出す
・アプリに対し1つしか作成することはできない
・アクティビティがバックグラウンドになった場合
処理中であってもkillされる可能性がある、それが嫌な場合はIntentServiceを書くこと

・満足度向上のために
・操作されたくないコントロールはDisableにする
・スピナーを使い処理中であることを知らせる
・200ms以上かかる場合はプログレスバーを表示する
・何をしているのかメッセージを表示する

・プログラムの高速化について
どうやって高速化するか、開発者が事前に予測して最適化することは不可能に近い
・できるだけシンプルな処理にする
・テストして性能を確認する
・遅い場合推定ではなく測定をすること
・修正をする
通常、測定→修正を何度か繰り返す必要がある

測定にはログに時刻を出力するだけで事足りる場合もあるが、TraceViewという
ツールを使うと簡単にプロファイルを収集し、統計を取ることができる。
表示もグラフィカルでとても見やすい。

ここでデモがあり、電話帳などのデータを読み込みJSONの文字列にして、
SDカードへエクスポートするアプリを実際に、TraceViewにかけた。
上記例からは遅くなると思われる部分は書き込みと予測できる。
実際にデータを見てみると、確かに書き込みが一番遅かった。
しかし、JSONオブジェクトを文字列に変換する部分でも、かなりの時間が掛かっていることが分かった。
そこで、変換するのに時間がかかるなら、いっそ変換せずに
バイナリで書き込んでしまった方が高速化できるのではないか、とのことだった。


マーケットライセンシングを使ってAndroidアプリケーションを守るには (14:00-14:45)

・マーケットライセンシングとは
Licensing Server ⇔ Androidマーケットアプリ ⇔ アプリ
といった形で認証を行う、アプリのライセンス管理を実現し、無償で提供する。
ゲーム等の有償アプリを安心してマーケットに出すことができる。

この認証を行うためにLicense Verification Library (LVL) というものがある。
ただしこれを使えば確実に安全という訳ではなく以下を実施することを推奨する。
・LVLのサンプルコードをそのまま使用しない
・アプリ全体のコードの難読化
・改竄対策
・サーバからのレスポンスをきちんと処理する

・LVLのコードの変更
サンプルコードは公開されているものなので、いくらでも調べることができる。
同じバイトコードを探すだけなので、アプリのどの部分で認証をしているかすぐ発見できてしまう。
少しでも変更しておくことで敷居が上がる。例えば以下のような変更をする。
・サンプルコードのロジックの変更、必要のない処理を削る等
・別スレッドに分ける
・switchをifに変える、間に別の処理を加えることができるため
・onCreateには書かない
・別のアクティビティを起動してそちらで認証を行う
・追加のfinishを入れてライセンスを持っていない場合は終了させる

・難読化
リバースエンジニアリングをし辛くする効果があるが、
自動化された攻撃から守ることはできない。
コードのフローを変えることもできない。
ProGuardというツールを使うと簡単にできる。

・改竄対策
自分自身のチェックサムとサーバから送られてくる有効なチェックサムを比較するのが現実的。
ただ、サーバは自分で用意する必要がある。


クールなAndroidアプリを作るには (15:00-15:45)

IMoNiの開発者の考えるクールは2種類ある、技術的な部分と人とのつながり。
技術的な側面について
・インテント
Androidには他にはないインテントというクールな機能がある、これをぜひ活用したい。
この機能で好きなアプリを組み合わせ、オペレーションを実行することができる。
その際URIの形式を真似て渡すとパースしやすいので便利で、他のアプリとの連携もしやすい。
他のアプリに渡すだけでなく、自分も受け入れるようにしよう。
・コンテントプロバイダ
標準化されている通知方法を積極的に使う。
標準化された伝達手段を使えばSMS対応アプリを新着通知アプリとして使うこともできる。

人とのつながり
アプリが簡単に連携できることから、自然と開発者同士のつながりも生まれる。
Androidは端末も多いので、色々な端末色々な意見が聞ける。

FxCameraの開発者の考えるクールは
・使いやすいこと
・落ちないこと
・サポートがしっかりしていること
・進化していくこと

使いやすいこと
操作感をを統一、独自描画せず標準のUI部品を使う。
Androidはもちろん、iOSのHuman Interface Guidelineなども参考にする。
Backキーの動作に注意する、ユーザは戻るを想定しているため終了しない方がよい。
メニューキーも気を付ける、押すという動作を全く思いつかない人もいるため。
・メニューキーを押さなければ、殆どなにもできないくらい積極的に活用する
・全く使用しない
・使用頻度が低いもののみメニューに格納する
のどれかを選択する。

落ちない
頑張るしかない、注意することは画面の縦横切り替え、ロケールの変更などの動作をするとき、
標準ではアクティビティが強制的に再起動する設定になっている。必要ない場合は変更しておくこと。

サポート
よくある質問とその答えをまとめたウェブページを作るのがよい。
アプリに埋め込むのはあまり良いアイディアではないかも。


Androidでリアルタイムゲームを開発する方法:リベンジ (16:00-16:45)

・OpenGL
Androidのバージョンや端末のハードウェアによってOpenGLの対応が違う。OpenGL ES 1.0 / 2.0
OpenGL ES 2.0対応端末のみに焦点を絞るなら、ETC1というテクスチャフォーマットを使うとよい。
ただ、遠くのオブジェクトは粗く表示させるというような工夫をすることで、
OpenGLのバージョンに関わらずほとんどの端末に対応させることはできる。
2Dでもdraw_textureを使うことで高速化できる。

・入力
Androidはトラックボールやキーボード、マルチタッチ等様々なデバイスを持つ端末が存在する。
しかしアプリ側では、それほど意識することなくそれらを扱うことができる。

・VBO (Vertex Buffer Object) を使う
これを使うことでVRAMにデータを置くことができる、通常のメモリと比べ3割程度高速化する。
ただ、変更に時間がかかるので、たくさん使わない、できるだけ数を減らすこと。

Java/Androidなのでユーザが死ぬ度にHTTPリクエストを出して、データを収集することも簡単にできる。
このデータからデスマップを作って難易度の調整などを行った。
またアプリにWebサーバ機能を持たせることで、外部からシェーダを入力し動的に反映させることで
デバッグが容易になった。このような方法はAndroid以外の環境では困難なのではないか。

0 件のコメント:

コメントを投稿