Android
googleio
GoogleIO2017

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

More than 1 year has passed since last update.


概要

個人的なメモとして一通り書いていたのを軽くまとめたものです。

割と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でしたが、さまざまなセッションがあり、

たくさんのセッションを集中的に見る機会は少ないため、知見にあふれていてとても良い機会になりました。

英語力の足りなさを実感できたので、強化して、ぜひまた行きたいです!