【追記:2022年2月1日へ延期】JCenter が2021年5月1日にシャットダウンすることになったので Android アプリエンジニア観点でメモをまとめた

シャットダウンが延期されました

JCenter のシャットダウンについては2022年2月1日へ延期になりました。

https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/

UPDATE: To better support the community in this migration, JFrog has extended the JCenter new package versions submission deadline through March 31st 2021.

To clarify, the JCenter repository will keep serving packages for 12 months until February 1st 2022. Only the JCenter REST API and UI will be sunsetted on May 1st 2021.

何が起きたか

Bintary、JCenter、GoCenter および ChartCenter が 2021年5月1日 2022年2月1日でシャットダウンすることが2月3日に JFrog から発表された。

jfrog.com

スケジュール

月日 | 内容 ---|--- 2月28日 | Bintray、JCenter、GoCenter および ChartCenter が新しい提出を受け付けなくなる。GoCenter と ChartCenter の Web サイトは無効化される 4月12日 / 26 日 | シャットダウンに向けた短期メンテナンス 5月1日 | Bintray、JCenter、GoCenter および ChartCenter シャットダウン

最新のスケジュールは JFrog の発表を参照してください。

Android アプリ開発でどのような影響を受ける

  • JCenter から Artifacts を手に入れられなくなる(依存解決先リポジトリがなくなる)
  • 各 Artifacts が他リポジトリMaven Central とか JitPack とか)へ移動すると思われるのでそれに合わせてビルドファイルを修正する必要が発生する
  • 開発終了などで JCenter 以外からの取得が望み薄の場合、今のうちに手元に確保しておく必要がある

いま JCenter を外すとどうなる

最低でもどれくらいの範囲で困るかということを確認するため Android Studio 4.1.2 で新規プロジェクトを起こして検証した。 JCenter を外し、代わりに Maven Central を設定する。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.4.21"
    repositories {
        google()
-       jcenter()
+       mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

この状態で依存解決を試みると、次のエラーになる。

A problem occurred configuring root project 'My Application'.
> Could not resolve all artifacts for configuration ':classpath'.
   > **Could not find org.jetbrains.trove4j:trove4j:20160824.**
     Searched in the following locations:
       - https://dl.google.com/dl/android/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
       - https://repo.maven.apache.org/maven2/org/jetbrains/trove4j/trove4j/20160824/trove4j-20160824.pom
     Required by:
         project : > com.android.tools.build:gradle:4.1.2 > com.android.tools.build:builder:4.1.2 > com.android.tools:sdk-common:27.1.2

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

trove4j なるものを僕はここで初めて目にしたのだけれど java.util.Collections の高速かつ軽量な実装をしたものらしい。

trove4j.sourceforge.net

trove4j / trove — Bitbucket

Android Gradle Plugin 4.1.2 はそれに依存しているが、Maven Central にはそれが無いので引き当てることができなかった。

Q. AGP の問題は解決されそうか

A.されそう

www.reddit.com

Android Studio Team の @droidxav 曰く、

  • AGP 7.0 では Maven Central がホスティングする新しいバージョンに依存するように移行済み
  • この変更を 4.2 に、場合によっては 4.1 にバックポートすることも検討している
  • 問題を軽減させるための他の手段も調査している

Q. AGP 以外に問題になるものを洗い出したい

Android Studio Arctic Fox でプロジェクトを開いてトップレベルのビルドファイル build.gradle を次のようにする。

  • AGP 7 へ依存するように変更
  • 参照先リポジトリjcenter() を削除して mavenCentral() を追加
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.0-alpha05"
        // other dependencies
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

この状態で Sync Project with Gradle Files で依存解決を走らせれば Maven Central に無いものを洗い出すことはできる。例として 2021年2月5日時点 JCenter のみで提供されている Groupie への依存があると、次のような warning(ビルドではエラー)になる。

f:id:bps_tomoya:20210205143749p:plain

Kotlin ほか関連ライブラリはすべて Maven Central で利用可能

編集履歴

  • 2021年2月4日 22時14分
    • Kotlin ほか関連ライブラリはすべて Maven Central で利用可能であることを加筆
  • 2021年2月5日 14時33分
    • AGP 以外に問題になるものを洗い出す方法を加筆
  • 2021年2月9日 14時57分
    • JCenter のシャットダウンが2022年2月1日へ延期になったので加筆、スケジュールを削除