【勉強会メモ】GDG神戸 Android Oreo with Kotlin&Android Studio 3.0勉強会
日時:2017-09-18(月)13:00 - 17:30
場所:ヤフー株式会社(大阪)
Oreoのリリースに合わせた新機能の紹介などベタな内容と思いきやもっと実用的で実開発寄りな内容で濃い内容の勉強会だった。
今すぐ始めるKotlinによるAndroidアプリ開発
発表者:サイバーエージェント藤原 聖さん
- FRESH! をKotlinで開発
- Kotlin助走読本 執筆
※会場アンケート
- Kotlinを触ったことある:3〜4割
- Kotlin in Action知っている人:2人ぐらい
Kotlinの考え方について知る
- 作者: Dmitry Jemerov,Svetlana Isakova
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2017/02/19
- メディア: ペーパーバック
- この商品を含むブログを見る
Kotlinの開発チームによって書かれた本
翻訳本が出版予定(Amazonで予約受け付け中)
Kotlinが目指しているところ
- より簡潔、より生産性が高く(実用主義)、より安全
- Javaの代替言語(相互運用性)
- 将来的にはJavaScript環境やiOSなどにも対応
簡潔さ
- 読みやすさを重視
安全性
- 安全性と実装コストは常にトレードオフ
- 重要な2つのエラーをコストのかからない方法で防止
NullPointerException
とClassCastException
- Null安全⇒低コスト(
?
一文字)で実現 - スマートキャスト⇒一度チェックしたあとのスコープないは再キャスト不要
相互運用性
注意点
- 自由度が高い
- 簡潔に書きすぎると読みにくくなる⇒コーディングルールはあったほうがいいかも
Kotlinの言語機能
- 不変(val)or可変(var)を指定して変数宣言
- 文脈的に一度しか初期化されない場合もvalになる
- できるだけvalを使い、必要なときにvarにする
- Data class
- getter/setter⇒プロパティ
- valの変数にはsetterがない(代入できない)
- 制御構文
一番重要なのはNull安全
Null安全を意識しながら徐々に様々な機能を使い始めるのが良い
※サイバーエージェントの状況
- FRESH!⇒最初からKotlin
- AWA⇒テストからか初めて順次置き換え中
- AbemaTV⇒書き換えるがリリースせずに習熟度を上げ中、一定期間後にいっきに書き換え予定
- タップル誕生⇒順次書き換えてリリース(Kotlin習熟度が高い人がレビュー)
- 新規サービス⇒最初からKotlin
Kotlin Contribution Guide
発表者:ヤフー株式会社 第六代黒帯 森 洋之さん
不十分なJava8対応を待つよりもKotlinを使ったほうがずっと快適
⇒Contributeしてみませんか
開発環境セットアップ
- JDK1.6,1.7,1.8すべて必要
- IntelliJ IDEA⇒Community EditionでOK
- Ant⇒Macなら最初から入っているものでOK
- InteliJにKotlinのプラグインを入れる
Contributing
issueは Youtrack
コントリビュートするissueの例
- 同名の引数にthisをつけるQuickFixを動作させる
- QuickFixクラスを作成
- QuickFix作成用のファクトリクラスを作成
QuickFixRegister
内で対応するエラーに対してファクトリクラスを作成
Android Studio 3活用術
発表者:有限会社シーリス 代表 有山 圭二さん
※会場アンケート
- Stable版を使っている:ほとんど
- Beta版以下を使っている:1,2割
Android Studio 3.0の新機能
- IntelliJ 2017.1ベース
- 新しいプロジェクトテンプレート(Instant App Support)
- Java8サポート(jack→desugar)
- 改良されたレイアウトエディタ
- フォントプレビュー
- Device File Explorer
- Kotlin対応
※Android ViewでのD&Dでの画像追加は今回も対応されず…
Kotlinへの対応
Device File Explorer
- DDMSにあったものがStudioに取り込まれた
Advanced Profiling
- あたらしいProfiler
- デバッグ中のアプリからどんな通信をしたかが見える
- 通信している画像のプレビューも見れる
- SDK26未満(Oreoでは使えない)
Target SDK Version 26に上げた時に躓いたこと
発表者:GDG神戸 中谷 克紀さん
Oreoの新しい機能
26に上げて発生した問題
- 通知が表示されなくなった
- 端末起動時にアプリがクラッシュ
Notification の仕様が変わった
- 通知の実装を変えないと通知されない
- 8.0以前は通知単位で重要度LEDバイブ等を設定
- Notification Managerに渡す
- 8.0では通知チャンネル単位で設定して通知チャンネルに発行する
- Notification Channelを作成して渡す
- 8.0以前は通知単位で重要度LEDバイブ等を設定
後方互換性
- NotificationCompatを使う
- もとからCompatを利用している場合は影響は少ない
- Channnelを作って引数で渡す
- Channel設定はユーザーが変更できる
- ユーザーのチャンネル設定を取得できる
- NotificationMannagerで取得
- NotificationCompatでBackportされていないメソッドがあるので注意
Background Limits
Background Serviceの実行制限
大きく2つの制限
- Excution Limits
- Backgroundの制限
Location Limits
- 位置情報の制限
Broadcastの制限
- ManifestでBroadcastReceiverを登録できなくなった
- 端末起動後にジョブ実行などは可能
- 可視アクティビティがある場合は制限されない
- フォアグラウンドサービスを使用している場合もOK
- 上記のようなケースに該当しない場合はバックグラウンドの制限対象となる
対策
- サービスを起動時に
Context.startForegroudService
を使う - サービス起動後5秒以内にNofiticationを発行する
- サービスが動作していることが明示的にユーザーに通知される
- 5秒以内に終了したとしてもダメ
- SDK26だけの対応なのでバージョンで分岐処理を書く
Prepare for Android 8.0
発表者:株式会社メルカリ ソフトウェアエンジニア Android-team/jp 菅井 純さん
8.0対応の参考サイト
Migrating to Android 8.0
Android 8.0 Behavior Changes
8.0対応のポイント
- 従来どおり動くこと
- 8.0からの新機能が使えること
ポイント
以下を26に変更
compileSdkVersion
buildToolsVersion
targetSdkVersion
⇒8.0より低いOSでだいたいクラッシュする
発生する問題の例
Window
BadTokenException
⇒他のアプリに重ねて表示するようなもの(Activity使わない系)で発生
VectorDrawable
NotFoundException
ContextCompat#getDrawable()
を使うResources#getDrawable()
など、バージョンごとに正解が変わってきたのでこれで大丈夫かはわからない
Background Execution Limit
IllegalStateException
Service#startForeground()
で回避- この問題はかなり起きる
- 4.x系との相性が悪い
InstantAppsが動かない問題
ContentProvider
を使用- Android Architecture Components
- LieDataを使っていると動かない
TLS1.2未満のセキュリティ問題
- PCI DSS⇒クレジットカード情報と取引の情報保護
- Android5系以上なら対応
育休エンジニア(LT)
発表者: furusin さん
子供の世話してたらなかなか開発する余裕ないが工夫して時間を捻出しアプリを開発中。
Twitodon:TwitterとMastodonに投稿できるアプリ
Kdoc(LT)
発表者: scache さん
KDoc
- Kotlin用のドキュメント記述用言語
- JavaDocと書き方は似ている
- htmlに出力するツール
Android で通知&プリインストールの設定アプリから自作アプリを起動する
発表者:橋度朋弥さん
Notification時の設定アイコン
- 5〜6系の場合
- 通知を長押しすると設定アイコンが出るアプリと出ないアプリがある
- 7系の場合
- 通知をスライドすると設定アイコンが出る
- どのアプリも全部出る
- 設定>アプリの通知に遷移すると
i
アイコンが出るアプリと出ないアプリがある
- 8系の場合
- どのアプリも出る
- 歯車と時計
- 「アプリ内のその他の設定」ボタンが表示されるアプリと表示されないアプリがある
ネットワーク系の設定
設定アプリ>アプリ詳細画面 >データ使用量>アプリの設定を表示
AndroidManifest
のintent-filter
にMANAGE_NETWORK_USAGE
を設定- ネットワーク利用に関するActivityを指定する
- ICSから対応
- Googleアプリ以外ではあまり対応されていない
Android Things
発表者:嘉多さん
Pushを送ることが可能
- OneSignalを利用
- いろいろ活用できる
Kotlinで作るiOSアプリ
発表者:中倉さん
- JavaかKotlinで記述
- Objective-Cのネイティブアプリを生成してくれる
- RxJavaとRetrofitを使っているけどこれがiOSでも動く
- MOEプラグインでiOSモジュールを追加する
- iOSと共通部分のモジュールができる
- Viewの部分はXcodeでViewContllerで作成しAndroidStudioのMOEプラグインでバインディングできる
- ボタンが押された処理はAndroid Studio側で書く
- Realm等は両プラットフォームのモジュールごとに入れる必要がある
- ドキュメントとサンプルが古く情報は少ない
Bundle Injection with Dagger
発表者:Benoît Quenaudonさん
- DaggerでのBundleServiceをinjectionする実例
- 資料のコードを見たほうがわかりやすいので説明は割愛
まとめ
Oreoは機能的な変化は少ないと思っていたが、実装レベルで見ると通知周りやバックグラウンド制限は影響が大きそうだと感じた。菅井さんのセッションで新バージョンへの対応は大変だけど追従していかなければ技術的負債はたまっていくという話があって、その通りだと思う一方で、新バージョンで古いバージョン向けの実装へ影響が起きる事例は年々増えている印象もあり悩ましい問題ではある。とはいえ2年単位で端末を買い換える人が多い今の状況を考えれば、やはり新しいバージョンへはコンスタントに対応していく必要があり、短期間でコードをメンテナンスしていく状況に合わせてKotlinのようなメンテナンス性の高い言語の需要が出てきているのかもしれない。