Circle CIでAndroid Support Libraryを含んだプロジェクトの日本語Javadocを出力する

# Circle CIを使ってAndroidライブラリJavadocを出力する

Circle CIはUbuntu環境でビルドとかができるようですが、ローカルのUbutu環境で実行できても何故かCIではうまく出力できませんでした。具体的には、javadocを出力しようとしてもAndroid Support Libraryのclasspathが足りないらしく、失敗となります。

慢心（ローカルで通るし）と環境の違い（日本語化してるし）があったのかと思いますが、とにかく通らないと気持ち悪いのでなんとか直すために試行錯誤しました。

無事通ったので、そのメモです。

## 修正前のbuild.gradle

ネット上で探してきた出力用のスクリプトがこれです。多少修正していますが、ほぼそのまま使っています。ですがコレだと日本語が文字化けするし、support libraryを含んでいるとclasspathが足りません。

そもそもSupport Libraryはaarなので、そのままだとclasses.jarにアクセス出来ないっぽいです。

```lang:groovy
android.libraryVariants.all { variant ->
    if (!"release".equals(variant.name) || "".equals(ARTIFACT_VERSION)) {
        return;
    }

    task("javadoc", type: Javadoc) {
        title = "${file(".").name} ver ${ARTIFACT_VERSION}"
        description "Generates Android Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"

        classpath = files(variant.javaCompile.classpath.files) +
                files(ext.androidJar) +
                files("build/intermediates/classes/${variant.name}/")

        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://d.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/*Dao.java' /* ignore greenDAO */
        exclude '**/DaoMaster.java' /* ignore greenDAO */
        exclude '**/DaoSession.java' /* ignore greenDAO */
        exclude '**/R.java' /* ignore greenDAO */
    }


    task("javadocJar", type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }

    artifacts {
        archives javadocJar
        archives sourcesJar
    }
}
```

## 修正後のbuild.gradle

試行錯誤して、Circle CI上で文字化けとSupport Libraryが通るようになったのがコレです。


 * charsetのUTF8指定
 * classpathにfileTreeでbuild/配下にあるAAR解凍キャッシュを指定
 * 追記: ラムダ式等、JDK1.8機能を使う場合はXdoclint:noneを追加することでエラーを回避できる

```lang:groovy
android.libraryVariants.all { variant ->
    if (!"release".equals(variant.name) || "".equals(ARTIFACT_VERSION)) {
        return;
    }

    task("javadoc", type: Javadoc) {
        title = "${file(".").name} ver ${ARTIFACT_VERSION}"
        description "Generates Android Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"

        classpath = files(variant.javaCompile.classpath.files) +
                files(ext.androidJar) +
                files("build/intermediates/classes/${variant.name}/") +
                fileTree("build/intermediates/exploded-aar").include("**/*.jar")

        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://d.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/*Dao.java' /* ignore greenDAO */
        exclude '**/DaoMaster.java' /* ignore greenDAO */
        exclude '**/DaoSession.java' /* ignore greenDAO */
        exclude '**/R.java' /* ignore greenDAO */

        options.addStringOption('Xdoclint:none', '-quiet')
        options.encoding = "UTF-8"
        project.configure(options) {
            memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
            charSet = "UTF-8"
        }
    }


    task("javadocJar", type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }

    artifacts {
        archives javadocJar
        archives sourcesJar
    }
}
```