CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Android StudioでUnity向けmoduleを作る方法

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

【2016/11/27更新】【Android】Bing Speech APIを使う手順とトラブル対応法をまとめました - CrossRoad

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

なお、下記の環境で検証しています。

  • Mac OSX : 10.11.6
  • Android Studio : 2.1.3




1. Android Studioの基礎知識

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

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

Eclipseのときは、ディレクトリ構成がそのまま表示されていましたが、Android Studioでは色々な表示が選べるようになっています。表示を変更するには、左上の垢枠部分を選択して一覧を表示します。

Android Studioのプロジェクト表示の変更方法

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

Android StudioのProject Viewの例

Android StudioのAndroid Viewの例

Project Viewは、従来のEclipseと同様にディレクトリ構造がそのまま表示されています。たとえば、表示順番はずれてますが、下記のように、MacのFinderとProject Viewの内容は一致しています。

Android StduioのProject ViewとMacのFinderによるフォルダ構成比較

一方、Andorid Viewは、実装に必要なファイルが前面に表示され、かなりすっきりしています。 実は最初、 Viewが複数あることに気づかず戸惑いました。

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

1-2. ビルドシステム

Eclipseのときと異なり、Gradleという仕組みが導入されました。下記に紹介する記事で勉強させていただきました。ありがとうございます。

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

https://www.ntts.co.jp/column/tec/java_03/index2.html

記事の「Gradleのインストールと設定」以降は、Android Studio使用時には条件が異なりますので、それ以前をご参照ください。また、下記にはAndroid StudioでGradleを使うときの便利な点が書かれており、参考になります。

ここが凄いよ AndroidStudioとGradle - Firespeed

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圧縮されているので、例えば下記のコマンドで簡単に中身を見ることができます。

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

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

Android Studioで作ったaarファイルの中身の例

この中にあるclasses.jarが、Android Studioで書いたソースコードをコンパイルしたものです。その他にも色々ありますが、細かくなるため割愛します。



2. moduleを作る手順

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

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

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

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

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

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

Android Studioを開いて、File -> Newを選択して、新規プロジェクトを作り、ファイル名、Package 名を決めます。次に、Activityを選択します。どちらでもよいですが、今回はEmpty Activityを選択します。

Android StudioでのActivity選択画面

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

Android Studioでのモジュール選択画面

Android Libraryを選択して、Nextをクリックします。今回のモジュール名を決めます。ここではnativepluginとしました。

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

Android Studioのフォルダ構成例

2-2. build.gradleの編集

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

Android Studioで表示される3種類のbuild.gradle

しかし、今回の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します。

classes.jarのコピー場所

このとき、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をビルドすると、以下の様にエラーがでます。

Android Studioで出た、UnitTestによるエラーの例

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


gist13288dec60bb1b63c693dbc6197e6d61

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

もう一度sync gradleを実行します。次に、下記の場所で右クリックし、javaのクラスファイルを生成します。

aarファイルの生成手順

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

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

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

この二つのメソッドがUnityから呼ばれることになります。UnitySendMessageは、Androidで処理した結果をUnityにコールバックするためのメソッドです。これについては次回のブログで解説します。この時点で、一度gradleのビルドを実施します。

2-5. aarの生成

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

Android Studioでターミナルを表示させるボタンの場所

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

./gradlew :nativeplugin:clean :nativeplugin:assembleRelease

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

aarの生成完了ログ画面

この時点で、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側の処理だけです。

3.終わりに

今回のプロジェクト一式はこちらです。

GitHub - flushpot1125/UnityAndroidPluginTest

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