radioc@?

レディオキャットハテナ

【勉強会メモ】GDG神戸 Android Oreo with Kotlin&Android Studio 3.0勉強会

gdgkobe.doorkeeper.jp

日時:2017-09-18(月)13:00 - 17:30

場所:ヤフー株式会社(大阪)

Oreoのリリースに合わせた新機能の紹介などベタな内容と思いきやもっと実用的で実開発寄りな内容で濃い内容の勉強会だった。

今すぐ始めるKotlinによるAndroidアプリ開発

発表者:サイバーエージェント藤原 聖さん

speakerdeck.com

※会場アンケート

  • Kotlinを触ったことある:3〜4割
  • Kotlin in Action知っている人:2人ぐらい

Kotlinの考え方について知る

Kotlin in Action

Kotlin in Action

Kotlinの開発チームによって書かれた本

翻訳本が出版予定(Amazonで予約受け付け中)

Kotlinが目指しているところ

  • より簡潔、より生産性が高く(実用主義)、より安全
  • Javaの代替言語(相互運用性)
  • 将来的にはJavaScript環境やiOSなどにも対応

実用主義

簡潔さ

  • 読みやすさを重視
    • ボイラプレートを極力減らす
      • クラスを定義する上での関心事を絞る
        • プロパティの型が何で、名前が何か、それが可変か不変か
        • それ以外のボイラープレートはコンパイラによって生成
      • 静的型付け言語であり、型推論が働く
    • よくある機能は標準ライブラリで提供
    • 読みにくくなることはさせない

安全性

  • 安全性と実装コストは常にトレードオフ
  • 重要な2つのエラーをコストのかからない方法で防止
    • NullPointerExceptionClassCastException
    • Null安全⇒低コスト( ? 一文字)で実現
    • スマートキャスト⇒一度チェックしたあとのスコープないは再キャスト不要

相互運用性

  • JavaのClassファイルへコンパイル
  • KotlinとJavaのソースを自由に行き来できる
  • ライブラリは既存のものをそのまま利用できる

注意点

  • 自由度が高い
  • 簡潔に書きすぎると読みにくくなる⇒コーディングルールはあったほうがいいかも

Kotlinの言語機能

  • 不変(val)or可変(var)を指定して変数宣言
    • 文脈的に一度しか初期化されない場合もvalになる
    • できるだけvalを使い、必要なときにvarにする
  • Data class
    • getter/setter⇒プロパティ
    • valの変数にはsetterがない(代入できない)
  • 制御構文
    • if文( whentry-catch も)を式として扱い、値を返すことができる
    • 三項演算子はKotlinにはない
    • for文⇒inでfor-eachのような繰り返し処理
    • Null許容⇒プリミティブ型にもNull許容型がある
      • プラットフォーム型(後ろに ! )どちらでも扱える特別な型
      • 文脈的にnullになりえない文脈の中ではNull非許容型として扱える
      • 安全呼び出し( ?.
      • エルビス演算子⇒?:の前がnullなら後ろの値を返す
      • 非Null表明( !! )は極力使わない

一番重要なのは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の例

KT-20023

KT-17204

  • 同名の引数に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への対応

  • JavaコードをコピペするとKotlinに変換するか聞いてくれる
  • JavaファイルごとKotlinに変換する機能もある

Device File Explorer

  • DDMSにあったものがStudioに取り込まれた

Advanced Profiling

  • あたらしいProfiler
  • デバッグ中のアプリからどんな通信をしたかが見える
  • 通信している画像のプレビューも見れる
  • SDK26未満(Oreoでは使えない)

Target SDK Version 26に上げた時に躓いたこと

発表者:GDG神戸 中谷 克紀さん

Oreoの新しい機能

developer.android.com

26に上げて発生した問題

  • 通知が表示されなくなった
  • 端末起動時にアプリがクラッシュ

Notification の仕様が変わった

  • 通知の実装を変えないと通知されない
    • 8.0以前は通知単位で重要度LEDバイブ等を設定
      • Notification Managerに渡す
    • 8.0では通知チャンネル単位で設定して通知チャンネルに発行する
      • Notification Channelを作成して渡す

後方互換

  • NotificationCompatを使う
    • もとからCompatを利用している場合は影響は少ない
  • Channnelを作って引数で渡す
    • Channel設定はユーザーが変更できる
    • ユーザーのチャンネル設定を取得できる
      • NotificationMannagerで取得
  • NotificationCompatでBackportされていないメソッドがあるので注意

Background Limits

Background Serviceの実行制限

developer.android.com

大きく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

developer.android.com

Android 8.0 Behavior Changes

developer.android.com

8.0対応のポイント

  1. 従来どおり動くこと
  2. 8.0からの新機能が使えること

ポイント

  • APIやOSの仕様変更、挙動が変わる
  • 利用OSSが影響を受ける
  • Support Libのバグ
  • Gradleの設定をAPI Level26にして検証

以下を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:TwitterMastodonに投稿できるアプリ

Kdoc(LT)

発表者: scache さん

speakerdeck.com

KDoc

  • Kotlin用のドキュメント記述用言語
  • JavaDocと書き方は似ている

Dokka

  • htmlに出力するツール

Android で通知&プリインストールの設定アプリから自作アプリを起動する

発表者:橋度朋弥さん

qiita.com

Notification時の設定アイコン

  • 5〜6系の場合
    • 通知を長押しすると設定アイコンが出るアプリと出ないアプリがある
  • 7系の場合
    • 通知をスライドすると設定アイコンが出る
    • どのアプリも全部出る
    • 設定>アプリの通知に遷移すると i アイコンが出るアプリと出ないアプリがある
  • 8系の場合
    • どのアプリも出る
    • 歯車と時計
    • 「アプリ内のその他の設定」ボタンが表示されるアプリと表示されないアプリがある

ネットワーク系の設定

設定アプリ>アプリ詳細画面 >データ使用量>アプリの設定を表示

  • AndroidManifestintent-filterMANAGE_NETWORK_USAGE を設定
  • ネットワーク利用に関するActivityを指定する
  • ICSから対応
  • Googleアプリ以外ではあまり対応されていない

Android Things

発表者:嘉多さん

  • IoTデバイスで動くAndroid
  • ラズパイで動作
  • Preview5はOreoベース

Pushを送ることが可能

  • OneSignalを利用
  • いろいろ活用できる

Kotlinで作るiOSアプリ

発表者:中倉さん

クロスプラットフォーム開発

Intel Multi-OS Engine

  • JavaかKotlinで記述
  • Objective-Cのネイティブアプリを生成してくれる
  • RxJavaとRetrofitを使っているけどこれがiOSでも動く

MOEプラグイン

  • MOEプラグインiOSモジュールを追加する
  • iOSと共通部分のモジュールができる
  • Realm等は両プラットフォームのモジュールごとに入れる必要がある
  • ドキュメントとサンプルが古く情報は少ない

Bundle Injection with Dagger

発表者:Benoît Quenaudonさん

speakerdeck.com

  • DaggerでのBundleServiceをinjectionする実例
  • 資料のコードを見たほうがわかりやすいので説明は割愛

まとめ

Oreoは機能的な変化は少ないと思っていたが、実装レベルで見ると通知周りやバックグラウンド制限は影響が大きそうだと感じた。菅井さんのセッションで新バージョンへの対応は大変だけど追従していかなければ技術的負債はたまっていくという話があって、その通りだと思う一方で、新バージョンで古いバージョン向けの実装へ影響が起きる事例は年々増えている印象もあり悩ましい問題ではある。とはいえ2年単位で端末を買い換える人が多い今の状況を考えれば、やはり新しいバージョンへはコンスタントに対応していく必要があり、短期間でコードをメンテナンスしていく状況に合わせてKotlinのようなメンテナンス性の高い言語の需要が出てきているのかもしれない。