日本Androidの会 12月定例会でLTしてきました

登壇してきた

12月19日に行われた"日本Androidの会 12月定例会"にLT参加してきました。

japan-android-group.connpass.com

10月ごろにTargetSDK 28対応を行った経験をベースにしました。AndroidXと書くべきかJetpackと書くべきか迷ったけどぱっと見で認識しやすそうなAndroidXにしてみた。

dr1009.hatenablog.com

資料はこちら。

speakerdeck.com

発表内容

内容はおおよそ下記3点。。

  • AndroidXのおさらい
  • AndroidXに対応するために
  • 実は対応必須項目
AndroidXのおさらい

AndroidX対応はGoogle I/O 2018で発表されたAndroid Jetpack対応のことを指しています。

developer.android.com

Jetpackは、Android Support Libraryで提供されていたAppCompatやRecyclerViewに加えて、DataBindingやAndroid Architecture Componentsなどが提供されるようになります。4つのコンポーネントに再整理される話は39秒あたり。


Introducing Android Jetpack

目的としてはAndroid OSのリリースと分けてAPIの提供をしたいため、とのこと。 Support Libraryとして28.0.0まで育ってしまったバージョンを1.0.0から始め、またGMSのようにそれぞれのライブラリで個別に更新していきます。OSのバージョンと切り離すぞ、という強い意志を感じますね。

AndroidXに対応するために

Migrate to AndroidX  |  Android Developers

AndroidStudio3.2以上にして、menuより"Migrate to AndroidX..."を選択すると上で紹介されている対応が一通り行われます。便利。
実際に対応をしていて手で更新が必要なのは、Gradleに追記されたライブラリのバージョンを、公開されている最新のバージョンへ更新する程度だと思われます。あとは、利用しているAPIがDeprecatedになっていないかなど、Android Lintによるチェック結果を見て適宜対応することになるかと。

現実的に対応が大変なのはTargetSDK 28対応だろう、と個人的には思っています。

Migrating Apps to Android 9  |  Android Developers

注目点はこちら。BottomNavigationViewのshift modeをoffにする対応など、リフレクションを利用している箇所が全て影響を受けます。アイドル中の制限も厳しくなりましたが、アイドル中にカメラやマイクへのアクセスを行うアプリは限られると思われるので、局所的に大変なことになる雰囲気です。

Android 9 端末で実行されるすべてのアプリに影響を与える主な変更点

また、次のガイダンスも確認必須となります。

Behavior changes: apps targeting API level 28+  |  Android Developers

ビルド時だけではなく、実行時にクラッシュすることもあるのでよくよく動作確認しましょう。

実は対応必須項目

やっと本題。

AndroidXに移行するにあたって、ライブラリ側でリファクタリングがなされているケースがあります。 今回ぶつかったのは、PreferenceCompatFragmentの継承がandroidのDialogPreferenceからandroidxのDialogPreferenceに変更したことにより、大幅な修正が必要になるケースです。

/**
 * A base class for {@link Preference} objects that are
 * dialog-based. These preferences will, when clicked, open a dialog showing the
 * actual preference controls.
 *
 * @attr ref android.R.styleable#DialogPreference_dialogTitle
 * @attr ref android.R.styleable#DialogPreference_dialogMessage
 * @attr ref android.R.styleable#DialogPreference_dialogIcon
 * @attr ref android.R.styleable#DialogPreference_dialogLayout
 * @attr ref android.R.styleable#DialogPreference_positiveButtonText
 * @attr ref android.R.styleable#DialogPreference_negativeButtonText
 */
public abstract class DialogPreference extends Preference implements
        DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
        PreferenceManager.OnActivityDestroyListener {
/**
 * A base class for {@link Preference} objects that are
 * dialog-based. These preferences will, when clicked, open a dialog showing the
 * actual preference controls.
 *
 * @attr name android:dialogTitle
 * @attr name android:dialogMessage
 * @attr name android:dialogIcon
 * @attr name android:dialogLayout
 * @attr name android:positiveButtonText
 * @attr name android:negativeButtonText
 */
public abstract class DialogPreference extends Preference {

PreferenceFragmentCompatを用意されているクラスだけ利用しているケースには問題がありませんが、アプリ独自のダイアログを用意している場合には大幅な修正が必要になります。 こういったケースは実際にandroidx対応を行って初めて気づくことが多いと思われるため、早め早めにandroidxの対応を始めるのが良さそうです。

他にどういったケースで書き換えが必要になるかわからないため、書き換えが発生したら適宜共有していくしかないのかな、と思います。

まとめ

2018年にTargetSDK 26以上が必須になったように、2019年にはTargetSDK 28以上が必要になります。 Support Libraryは28.0.0で打ち切りになることが公式に発表されていることもあり、2019年はAndroidX対応に追われることになりそうです。生きぬきましょう。

お土産の話

会の最後に、投票で選出いただきキングジョーとそうめんをいただきました。

キングジョーかわいい。 そうめんはそうめんスポンサーこと池田製麺工場さんから。

池田製麺工房

3連休はそうめん祭りでした。