Unity Android Plugin の手間を軽減する管理方法(改)

概要

Unity Android Plugin の解説記事では JAR, AAR ファイルを手動コピーする例が多く見受けられます。 手動コピーでは依存ライブラリのバージョンを管理しづらくなるため、出来る限り手動コピーは避けたいです。 この記事では Gradle の Local リポジトリを経由して Android Plugin を Unity に公開する方法を説明します。

目次

確認環境

  • macOS 10.15.7
  • Android
    • Android Studio 4.1.2
    • minSdkVersion 19
    • buildToolsVersion 30.0.3
    • Gradle 6.5
  • Unity 2019.4.18f1
  • Rider 2020.3.2

参考情報

解説

Android Plugin (AAR) をビルドする

Android Library モジュールを作成し、モジュールの build.gradle を以下の様に記述します。 この例ではモジュール名を sample にしています。

plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'maven-publish'
}

ext {
    groupId = "com.example"
    versionName = "1.0"
    unityVersion = "2019.4.18f1"
    unityJar = "/Applications/Unity/Hub/Editor/$unityVersion/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar"
}

group = groupId
version = versionName

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1
        versionName versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    compileOnly files(unityJar)
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

// see: https://developer.android.com/studio/build/maven-publish-plugin?hl=ja
afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
            }
            debug(MavenPublication) {
                from components.debug
                artifactId = "${project.name}-debug"
            }
        }
    }
}

ポイントは以下の2点です。

  • Maven Publish Plugin を使用する
  • Unity の classes.jar をコピーせずに直接指定する

1つめのポイントとして、 Maven Publish Plugin を使用するために pluginsid 'maven-publish' を追加しています。 また、afterEvaluate 内に publishing の設定を記述しています。 この例の設定では、ビルドバリアント(debug, release)毎に AAR ファイルを生成します。 具体的には、sample-1.0.aar (release) ファイルと sample-debug-1.0.aar (debug) ファイルが生成されます。

2つめのポイントとして、 compileOnly files(unityJar) によって Unity の classes.jar を参照しています。 Windows の場合は unityJar のパスを適切なパスに変更してください。 Unity のバージョンを変える場合には unityVersion を変更します。 implementation ではなく compileOnly にしている理由は、 Unity から AAR ファイルを参照する際に Unity の classes.jar が重複して参照されることを防ぐためです。 implementation にすると Unity でビルドする際にエラーになります。

ビルド設定は以上です。

ビルドを実行する前に、今回は以下のサンプルプログラムを作成します。

package com.example.unity.sample

import com.unity3d.player.UnityPlayer

class KotlinObject {

    fun getActivityName(): String = UnityPlayer.currentActivity.localClassName

}

Android Plugin をビルドし、Local リポジトリに保存する

以下のコマンドを Terminal で実行するとビルドが行われ、その結果が Local リポジトリに保存されます。

project % ./gradlew publishToMavenLocal

Gradle のデフォルトでは、Local リポジトリ~/.m2/repository になっています。 この repository ディレクトリに以下のファイルといくつかの関連ファイルが作成されます。

  • com/example/sample/1.0/sample-1.0.aar
  • com/example/sample-debug/1.0/sample-debug-1.0.aar

以上で Android Plugin の作成と公開は終了です。

アプリに Android Plugin への依存を追加する

Unity で Project Settings > Player > Android > Publishing Settings > Build と辿っていくと以下の設定が表示されます。

f:id:nosix:20210225172356p:plain

画像の様に以下の2箇所にチェックを付けます。

  • Custom Main Gradle Template
  • Custom Base Gradle Template

チェックを付けることで Assets/Plugins/Android ディレクトリに以下の2つのファイルが作成されるはずです。 (作成されない場合は Build を実行してみると作成されると思います。)

  • mainTemplate.gradle
  • baseProjectTemplate.gradle

この2つのファイルを編集します。

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.example:sample:1.0'
**DEPS**}

// ... 以下省略
// ... 以上省略
    repositories {**ARTIFACTORYREPOSITORY**
        google()
        jcenter()
        mavenLocal()
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

mainTemplate.gradle には implementation 'com.example:sample:1.0' を追加しています。 これは groupId:artifactId:version の形式になっており、groupId と version は Android Plugin の build.gradle で指定した値になっています。 artifactId はモジュール名が使われており、今回は sample (release) か sample-debug (debug) です。

baseProjectTemplate.gradle には mavenLocal()repositories に追加しています。 ファイル内に repositories が2箇所あるので注意して下さい。 buildscript 内の repositories はビルドスクリプト(Gradle)が使用するライブラリのリポジトリを指定しています。 buildscript ではない方の repositories は Android アプリをビルドする際に使用するライブラリのリポジトリ指定です。 ここに Local リポジトリを参照する指定 mavenLocal() を追加します。

アプリをビルドする

今回は以下の Script を作成して動作確認をしました。

using UnityEngine;
using UnityEngine.UI;

public class AndroidExecutor : MonoBehaviour
{
    [SerializeField] private Text result;

    void Start()
    {
        using (var o = new AndroidJavaObject("com.example.unity.sample.KotlinObject"))
        {
            result.text = o.Call<string>("getActivityName");
        }
    }
}

Androidバイスを PC に接続するか Android Emulator を起動した上で、 Build Settings で Android Platform に Switch して、 Run Device にデバイスか Emulator を指定します。 File メニューの Build And Run を選択すると APK ファイルのファイル名を訊ねられないので、 Build Settings の Build And Run は使わずに閉じて File メニューから実行しています。

実行するとText に以下の様に表示されます。

f:id:nosix:20210225175148p:plain