Kansai.kt #4 〜呑んだくれLT大会〜の発表資料とさせてください。
- @ikesyo
- 株式会社はてな アプリケーションエンジニア@京都
- https://twitter.com/ikesyo
- https://github.com/ikesyo
- http://ikesyo.hatenablog.com/
- 仕事ではiOSもAndroidもやっています
- 少し前まではTypeScriptでReact Nativeを書いていました
- Swiftコミッターです(コンパイラーには詳しくない)
- AndroidX Overview | Android Developers
- GradleのdependenciesのアーティファクトIDの変更
- パッケージの変更
- ソースコード
- XML
- 変更自体は"Migrate to AndroidX"がやってくれる
- importやXML内の参照の変更がありまくる
- diffが多くてPRのレビューが大変
- importの変更はほぼ見る必要なくても、他に意味ある変更があると埋もれる
- 並行する機能開発との衝突
package androidx.fragment.app
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter
typealias Fragment = Fragment
typealias FragmentManager = FragmentManager
typealias FragmentStatePagerAdapter = FragmentStatePagerAdapter
import android.content.Context
- import android.support.v4.app.Fragment
- import android.support.v4.app.FragmentManager
- import android.support.v4.app.FragmentStatePagerAdapter
+ import androidx.fragment.app.Fragment
+ import androidx.fragment.app.FragmentManager
+ import androidx.fragment.app.FragmentStatePagerAdapter
- AndroidX移行前でも、移行後と同じパッケージでimportしておける
- FragmentやAppCompatActivity、RecyclerViewなど数が多そうなところをやるだけでも差分をずいぶん減らせそう
- 差分をいくつかのPRに分割しておける
- JavaコードやXML(レイアウトやAndroidManifestなど)からは
typealias
は参照できない- JavaとKotlinの混在プロジェクトやXMLもカバーしたい場合は、同様に移行後のパッケージでサブクラスを作っておけばよさそう?
- こんなことしていて"Migrate to AndroidX"はちゃんと動くの?
- 新規プロジェクト作成して試したらちゃんと動きました
- https://twitter.com/ikesyo/status/1079782177510838280
- Jetifierのソースコード変換は、変換前後のパッケージのマッピングJSONファイルからsedのコマンド生成して変換しているようだった
- 変換後のパッケージがソースコード中に存在していても問題はなさそう
- https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/jetifier/jetifier/migration.config
- https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/jetifier/jetifier/source-transformer/rewritePackageNames.py
- ライブラリでの後方互換性確保
- クラス名を変更したい
- 単に変更すると破壊的変更になる
typealias
で変更前の名前も提供する- ついでに
@Deprecated
アノテーションも付けるとよさそう
class NewClass { ... }
@Deprecated(
message = "Renamed to NewClass",
replaceWith = ReplaceWith("NewClass")
)
typealias OldClass = NewClass