この記事は KLab Advent Calendar 2016 の14日目の記事で @kakkun61 が担当します。
compile SDK version や build-tools version を Unity アプリで指定するにはどうすればいいの?という話をします。
この記事の内容は OS X 10.11.6 で確認しています。
Android アプリケーションのビルド時に指定するバージョンについては「基本をおさえる!Androidアプリで指定するバージョンについて(compileSdk,buildToolsVersion,....) - Qiita」にまとまっています。簡単に引用・要約します。
Android アプリケーションのビルド時に指定するバージョンは下記7つあります。
Unity 3D を使って直接 APK を生成する場合、コンパイル SDK バージョンと build-tools バージョンを指定することができず、ビルドするコンピューターにインストールされている最新版が使用されます。これでは、ビルドサーバーを複数案件で共用している場合、案件ごとでこれらバージョンを固定してビルドすることができなくなります。なので、Unity 3D から Android プロジェクトを生成し、Gradle でビルドすることを考えます。
ただ、これではまだ問題があります。Unity 3D の生成する Android プロジェクトの形式が ADT 形式なのです。Google による ADT のサポートは終了しています。
これを Gradle でビルドするために Gradle ビルドスクリプトに少し工夫を加えます。
下記のようなディレクトリー構成とします。サンプルリポジトリーはこちら。
バッチビルドでは Build()
関数を呼び出せば build-adt ディレクトリーに Android プロジェクトが生成されます(処理の流れ 1)。BuildOptions.AcceptExternalModificationsToPlayer
を指定することで Android プロジェクトの生成を指定しています。その他のパラメーターは適宜変更してください。
using UnityEngine;
using UnityEditor;
using System.Linq;
public static class BatchBuild
{
public static void Build()
{
EditorApplication.Exit(DoBuild());
}
static int DoBuild()
{
Debug.Log("Build Start");
var options = BuildOptions.SymlinkLibraries
| BuildOptions.Development
| BuildOptions.AllowDebugging
| BuildOptions.AcceptExternalModificationsToPlayer; // このオプションでプラットフォームのプロジェクトが生成される
var scenes = EditorBuildSettings.scenes.Where(s => s.enabled).ToArray();
PlayerSettings.bundleIdentifier = "com.example.gradletest";
PlayerSettings.bundleVersion = "1";
PlayerSettings.productName = "Gradle Test";
PlayerSettings.Android.bundleVersionCode = 1;
PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel22;
var errorMessage = BuildPipeline.BuildPlayer(scenes, "build-adt", BuildTarget.Android, options);
if (string.IsNullOrEmpty(errorMessage))
{
Debug.Log("Build Success");
return 0;
}
Debug.LogError("Build Failure");
Debug.LogError(errorMessage);
return 1;
}
[MenuItem("File/Export Android Project #%a")]
public static void MenuBuild()
{
DoBuild();
}
}
処理の流れ 1 で、build-adt ディレクトリーに Android プロジェクトが生成されるので、Gradle でのビルドができるようにそこにファイルのリンクを置きます(処理の流れ 2)。prod_name
は BatchBuild.cs の PlayerSettings.productName
に指定されたものです。
#!/usr/bin/env bash -ex
prod_name=$(ls -1 build-adt)
ln -sFv "$(pwd)/gradle/"* "build-adt/$prod_name"
処理の流れ 3 のADT 形式のプロジェクトを Gradle でビルドするためのビルドスクリプトです。sourceSets
の部分がキモで、各ソースファイルの位置を ADT 形式に合うように指定しています。他の部分は一般的な Android のビルドスクリプト同様に適宜変更してください。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
allprojects {
repositories {
jcenter()
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.gradletest"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
// Lint エラーが出てもビルドを継続するように指示
// Unity の生成物が Lint にひっかかるので必須
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-unity.txt'), 'proguard-rules.pro'
}
}
// ADT 形式のディレクトリー構成に対応するための記述
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
}
以上の準備をすると、下記コマンドでビルドができるようになります。生成された APK は build-adt/$prod_name/build/outputs/apk 以下にあります。./make-gradle-buildable.bash
と ./gradlew build
の実行は、Unity の post process build にしてしまうのもありだと思います。
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -executeMethod BatchBuild.Build
./make-gradle-buildable.bash
pushd "build-adt/$(ls -1 build-adt)"
./gradlew build
popd
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。
合わせて読みたい
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。