Tips : Android Studio Gradle Pluginでjarをapkに含めずにコンパイルする

なかなかマニアックなユースケースですが、例えばandroid.jarのようにコンパイル時に参照解決するけど、apkには含めないような形で、独自のjarに依存するapkをGradleでビルドする方法についてメモしておきます。

Gradleのruntimeメソッドはない

Gradleのドキュメントを調べると、runtimeメソッドがあるようで、これを使うことで目的が達成できるようです。

dependencies {
    runtime fileTree(dir: "${project.rootDir}/path_to_libs_dir", include: '*.jar')
}

しかし、AndroidのGradle pluginではこのメソッドがサポートされていません。(excludeもないっぽいです)

なので別の方法で参照解決をする必要があります。

build.gradle の編集と確認

要は、コンパイル時にclasspathに入っていればいいので、それをbuild.gradleに追記していきます。

configurations {
    provided
}
 
dependencies {
    // ...
    provided fileTree(dir: "${project.rootDir}/path_to_libs_dir", include: '*.jar')
}
 
// Android's version of sourceSets.main.compileClasspath
android.applicationVariants.each { variant ->
    variant.javaCompile.classpath += configurations.provided
}

これで出来上がりです。この方法は、こちらの内容を参考にしました。

本当にjarが入っていないか調べるために、中身をみてみます。

$ mv app-debug.apk app-debug.zip
$ unzip app-debug.zip

この中に、classes.dexがあるので、これをdexからclassに変換します。

$ d2j-dex2jar classes.dex

これでjarができるので、zip拡張子を変更してまた解凍します。

中にjarに相当するパッケージのディレクトリ階層やclassファイルがなければ成功です。

Gradle Beyond the Basics

Gradle Beyond the Basics