kobakei's blog

プログラミングの話や技術系イベントの話をゆるく書くブログです

#DroidKaigi 2018で「開発者が知っておきたい通知の歴史」という内容で講演しました

DroidKaigi 2018

今年はセッションが採択されたので、スピーカーとして参加しました。去年までは普通に参加者としてだったので、スピーカーとして参加するのは今年が初です。

続きを読む

Androidアプリを設計する上で考慮したポイント

この記事はAndroid Advent Calendar 2017の13日目です。

僕が今業務で開発しているAndroidアプリの設計の紹介と、そこに行き着くまでの僕の設計に対する考え方を紹介します。

こんな設計にしています

f:id:keisukekobayashi:20171210023107p:plain

どういうポイントを考慮してなぜこの形に行き着いたのかを以下紹介します。

続きを読む

iOSはじめました

最近仕事でiOSを書き始めた。正直まだ全然書けないのでひたすら本読んだりググったりしながら、練習がてら簡単そうな機能から作っている。

AutoLayout辛い

AndroidのConstraintLayoutの元ネタのレイアウトの仕組み。XcodeGUIでUIを組み立てていくのにまだ慣れない。些細なことでレイアウトが崩れるし、Storyboard開くだけでGitでdiffが出たりして辛みがある。iOS書いてると「なんてAndroid Studioはいい子だったんだ」と再認識するんだけど、原因の8割くらいはAutoLayout関連な気がする。

AutoLayout含め、iOS開発では「お前らXcodeGUIで色々できるようにしといたからそれ使って開発しろよ。それ以上のことやりたい?知るか」的なAppleの思想を感じる。Androidは逆に最低限のGUIしか提供してない代わりに、XMLいじれば大抵の要素をいじれるようにしてくれてる気がする。ConstraintLayoutも、結局XML触るしね。

Swiftはそんなに抵抗ない

もともと書いてなかったけどコード読む機会はそこそこあったので、割とすんなり入れてる。AutoLayoutで消耗しすぎて進捗は著しく悪いんだけど、慣れてくれば普通に書けると思う。今年はKotlinも書き始めたんだけど、Javamよりは文法近いのでなおさら抵抗がないのかもしれない。

ネットの記事やサンプルにたまに出てくるObjectibve-Cは、4~5年前くらいにちょっと書いてたこともあってすでに克服していたのはよかった。

昔より物覚えが悪くなったかもしれない

今回久しぶりに新しい技術を勉強してるわけだけど、20代の頃の自分だったらもっとすんなり習得できたんじゃないかという気がしていて、歳とったんだなとしみじみした。10年前のフレッシュな脳みそが欲しい。

あとは「一人前にiOS書けるようになった」と自信を持つには、簡単な趣味アプリでもいいのでゼロから書いて公開する体験が必須だと思ってるんだけど、いいネタが無い。毎年Appleにお布施を払わないといけないというのも腰が重い理由かも。誰か儲かるアプリのアイデアください。

DroidKaigi 2018でリジェクトされたネタ

DroidKaigi 2018で、「開発者が知っておきたい通知の歴史」というセッションが採択されました。通知のAPIや仕様の変遷を辿り、後方互換姓を考慮した実装をするにはどんな風に書けば良いのかを紹介するセッションです。特に最近Android開発を初めて昔の通知を知らない人に是非聞いてもらいたいと思っています。

一方で、他に応募していた3本のセッションがリジェクトされたので、どんな内容を話すつもりだったかを備忘録的に残しておきます。今後shibuya.apkなど他の勉強会で機会があればショートバージョンにして話すかもです。

データバインディングをもっと使いこなそう

データバインディングの初心者や基本的な使い方しか知らない人向けに、実践的な使い方を紹介する予定でした。具体的には、以下の様な内容をカバーします。

  • BindingAdapter & InverseBindingAdapter
  • ObservableList と RecyclerView
  • アニメーション関連。特にOnRebindCallback
  • MVVMパターン with data binding

過去発表した以下のセッションの内容+αなイメージでした。気になる方はこちらのスライドも見てください。

speakerdeck.com speakerdeck.com

Androidアプリ開発をラクにするCI/CD

今の会社で実戦投入しているCI/CDの事例や小技を紹介するセッションの予定でした。CircleCI Meetupで発表したこのスライドをベースにするつもりでした。

speakerdeck.com

バイスファームのセッションを除くと、CI/CD系のセッションは今回一件も採択されていなかったので需要がなかったのかも?一昔前に比べると情報が見つけやすい気はしますね。

Robolectricで単体テストを書けるようにするには

Robolectricそのもののセッションではなく、Robolectricでテストを書きやすい状態にするための設計のセッションの予定でした。DIの導入やMVWパターン、staticメソッドの潰し方やテストしづらい外部SDKFacebook SDKなど)のラッパーを書く、などの話をする予定でした。改めて応募を見返すと内容が薄そうに見えたので、どこかの勉強会でLTで話せばちょうどいい分量のような気がしました。

総括

結果1勝3敗ということで、DroidKaigi全体の採択率通りの結果でした。来年はもうちょい数を絞って練った応募を出せるようにしたいです。

Kotlin 1.1.4のParcelizeを試してみた

Kotlin 1.1.4でParcelableがサポートされたので、移行してみました。

注意:ParcelableサポートはまだExperimentalなので、仕様が変わる可能性があります。

導入

app/build.gradleに以下を追加します。

...
apply plugin: 'kotlin-android-extensions'

android {
    ...
    androidExtensions {
        experimental = true
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3"
    ...
}

Entity classをParcelableを継承するようにし、@Parcelizeアノテーションを追加します。

@Parcelize
data class Hoge constructor(
    val foo: String,
    val bar: String
) : Parcelable

あとはビルド時にCREATORが自動生成されます。便利ですね。

問題: Dateが使えない

プロパティにDateがあるとビルドエラーが発生しました。例えばこんな感じのクラス。

@Parcelize
data class Hoge constructor(
    val foo: String,
    val bar: String,
    val createdAt: Date
) : Parcelable

DateクラスはSerializableなクラスなので、Parcelableに突っ込めるはずなんですが謎。 Parcelerjohncarl81/parcelerとは別物)というシリアライズ/デシリアライズを自分で書くためのインタフェースが提供されているので、companion objectに継承させて解決できます。

// Dateをread/writeするための拡張関数
fun Parcel.writeDate(date: Date) {
    writeLong(date.time)
}
fun Parcel.readDate(): Date {
    return Date(readLong())
}

@Parcelize
data class Hoge constructor(
    val foo: String,
    val bar: String,
    val createdAt: Date
) : Parcelable {

    companion object : Parceler<Hoge> {
        override fun create(parcel: Parcel): Hoge {
            return Hoge(
                        parcel.readString(),
                        parcel.readString(),
                        parcel.readDate()
            )
        }
        override fun Hoge.write(parcel: Parcel, flags: Int) {
            parcel.writeString(foo)
            parcel.writeString(bar)
            parcel.writeDate(createdAt)
        }
    }

}

Parcelerを用意するのめんどくさいので、そのうち修正してほしいところですね。

問題: Proguard有効時にビルドエラー

Progaurdを有効にしてビルドするとビルドエラーが出ました。こちらのチケットのコメントにある設定を足すととりあえず解決できます。

-dontwarn my.package.entity.**

johncarl81/parcelerから移行してみて

johncarl81/parcelerだとEntity自体はParcelableにはならなかったため、Bundleに詰めるときなどは必ずParcels.wrapでParcelableに変換してから詰めてたんですが、KotlinのParcelizeだと変換が不要なので、ActivityやFragmentでParcelableを扱うときは大分見やすくなると思います。

一方で、Parcelizeでは本来そのまま扱えるはずのDateが上手く扱えないなど、使いづらい点が残っていると感じます。この辺はまだExperimentalということで、今後改善されていくことを期待しています。

追記: Jelly Beansでインストールできなくなる模様

https://youtrack.jetbrains.com/issue/KT-20034

まだ本番投入するのは早そうです。