概要
個人的なメモとして一通り書いていたのを軽くまとめたものです。
割とAndroidの開発者視点のものが多いと思います。
太字が特に驚いたところです。
言っている場所のYouTubeのURLを貼るので、詳細が気になったらそれを開いてみてください!
間違えているものがあればご指摘お願いします。(英語勉強します。)
Keynote
みんな見ている気がするので省略
Google lensでWiFiのパスワード入れられるのめっちゃ便利。AIファースト。
Developer Keynote
動画: https://www.youtube.com/watch?v=EtQ8Le8-zyo
- Kotlin
- KotlinがAndroidアプリの開発言語のfirst class supportになるそうです。すごい。
- https://youtu.be/EtQ8Le8-zyo?t=578
- Android Platform Support
- GoogleのmavenリポジトリによってSDKマネージャでダウンロードする必要がなくなった
- https://youtu.be/EtQ8Le8-zyo?t=1036
repositories{
maven {
// Google Maven Repository
url "https://maven.google.com"
- Architecture Component
- ライフサイクルやベストプラクティスの共通の処理のためのライブラリ
- Googleが推奨する物が出てきたのがすごい。
- https://youtu.be/EtQ8Le8-zyo?t=1055
- TwitterのPWA(Progressive Web App)アプリが92kbしかなかったのすごすぎる件
- ChromeでlighthouseでWebページのパフォーマンス測定
- いい感じに調べられるようになってて汎用性が高そう
-
https://youtu.be/EtQ8Le8-zyo?t=2532
https://github.com/GoogleChrome/lighthouse
- Firebase Performanceがリリース
- https://youtu.be/EtQ8Le8-zyo?t=2883
- アプリのスタートタイム
- ネットワーク
が見られるらしい
- Firebaseの大部分をOpen Sourceで公開する
https://youtu.be/EtQ8Le8-zyo?t=2935
What's new in Android
- Android O
- Picture in pictureがスマホ対応
Picture in pictureに入るのに、ManifestファイルにresizableActivity="true"はいらなくなり、supportPictureInPicture="true"とactivity.enterPictureInPicture()を呼び出すだけらしい - findViewByIdに型のキャストがいらなくなりました。(これはcompileSdkVersionを変えるだけで適応されると思われるのでバージョンにかかわらず利用できるのではと思います。まだソースがダウンロードできないので検証できない)(知っていましたが反響が大きかったので、、)
- 色やショートカット、通知についてはそのセッションについてで、、
- Picture in pictureがスマホ対応
- Support Library v26
- そのセッションについてで
Architecture Components - Introduction (Google I/O '17)
- "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でデータを保持しておきたい時に使う
-
LifecycleOwner
-
データの永続化
- 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から構成される
- それぞれの役割の説明は必見です! https://youtu.be/FrteWKKVyzI?t=1729
- DIについて公式からあった
- RetrofitやDaggerが公式サンプルで登場
- Daggerでなくて、Service Locatorを使う方法もあると説明。
-
アプリを書き直すべきか?
→ あなたが満足しているのであれば書き直す必要はない。
Architecture Components - Solving the Lifecycle Problem
-
LifecycleOwnerのLyfecycleActivityやLifecycleFragmentは将来的にはAppCompatActivityやSupport LibraryのFragmentに統合
-
Custom LifecycleOwnerを使うとテストが出来る
-
LiveDataクラスを継承して自分でLiveDataを作れる 作り方はRxJavaのObservableを作る感じ LiveDataはonPause後に勝手に流れなくなったりonDestroyで消したり管理してくれる
-
LiveDataはRxJavaでは?
- https://youtu.be/bEKNi1JOrNs?t=1160
- YES: Reactive programming modelである
- NO: ライフサイクルawareなのが簡単にかける
-
RxJavaから移行するべきか?
- https://youtu.be/bEKNi1JOrNs?t=1241
- すでに正しくライフサイクルを管理できていると思うので、移行しないでいい
-
新しいプロジェクトではどうするべきか?
- https://youtu.be/bEKNi1JOrNs?t=1277
- LiveDataではじめる
- またはもっとリアクティブプログラミングしたければ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ではない
- https://youtu.be/bEKNi1JOrNs?t=1335
- (個人的にはRxJavaのBehaviorSubjectみたいなものだと思っているのですがどうなんでしょ、、)
-
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)
@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
- https://youtu.be/MfHsPGQ6bgE?t=422
- コンパイル時にfieldがないとかテーブルがないとか警告してくれるので安全
- Roomで1カラムを受け取るときはStringとかに返り値をすることも可能
- roomのTypeAdapter
-
https://youtu.be/MfHsPGQ6bgE?t=621
TypeComberters(MyConverter.class)
をDatabaseやDaoクラスにつけて、型の変換することが出来る
問い合わせなどではDate型を使って、SQLiteの中ではUnixタイムを使うということが出来る
-
https://youtu.be/MfHsPGQ6bgE?t=621
- Embeddedをつけると、同じテーブルにフィールドの中の値を入れられる
→2つあるとエラーになる@Embedded(prefix=“seen_")
とかつけてあげれば、その中にあるfieldをすべてprefixつけて解決できる - Observability
-
https://youtu.be/MfHsPGQ6bgE?t=1119
Listではなく、LiveDataオブジェクトを返してあげるように書くと、アップデートを受け取れる 同様にFlowableにも変えられる
-
https://youtu.be/MfHsPGQ6bgE?t=1119
- Entityの中にEntityは書けるか?
-
https://youtu.be/MfHsPGQ6bgE?t=1536
どこまで取ってくるかが難しい。
SQLiteで普通にJOINなどして、複数のテーブルから取得してきて、表示用のEntityを用意して、それにいれてあげるのが良い(理由は動画で見てね)
-
https://youtu.be/MfHsPGQ6bgE?t=1536
- Room
@Entity(foreignKeys=...)
とかちゃんとリレーションも設定できる。 -
@Entity(indices= {@Index("title","subTitle")})
とかでインデックスも貼れる - RoomのTest
- https://youtu.be/MfHsPGQ6bgE?t=1961
- Junitで、Room.inMemoryDatabaseBuilderでモックのデータベース作ってテストできる(すごい)
- 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
- 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によって使えるように
-
https://youtu.be/V6-roIeNUY0?t=440
- 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)
-
この公式ブログがすごく分かりやすくてすぐ見れていい感じです
-
https://android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html
-
Android Studio3.0でNetworkをデバッグで見れるようになって、通信している画像とか見れるようになった!!
- HttpUrlConnectionとVolleyとOkHttp3.0のcanaryも対応
-
EmulatorにProxy Support追加
-
など
What's New in Android Design Tools - New Features for Rapid UI Development
- ConstraintLayout 1.1.0 beta1はBarriers, Group, Placeholder, Percent dimensionsが追加
- Android Studio 3.0でapp/sampledataフォルダに文字列が書いてあるファイルを置くとtools:text="@tools:sample/strings"で参照できたりする(試してみたけどうまく動かない??)
- ConstraintSetを使うとレイアウトやViewからConstraintを取得して、他のレイアウトやViewにセットが出来る これでRotation対応ができる(ちょっとよく分かっていない)
- ConstraintSet + beginDelayedTransitionで楽々アニメーションができそう
ConstraintSets + Transitions are 🤘 That's basically how we built this interaction in the I/O app. https://t.co/KiSpdKLS4e pic.twitter.com/PhlVGXn3Wj
— Nick Butcher (@crafty) 2017年5月24日
What's New in Notifications, Launcher Icons, and Shortcuts
- 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)
以下のQiitaがよくまとまっています。
http://qiita.com/rkowase/items/808064f16272e131be63
-
追記するのであれば、DexInProcessが有効になっていれば、javaMaxHeapSizeは意味がないので、消したほうが良いという話がありました。
-
Android Gradle Pluginの話
-
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が登場!
- なぜappも再ビルドしなくてはいけないのか?
→ 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
カードの画像を見た時に
デザイナはマテリアルコンポーネントのカードだなと思って
開発者はBoxに影があって、端っこが丸くて、ボタンが有ると思う。
言語の違いがある。
→それをうめるのにFlatterを使う。
開発もデザイナも同じコードベースを見る感じ
Flutter にはマテリアルデザインのコンポーネントがたくさん用意されている
FlutterでRippleさせるにはInkWell。iOSでもRippleする
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!
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からそれを変換したり出来るよという話でした。
AndroidOでColor.valueOfの引数でADOBE_RGBなど、どのRGBを使うか渡せるようになった #io17jp pic.twitter.com/3W4Q7gB14K
— takahirom (@new_runnable) 2017年5月19日
種類が違うと全然画像の見え方が違いました。
また広い色域を使いたい場合は<activity android:colorMode="wideColorGamut"
でできるそうです。
まとめ
初めてのGoogle I/Oでしたが、さまざまなセッションがあり、
たくさんのセッションを集中的に見る機会は少ないため、知見にあふれていてとても良い機会になりました。
英語力の足りなさを実感できたので、強化して、ぜひまた行きたいです!