Eclipseでaar形式のAndroidライブラリを取り込む方法


Eclipse ADTでaar形式のライブラリを取り込むことができるGradleのプラグインの紹介です。
https://github.com/ksoichiro/gradle-eclipse-aar-plugin

Android Studioが正式にリリースされた今、AndroidでのEclipseの話題は歓迎されないかもしれません・・・
ですが、実際、開発した[他のライブラリ](https://github.com/ksoichiro/Android-ObservableScrollView)でも、Eclipseでインポートしたい、Eclipseで使いたいという声は何度もいただいていますし、Android Studioに移行したいが諸事情によりできない、Eclipseの方を使い続けたい、でもGradleのようにライブラリを簡単に取り込みたい、という方はいらっしゃると思います。
自分のように、Android Studioの利用を前提にライブラリを開発しているが、Eclipseでも簡単に取り込んでもらえるようにしたい、という方もいらっしゃるかもしれません。

そんな方に役に立つかもしれないツールの導入方法の説明です。

## 導入方法

ライブラリをEclipse向けに変換するために、Gradleを使います。
Gradle用の設定を書き、Gradleでコマンドを実行して変換し、インポートするという流れです。
 
### build.gradleの準備

Android Studioと同じように`build.gradle`を記述します。
プロジェクトフォルダ直下に配置します。
(既にAndroid Studioを使っている方で、マルチプロジェクト構成にしている場合は、プラグインはルートプロジェクトに適用します。)

```groovy:build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
        classpath 'com.github.ksoichiro:gradle-eclipse-aar-plugin:0.1.0'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.github.ksoichiro.eclipse.aar'

repositories {
    mavenCentral()
}

// 使用するライブラリを定義(以下は例です)
dependencies {
    compile 'com.android.support:appcompat-v7:21.0.2'
    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.melnykov:floatingactionbutton:1.0.7'
    compile 'com.github.ksoichiro:android-observablescrollview:1.5.0'
}

// gradle-eclipse-aarプラグインの設定
eclipseAar {
    // ビルドに使うAPIレベル (project.propertiesの出力に使われます)
    androidTarget = 'android-21'
    // 展開したAARをライブラリプロジェクトとして格納するディレクトリ
    aarDependenciesDir = 'aarDependencies'
    // (その他の設定はGitHubをご確認ください)
}

// Androidプラグインの設定
// (Eclipseだけでしか利用しない場合でも、最低限以下のような内容は書く必要があります)
android {
    // ビルドに使うAPIレベル
    // (Androidプラグインの適用時に参照されるため、何かしら定義しておく必要があります)
    // (Eclipseのみの利用であれば1でOK)
    compileSdkVersion 1

    // Android Studioも利用する場合は、必要に応じて
    // 以下のようにEclipse向けにディレクトリ構成の調整などを記述
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}
```

### Gradleの導入

Gradleをインストールするか、Gradle wrapperを導入します。
(バージョン2.2.1で動作確認済み)
上記GitHubのページからプロジェクトをダウンロードして下記をプロジェクト直下にコピーしても良いです。

* gradle (ディレクトリごと)
* gradlew
* gradlew.bat

### aarの展開・ライブラリプロジェクトの生成

Mac/Linuxなら以下を実行します。

```sh
$ ./gradlew generateEclipseDependencies
```

Windowsなら以下で良いはずです。

```
> gradlew generateEclipseDependencies
```

実行すると、`aarDependencies`というディレクトリにライブラリプロジェクトが生成されます。
`libs`にはjarファイルが生成されます。
`.project`、`.classpath`、`project.properties`といったEclipseに必要なファイルも生成されます。
既にファイルがある場合は、必要な情報が追記されます。

マルチプロジェクト構成の場合、同じartifactIdを持つライブラリが複数ある場合、バージョンの違うライブラリが複数含まれる場合、などでもきちんと生成してくれるはずです。
うまくいかなかったらすみません・・・。
GitHubのIssueやメールなどでご連絡いただければと思います。

### インポート

あとはEclipseでインポートするだけです。

1. Eclipseを起動します。
1. `File` > `Import`を選択します。
1. `General` > `Existing Projects into Workspace`をクリックし、`Next`をクリックします。
1. `Browse`をクリックし、対象のプロジェクトを選択します。
1. `Search for nested projects`にチェックを入れ、`aarDependencies`ディレクトリ以下に生成されたプロジェクトも見えるようにします。
1. 表示されたすべてのプロジェクトにチェックを入れ、`Next`をクリックします。
1. 使用するライブラリによってはビルド時に警告メッセージが出る可能性がありますが、
   そのままビルドします。

### ライブラリの変更

ライブラリの追加・バージョンアップ・削除をする場合は、インポートしたプロジェクトを一度削除し、build.gradleのdependenciesの部分を編集→再度コマンド実行→インポート、と一連の流れを繰り返せば反映されるはずです。

削除やバージョンの変更をした場合、古いライブラリが`libs`ディレクトリに残ってしまいますが、これを自動で削除したい場合は`build.gradle`で以下のように`cleanLibsDirectoryEnabled`オプションを有効にします。
ただし、このオプションは`libs`ディレクトリの中身を全て削除してしまうため、手動で格納したjarファイルなどがある場合はご注意ください。

```groovy
eclipseAar {
    cleanLibsDirectoryEnabled = true
}
```

## 実現できること

まとめとして、この方法で実現できることを挙げてみます。

### aar形式のライブラリをEcipseに取り込める

Library Projectとして取り込もうにも、ライブラリのプロジェクト構成が
Android Studio向けのプロジェクト構成になっていて
適応させるのに一苦労、といった場合でも苦労なく取り込めます。
GradleはGradle wrapperをコピーしてくればすぐに使えるので、
Maven pluginなどを導入するよりも簡単だと思います。

### Gradleで依存関係管理ができる

Gradleをベースに使うので、手動で取り込んだ後、時間が経ってからどのバージョンを取り込んだか分からなくなってしまうなどといったことはありません。
ライブラリのソースコードを丸ごと取り込んで管理する必要もありません。
`build.gradle`にAndroid Studioと同じように依存関係を定義し、コマンドを叩いて
プロジェクトをインポートし直せば良いだけです。

### Android Studioを使いつつEclipseでも開発できる／緩やかに移行できる

Android Studioのユーザにはプロジェクト構成等の制限をつけなければなりませんが、
それでも、一番面倒な外部ライブラリの取り込みが簡単にできるようになるので
Android StudioとEclipseを同じプロジェクトで使うのも無理ではないと思います。
(例えば、数名に先行してAndroid Studioを試してもらい、残りのメンバーは慣れたEclipseで開発し続けるなど)

以上です。