(Japanese only)

本日のライブ放送のアウトラインをここに掲載します。 Here's an outline of today's boradcast on device compatibility consideration at your Android apps.


----------------------------
Android アプリ機種対応ことはじめ

グーグル株式会社  Android デベロッパーリレーションズ
デベロッパーアドボケイト
松内 良介  Ryosuke Matsuuchi

グーグル株式会社  Android コンテンツ開拓担当
日本統括マネージャー
吉嗣 浩隆  Hirotaka Yoshitsugu

9/24/2012


----------------------------
機種対応: Android OS の最近の動き

2010.05.20 Android 2.2 (Froyo)
2010.12.06 Android 2.3 (Gingerbread)
2011.02.22 Android 3.0 (Honeycomb)
タブレット対応
Android UI/UX の大きな変化 ("Holo" theme)
2011.10.18 Android 4.0 (Ice Cream Sandwich)
携帯OS/タブレットOSの統合
2012.06.27 Android 4.1 (Jelly Bean)
全体的なチューニング、画面描画の円滑化、 Nexus 7

9月4日 現在の分布 : (4+, 3, 2.3, 2.2, 2.1-) = (22.1%↑, 2.1%, 57.5%, 14%↓, 4.3%↓)
http://developer.android.com/about/dashboards/index.html


----------------------------
機種対応: Android SDK (Java) - 画面解像度対応

(a) Multiple-screen support
さまざまな画面解像度への対応手法
http://developer.android.com/training/multiscreen/index.html
Android Design ガイドライン (2012.1.12) でも考え方を説明
Devices and Displays.  Android Design Guideline.
http://developer.android.com/design/style/devices-displays.html

(b) Resource qualifier (selector), Dimension リソース (dimens.xml) を活用して XML マークアップを効率良く記述
例: Google I/O 2012 アプリ ソースコード
http://code.google.com/p/iosched/ res/layout res/layout-large-v11 res/layout-land res/layout-large-land-v11 res/values res/values-land res/values-sw720dp res/values-sw720dp-land

(c) ブログ記事: New Tools For Managing Screen Sizes.  Dianne Hackborn.  7/27/2011.
http://android-developers.blogspot.jp/2011/07/new-tools-for-managing-screen-sizes.html


----------------------------
機種対応: Android SDK (Java) - その他の話題

(a) 標準 Android SDK API は上方互換 (Activity, View, Fragment, Support Library (ViewPager etc), Service, SQLite Database, ...)
カメラなど端末メーカーが独自に実装している機能の利用に関しては注意が必要 (通常、Intent 経由で使う場合は問題ない)

(b) Android Compatibility Definition Document
端末に Google サービス (Gmail, ..) を搭載する試験の要件
http://source.android.com/compatibility/index.html
過去 OS バージョン用も公開されています

(c) Out Of Memory 対策 (機種によっては搭載RAMが小さい)
標準 API で効率良く Bitmap を利用する手法の例
http://developer.android.com/training/displaying-bitmaps/index.html

(d) OSバージョンによる API の違いの吸収手法
Java の lazy class loading の利用例 (Reflectionより高速)
http://android-developers.blogspot.jp/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

(e) Secondary External Storage 問題
機種によっては SD card 領域が Context.getExternalFilesDir() ではアクセスできない (どうしても利用したい場合は機種依存のプログラミングが必要)


----------------------------
機種対応: Android NDK (C/C++)

(a) ABIs (Application Binary Interfaces)
armeabi
armeabi-v7a
ARM Architecture v7-a.  浮動小数点演算命令のサポート
x86 (まだ上 2つほどポピュラーではない) 
ZTE Grand X IN, Intel AZ210 / Orange San Diego (UK) / Xolo X900 (India) / MegaFon Mint (Russia)
mips (まだ上 2つほどポピュラーではない)
Ainol Novo 7

(b) <ndk>/docs/STABLE-APIS.html
libc: C Library (Android 1.5+)
libm: Math Library (math.h) (Android 1.5+)
C++ Library (一部) (Android 1.5+)
liblog: Android-specific Log Support (Android 1.5+)
libz: ZLib Compression Library (Android 1.5+)
Dynamic Linker Library (Android 1.5+)
OpenGL ES 1.x Library (Android 1.6+)
OpenGL ES 2.0 Library (Android 2.0/2.2+)   ※ NDKヘッダは 2.0 から、Java API は 2.2 から
jnigraphics (Pixel buffer access) Library (Android 2.2+)
EGL graphics library (Android 2.3+)
OpenSL ES native audio Library (Android 2.3+)   ※ Android 2.2以下では JNI 経由で音声を再生する必要がある
Android native application APIs (Android 2.3+)
OpenMAX AL native multimedia library (Android 4.0+)

(c) 2012.09.15 CPUアーキテクチャ別 Google Play Multiple APK サポート提供開始
http://developer.android.com/guide/google/play/publishing/multiple-apks.html


----------------------------
機種対応: OpenGL ES

(a) 8/1現在、全世界の Android 端末の 90.7% が OpenGL ES 2.0 に対応

(b) GPUのファミリー別に代表機種をテストすることを推奨
Adreno/Snapdragon : HTC Evo 3D, Xperia S 等
PowerVR : Nexus S, Galaxy Nexus 等
Tegra : HTC One X, Asus Transformer Prime, Motorola Xoom 等
Mali : Galaxy S2, Galaxy S3, Galaxy Note 等
Vivante (まだ上位4つほどポピュラーではない) : Ainol Novo 7
Broadcom (まだ上位4つほどポピュラーではない) : Galaxy Ace Duos (GT-S6352)

(c) Texture compression format
ETC1 (Ericsson texture compression). Supported by all Android phones. No alpha channel
PVRTC (PowerVR texture compression) : PowerVR
ATITC (ATI texture compression) : Adreno
S3TC (S3 texture compression) : NVIDIA (Tegra)
http://stackoverflow.com/questions/9148795/android-opengl-texture-compression

(d) Topic #9 of "Ten Things Game Developers Should Know", Google I/O 2012, 6/29/2012
Google I/O 2012 - Ten Things Game Developers Should Know
PowerVR はパフォーマンス特性が他GPUと大きく違うため sort 処理の実装を分けることを推奨
例: PowerVR: sort by material   Others: sort by geometry, depth, complexity

(e) GPUファミリごとにテストしながらチューニング、チューニング、チューニング


----------------------------
機種対応: WebView/HTML/javascript

(a) OSバージョンによる違い / CSS animation / Canvas
Android 2.1: WebKit 530.17
Android 2.2-2.3: WebKit 533.1
Android 3.x: WebKit 534.1x
Android 4.0-4.1: WebKit 534.3

(b) Chrome for Android のコードと従来の Android 標準ブラウザのコードのマージが進行中
Nexus 7 はブラウザアプリは Chrome, WebView は従来の Android 標準ブラウザコード

(c) 画面サイズ・解像度の変化への対応アプローチ
(c-1) viewport の width を固定ピクセル数に指定して自動拡大・縮小
<meta name="viewport" content="width=720"/>
http://developer.android.com/guide/webapps/targeting.html
(c-2) viewport による自動拡大・縮小を利用せずにガチで javascript コーディング
window.innerWidth, window.innerHeight, document.documentElement.clientWidth, document.documentElement.clientHeight
その解像度で最も美しく見える bitmap asset を選択するコードを記述

(d) [関連トピック] 高速化とネットワーク通信の低減のため、キャッシュ・先読み処理を推奨
http://alex.tapmania.org/2010/11/html5-cache-android-webview.html
http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.html
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setAppCacheMaxSize(8 * 1024 * 1024);
webview.getSettings().setAppCachePath("/hoge/hoge/");
webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);


----------------------------
機種対応: WebView/HTML/javascript (2)

(e) [関連トピック] 落とし穴の例: Activity/View の layout 計算と WebView の layout 計算が同時に実行されてしまうと衝突することがあります。 回避策の例:

public class MainActivity extends Activity {

  private WebView mWebView1 = null;
  
 @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView1 = (WebView) findViewById(R.id.main_webview1);
    // このタイミングでは WebView にコンテンツをロードしない
  }

 @Override
  protected void onStart() {
    super.onStart();
    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
     @Override
      public boolean queueIdle() {
        // Activity/View のレイアウト計算がすべて終了した。
        // WebView にコンテンツをロードする。
        if (mWebView1 != null) {
            mWebView1.loadUrl("....");
        }
        return false;
      }
    });
  }
}


----------------------------
機種対応: その他の話題 & 質疑応答

(a) [非推奨] アプリ起動に SIMカード必須 !?
- 電話ではない端末 (タブレットなど) のユーザーが利用できなくなります
- ハードウェア固有の識別子の利用はできるだけ避けてください
- 不注意に利用すると個人情報漏洩につながります
- 止むを得ない場合は:
android.os.Build.SERIAL (Android 2.3+)
Settings.Secure.ANDROID_ID (端末初期化操作によりリセット可能)
- READ_PHONE_STATE, READ_CONTACTS などユーザーに不安を与えかねないパーミッションを要求する場合は なぜ それが必要なのかユーザーに説明してください
Google Play ではアプリ公開時、プライバシーポリシー URL を設定できます
- ブログ: Identifying App Installations.  Tim Bray.  3/30/2011.
http://android-developers.blogspot.jp/2011/03/identifying-app-installations.html
Shared publiclyView activity