登壇してきた
12月19日に行われた"日本Androidの会 12月定例会"にLT参加してきました。
japan-android-group.connpass.com
10月ごろにTargetSDK 28対応を行った経験をベースにしました。AndroidXと書くべきかJetpackと書くべきか迷ったけどぱっと見で認識しやすそうなAndroidXにしてみた。
資料はこちら。
発表内容
内容はおおよそ下記3点。。
- AndroidXのおさらい
- AndroidXに対応するために
- 実は対応必須項目
AndroidXのおさらい
AndroidX対応はGoogle I/O 2018で発表されたAndroid Jetpack対応のことを指しています。
Jetpackは、Android Support Libraryで提供されていたAppCompatやRecyclerViewに加えて、DataBindingやAndroid Architecture Componentsなどが提供されるようになります。4つのコンポーネントに再整理される話は39秒あたり。
目的としては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にする対応など、リフレクションを利用している箇所が全て影響を受けます。アイドル中の制限も厳しくなりましたが、アイドル中にカメラやマイクへのアクセスを行うアプリは限られると思われるので、局所的に大変なことになる雰囲気です。
また、次のガイダンスも確認必須となります。
Behavior changes: apps targeting API level 28+ | Android Developers
ForegroundService
を利用している場合にはAndroidManifest
にパーミッションが必要(Normalパーミッション)- Apache HTTP クライアントのサポート終了
- 3rd party製ライブラリで利用している場合も対応が必要
- Set up an Android Studio project | Maps SDK for Android | Google for 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連休はそうめん祭りでした。