アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

gradle dependencies、compileからimplementation、apiへ。ライブラリを作るなら気をつけないといけない違い。

はじめに

Androidのライブラリを作成するには通常通りappモジュールを作成し、そこにモジュールを追加して書いていきます。appでは実際にはサンプルとか書く感じになると思います。(ですよね?)

問題発生

今まではcompileを使っていましたが今後はimplementationとapiになるということは知っていましたが両者の違いがわかりませんでした。
そして今回AACを追加しました。

    def lifecycle_version = '1.1.1'
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    kapt "android.arch.lifecycle:compiler:$lifecycle_version"

そして以下のエラーが発生。

Android dependency 'android.arch.lifecycle:runtime' has different version for the compile (1.1.0) and runtime (1.1.1) classpath. You should manually set the same version via DependencyResolution

サポートライブラリが依存していてその先が1.1.1だったり1.1.0だったりしたみたいです。でも1.1.1って宣言してるのにと思いましたがモジュールとして参照していたので発生していたようです。

理由

implementationの意味は「実装」でアプリで使うって宣言だけって感じなんでしょうか、こちらは依存してもらう側に依存を継承しません。
apiはアプリケーションへ提供されるものって感じの意味の名前付けでしょうか、依存してもらう側に依存を引き継ぎます。
今までのcompileではテストライブラリなど関係ないものも依存関係に含まれて肥大化していたのを使い分けるために2つに分かれたようですね。

解決

    def lifecycle_version = '1.1.1'
+   api "android.arch.lifecycle:extensions:$lifecycle_version"
-   implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    kapt "android.arch.lifecycle:compiler:$lifecycle_version"

おわりに

普通に使うだけなら何も分からずimplementationで良かったので今まで適当に書いてきました。 でもただなんとなく書いてるだけじゃダメだなぁと思いました。分からなかったら調べないとダメですね。

参考

Gradle の compile, api, implementation とかについて - Qiita