Google I/O 2017で驚いたところ(Android多め)

  • 67
    いいね
  • 1
    コメント

概要

個人的なメモとして一通り書いていたのを軽くまとめたものです。
割とAndroidの開発者視点のものが多いと思います。

太字が特に驚いたところです。
言っている場所のYouTubeのURLを貼るので、詳細が気になったらそれを開いてみてください!
間違えているものがあればご指摘お願いします。(英語勉強します。)

Keynote

みんな見ている気がするので省略
Google lensでWiFiのパスワード入れられるのめっちゃ便利。AIファースト。

Developer Keynote

動画: https://www.youtube.com/watch?v=EtQ8Le8-zyo

repositories{  
 maven {  
  // Google Maven Repository  
  url "https://maven.google.com"  

What's new in Android

  • Android O
    • Picture in pictureがスマホ対応
      Picture in pictureに入るのに、ManifestファイルにresizableActivity="true"はいらなくなり、supportPictureInPicture="true"とactivity.enterPictureInPicture()を呼び出すだけらしい
    • findViewByIdに型のキャストがいらなくなりました。(これはcompileSdkVersionを変えるだけで適応されると思われるのでバージョンにかかわらず利用できるのではと思います。まだソースがダウンロードできないので検証できない)(知っていましたが反響が大きかったので、、)
    • 色やショートカット、通知についてはそのセッションについてで、、
  • Support Library v26
    • そのセッションについてで

Architecture Components - Introduction (Google I/O '17)

https://youtu.be/FrteWKKVyzI

  • "Big changes to how we recommend that you build application"
    推奨しているアプリケーションの作り方を変えた! https://youtu.be/FrteWKKVyzI?t=14

Architecture Componentsに登場したものは基本的に驚きました。。

  • Lifecycle Made Easy
    https://youtu.be/FrteWKKVyzI?t=647
    • LifecycleOwner
      → Lifecycleを管理しているクラス、getLifecycle()でLifecycleクラスを返す、LifecycleActivityやLifecycleFragment(それぞれLifecycleOwnerを継承している)を継承して通常は利用する
    • LifecycleObserver
      → Lifecycle.addObserver()で追加するもの。(正確にはLifecycleRegistryで管理されていて)ライフサイクルに変化があった時に@OnLifecycleEvent(ON_START)などがついているメソッドが呼び出される。
    • LiveData(RxJavaを見たことがあればObservableをイメージすると分かりやすいです。)
      → ライフサイクルを検知するObservable(変更が検知できる)。 startとstopだけ書けば動く。(中ではLifecycleObserverを利用している)
    • ViewModel
      → LiveDataで保持していた値を画面回転後も持っていたい
      → ActivityやFragmentでデータを保持しておきたい時に使う

Lifecycleに関する個人的なメモUML:
image.png

  • データの永続化

    • https://youtu.be/FrteWKKVyzI?t=1276
    • Roomというライブラリを作った
      • RoomはSQLiteのためのマッピングライブラリ
      • ボイラープレートがいらない
      • SQLite
      • コンパイル時にSQLを検証してくれる
      • データの変更を検知してLiveDataで返せる
      • RxJava2をサポート
        Retrofitっぽく書けるのも個人的にとても良いです!
  • アーキテクチャ

    • https://youtu.be/FrteWKKVyzI?t=1677
    • 良いアプリケーションを書く事ができると信じているが、従う必要はない。
    • UIコントローラ(Acctivity, Fragment) , View Model, Repository, Datasourceから構成される
    • DIについて公式からあった
    • RetrofitやDaggerが公式サンプルで登場
    • Daggerでなくて、Service Locatorを使う方法もあると説明。
  • アプリを書き直すべきか?
    あなたが満足しているのであれば書き直す必要はない。

Architecture Components - Solving the Lifecycle Problem

https://www.youtube.com/watch?v=bEKNi1JOrNs

  • LifecycleOwnerのLyfecycleActivityやLifecycleFragmentは将来的にはAppCompatActivityやSupport LibraryのFragmentに統合
  • Custom LifecycleOwnerを使うとテストが出来る
  • LiveDataクラスを継承して自分でLiveDataを作れる 作り方はRxJavaのObservableを作る感じ LiveDataはonPause後に勝手に流れなくなったりonDestroyで消したり管理してくれる
  • LiveDataはRxJavaでは?

  • RxJavaから移行するべきか?

  • 新しいプロジェクトではどうするべきか?

  • LiveData.postValueでmainThread以外からも値をpostできる

  • LiveDataReactiveStreams

    • https://youtu.be/bEKNi1JOrNs?t=1315
    • compile "android.arch.lifecycle:reactivestreams:1.0.0-alpha1"
    • fromPublisher, toPublisherで使える
    • RxJavaなどとの連携がスムーズに!
  • LiveDataは基本的にHolderであってStreamではない

  • ViewModelはFragment間でのデータの受け渡しでも使える!

    • https://youtu.be/bEKNi1JOrNs?t=1762
    • ViewModelProviders.of(getActivity())// ここでActivityスコープなのでFragment間で受け渡しができる
      .get(SharedViewModel.class)
  • ViewModelは絶対にViewのインスタンス、Activity、resource(draweableなど)を持ってはいけない
    https://youtu.be/bEKNi1JOrNs?t=1788

Architecture Components - Persistence and Offline (Google I/O '17)

https://www.youtube.com/watch?v=MfHsPGQ6bgE
* 簡単にかける!
https://youtu.be/MfHsPGQ6bgE?t=234

@Dao
interface FeedDao {
  @Query("SELECT * FROM feed WHERE title = :query")
  Feed loadFeeds(String query);
}

@Database (entities={Feed.class},version=1) 
abstract class Database {
}
  • @Insert
    https://youtu.be/MfHsPGQ6bgE?t=341
    引数に複数入れられるし、コンフリクトのときのストラテジーも設定できる
  • @Update@Delete出来る
  • 引数にArrayを渡して、SQLiteのIN(:ids)などで複数指定したり出来る
  • Room Speaks SQL
  • Roomで1カラムを受け取るときはStringとかに返り値をすることも可能
  • roomのTypeAdapter
    • https://youtu.be/MfHsPGQ6bgE?t=621 TypeComberters(MyConverter.class)
      をDatabaseやDaoクラスにつけて、型の変換することが出来る
      問い合わせなどではDate型を使って、SQLiteの中ではUnixタイムを使うということが出来る
  • Embeddedをつけると、同じテーブルにフィールドの中の値を入れられる
    →2つあるとエラーになる@Embedded(prefix=“seen_")とかつけてあげれば、その中にあるfieldをすべてprefixつけて解決できる
  • Observability
    • https://youtu.be/MfHsPGQ6bgE?t=1119
      Listではなく、LiveDataオブジェクトを返してあげるように書くと、アップデートを受け取れる 同様にFlowableにも変えられる
  • Entityの中にEntityは書けるか?
    • https://youtu.be/MfHsPGQ6bgE?t=1536
      どこまで取ってくるかが難しい。
      SQLiteで普通にJOINなどして、複数のテーブルから取得してきて、表示用のEntityを用意して、それにいれてあげるのが良い(理由は動画で見てね)
  • Room @Entity(foreignKeys=...)とかちゃんとリレーションも設定できる。
  • @Entity(indices= {@Index("title","subTitle")})とかでインデックスも貼れる
  • RoomのTest
  • MockitoでDaoのMockを作ってもテストできる
  • マイグレーションの方法 https://youtu.be/MfHsPGQ6bgE?t=2119
addMigrations(new Migration(1, 2){
            migrate(){
                executeSQL("ALTER TABLE...")
            }
   })
  • マイグレーションのテストも出来る
    MigrationTestHelper.runMigrationsAndValidateメソッドで出来る

What's new in the support library

https://www.youtube.com/watch?v=V6-roIeNUY0

  • Support Library minSdkVersion 14に
  • Support LibraryがGoogleのMavenに移動したのでSDKManagerから落とす必要なくなった
  • New issue trackerに移行された
  • Font in XML res/fontが使えるように。TextViewにandroid:fontFamily="@font/myfont"
    • https://youtu.be/V6-roIeNUY0?t=440
      コードからセットするときはResourceCompat.getFontしてtextView.SetTypeface
      800種類のgoogleのfontがGoogle Play Servicesによって使えるように
  • Android Studio 3.0でダウンロードfontを設定すると自動でダウンロードのxmlとか書いてくれる!
  • Emoji Compatibility Library
    • support-emoji ダウンロード版と、バンドル版がある バンドル版は7mbあるので注意してね
    • support-emoji API Level 19
  • TextView auto sizing
    TextViewにautoSizeTextType=“uniform”でできる 細かいサイズの設定もできる
  • Dynamic Animation
    SpringAnimation anim.getSpring().setDampingRatio
  • VerctorDrawableCompat Fillできるようになった?もっと細かい指定ができる
  • AnimatedVectorDrawableCompat
  • PathInterpolator
    <pathInterpolator android:pathData=“M 0.0…"
    <objectAnimator android:interpolator=“@…"
  • new Wear Support Livrary Module
    WearRecyclerView
    BoxInsetLayout など
  • LeanbackにDetailViewが追加 かっこいい
  • PreferenceDataStore
    Preferenceの保存先とか保存処理を自分で実装できるらしい

What's New in Android Development Tools (Google I/O '17)

What's New in Android Design Tools - New Features for Rapid UI Development

https://www.youtube.com/watch?v=nYb4FUdlLZE
* ConstraintLayout 1.1.0 beta1はBarriers, Group, Placeholder, Percent dimensionsが追加
* https://youtu.be/nYb4FUdlLZE?t=677
* Android Studio 3.0でapp/sampledataフォルダに文字列が書いてあるファイルを置くとtools:text="@tools:sample/strings"で参照できたりする(試してみたけどうまく動かない??)
* ConstraintSetを使うとレイアウトやViewからConstraintを取得して、他のレイアウトやViewにセットが出来る これでRotation対応ができる(ちょっとよく分かっていない)
* https://youtu.be/nYb4FUdlLZE?t=1737
* ConstraintSet + beginDelayedTransitionで楽々アニメーションができそう

What's New in Notifications, Launcher Icons, and Shortcuts

https://www.youtube.com/watch?v=TB-K6OniF68

  • Launcher Icon APIは直径66dpが安全ゾーンで、それ以外は切り取られる可能性があるので注意が必要。そこには大切なものを入れないほうが良さそう。
  • mipmap-anydpiにic_launcher.xmlにLauncher Icon用のxmlを置いて、O未満用のはmipmap-xxhdpiなどにic_launcher.pngなどで置く
  • insetを入れて再利用してあげることで、古いアイコンを使って新しいアイコンを作れるので、APKサイズに優しく出来る
  • Android Oのランチャーの設定からアイコンを丸く切り抜くとか選べる
  • Android Oではcom.android.launcher.action.INSTALL_SHORTCUTが無効化された。かわりにrequestPinShortcutを使う。

Behavior Changesにも書いてありました。
https://developer.android.com/preview/behavior-changes.html

The com.android.launcher.action.INSTALL_SHORTCUT broadcast no longer has any effect on your app, because it is now a private, implicit broadcast. Instead, you should create an app shortcut by using the requestPinShortcut() method from the ShortcutManager class.

  • AppWidgetManager.requestPinAppWidgetでウォジェットが置けるダイアログが表示させられる Oが普通になれば、ウィジェット復権ありえますね。
  • 通知の順番ソートが変わる
    • https://youtu.be/TB-K6OniF68?t=1031
    • 以下の順番(ちょっとよく分かっていないのでコードが出て時間があればコードを読みたい)
    • Major Ongoing
      • 重要な現在進行中のタスク
      • Media notification
      • Foreground Service
        • setColorizedで通知に色がつけられる
    • People to People
      • MessagingStyle
      • Default SMS App
    • General
    • BTW
  • cannel(コード上) = category(UI上)単位でユーザーが通知を拒否できる
  • categoriesは飛行機のアプリであればFlight updatesやExcutive proguramなどにする
  • カテゴリに対して振動するかどうかなどの細かい設定ができる(ユーザーも変更できる)
  • カテゴリはアプリの文脈によって部屋であったり、タイトルであったり、送信者であったりする

Speeding Up Your Android Gradle Builds (Google I/O '17)

https://www.youtube.com/watch?v=7ll-rkLCtyk

以下のQiitaがよくまとまっています。
http://qiita.com/rkowase/items/808064f16272e131be63
* 追記するのであれば、DexInProcessが有効になっていれば、javaMaxHeapSizeは意味がないので、消したほうが良いという話がありました。

  • Android Gradle Pluginの話

    • https://youtu.be/7ll-rkLCtyk?t=1364
    • app -> lib1 -> lib2と言うかたちで依存していた時を思い浮かべてください(compile project(":lib1")みたいな形)
    • ABI(Application Binary Interface)
      • これは主にpublicメソッドなどのことを指す
    • 3.0未満ではlib2などでABIが変わっておらず中身の実装が変わった時も、依存しているモジュールapp,lib1でビルドが走る
    • 3.0からはABIが変わった時以外は再ビルドしない。
    • 3.0でもABIがかわったらapp, lib1で再ビルドがかかる
      • なぜappも再ビルドしなくてはいけないのか?
        • appがlib1もlib2も見える状態になっているから
        • なので、compileの代わりにimplementationが登場!

Android Gradle Plugin 3.0からはdependenciesのcompileはdeprecatedになり、apiとimplementationになる
→ apiはこれまで通り
→ implementationはappからlib2が見えないような形(つまりtransitive dependencyが発動しない)

Prototyping to Production Bridging the Gap with a Common Tool

https://www.youtube.com/watch?v=BJCqRpvvTrM

カードの画像を見た時に
デザイナはマテリアルコンポーネントのカードだなと思って
開発者はBoxに影があって、端っこが丸くて、ボタンが有ると思う。
言語の違いがある。

→それをうめるのにFlatterを使う。
開発もデザイナも同じコードベースを見る感じ

Flutter にはマテリアルデザインのコンポーネントがたくさん用意されている
FlutterでRippleさせるにはInkWell。iOSでもRippleする

ちなみに文法はKotlinのAnkoっぽかったです。
image.png

Machine Learning APIs by Example

https://www.youtube.com/watch?v=ETeeSYMGZn0
Video , Vision , Speech , Natural Language, TranslationのAPIの紹介という感じだった ここにそれぞれのサンプルコードがあるみたい https://github.com/sararob/ml-talk-demos

Single codebase, Two Apps!

https://www.youtube.com/watch?v=w2TcYP8qiRI

Flutterを始めるには?

git clone -b alpha https://github.com/flutter/flutter.git 
// flutterへのパスを通す
flutter doctor

reactに似ている

Flatterによるアプリ開発
370行で画像のアップロードまで出来るチャットアプリが作れる。AndroidでもiOSでもOK
すごい

Understanding color

https://www.youtube.com/watch?v=r8NeG0wmFXM
本当に色の話をしていました。
RGBにも色んな種類があり、Android Oからそれを変換したり出来るよという話でした。

種類が違うと全然画像の見え方が違いました。
また広い色域を使いたい場合は<activity android:colorMode="wideColorGamut"でできるそうです。

まとめ

初めてのGoogle I/Oでしたが、さまざまなセッションがあり、
たくさんのセッションを集中的に見る機会は少ないため、知見にあふれていてとても良い機会になりました。
英語力の足りなさを実感できたので、強化して、ぜひまた行きたいです!