ぐーるらいふ

底辺。

【Unity】Android Native連携Pluginを開発してたら has been replaced with 'variant.getPackageLibraryProvider()'.

Androidのネイティブ連携開発

UnityでAndroidのNative連携Pluginの開発をしていたらこんなエラーに出くわした。

WARNING: API 'variantOutput.getPackageLibrary()' is obsolete and has been replaced with 'variant.getPackageLibraryProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
To determine what is calling variantOutput.getPackageLibrary(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace.
Affected Modules: helloplugin

エラー内容を見れば、
「variantOutput.getPackageLibrary()は2019年には消えるから、variant.getPackageLibraryProvider()に
置き換えて下さい」
といった具合なのですが、ちょっと対応に戸惑ったのでメモしておこう。

発生した状況

Android Studio 3.3を利用して素直にプロジェクトを作るとデフォルトで

com.android.tools.build:gradle:3.3.0

を利用することになり、そしたら遭遇した。

前提として

AndroidでNative連携Pluginを作る時、AndroidからUnityの機能を呼びたい事がよくある。
そういった機能を使う時に、Unityが用意しているAndroid用クラスライブラリをPlugin側に
組み込む必要がある。
例えば、Unity HubでUnity2018.3.2f1を利用している場合はここにある。

C:\Program Files\Unity\Hub\Editor\2018.3.2f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

Macとかならこの辺りを参考に
docs.unity3d.com

原因

build.gradleに記載してあるこれが原因。

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

これは、AndroidでUnityの機能を使うためにlibs/classes.jarに配置して使用するが、
Unity側に含めると重複エラーになってしまうので、aarに固める時には省きたい。
その省く処理を行っている。

間違った対応メモ

android.variants.all{ variant ->
    variant.packageLibararyProvider.each { output ->
        output.configure{
            exclude “libs/classes.jar”
        }
    }
}

ストレートに直すとこうだ。
エラーは出なくなるが、これでは上手くいかず、classses.jarがPluginに入ってしまった。

そもそもPackageLibraryProviderに代わっているため、流れてくる内容が違う。
中身はTaskProviderでDebug , Releaseになってるような感じだった(ちょっと詳しくはわからないけど)
なので、そこでexcludeとかやっても特に効果が無い。

解決について

ただやりたいことは、

ビルド時にlibs/classes.jarを省きたい

これだけなんだ。

つまりこうすればいい

dependencies{
    compileOnly fileTree(dir:”libs” , file: “classes.jar”)  
    .....
}

(もちろんpackageLibrary~の部分は全部消していい)

前まではprovidedだったが、これも無くなって今はcompileOnlyになった。
これで固める時にclasses.jarを省くことが出来る。