[Android] JCenter 依存解消でやったことメモ

# はじめに
Android アプリではいろいろなライブラリをオープンなリポジトリからダウンロードして利用しています。
そのリポジトリの中に `JCenter` というモノがあり、[2021年5月で閉鎖するという発表](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)がありました。

この `JCenter` というリポジトリ、大体の Android アプリで参照されてるんじゃないかってぐらい主要なリポジトリなので Android 界隈がざわつき、閉鎖期限の延長もされたのですが、あまりに影響が大きすぎたため閉鎖はされずに読み取り専用で存続することになりました。

（詳細については [コチラの記事](https://bps-tomoya.hateblo.jp/entry/2021/02/04/184317) がとてもわかりやすかったです。ありがとうございます。）

読み取り専用で存続することになったとは言え、またいつ方針が変わるかわからないので JCenter の依存を解消することにしました。

基本的な方針として

- ライブラリが `MavenCentral` リポジトリに移行されているか
    - yes
        - 現状のバージョンのものが存在するか
            - yes
                - 何もしない
            - no
                - 最新バージョンにアップデートして問題ないか
                    - yes
                        - 最新バージョンにする
                    - no
                        - gradle の cache ファイルをローカルにコピーして使用する
    - no
        - gradle の cache ファイルをローカルにコピーして使用する

こんな感じで進めました。

依存解消のためにやったことをつらつらと書き残しておきます。
何かの参考になると幸いです。

# 目次
1. [やったこと](#やったこと)
1. [参考](#参考)

# やったこと

- build.gradle から `jcenter()` `maven { url "http://dl.bintray.com...` という記述削除
    - JCenter を参照しないようにする
- `./gradlew --refresh-dependencies` を実行
    - --refresh-dependencies というオプションで依存状態リフレッシュ
    - エラーが出なくなるまで繰り返す
- `mavenCentral()` を `repositories` に追加
- `de.mannodermaus.gradle.plugins:android-junit5:1.6.1.0` を  `1.8.2.0` に変更
    - [MavenCentral](https://mvnrepository.com/artifact/de.mannodermaus.gradle.plugins/android-junit5) 移行済み
- `./gradlew assemble --stacktrace --info` 実行
    - StackTrace 付きでコンパイル
    - エラーが出なくなるまで繰り返す
- `com.linecorp:linesdk:5.0.1` を `com.linecorp.linesdk:linesdk:5.6.2` に変更
    - MavenCentral 移行済みで、名前とバージョンを変更
    - [line/line-sdk-android: LINE SDK for Android lets you integrate LINE into your Android app to create a more engaging experience for your users.](https://github.com/line/line-sdk-android#setup)
- `maven { url 'https://s3.amazonaws.com/moat-sdk-builds' }` 削除
    - 下記エラーが出るので削除

```
Could not HEAD 'https://s3.amazonaws.com/moat-sdk-builds/com/twitter/sdk/android/twitter/3.3.0/twitter-3.3.0.pom'. Received status code 403 from server: Forbidden
```
- `jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1` を `jp.co.cyberagent.android:gpuimage:2.1.0`に変更
    - 名前が変わって MavenCentral に移行されてた
    - [Maven Repository: jp.co.cyberagent.android » gpuimage](https://mvnrepository.com/artifact/jp.co.cyberagent.android/gpuimage)
    - フィルター関連のクラスが `filter` パッケージ配下に移動されてたのと一部名前が変わってたので修正

```diff
-import jp.co.cyberagent.android.gpuimage.GPUImageFilter;
-import jp.co.cyberagent.android.gpuimage.GPUImageGrayscaleFilter;
-import jp.co.cyberagent.android.gpuimage.GPUImageSepiaFilter;
-import jp.co.cyberagent.android.gpuimage.GPUImageToneCurveFilter;
+import jp.co.cyberagent.android.gpuimage.filter.GPUImageFilter;
+import jp.co.cyberagent.android.gpuimage.filter.GPUImageGrayscaleFilter;
+import jp.co.cyberagent.android.gpuimage.filter.GPUImageSepiaToneFilter;
+import jp.co.cyberagent.android.gpuimage.filter.GPUImageToneCurveFilter;
```

- `com.facebook.fresco:xxx` を `1.11.0` から `1.12.0`に変更
    - `com.facebook.fresco:animated-gif` と `com.facebook.fresco:animated-webp` の `1.11.0` にはなぜか `pom` ファイルがなかったので変更
    - [Central Repository: com/facebook/fresco/animated-gif/1.11.0](https://repo.maven.apache.org/maven2/com/facebook/fresco/animated-gif/1.11.0/)
    - [Central Repository: com/facebook/fresco/animated-webp/1.11.0](https://repo.maven.apache.org/maven2/com/facebook/fresco/animated-webp/1.11.0/)
- `com.mopub:mopub-sdk:5.7.0@aar` を `5.8.0` に変更
    - MavenCentral には `5.8.0` からしかなかった
    - [Maven Repository: com.mopub » mopub-sdk](https://mvnrepository.com/artifact/com.mopub/mopub-sdk)
- `com.facebook.android:audience-network-sdk:4.27.0` を `5.6.0` に変更
    - [Maven Repository: com.facebook.android » audience-network-sdk](https://mvnrepository.com/artifact/com.facebook.android/audience-network-sdk)
- `com.mopub.mediation:facebookaudiencenetwork:4.27.0.0` を `5.6.0.0` に変更
    - [Maven Repository: com.mopub.mediation » facebookaudiencenetwork](https://mvnrepository.com/artifact/com.mopub.mediation/facebookaudiencenetwork)

- `com.android.volley:volley:1.1.1` を `1.2.1` に変更
    - MavenCentral 移行済み
    - [Maven Repository: com.android.volley » volley](https://mvnrepository.com/artifact/com.android.volley/volley)
- `com.google.ads.mediation:mopub:5.12.0.1` を `5.18.0.0` に変更
    - Google の Maven リポジトリ 移行済み
    - [Maven Repository: com.google.ads.mediation » mopub](https://mvnrepository.com/artifact/com.google.ads.mediation/mopub)

- 以下エラーが発生するため Kotlin のバージョンを `1.3.61` から `1.5.20` に変更

    ```
    Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.
    ```

- 以下エラーが発生するため `.idea` を削除して Android Studio 再起動

    ```
    A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
          > java.lang.reflect.InvocationTargetException (no error message)
    ```

    - 参考
        - [少し前のアプリの改修をしたときのメモ - たくさんの自由帳](https://takusan.negitoro.dev/posts/android_hisasiburi_dev/)


- プロジェクト直下に `local-repository` というディレクトリを作成し、プロジェクトの `build.gradle` にリポジトリ検索対象として追加

```gradle
buildscript {
        repositories {
            ...
            maven { url = rootProject.file('local-repository') }
        }
}
```

- `local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/` に `pom`、`aar`、`jar` など配置
    - `local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/` ディレクトリ作成
      ```
      % mkdir -p local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/
      ```
   - `jcenter()` を参照した状態でビルドし Gradle の キャッシュ `~/.gradle/caches` を `*lombok.ast*` というファイル名で検索し、ヒットしたファイルを ` local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/` へコピー  
      ```
      % cp `find ~/.gradle/caches -type f -name \*lombok.ast\* | grep modules | grep files` local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/
      ```
    - コピーできたか確認

    ```
    % ls -lsa local-repository/me/tatarka/retrolambda/projectlombok/lombok.ast/0.2.3.a2/
    total 1984
       0 drwxr-xr-x  5 usr0200413  staff     160  4 25 16:21 ./
       0 drwxr-xr-x  3 usr0200413  staff      96  4 25 16:19 ../
     560 -rw-r--r--  1 usr0200413  staff  283868  4 25 16:21 lombok.ast-0.2.3.a2-sources.jar
    1416 -rw-r--r--  1 usr0200413  staff  722592  4 25 16:21 lombok.ast-0.2.3.a2.jar
       8 -rw-r--r--  1 usr0200413  staff    1582  4 25 16:21 lombok.ast-0.2.3.a2.pom
    ```

- 以下も上記と同じ手順で配置
    - `local-repository/com/twitter/sdk/android/twitter/3.3.0/`
    - `local-repository/com/google/android/flexbox/2.0.1/`
    - `local-repository/com/twitter/sdk/android/tweet-ui/3.3.0/`
    - `local-repository/com/twitter/sdk/android/tweet-composer/3.3.0/`
    - `local-repository/com/twitter/sdk/android/twitter-core/3.3.0/`
    - `local-repository/com/mani/ThinDownloadManager/1.3.0/`
    - `local-repository/com/google/ads/mediation/mopub/5.8.0.0/`
    - `local-repository/com/mopub/libAvid-mopub/3.6.4/`
    - `local-repository/com/moat/analytics/mobile/mpub/moat-mobile-app-kit/2.4.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-core/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-ui/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-core/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-dash/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-hls/2.9.5/`
    - `local-repository/com/google/android/exoplayer/exoplayer-smoothstreaming/2.9.5/`
    - `local-repository/com/applovin/applovin-sdk/8.1.4/`
    - `local-repository/com/google/ads/mediation/facebook/5.9.0.2/`
    - `local-repository/io/realm/realm-gradle-plugin/6.0.2`
    - `local-repository/io/realm/realm-transformer/6.0.2/`
    - `local-repository/io/realm/realm-annotations/6.0.2/`
    - `local-repository/io/realm/realm-android-library/6.0.2/`
    - `local-repository/com/getkeepsafe/relinker/relinker/1.3.0/`
    - `local-repository/io/realm/realm-annotations-processor/6.0.2/`
    - `local-repository/com/github/maskarade/android/orma/orma/6.0.2/`
    - `local-repository/com/github/maskarade/android/orma/orma-annotations/6.0.2/`
    - `local-repository/com/github/maskarade/android/orma/orma-core/6.0.2/`
    - `local-repository/com/github/maskarade/android/orma/orma-migration/6.0.2/`
    -  `local-repository/com/github/maskarade/android/orma/orma-processor/6.0.2/`
    - `local-repository/com/outbrain/sdk/pub/obsdk/3.9.2/`
    - `local-repository/com/yarolegovich/discrete-scrollview/1.4.4/`
    - `local-repository/com/google/ads/mediation/maio/1.1.5.0/`
- 以上で無事にビルドできるようになった
- apk 作成時にエラーが出たので `de.mannodermaus.junit5:android-test-core` と `de.mannodermaus.junit5:android-test-runner` を `1.0.0` から `1.3.0` に変更
    - MavenCentral 移行済み
        - [Maven Repository: de.mannodermaus.junit5 » android-test-core](https://mvnrepository.com/artifact/de.mannodermaus.junit5/android-test-core)
        - [Maven Repository: de.mannodermaus.junit5 » android-test-runner](https://mvnrepository.com/artifact/de.mannodermaus.junit5/android-test-runner)


# 参考
- [Service End for Bintray, JCenter, GoCenter, and ChartCenter | JFrog](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)
- [JCenter が2021年5月1日にシャットダウンすることになったので Android アプリエンジニア観点でメモをまとめた - BattleProgrammerShibata](https://bps-tomoya.hateblo.jp/entry/2021/02/04/184317)
- [AndroidアプリのJCenter閉鎖の影響調査と暫定対応 | MoT Lab (Mobility Technologies Engineering Blog)](https://lab.mo-t.com/blog/android-remove-jcenter)
- [利用ライブラリをMavenリポジトリ形式でプロジェクト内のファイルとして保持する(JCenterシャットダウンに向けて)](https://zenn.dev/onozaty/articles/java-local-maven-repository)