[Unity] Eclipseライブラリ形式でAndroidネイティブプラグインを作る


UnityでAndroidのネイティブプラグインを作る際、大きく分けて以下の3つの構成があるかと思います。

1. aar形式で作成

aarで作成すると、リソースファイル(resディレクトリ)やマニフェストを含めてライブラリを作成できますが、
aar内のマニフェストを確認したり、変更したりすることが簡単にできません。

2. jarのみ作成して、Assets/Plugins/Android直下にリソース、マニフェストを置く

こんな感じの構成です。

マニフェストファイルはAssets/Plugins/Android直下に置いているので、
ライブラリが複数ある場合は、手動でのマージが必要になることが多いです。
間違って上書きしたりすると最悪です。

3. jarのみ作成して、Eclipseライブラリ形式にする

aarと同様、ライブラリ毎にresディレクトリやマニフェストファイルを配置することができます。
その上、ただのディレクトリなので、直接マニフェストを書き換えたり、ファイルを編集したりすることが簡単にできます。
Unityではこの形式が一番便利かと思います。

こんな感じの構成になります。

project.propertiesの内容はこんな感じ。

project.properties
target=android-16
android.library=true

この形式で作成する場合のポイントは以下の3点です。

  • Assets/Plugins/Android直下にライブラリ用のディレクトリを作成する
  • ディレクトリ内に、project.propertiesを配置する(libsやresは必要に応じて配置)
  • 他の階層に、同名のディレクトリが存在しないようにする

3つ目はどういうことかというと、例えばAssets直下にXXXPluginというディレクトリが存在する状態で、
Assets/Plugins/Android配下に同名のXXXPluginというライブラリディレクトリを作成した場合、
うまく認識されない場合があります。

このEclipseライブラリ形式で作成したサンプルを以下に置いておきます。
(Crittercismというクラッシュレポートのプラグインです)
Crittercism-UnityPlugin

C#のスクリプトやiOS用のファイルを含めて、最終的に以下の構成となっています。

(補足1)AndroidManifest.xmlの確認

UnityでAndroidのビルドをすると、以下のようにマニフェストが作成されるようです。

  • Assets/Plugins/Android/AndroidManifest.xml があればベースにする
  • 無ければUnityが自動で作成する
  • aarがあれば、aar内のAndroidManifest.xmlをマージする
  • Eclipseライブラリがあれば、Eclipseライブラリ内のAndroidManifest.xmlをマージする

マージした結果のファイルは、ビルド時にUnityプロジェクト配下のTemp/StagingArea/AndroidManifest.xmlに出力されます。

(補足2)AndroidStudioでjarファイルの出力

Androidのネイティブライブラリを作る場合、私は以下のような手順でjarを出力しています。

  1. AndroidStudioで新規プロジェクトを作る

  2. File -> New -> New Module -> Android Library でモジュールを追加

  3. 追加したモジュールのbuild.gradleに、以下のタスクを追加

build.gradle
task makeJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('../libs/')
    include('classes.jar')
    rename('classes.jar', project.name + '.jar')
}

あとはビルド後に上記のmakeJarタスクを実行して、jarファイルを取り出します。