Google Developers Summit 2016 : Android 参加メモ

Google Developers Summit Android に参加したのでメモを残す。(ようやく書く暇ができた・・・)
一応まとめましたが、個人的なメモです。雑なまとめ方で申し訳ございません。


# イベント概要

- Google Developers Summit : Android
- 2016 年 4 月 25 日（月） 13:30 - 17:30
- コクヨホール、東京都港区港南 1 丁目 8 番 35 号

# Overview of Android Beta Program

- Preview版は5まで出してから正式リリース予定
- Preview版及びイベントを設けている理由
  - 開発者からフィードバックが欲しい
- N Preview を焼きたい場合
  - google.com/android/beta からOTAで取得可能

# Android Studio 2.0

## Android Studio 複数バージョンの共存

- Android Studio のバージョンアップは躊躇わなくて良い
    - ファイル名で分けることができる
- しかし、最新版を追従するのは実部隊では難しい
- なので、誰かがなるべくCanaryやDevに並行して触れておいて欲しい
    - 新しい機能の把握
    - 既存プロジェクトのビルド確認
    - いけそうだったら全員バージョンアップ！
- Android Studio のバージョンアップをした時に心配になるのが SdkVersion 等の設定
    - compileSdkVersion や buildToolsVersion はあげても大丈夫
    - targetSdkVersion だけは、ゆっくりとテストしてからあげたほうが良い
    - 最新の Support Library を使うときは compileSdkVersion もあげる必要がある
        - 例えば Facebook SDK は Support Library に依存している
        - Facebook SDK をあげた時には Support Library もあげる必要がある → compileSdkVersion をあげないといけない
    - 現段階では
        - compileSdkVersion, buildToolsVersion は23系
        - Gradle は 2.4(2.8), Pluginは 2.0
- Android Studio 2.0 にするとレイアウトプレビューがデフォルトで N になってるから少々面倒
    - (23) にするとちゃんと表示される

## Android Studio 2.1

- Android N Developper Preview のサポート
- Java8 の一部の機能をランタイムサポート
    - lambda はツールチェインが下位互換サポート
- JDK8 必須
- Jack and Jill 必須
    - Jack: コンパイラ
    - Jill: リンカ
    - Jack and Jill 特徴
        - `.java -> .class -> .dex` ではなく、 `.java -> (.jack) -> Dex` といった具合に `.class` を作らない
- まだまだ問題がたくさん
  - 問題を見つけたらフィードバック！

## Android Studio 2.0

- DEXに関する処理の改善による高速化
    - dexInProcess を true にする(2.0はデフォルトtrue)
        - 依存関係が多い場合に早くなる
- メモリ不足の時の設定が変わった
    - gradle.properties に org.gradle.jvmargs=-Xmx4096 を書く
- シュリンク機能(不要なメソッドを削除する)
    - Debug時に Proguard は遅いので非現実的
    - シュリンク機能は Progurad を置き換える機能ではない
        - Debug時: minifyEnabled=true, useProguard=false
- ADBによるデプロイ高速化
    - 5倍くらい早くなった！
    - Platform Tools 23.
- AAPT(Android Asset Packaging Tool)の機能改善
    - xxhdpi の端末には xxhdpi のみ転送(デバッグビルド実行のみ)
- Instant Run
    - Instant Run が使える条件
        - 接続中であること
        - デバッグビルドのみ
        - APIレベル15以上(Cold Swapは21以上)
    - Instant Run の種類
        - Hot Swap: 実行状態を保ったまま変更を反映
            - 既存メソッドの実装を変更した場合
        - Warm Swap: Activityが再起動される
            - リソースを変更したり削除した場合
        - Cold Swap: アプリが再起動される
            - アノテーションを変更したり削除した場合
            - フィールドを変更したり削除した場合
            - メソッドのシグネチャを変更した場合など
        - New Build & Deploy: 今までと同じ(今まではこれのみだった)
            - AndroidManifestを変更した場合など
    - 問題点
        - multiDexEnabled true && minSdkVersion 20の場合にパフォーマンスが落ちる
        - DEXに含まれるメソッド数が本来の数よりも増える(64K問題)
        - Jackと併用できない
- エミュレータ
    - 実機よりも高速
    - マルチタッチなどの細かな操作が可能
    - 様々な状態設定や機能をモックできる
    - 電話、SMS、バッテリーの残量を変えたりできる
    - APKをエミュレータに対して、ドラッグ&ドロップでインストールできる
    - ウィンドウ枠のドラッグでエミュレータのウィンドウサイズも変えられる
    - GPU Profiler
        - 各フレームごとのプロファイラ情報が確認できる
- IntelliJ 15をベースにしている
- App Indexing支援
  - インテントフィルタの定義とかディープリンクとかを支援
- 質問
  - Android Studioを共存させた場合にプラグインを共通のものにできるか
    - 設定でディレクトリがあるはず
  - 2.0にした後に1.5側でビルドができなくなる
    - テスター1.5, 開発2.0でやってるパターンとかに問題が・・・

# Android N What's New + Support Library update

## Android N

- OTAでインストールできる
- Preview 5が終わってから正式リリース
- Preview 3まではAPIが変わる可能性がある
- Preview 4で API Level が 24 になる予定

### 新機能

#### マルチウィンドウ

- マルチウィンドウ(3種類)
    - 2分割
        - 縦横
        - ウィンドウリサイズできる
    - 自由形式
        - WindowsやMacと同じ
    - Picture in Picture(TV限定)
- マルチウィンドウによって増える状態
    - ウィンドウは表示されているがアクティブではない
    - リサイズされてレイアウトが変わる
- ライフサイクル
    - これまで通り
    - リサイズ
        - 画面回転した時の処理を正しくハンドリングしていれば問題ない
    - アクティブ/非アクティブ
        - アクティブ: onResumeが呼ばれた状態
        - 非アクティブ: onPauseが呼ばれた状態
            - ダイアログを表示している時と同じ
        - UIの停止はonStopで、onPauseでは止めないように
            - ※onStopが呼ばれない問題や後述のNDK絡みも含めて再検討するとのこと
- 変わったこと
    - AndroidManifestに新しいパラメータ
        - resizableActivity
            - デフォルトtrue(=マルチウィンドウサポート)
        - minimalHegiht/minimalWidth
        - defaultHeight/Width
    - Activity/Fragmentに新しいメソッド
        - isInMultiWindowMode()
        - isInPictureInPictureMode()
            - 分割、自由形式(アプリからは制御できない。ユーザ制御)
            - Picture in Picture(アプリ側から制御できる)
    - ドラッグ&ドロップできる

#### 通知強化(Nothification)

- 通知から直接返信できるようになった
- setRemoteInputHistry: ユーザ入力を助ける
- setGroup: 通知をまとめる
    - inBoxStyle
- カスタムビューのやり方が変わった
    -  setCustomContentView()

#### Java 8

- jackOptions { enabled true } 必須
- ラムダ
    - 後方互換がある(過去バージョンで使える)
    - ラムダを使うときは無名クラスとしてnewしていることを意識する

#### データセーバー

- あらゆるアプリがネットワーク通信ができなくなる
    - ユーザー制御で変更される
- ConnectivityManager で取得できる

#### クイック設定(Wi-Fiとか画面回転制御ができる場所)

- ドラッグ&ドロップで項目を追加・削除ができる
- Tile/TileService

#### 特定のディレクトリへの権限を要求

- 写真ディレクトリを見に行きます的な

#### その他

- Direct Boot
    - 端末が再起動しても見れないといけないデータはこれ
- ShortcutManager
    - 動的なショートカット
- ICU4J
- NFC Type-F
- Android for Work

### 既存機能の動作変更

#### Doze(端末を机の上に置いてる時とかに休眠状態にしたりする機能のこと)

- 軽いDozeモード的なものが追加された
    - 今まで: 机の上に置いておくとネットワーク遮断する
    - これから: 放電中、スクリーンOFF、静止状態にも反応する
    - 開発者は・・・
        - JobScheduler や GCM を使う
- 暗黙的ブロードキャスト廃止
    - CONECTIVITY_ACTION(WiFi/LTE切り替え通知)
        - このオプション?を指定したアプリがたくさん入ってると電池が・・・
        - 動的に BroadcastReceiver を登録すると受け取れる
    - ACTION_NEW_PICTURE
    - ACTION_NEW_VIDE
    - 開発者は・・・
        - 代わりにJobSchedulerを使う
- 表示サイズ(ユーザーが変更してくる)
    - 文字の大きさは既に変更できる、それのウィンドウサイズ版？
    - 表示サイズは最大でもNexus 4
    - 開発者は・・・
        - pxではなくdpを使う
        - sw320dpで正しく動くか確認すること
- 言語設定
  - これはまでは1個までしかできなかった
  - これからは2つ以上設定できる
  - LocaleList.getDefaultでリストを取得できる
    - このユーザは言語リストに複数入ってるから翻訳しなくていいよ的な

## Support Library

- 時間上発表なし

# Android NDK/Game/Vulkan Updates

- Android N Developer Preview
    - ゲーム開発に役立つ機能
        - 新しいNotification
            - ゲームからNotificationをたくさん送ってもグルーピングできるからok
        - Vulkan/OpenGL ES 3.2対応
    - 機能追加ではなく、安定リリース向け
      - パフォーマンス向上など
    - 挙動変更によってゲームに関するもの
        - バックグラウンドの挙動
            - ConnectivyManagerでデータセーバーのチェック
            - JobScheduler, GCM等のシステムサービスに移行
        - 低メモリデバイスの対応
            - アジア圏では512MB端末がある
                - できる限りオンメモリを少なく
        - 新しいセキュリティ
            - /system/lib 以下の未公開ライブラリの参照を禁止
                - libpng, libcryptoをopenするとExcepiton?
                - NDKに含まれるライブラリなら開ける
- Android NDK (r11c)
    - Clang がデフォルトコンパイラ(gccはduplicated)
    - SDKマネージャーからDL可能
    - 開発はAOSP上で
        - AOSPのチェンジログをウォッチできる
    - バグ報告はGitHub上で(b.android.comではない理由は不明)
        - github.com/android-ndk/ndk
    - r12 Beta
        - Vulkan対応されている
        - Vulkan.h / Vulkan.so を追加
        - GitHubからDLできる
    - 今後積極的にアップデートされる
- Google Play, 開発ツール
    - Google Play Game Service(Playstation Network的な/iOS Game Center的な)
        - Google+ のIDが不要になった(Gamer IDを作ればok)
        - ビデオ録画APIが入った
    - Cardboard SDK
        - ダンボールに入れてVRができる
        - 3Dオーディオ
    - ゲームに関係する Android Studio のアップデート
        - LLDBを使った安定デバッグ
        - adb push/pullが高速
        - GradleでのC++コンパイル
        - GPUデバッガ
- Vulkan(次世代高速汎用描画API)
    - Preview2から対応
    - 端末にVulkanドライバが入ってる必要がある
    - Android Nで正式サポート
    - ハイエンドデバイスで対応
        - Nexus 6P
        - Galaxy S7
    - テクスチャフォーマット
        - ASTCをサポートしている
    - ライフサイクル
        - OpenGL Contextのライフサイクルと同じ
    - OSSゲーム
        - パイヌーン
        - ズーシー