経緯
自作AndroidライブラリをMaven Centralで公開しているのですが、海外の方から、 「Duplicate files copied in APK AndroidManifest.xml」とエラーが出てビルドできねーよ。 と問い合わせがあったので調べてみました。
そんな私はAndroidStudio初挑戦です。
対象のライブラリの内容
まず、おさらいがてら、公開しているライブラリのpom.xmlの内容から抜粋です。
<parent>
<groupId>com.tojc.ormlite.android</groupId>
<artifactId>ormlite-content-provider-parent</artifactId>
<version>1.0.3</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>ormlite-content-provider-library</artifactId>
<name>Android-OrmLiteContentProvider Library</name>
<packaging>apklib</packaging>
<description>This is a library that easy to make using ContentProvider with OrmLite.</description>
ここで、 packagingにapklibを指定している ことに注目してください。
これとは別に、一般のjarファイルもMaven Centralに公開しています。
※このapklibとjarの複数公開のやり方については、説明しません。
気になる方は、以下のアドレスからAndroid-OrmLiteContentProviderの各pom.xmlを覗いてもらえればと思います。
※実はこのやり方、ActionBarSherlockのpom.xmlを参考にしています。
Android-OrmLiteContentProvider
mavenから使う場合
そして、apklibとjarの二つのファイルをMaven CentralにUPしているので、Mavenから使うには、こんな感じで以下のように記述すればOKでした。
<dependency>
<groupId>com.tojc.ormlite.android</groupId>
<artifactId>ormlite-content-provider-library</artifactId>
<version>1.0.3</version>
<type>jar</type> <!-- or apklib -->
</dependency>
利用者は、typeのところで、使いたい方を記述すれば、そのライブラリが落ちてきます。
gradleから使う場合
さて、これをAndroid Studioやgradleで使いたい場合、普通はこう書きます。
dependencies {
compile 'com.tojc.ormlite.android:ormlite-content-provider-library:1.0.3'
}
ところが、これだと
Gradle: Execution failed for task ':TestApplication:packageDebug'.
> Duplicate files copied in APK AndroidManifest.xml
File 1: C:\Users\Jaken\AndroidStudioProjects\TestApplicationProject\TestApplication\build\libs\TestApplication-debug.ap_
File 2: C:\Users\Jaken\AndroidStudioProjects\TestApplicationProject\TestApplication\build\libs\TestApplication-debug.ap_
と、怒られてしまいます。
エラーのログをよく見ると、上の方に、こんなログも出ていました。
Origin 2: C:\Users\Jaken\.gradle\caches\artifacts-26\filestore\com.tojc.ormlite.android\ormlite-content-provider-library\1.0.3\apklib\5b3fb9e6ca26b4a01166740cf513cbd8f9ac6450\ormlite-content-provider-library-1.0.3.apklib
apklibを読み込んでいるようですね。
そして、apklibの中に、AndroidManifest.xmlが存在しているので、プロジェクトのAndroidManifest.xmlとダブっていることが原因のようです。
Android Studioでは普通に処理ができるjarファイルを読み込んでほしいところです。
ところが、公開されているライブラリのほうで、デフォルトのpackagingがapklibに設定してあるため、apklibを優先的に読み込んでしまっているのです。
困りました。
結論
はい、結論です。こんな時、こう書けば、読み込んでくれます。
dependencies {
compile 'com.tojc.ormlite.android:ormlite-content-provider-library:1.0.3@jar'
}
後ろに「 @jar 」を付けてあげるだけで、解決しちゃいました・・・。
これ、@jar以外に、@aarなんかもこのテクニックが使えるので、覚えておいて損はないと思います。
おまけ:gradleでActionBarSherlockのaarを使う
ActionBarSherlockのaarを読み込みたい場合は、以下のリンク先のサンプルの記述になります。JakeWhartonさん、ちゃんとサンプル公開してます。さすが。
ActionBarSherlock-Gradle-Sample
ということで、gradleからmavenを使うときのテクニックとして使えると思いますので、参考にしてください。