Google Developer Summit 2016:Android 知らなかったこと驚いたことメモ

知らなかったこと驚いたこと面白かったことを太字にしておきます。
流し見するのにはいいかもしれません。

Android N対応の知見が少し貯めることができました。
またAndroid StudioのところではGradleで設定しているバージョンなどに気を使ってみようかなという気になりました。
Googleの目的としてはAndroid Nの情報を出していくことで、フィードバックをもらい、改善につなげていきたいというところのようです。
間違いなどがございましたらコメントでご指摘いただくか、編集リクエストしていただけるとうれしいです。

# Android Studio
* 一番伝えたいこと
    * 複数のAndroidStudioのバージョンを共存できる  
アプリケーションディレクトリにAndroid Studio.appからAndroid Studio Canary.appなどに変えて、ファイル名を変えて、二つ入れることができる
        * **Android Studio Canary.appの方の更新チャンネルをCanaryにすることで、片方だけ実験版で使うということができる**
    * **基本的にSDKのインストールディレクトリは複数のAndroid Studioのバージョンで共用してもOK**  
→共有しているとAndroid Studio 2.0でレイアウトxmlでRendering Problemsなどが出てしまうといったN Preview用のものを見てしまっていることがあるので注意する(上のメニューで切り替え可能)
* Gradle
    * バージョンアップのポリシー  
compileSdkVersionとbuildToolsVersionは23系(サポートライブラリも)にあげる(最新のstable)  
Gradleは2.4以上にPluginは2.0系に早めにあげる
    * **targetSdkVersionはゆっくりテストをしてからあげる(急いであげる必要はない)**


* エミュレーター
    * apkをドラッグアンドドロップでインストールできる
* Android Studio 2.1
  * Jack&Jill
      * Javaのバイトコードに変換せずにDEXに変換することでビルドを高速化している
      * **Android自体もJackでコンパイルされている**
  * 2.1の現時点の問題点
     * gitのインテグレーション機能がうまく動かない
     * デバッグ実行に問題
     * 明示的にIPv6を指定する必要があることなど
* Android Studio 2.0
    * DEXに関する処理の改善による高速化
        * →**20個弱のライブラリに依存しているサンプルでビルド時間が半分に！**
        * **Build Tools 23.0.2 Gradle2.4 Plugin 2.0.0に設定されている必要がある**        
        * これに伴って**ビルド時のJVMのヒープサイズの設定の方法が変わる**
            * build.gradleで`dexOptions`で`javaMaxHeap〜`で設定したものは利用できなくなり、`gradle.properties`に`org.gradle.jvmargs=-Xmx4094ms`に設定する必要がある
    * シュリンク機能
        * **メソッド数が上限に近い人がデバッグ時にメソッド数を減らすときに利用する**  
難読化せず、メソッドの削除だけ行うので時間が短いなどの利点がある  
以下のような設定をしたbuildTypeを用意してデバッグで利用する
        
```groovy
minifyEnabled true
useProguard false
```

* adbによるデプロイ高速化
  * **Platform Tools 23.1**より
  * **push pullの速度が4-6倍**
* aaptの改善
    * デバッグビルド時に端末に必要な画像リソースのみをapkにしてデプロイするようになった
    * 将来的にはCPUのアーキテクチャやMulti-Dexなどをうまくデプロイする仕組みができるかも
* Instant Run
    * デバッグビルドのみ
    * 対応はAPI レベル15以上
    * 現状の問題点
        * MultiDex利用時の問題
            * multiDexEnabled trueかつminSdkVersion 20の場合にパフォーマンスが落ちる
        * DEXに含まれるメソッド数が従来の数より増える
        * Jackと併用不可
    * 仕組みについては「Instant Runを実現する仕組み」というDroidkaigiのセッションが良い
* その他
    * IntelliJ IDEA 15がベースになる
    * App Indexing支援
    * Android Dev Summit 2015のAndroid StudioのものはI/Oからのアップデート分を説明しているので見ておくと良い

## Q&A
プラグインの設定をバージョン間で共有したい
→ディレクトリ指定できるかもしれない

minifyEnabled true useProguard false の場合にProguardの設定を行うか？
→minifyには、ProGuardの設定は使わない

# Android N
* マルチウインドウ
    * 3種類ある
        * 二分割  
            * 縦横や左右で、リサイズ可能
        * 自由形式
            * Mac Windowsみたいに自由における
        * picture in picture(TV)
    * レイアウトに関してはAPIがない  
今までも大きさに従って調節できるようになっている  
Altanative Resourceで画面サイズ対応を行う
    * ライフサイクルは？
        * 画面回転と一緒
        * アクティブ/非アクティブが切り替わる (onResumeとonPauseで知ることができる？)
            * **UI更新の停止はonStopで行う**(onPauseで行うとマルチウインドウで他のアプリがアクティブになった場合にアプリが表示されているのに更新が止まってしまう)
        * **targetSdkVersionがNでないアプリはデフォルトでマルチウインドウ対応になる**
        * **AndroidManifestのresizableActivityがデフォルトはtrueなのでマルチウインドウ対応アプリとなる**
        * **AndroidManifestでrotation対応していない、方向指定している場合はマルチウインドウ非対応となる**
        * ウインドウの最小のサイズの設定ができる(Android Manifestで設定可能)
        * アプリ間のドラッグアンドドロップが実装可能
        * マルチウインドウの切り替えはユーザーが操作する(*アプリ側からは不可*)
* 新しい通知
    * 直接通知から返信ができる
    * **RemoteInputで返信の履歴を設定して返信するのを助けることができる**
    * NotificationのsetContentViewはDeprecated  
setCustomContentViewを使う
    * 通知をグループ化することができる
* Jack&Jill
    * jackを使うときはbuild.gradeでjackOptionsを設定する
    * **ラムダにOSの下位互換性がある(Android Nより前のOSでも利用できる)**
    * **内部的にはnewしているという意識して使う必要がある**
* データセーバー
    * ユーザーがアプリがバックグラウンドでネットワーク通信するかを設定できるようになった
    * データーセーバーをオンにするとそのアプリがバックグラウンドで通信できなくなる
    * **ConnectivityManager#getRestrictBackgroundStatus()がRESTRICT_BACKGROUND_STATUS_ENABLEDであればアプリが制限されている**
* クイック設定(ステータスバーでの設定 今Wifiなどの設定がある部分)  
`android.service.quicksettings`でユーザーがドラッグアンドドロップでタイルを追加できる
アプリ側から追加できる
**押すとインテントが飛ぶ**
* Scoped Directory Access  
特定のディレクトリへの権限を要求できる  
ScopedDirectoryAccessというサンプルがある  
→https://github.com/googlesamples/android-ScopedDirectoryAccess
* Direct Boot
    * 起動した時に動くのに利用する
    * (ちょっと調べてみたらBroadCastReceiverのACTION_BOOT_COMPLETEDの新しい版みたいな？？)
* ランチャーの中にダイナミックなショートカットが追加(あまり詳しい説明はありませんでした)
* Dozeについて  
    * Dozeが二段階になる
    * Dozeはもともといろいろオフにしていたが
ネットワークアクセスだけやめるといった
軽いDozeが実装される。
    * ベストプラクティスは今までどおりJobSchedulerを使う  
外から更新を貰いたいときはGCMでもらう
* 電池消費を抑えるプロジェクトの一環で暗黙のブロードキャストインテントがこなくなるようになった  
CONNECTIVITY_ACTIONが呼ばれなくなる  
ただ**AndroidManifestで設定されている場合がダメで、動的にBroadcastRecieverは設定できる**  
ACTION_NEW_PICTUREやACTION_NEW_VIDEOも受け取れない  
**JobScheduler と GcmNetworkManager で同等のことができる(JobInfo.Builder#addTriggerContentUri(       JobInfo.TriggerContentUri))**
* 表示サイズが設定できる  
    * **ユーザーがdpとpxの比率が変えられるようになった**　  
    * **ただし最大にしてもNexus4の大きさまで(sw320dpまで)**
    * 画面のサイズに従って画像のキャッシュなどをしている場合はキャッシュを削除する必要がある
* 言語設定  
LocaleList.getDefault()でリストを取得できる  
言語設定を一つだけでなく複数設定できるようになった  
システムが勝手にリソースを選んでくれるので基本的にすることなし  
翻訳アプリなどでデフォルト言語を取得する際にLocaleList.getDefault()を利用して使える
* ゲーム
    * NDKがSDKManagerからダウンロードできるようになった
    * ビデオ録画API ゲーム画面を録画 実況機能を実装予定
    * Vulkan
        * 次世代高速汎用描画API
        * パフォーマンスが良いなどなど

# Q&A

Swift化について一言
→**チームのメンバーがJava愛好家メンバーが多いのでならなそう**
AOSPを監視すると予兆があるかも

Kotlinはどう思っているか？
→排斥しようとかは思っていない。いいと思います。
→いいと思います。基本はJavaでその上にあるというところ。コミュニティが頑張れば標準も、、

Volleyの今後
→どうなるのかわからない。自分なら別のものを使う。

Jack&Jillを開発している意図は？
→クラスファイルを見るツールが使えない。何かを作っている話があるらしい。認識しており、回答は準備中。ただ社内でAndroid本体を素早くビルドしたいという要望がある。

BottomNavigationは推奨ですか？
→指が届かない問題はあった。マテリアルデザインのガイドラインは常に更新されている。フィードバックをもらって変わっていく。Google内でも実験的にやっている。
一つ付け加えると**デザイナが言っていたのはタブの置き換えではない。ナビゲーションドロワーの置き換え。**

マルチウインドウの使い所は？
→猫集め+デレステとかw攻略サイトを見ながらゲーム、、

マルチウインドウのキーボードはどうするか
→左右 アクティブな方の下にでる。上下は下にでる
→ドキュメントにあるはず、動いたコードが仕様

Support Library 23.3.0では何が追加されたか？
→ほとんど一緒で、AppLaunchCheckerを追加するためだけにバージョンアップ

Bazel採用される予定か？
→なんですかね？採用されない予定だと思う。**今後長くGradleでいくのでは？**

StreamAPIのバックポート
→されていない
→ライブラリを使うと良いのでは？
(Lightweight Stream APIのことでしょうか)

InboxのようなFabメニューは？
→開発は優先度が高いところからやっていく
→サードパーティである

Jack JillになったらOracleのJDKは不必要？
→今後も証明書のサインなどでいりそう。

jayceの仕様は公開されないか？
→ソースコードが仕様になっている

セキュリティ面で改善された部分は？
→Scoped Permissionとか
→SSLの証明書を設定する機能など
→NDKの方でも増えている

useLibrary 'org.apache.http.legacy'はいつまでサポートされるか？
→わからない。deprecatedになる場合は早く報告する

Jackでアノテーションプロセッシングサポートはどう
→頑張っています

Nのマルチウィンドウに対応していないアプリはどうなる？
→強制的にサポートされる
→方向が固定されている場合はサポートされないようになっている

NFC Type-F Host Card Emulationについて詳しく聞きたい
→ Felicaのカードとしてふるまう。スイカっぽいことができるかも？？

シュリンク時は@Keep効くか？(リフレクションなどで呼ぶ)
→効く

MultiDexを使うと4.0以上でしか動作しなくなりますが、Googleは切り捨てて欲しいのでしょうか？
→そんなことはない、今も自分は頑張っている
→デバッグはMultiDexを使って、リリースはProguardでやるというのが結構良い

23.3で少しVectorDrawableの機能が削られたが、今後もVectorDrawableの機能は削られるか？
→**知る限りないので大丈夫**

データセーバーはデフォルトでONか？
→ユーザーが自分でやる必要がある

Android Studio 2.0のバージョンが143となっていて、2からはじまらないのはなぜか？
→IntelliJのバージョンでは？

テストの実行にはエミュレーターと実機、どっちが推奨？
→どっちでもない。自分は両方やっている。
→ゲームだとエミューレーターで動かない

低メモリデバイスへの対応は
→エミュレーター
→Galaxy Nexus

N Previewの対象端末がXperialZ3が増えたが、対象が増える場合もあるか？
→増えていくと嬉しい。

Nリリースに伴い2系のサポート終了をアナウンスする場合もある？
→落とすこともあるかもしれない

フィードバックは英語のみ？
→微妙ですがスクリーンショットなどをあげればみんな頑張って読む

アプリ側からマルチウインドウができる？
→できない。ユーザーが戻し方がわからないなどがある。今後見せ方が見つかるかも