YAMADA TAISHI’s diary

ゲームについてとか私の日記とか。このブログのあらゆるコードは好きにどうぞ。利用規約があるものは記事内のGitHubのRepositoryのリンクで貼られていると思うので、そちらを参照ください。

UnityのGradle対応方法(Unity2018.2系)

概要

こんにちは、やまだたいし( やまだ たいし@ソシャゲプログラマ (@OrotiYamatano) | Twitter )です。
当チームはAndroid64bit対応にあたり、Android64bit未対応のライブラリから対応バージョンへのネイティブライブラリの更新を行いました。
ネイティブライブラリをAndroid64bit対応のあるバージョンへの更新を行いましたが、そのライブラリがGradle利用を想定していたため、Gradleの対応を行いました。
今回はその時の知見を共有したいと思い記事化しました。



本文

Gradle Bulidとは


InternalビルドはUnity独自のビルドシステムでしたが、Gradleはオープンソースのビルドシステムです。
UnityがプロジェクトをGradleプロジェクトとして出力した後、Gradleビルドを行います。

Build SystemのExport Projectにチェックを入れた場合は、出力先設定した場所に、「Gradleに変換されたプロジェクト」が出力され、
チェックを付けていない場合でも一時的なプロジェクトとして、UnityプロジェクトのTempフォルダにGradleOutという名前でGradleプロジェクトが出力されます。
(GradleOutフォルダはあくまでも一時ファイルでビルドされる度に削除される)

f:id:OrotiYamatano:20190902155256p:plain

プロジェクトをエクスポートした場合は、外部のGradleビルドシステム(Android Studioなど)でビルドが可能です。
エクスポートをしない場合、Unity内部のGradle ビルドシステムが使用されます。

導入手順


UnityのbuildSettingsのAndroidのBuild SystemをGradleに変更

f:id:OrotiYamatano:20190902155521p:plain

PlayerSettings>Publissing Settings>Build>Build SystemをGradleに変更(赤い枠内)
また当チームはGradleの設定が必要だったため、水色の枠内も変更

  • Custom Gradle Template
    →GradleのBuild設定をデフォルトからカスタムに変更する(詳細については後述※1)
  • User Proguard File
    →コードの圧縮しないファイル、バイナリ化しないファイルの設定(詳細については後述※2)
  • Minify
    →コードの圧縮設定(今回は圧縮なしに理由については後述※3)

f:id:OrotiYamatano:20190902155911p:plain

基本的な設定は以上になります。

SDKなどの設定


Unityで動作保証されているAndroid SDKのバージョンを使用します。
Gradleの設定をする時には以下の設定に注意が必要

Unity PrefarenseのExternal Toolより設定

f:id:OrotiYamatano:20190903120351p:plain

JDK

preferencesの設定項目を確認
1.8.0系なっていることを確認、Unity2018系では1.8.0系じゃないと上手く動かないので注意が必要
当チームは1.8.0_181を使用
Macの場合はhomeフォルダを指定
Unityのほかバージョンで設定していると設定が引き継がれるので注意が必要

SDK

SDKだけでなく詳細な設定が必要です。
以下のバージョンを確認を行います。

コマンドでも確認できますがGUIでの確認方法を記述します。

AndroidStudio起動後、右下のConfigureのSDKManagerを選択
AndroidSDKの項目で以下を確認

Android SDK Platform-Tools
28.0.1を当プロジェクトでは使用。インストールされていることを確認

Android SDK Tools
当プロジェクトの場合Android最新一個前で動かしたいので28が選択されていることを確認(他のは選択されていなくてもされていても問題ない)

Android SDK Build-Tools
これはAndroidStudioから確認できないため/user/xxxx/Library/Android/sdk/build-toolsのフォルダ内を確認
当プロジェクトでは28.0.3。新しすぎないバージョンであることを確認(新しすぎるとUnityで動作しない)

・ NDK

Unityが指定するバージョンを落としてくること。ビルドが通っても、上手く動かないことがあります。

・その他バージョン

上記でバージョンを設定したとしてもGredleファイル(後述※1)にバージョンを指定してあると無視されるため注意が必要

AndroidPluginVersion/GradleVersion
基本的にはUnityのバージョンによって決められています。

Gradleファイルのcom.android.tools.build項目にAndroid plugin version指定箇所がありますが
Unityのバージョンの組み合わせによって上手く動かないことがあるため、
バージョンは容易に変えないことを推奨します。

GradleVersionはUnityでビルドした場合は

Unityのインストールフォルダ\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle

に格納されているGradleが使われます。
(置き換えれば、ほかのバージョンでもビルドが可能)

エクスポートビルドしてAndroidStudioでビルドした場合、
特に設定しなければAndroidStudioインストール時に自動で出来上がるGradleが使われます。
UnityでインストールされたGradleVersionが使われるわけではないため注意が必要です。
エクスポート時はgradlepropertiesでバージョンの指定が可能です。

(UnityのバージョンごとにAndroid plugin versionとGradle versionは決まっている) https://forum.unity.com/threads/gradle-build-error-gradle-version-2-10-is-required-current-version-is-4-0-1.499520/#post-3500005

当プロジェクトのUnity version
2018.2 usesAndroid plugin version 3.0.1
Gradle version 4.2.1

2019.1 starting from 2019.1.7f1, 2019.2 and 2019.3 use
当プロジェクトが変更したAndroid plugin  versionとGradleVersion
Android plugin version 3.4
Gradle version 5.1.1


当プロジェクトではOut of memoryが発生し、上手くビルドが出来なかったため、

例外的に

  • Android plugin version 3.4
  • Gradle version 5.1.1

を使用しています。

Build設定(Gredleファイルの設定) ※1


Gradle buildに切り替えることによってAndroidManifestの定義を変更する必要があります。
AndroidManifestの設定は基本的に変更しなくても良いですが、Gradleで設定されている設定が優先されます。

デフォルトの設定の場合、以下のテンプレートの設定が採用されます。(Unityのバージョンに応じて中身が異なります)

Unityのインストールフォルダ\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates\mainTemplate.gradle


UnityのGradleプロジェクト作成時に参照され、**APIVERSION**などテンプレート変数の箇所が置き換わります。

テンプレート変数についてはUnityの公式(https://docs.unity3d.com/ja/current/Manual/android-gradle-overview.html)に記載があるのでそちらを参照してください。

Gradle設定ファイルはPlayer Settingsにチェックをつけることにより設定が可能になります。
チェックを入れると設定ファイルが

プロジェクトフォルダのAsset\Plugins\Android\mainTemplate.gradle

に出力されます。

UnityのProjectSettingsなどから値を拾ってくるため、ライブラリを新規追加したり、多すぎる量のライブラリを読み込まない限り
そのままの設定で利用可能

当チームの設定は公開しません。
(単純に記事書くのが面倒なため。要望があれば別記事で書くかも)

User Proguard Fileの設定 ※2


圧縮・難読化 しないファイル を記述します。

Unityのインストールフォルダ\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\UnityProGuardTemplate.txt

デフォルトでは、以下のテンプレートが採用されるようです。

-keep class bitter.jnibridge.* { *; }
-keep class com.unity3d.player.* { *; }
-keep class org.fmod.* { *; }
-ignorewarnings

Gradle設定ファイルはPlayer Settingsにチェックをつけることにより設定が可能になります。
チェックを入れると設定ファイルが

プロジェクトフォルダのAsset\Plugins\Android\proguard-user.txt

に出力されます。

圧縮・難読化対象になるとバイナリ化と圧縮化され外部からのライブラリの参照が難しくなるため、ビルドエラーになることがあります。
Unityのコード上から参照している場合は難読化(バイナリ化)対象から外してビルドを行ってください。
また、難読化されるライブラリのメソッド数が65,536を超えるとビルドエラーが発生するため、超えた場合は難読化対象からいくつか外してやればビルドが通ります。

難読化対象から外したくない場合、multidexの設定をする、Minifyを使用するなどが必要です。(Minifyについては後述※3)
multidexは難読化対象にするファイルを2つ以上にわける設定です。
Android5.0以下と以上の設定をする場合2つの設定が必要になります。
当プロジェクトでは一応対応しましたが、込み入った話になるため詳細は記述しません。

Minifyの設定 ※3


設定するとデータの圧縮を行います。
難読化対象のライブラリの圧縮を行います。

ライブラリのメソッド数が65,536を超える場合や難読化を更に複雑にしたい場合などに利用します。
ライブラリが正常にうごかなくなることがあるため当プロジェクトでは採用しませんでした。

参考サイト developer.android.com

エラーなどの注意点


・Could not find com.android.tools.build:aapt2

Gradleファイルを以下のように修正
Goooglのライブラリに依存があったので、allprojects のrepositories を下のように修正

allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

・ビルド時に ClassNotFound もしくはNoSearchMethod もしくは Out of Memory

ビルド時に、Androidネイティブでエラーが発生した場合

難読化されるライブラリのメソッド数が65,536を超えたときのビルドエラーです。
難読化対象から外す、圧縮する、分割することで対処が可能

また、ヒープサイズが大きすぎる場合も出たりします。
ヒープサイズはGradleファイルで設定できないため、Gradleプロジェクトをエクスポートしてlocal.properties設定してください。
mainTemplate.gradle の一番上にlocal.propertiesを別途読み込む処理を追記することで、
ビルド時に値を設定するという方法もあると思いますが、試していません。

GradleVersionの互換性で上手くビルドが出来ないケースもあります。
当プロジェクトでは、上手くビルドが出来ないケースでした。

・OutOfMemory

Build SettingsのCompression MethodがLZ4HCになっていた場合、Androidの一部端末でout of memoryが発生し、クラッシュすることがあります。

Compression Method:
→ゲームに含めたシーンやResourcesから参照しているアセット群の圧縮設定です。

多分ですが上手く圧縮できずビルドが上手くできないのだと思われます。
当プロジェクトではdefaltに設定することで対応

以上、Gradle化対応でした。

まとめ


実は社内の他チーム向けに作った資料なのですが、せっかくなので外部に公開し役立ててもらえたら良いなと思い公開しました。
お役に立てば幸いです。