UnityでのAndroidX対応(AndroidStudio未使用)

## はじめに
AdMobで `play-services-ads`のバージョン18.0.0以降を使用する場合は `AndroidX`への移行が必須となる
[AndroidXとは](https://developer.android.com/jetpack/androidx?hl=ja)  

AndroidStudioを用いたAndroidXへの移行は[こちら](https://qiita.com/keidroid/items/57b0b3e3ecc458d1f548)のサイトに説明があるが、AndroidStudioを用いずにUnity単体での対応方法がなかったためメモしておく

## 実装環境
- Unity 2019.1.7f1
- Google Mobile Ads Unity Plugin v3.17

## 対処方法
~~- build.gradleファイルを書き換えるスクリプトを記述する~~

- templateファイルにAndroidX用の記載を追加する
- AndroidSupportのライブラリをAndroidX用に変更する

## templateファイルにAndroidX用の記載を追加する
- Unityメニューバーより、File→Build Settings→Player Settings→ Androidマークのタブをクリック→Publish Settingsと遷移させ、`Custom Gradle Properties Template` の部分にチェックを入れる

![SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/76661e9c-3ad7-9bec-e293-03d537468333.png)
- 該当箇所にファイルが生成されている(上記の例では `Assets/Plugins/Android/gradleTemplate.properties`)ので、以下の項目を追記する

```
android.useAndroidX=true
android.enableJetifier=true
```

## AndroidSupportのライブラリをAndroidX用に変更
バージョンや名前は2019年7月時点で最新のもの、最新状態は[mvnrepository](https://mvnrepository.com/)等のサイトで調べる

```Gradle:旧版
    compile group: 'com.android.support', name: 'customtabs', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-annotations', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-compat', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-core-ui', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-core-utils', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-fragment', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-media-compat', version: '28.0.0'
    compile group: 'com.android.support', name: 'support-v4', version: '28.0.0'
    compile group: 'com.android.support', name: 'recyclerview-v7', version: '28.0.0'
    compile group: 'com.android.support', name: 'appcompat-v7', version: '28.0.0'
    compile group: 'com.android.support', name: 'cardview-v7', version: '28.0.0'
    compile group: 'com.android.support.constraint', name: 'constraint-layout-solver', version: '1.1.3'
    compile group: 'com.android.support.constraint', name: 'constraint-layout', version: '1.1.3'
```

```Gradle:AndroidX対応版
    compile group: 'androidx.browser', name: 'browser', version: '1.0.0'
    compile group: 'androidx.annotation', name: 'annotation', version: '1.1.0'
    compile group: 'androidx.core', name: 'core', version: '1.1.0-rc02'
    compile group: 'androidx.legacy', name: 'legacy-support-core-ui', version: '1.0.0'
    compile group: 'androidx.legacy', name: 'legacy-support-core-utils', version: '1.0.0'
    compile group: 'androidx.fragment', name: 'fragment', version: '1.1.0-rc03'
    compile group: 'androidx.media', name: 'media', version: '1.1.0-rc01'
    compile group: 'androidx.legacy', name: 'legacy-support-v4', version: '1.0.0'
    compile group: 'androidx.recyclerview', name: 'recyclerview', version: '1.1.0-beta01'
    compile group: 'androidx.appcompat', name: 'appcompat', version: '1.1.0-rc01'
    compile group: 'androidx.cardview', name: 'cardview', version: '1.0.0'
    compile group: 'androidx.constraintlayout', name: 'constraintlayout-solver', version: '2.0.0-beta2'
    compile group: 'androidx.constraintlayout', name: 'constraintlayout', version: '2.0.0-beta2'
```

## 補足
### build.gradleファイルを書き換える方法
`gradleTemplate.properties` ファイルを使用せず、ビルド時に自動で `build.gradle` ファイルを書き換える方法を参考までに載せておく
**※但し、Unity2020では正しく動作しないためあくまで参考資料**

```C#:Editor/Build/AndroidPostBuildProcessor
using System.IO;
using UnityEditor.Android;

namespace Editor.Build
{
    public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
    {
        /// <summary>
        /// 実行順を指定(0がデフォルト、低いほど先に実行される)
        /// </summary>
        public int callbackOrder => 999;
        
        /// <summary>
        /// build.gradleをビルド時に書き換える
        /// </summary>
        void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path)
        {
            var gradlePropertiesFile = path + "/gradle.properties";
            if (File.Exists(gradlePropertiesFile))
            {
                File.Delete(gradlePropertiesFile);
            }

            var writer = File.CreateText(gradlePropertiesFile);
            writer.WriteLine("org.gradle.jvmargs=-Xmx4096M");
            writer.WriteLine("android.useAndroidX=true");
            writer.WriteLine("android.enableJetifier=true");
            writer.Flush();
            writer.Close();
        }
    }
}
```