【Unity-Android 】 (1) Android StudioでUnity向けにmoduleを作る方法

前回紹介した、Microsoftのcognitive Serviceの一つ、Bing Speech to Text APIをUnityで使おうと思い、サンプルのAndroidプロジェクトのプラグイン化を試しています。

magicbullet.hatenablog.jp


まだできていませんが、その過程でAndroid StudioとUnityの連携について色々とわかってきました。

ただ、普段Unityでアプリ開発をしていてAndroid Studioに詳しくない人(私のことです、、)にはわかりづらいところもあったので、Android Studioの基礎知識も含めて解説したいと思います。


長くなるので、大きく下記のように4つに分ける予定です。

(1) Android StudioでUnity向けにmoduleを作る方法

(2) Android Studio作ったmoduleを、unityから呼ぶ方法

(3) Android StudioでUnity向けにmoduleを作るときのエラー対応集

(4) UnityでBing Speech to Text API(Android用)を使う方法


今回は(1)を解説します。

=========

目次

1. Android Studioの基礎知識

1-1. プロジェクト構成の表示方法

1-2. ビルドシステム

1-3. ApplicationとModule

2. moduleを作る手順

2-1. Module用のプロジェクト作成

2-2. build.gradleの編集

2-3. UnitTest系のコードをコメントアウト

2-4. ソースコードの追加

2-5. aarの生成

=========

1. Android Studioの基礎知識

Googleが2013年頃から提供している、Andoridアプリケーションの開発環境です。
従来のEclipse+Android向けプラグインでの開発方法とは、色々なところで手順が異なっています。

参考までに、異なる例をいくつか解説します。

1-1. プロジェクト構成の表示方法

Eclipseのときは、ディレクトリ構成がそのまま表示されていましたが、Android Studioでは色々な表示が選べるようになっています。

表示を変更するには、左上のここを選択して一覧を表示します。

f:id:Takyu:20161002152211p:plain


今時点で私がよく使っているのは、Project ViewとAndroid Viewです。

f:id:Takyu:20161002152223p:plain

f:id:Takyu:20161002152236p:plain

Project Viewは、従来のEclipseと同様にディレクトリ構造がそのまま表示されています。

たとえば、表示順番はずれてますが、下記のように、MacのFinderとProject Viewの内容は一致しています。

f:id:Takyu:20161002152256p:plain

一方、Andorid Viewは、実装に必要なファイルが前面に表示され、かなりすっきりしています。


実は最初、 Viewが複数あることに気づかず戸惑いました。

たとえば、「「ここ」にあるmanifestファイルを修正して〜」という解説記事を見たとき、その記事では Android Viewのスクショで説明されているのですが、自分の環境はProject Viewになっていたので、「manifestフォルダはどこ?」になってしまいました。


1-2. ビルドシステム

Eclipseのときと異なり、Gradleという仕組みが導入されました。

下記に紹介する記事で勉強させていただきました。ありがとうございます。


Gradeとは何か?、については下記の解説が大変わかりやすいです。

www.ntts.co.jp

記事の「Gradleのインストールと設定」以降は、Android Studio使用時には条件が異なりますので、それ以前をご参照ください。


また、下記にはAndroid StudioでGradleを使うときの便利な点が書かれており、参考になります。

firespeed.org


Android Studioでプロジェクトを作るといくつかのgradleファイルができるのですが、よく使うのはbuild.gradleです。

build.gradleの使い方は2-2で解説します。


1-3. ApplicationとModule

Android Studioでは、build.gradleの記述を少し変えるだけで、ビルドする対象をApplication(apk)かModule(aar)に分けることができます。

apkは従来通りAndroidアプリそのものです。

aarとは、Android Archive Libraryの略で、Androidプロジェクトのビルド結果(classes.jar)、およびAndroidアプリに必要なプロジェクト情報をまとめたももです。

aarファイルはzip圧縮されているので、例えば下記のコマンドで簡単に中身を見ることができます。

>|bash|

$ mkdir testfolder
$ mv test.aar test.zip
$ mv test.zip testfolder
$ cd test
$ unzip test.aar

|


詳細な構成はAndroid Studioでのアプリの作り方に依存しますが、例えばこのようになります。

f:id:Takyu:20161002160053p:plain


この中にあるclasses.jarが、Android Studioで書いたソースコードコンパイルしたものです。


その他にも色々ありますが、細かくなるため割愛します。

2. moduleを作る手順

いくつかの記事を参考にさせていただきました。ありがとうございます。

AndroidStudioを使ってUnityとAndroidの連携 - ほげほげ(仮)

UnityとAndroidネイティブの連携:UnityからネイティブのActivityを呼び出す[part1] | 未知の路

Unity – Androidでバッテリ情報取得 | MIZUTANI KIRIN


下記の環境で検証しました。

Mac OSX : 10.11.6
Android Studio : 2.1.3

2-1. Module用のプロジェクト作成

実際、Moduleを作るためだけの方法はなさそうなので、まずはAndroid Studioでプロジェクトを作成します。

Android Studioを開いて、File -> Newを選択して、新規プロジェクトを作ります。

ファイル名、Package 名を決めます。

次に、Activityを選択します。どちらでもよいですが、今回はEmpty Activityを選択します。

f:id:Takyu:20161002160750p:plain

次に、出来上がった空っぽのプロジェクトを開いた状態で、New Moduleを選択します。

f:id:Takyu:20161002160806p:plain

Android Libraryを選択して、Nextをクリックします。

今回のモジュール名を決めます。ここではnativepluginとしました。

すると、このように、nativepluginという名前のフォルダが新しく生成されます。

f:id:Takyu:20161002160827p:plain

2-2. build.gradleの編集

ここまで作ると、build.gradleが三種類できています。見やすい様にAndroid Viewで示します。

f:id:Takyu:20161002160837p:plain

しかし、今回のmodule作成用には、"Module:nativeplugin"と書かれたファイルだけを使います。

build.gradleは、ビルドに関する設定をまとめたファイルで、"{}"の単位で設定をまとめます。


Unity向けのmoduleを作るには、まずUnityのライブラリを追加します。

Unityのライブラリは、インストールしたPc内にあります。

例えば、MacでUnity5.3.5f11の時点の場合、下記にあります。

/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar


このファイルをAndroid Studioにコピーするため、右クリックでcopyを選択します。

Project Viewに変更し、app/libs で右クリックしてPasteします。

f:id:Takyu:20161002160959p:plain

このとき、classes.jarをドラッグすると、copyではなくmoveになり、元の場所からファイルが消えてしまうので注意してください。

次に、build.gradleのdependenciesに

dependencies {
compile files('libs/classes.jar')
}

を追加します。

次に、gradleファイルとAndroidのプロジェクトファイルをsyncします。

これで、AndroidでもUnityが準備しているpackageをimportすることが可能になります。

もしエラーがでる場合、"{"が閉じてない、libs/classes.jarを囲むとき、" ' "を使っているか、などを確認してみてください。


また、build.gradleの最後に

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/classes.jar')
    }
}

を追加しておきます。

また、以下はコメントアウトしておきます。

testCompile 'junit:junit:4.12'

まとめると、build.gradleはこのようになります。


gist4d8aba4519264552b097807fb041a2cf

2-3. UnitTest系のコードをコメントアウト

この時点でgradleをビルドすると、以下の様にエラーがでます。

f:id:Takyu:20161002161917p:plain

今回、UnitTestは使わないので、対象のソースコードをこのようにコメントアウトしておきます。


gist13288dec60bb1b63c693dbc6197e6d61

2-4. ソースコードの追加

もう一度sync gradleを実行します。

次に、下記の場所で右クリックし、javaのクラスファイルを生成します。

f:id:Takyu:20161002162144p:plain

(注)ここではAndroid Viewで説明しましたが、Project Viewで追加もできます。


下記の様なコードを書きます。



gist084d8d4a6cb21d80ee96273130d3a6ca


(Log.eにしたのは、LogCatで目立たせるためです)

この二つのメソッドがUnityから呼ばれることになります。

UnitySendMessageは、Androidで処理した結果をUnityにコールバックするためのメソッドです。これについては次回のブログで解説します。

この時点で、一度gradleのビルドを実施します。


2-5. aarの生成

下記の赤枠部分をクリックして、Terminalを表示させます。

f:id:Takyu:20161002162352p:plain

以下のコマンドを入力してEnterを押します

./gradlew :nativeplugin:clean :nativeplugin:assembleRelease

f:id:Takyu:20161123172256p:plain

aarの生成が始まります。完了すると、このように表示されます。

f:id:Takyu:20161123172304p:plain


この時点で、aarが生成されています。場所は下記です。

Android Studioのプロジェクトトップ /module名 / build / outputs / aar / -release.aar

今回の場合、Unityで使うのはjarのみでよいので、jarをUnityにインポートします。
Android側のプロジェクト構成次第では、jar以外もインポートします)

aarを解凍してjarを取得しても良いのですが、

Android Studioのプロジェクトトップ /module名 / build / indermediates / bundles / classes.jar

に目的のjarがあるので、手間を省くため、こっちを使います。


Unityの持つclasses.jarとかぶる懸念があるので、classes.jarをplugin.jarのようにリネームします。
(不要な操作かもしれません)


Unityはこのjarを読み込んで、Android Nativeの機能を使います。読み込むとき、jarのファイル名は関係ないようです。

このjarファイルをUnityで作ったプロジェクトの、Plugins/Android/ にドラッグすれば、あとはUnity側の処理だけです。

次回は、このmodule(jar)を使って、UnityからAndroid nativeのメソッドを呼ぶ方法を紹介します。

今回のプロジェクト一式は、Unity側を含めて下記にあります。

github.com


次回のブログでは、Unity側の記述方法を紹介いたします。