Android Studioでビルドエラーと格闘する

# はじめに
2016年頃まで自作のAndroidアプリを作って、[Google Play](https://play.google.com/store/apps/developer?id=hamham)に公開していました。
2021年の某日。突然Googleから**「ご対応のお願い: Google Play のポリシーをアプリが遵守していません」**とのメールがきて、アプリがストアから削除されてしまいました。
最後のアプリのアップデートをしてから5年も経って、突然こうなったということは、**Google Play側のデベロッパープログラムポリシーの変更に追随できておらず放置していたということが原因**と考えられます。
幸い、ポリシーに違反していた部分は軽微だったので修正自体は難しくなさそうです。
ポリシー違反部分を修正して再アップすればよいのですが、なんせ5年も前なので、開発環境を整えていたPCは手放してしまったし、アプリのビルドやストアへの公開方法も忘れてしまっている状態です。
残っているのはzipで固められた当時のソースコードのみ。

ということで、開発環境を構築して、アプリをビルドしようとしたのですが、いろんなエラーに遭遇してなかなか成功しません。
ここにビルドエラーと格闘した話を、自身の備忘録も兼ねて載せておきます

# 開発環境のセットアップ

### Android Studioのインストール

私はWindows10を使っているので、手順はWindows前提になります。
まずは、[Android Studio](https://developer.android.com/studio/install?hl=ja)をダウンロードして、PCにインストールします。

### Android SDKの導入

Android Studioが起動したら「Tools>SDK Manager」からSDKを導入します。
私の場合は、2016年頃に最後にアプリのアップデートをしたときに使っていたAndroid 6.0(API Level 23)と、2021年時点で比較的使っている人が多いと思われるAndroid 11.0(API Level 30)を選択しました。
新しいバージョンのものを選べば、Android側で対応した新しい機能が使えたりするのですが、一方で下位互換性が省かれている場合もあるので、**単純に一番新しいものを選べばよいわけではない**と考えたほうがよいと思います。

![sdk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/10fe0c6c-6ac6-240c-f0c7-9da334eb8959.png)

### AVDの導入

AVDはAndroid Virutual Deviceの略称です。
PC上でAndroidの端末をエミュレートしてアプリの動作確認をするときに使います。
Android Studioの「Tools>AVD Manager」からAVDを導入できます。
私はPixel 5を使っていることもあり、Pixel 5のVirtual Deviceを選択しました。
ご自身で動作確認したい端末を、「Create Virutual Device」から作成しましょう。

![avd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/ef1a9c71-94d6-590c-2c6d-27cc5cc816d9.png)

これで、以下のようにPixel 5のエミュレータをPCで起動することができました。

<img width="300" alt="pixel5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/4e1f42c5-a162-411e-20f7-03a745378b71.png">

# ビルドエラーと格闘する

ここからが本題です。
「File>Open」から当時作成したプロジェクトファイルを開くも、開発環境の問題なのかなかなかビルドが成功しません。

### Unsupported Gradle

```
Unsupported Gradle. 
The project uses Gradle 2.10 which is incompatible with Android Studio 2020.3.

Possible solution:
 - Upgrade Gradle wrapper to 3.0 version and re-import the project
```

2016年時点とAndroid Studioのバージョンも違うし、Gradleのバージョンも違うしということでなんか怒られました。
とりあえずエラーメッセージのとおり、Gradle wrapperを3.0にアップデートしてみます。

```
Unable to start the daemon process.

The project uses Gradle 3.0 which is incompatible with Java 11 or newer.

Possible solution:
 - Upgrade Gradle wrapper to 4.8 version and re-import the project

```

しかしながら、まだアップデートしろと言われました。
ということで、Gradle wrapperを4.8にアップデートします。

### Unable to load class 'javax.xml.bind.annotation.XmlSchema'

しかし、それでも以下のようにエラーがでます。

```
Unable to load class 'javax.xml.bind.annotation.XmlSchema'.

This is an unexpected error
```

いろいろ調べた結果、gradle build tool versionを上げるとよいということで、「File>Project Sturucture>Project」からバージョンを変更します。
[公式サイト](https://developer.android.com/studio/releases/gradle-plugin?hl=ja)の情報によると、プラグインのバージョンと必要なGradleのバージョンを合わせる必要があるようです。
以下のようにバージョンを指定します。

![gradle_ver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/aa49b900-4527-7a96-035e-86357c3ea475.png)

### Could not find com.android.tools.build:gradle:7.0.3.

ここまできて、「File＞Sync Project with Gradle File」を実施しますが、まだエラーがでます。

```
Could not find com.android.tools.build:gradle:7.0.3.
Searched in the following locations:
  - https://jcenter.bintray.com/com/android/tools/build/gradle/7.0.3/gradle-7.0.3.pom
If the artifact you are trying to retrieve can be found in the repository but without metadata in 'Maven POM' format, you need to adjust the 'metadataSources { ... }' of the repository declaration.
Required by:
    project :
Add google Maven repository and sync project
Open File
```
gradle 7.0.3が見つからないと言われます。
[jcenterのリンク](https://jcenter.bintray.com/com/android/tools/build/gradle/7.0.3/gradle-7.0.3.pom)をクリックすると「403 Forbidden」が返ってきます。
どうやら**「JCenter リポジトリは、2021 年 3 月 31 日に読み取り専用になりました。」**ということみたいです。
ここで、**build.gradle**を編集して、googleのリポジトリから取得できるようにします。

```build.gradle
buildscript {
    repositories {
        jcenter()
        google() //これを追加！！
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.3'
    }
}

allprojects {
    repositories {
        jcenter()
        google() //これを追加！！
    }
}
```
もう1回、「File＞Sync Project with Gradle File」を実施すると、必要なgradleのファイルをダウンロードしはじめて、BUILD SUCCESSFULが表示されました。

### A problem occurred evaluating project ':app'.

これでうまくいくかと思いきや、また別のエラーが出始めました。

```
A problem occurred evaluating project ':app'.
> Could not find method compile() for arguments [com.google.android.gms:play-services:9.2.1] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
```

広告表示で使っているGoogle Play Services（日本語では「Google Play開発者サービス」というらしい）が悪さをしているようです。
「File>Project Sturucture>Suggestions」で一通りwarningが出ているものを更新したらうまくいきました。

![suggestion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/0d8a1f0f-fe9b-3210-741c-881ce0d52634.png)


### AAPT: error: resource android:attr/colorError not found.

これで「Run>Run 'app'」でPC上のエミュレータで動くと思いきや、またエラーが。。そろそろ心が折れてきた。。

```
AAPT: error: resource android:attr/colorError not found.
```
app配下のbuild.gradleで、**compileSdkVersionとbuildToolsVersionを編集**すればよいらしい。

```build.gradle
    compileSdkVersion 23
    buildToolsVersion "30.0.2"
```

### The minSdk version should not be declared in the android manifest file.

また別のエラーが発生。

```
The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
Remove minSdkVersion and sync project
```

どうやら**AndroidManifest.xmlでminSdkVersionを定義するのは古いやり方**らしく、正しくはbuild.gradleで定義すべきということらしい。
ということで、AndroidManifest.xmlからminSdkVersionの定義をコメントアウトします。

```AndroidManifest.xml
    <!--
        <uses-sdk
            android:minSdkVersion="9"/>
    -->
```

ここまでやって、やっと「Run>Run 'app'」でPC上のエミュレータでアプリが起動しました。
私が持ってる端末をPCとUSBデバッグモードで接続し、Runしたらちゃんと端末でも起動できました。

あとは、AndroidManifest.xmlでVersionCodeとVersionNameを新しいものに書き換えます。
バージョンはもちろんアプリによって異なりますが、私は以下のルールでやっています。

- VersionCode：ユーザーから見えないもの。整数で記述。アップデートのたびに＋１する。
- VersionName：ユーザーから見えるもの。メジャーバージョン・マイナーバージョンのルールを決めて変更する。


```AndroidManifest.xml
    android:versionCode="8"
    android:versionName="1.3.2" 
```

そして、「Build>Generate Signed Bundle or APK」から、署名してapkファイルを作成します。
しかし、ここでまたエラーが発生。

### Lint found fatal errors while assembling a release target.

これはググったら、[Android Studioで署名付きAPK作成時にLintエラーが出た場合の対処法](https://qiita.com/takahamarn/items/dfc9f44c9591fd3780c7)というQiitaの記事が引っかかり、記事のとおりapp配下のbuild.gradleを編集し、Lintチェックを外したらビルドに成功しました。

```build.gradle
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}
```

# Google Playストアにアップロード

署名したapkファイルができたので、あとはストアにアップロードします。
ここで、[Google Play Console](https://play.google.com/console/u/0/developers/)を開いたところ、以下の記載がありました。

**[APK に代わり、Android App Bundle が Google Play で推奨している公開形式になりました](https://developer.android.com/guide/app-bundle)**

どうやら、2021年8月から、apkではなくAndroid App Bundle（拡張子：aab）を使うことが推奨されるようになったようです。
そこで、Android Studioから署名付きのapkではなくAndroid App Bundleを作成します。
「Build>Generate Signed Bundle or APK」から「Android App Bundle」を選択してウィザードを進めるだけです。

![aab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/0e56c173-d1ab-9406-aea8-2f4bb7dbbee9.png)

できあがった、apkとaabを比較すると、aabのほうが若干サイズが小さくなっています。

![apk_aab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/68d3a455-c0c0-aa44-4145-84ba5f194ad7.png)

これでGoogle Play Consoleからストアにアップロードできる状態まで持っていけました。

# さいごに

ということで半日ほどかかりましたが、なんとかストアに更新版をアップロードして、無事アプリの公開が再開されました。
正直、アプリ自体は旬を過ぎており、最近はほぼダウンロードされていません。
それでも、自作アプリは自分の作品みたいなものなので、ストアに残せるように最低限のアップデートはしていきたいと思います。


# 参考サイト

- https://stackoverflow.com/questions/51960049/android-build-error-unable-to-load-javax-xml-bind-jaxbexception
- https://teratail.com/questions/215383
- https://cpoint-lab.co.jp/article/201801/1040/
- https://zesys.net/pc/android/android-studio-debug/
- https://qiita.com/takahamarn/items/dfc9f44c9591fd3780c7
- https://apprili.com/2019/02/18/versioncode%E3%81%A8versionname%E3%81%AE-%E9%81%95%E3%81%84/