Cross Road

Unity、VR、MR、ARを中心とした技術ブログ

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

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

【Android】Bing Speech APIを使う手順をまとめました - Cross Road


まだできていませんが、その過程で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:20180711004705j:plain


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

f:id:Takyu:20180711004720j:plain

f:id:Takyu:20180711004735j:plain

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

f:id:Takyu:20180711004754j:plain

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

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

1-2. ビルドシステム

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

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

ビルドツールGradleスタートアップガイドの紹介「Grails/Groovy工房 vol.2」[前編] | コラム | 情報畑でつかまえて - NTTソフトウェアブログ

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

>|bash|

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

|


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

f:id:Takyu:20180711004853j: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:20180711004922j:plain

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

f:id:Takyu:20180711004935j:plain

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

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

f:id:Takyu:20180711004953j:plain

2-2. build.gradleの編集

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

f:id:Takyu:20180711005010j: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:20180711005114j: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:20180711005141j:plain

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


gist13288dec60bb1b63c693dbc6197e6d61

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

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

f:id:Takyu:20180711005158j:plain

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

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

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

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

2-5. aarの生成

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

f:id:Takyu:20180711005228j:plain

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

./gradlew :nativeplugin:clean :nativeplugin:assembleRelease

f:id:Takyu:20180711005639j:plain

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

f:id:Takyu:20180711005624j: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 - flushpot1125/UnityAndroidPluginTest


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