Gradleは使ったことはあっても弄ったことはなかった。
便利なんだろうけど利用範囲が大きすぎてとっつきにくい感じがする。
Unityで使う用ライブラリで外部ライブラリを含めたりする方法のメモ。
Plugin2系(Gradle3系)とPlugin3系(Gradle4系)だとかなり違うみたいです。
dependencies だとこんな違いがある。
せっかくなので最新バージョンに合わせて考えてみます。
まず基本形はこんな感じにして、それぞれのオプションを足したり変えたりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
apply plugin: 'com.android.library' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' } } android { compileSdkVersion 27 buildToolsVersion "27.0.2" defaultConfig { minSdkVersion 18 targetSdkVersion 27 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'com.android.support:appcompat-v7:27.0.2' } |
Unityライブラリである classes.jar はコンパイルの時だけ使うようにする。
1 2 3 4 |
dependencies { implementation 'com.polidea.rxandroidble:rxandroidble:1.4.3' compileOnly fileTree(include: ['*.jar'], dir: 'libs') } |
Unityライブラリ以外をlibsに入れて、それらは同封したい場合は別途excludeする。
transitiveは推移的な依存フラグ。default:trueで特にいじる意味はない。
1 2 3 4 5 6 7 8 9 |
android.libraryVariants.all { variant -> variant.outputs.each { output -> output.packageLibrary.exclude('libs/classes.jar') } } dependencies { implementation ('com.polidea.rxandroidble:rxandroidble:1.4.3'){transitive = true} implementation fileTree(dir: 'libs', include: ['*.jar']) } |
あるいはこうでもいい。
1 2 3 4 |
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'], exclude: ['classes.jar']) compileOnly fileTree(dir: 'libs', include: ['classes.jar']) } |
ちなみにこれはダメだった。
1 2 3 4 5 6 |
android { ... packagingOptions { exclude 'libs/classes.jar' } } |
外部のライブラリを libs に入れて、依存先を含むライブラリを作成する。
本来はこんな必要はないけど、Unity (Gradle不使用) で使うためのライブラリを作るならこんな感じで独立して動くようにしないといけない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
configurations { outLib } dependencies { outLib 'com.polidea.rxandroidble:rxandroidble:1.4.3' implementation fileTree(dir: 'libs', include: ['*.jar','*.aar']) } task _copyDependencies(type:Copy) { dependsOn build copy { from configurations.outLib into 'libs' } } |
これで hoge.aar / libs / rxandroidble-1.4.3.aar みたいに配置されるわけだけど、中身が空になってしまう。ビルド自体は問題ないのになぜ。
これは上手い解決法がなかったので aar はそのまま出力してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
task _copyDependencies(type:Copy) { dependsOn build copy { from configurations.outLib into 'libs' } fileTree(dir: 'libs', include: '**/*.aar').each { File file -> copy { from file into('build/outputs/aar/') rename(file.name,'blemodule-'+file.name) } } } |
なんとなくすごい遠回りしてる気がする。
UnityでGradleを使ったビルドをしたほうが最終的には楽で最適化されたものができると思うけど、情報が少なすぎるのでしばらく保留します。
追記
ちょっとライブラリの構造が気になった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* 今はこうなってる。 */ hoge.aar/libs ┣dagger-2.8.jar ┣javax.inject-1.jar ┣proguard-rules-1.3.2.0.aar ┣rxandroidble-1.4.3.aar ┣rxjava-1.3.2.jar ┣rxrelay-1.2.0.jar ┗support-annotations-25.3.1.jar /* こうあるべきでは? */ hoge.aar/libs ┗rxandroidble-1.4.3.aar/libs ┣dagger-2.8.jar ┣javax.inject-1.jar ┣proguard-rules-1.3.2.0.aar ┣rxjava-1.3.2.jar ┣rxrelay-1.2.0.jar ┗support-annotations-25.3.1.jar |
でも RxJava なんかは他の外部ライブラリでも使われそうだし、重複チェックがしにくくなりそう。そもそもaar内にaar入れるのが可能なのか不明。
追記2
過去のバージョンだとaarファイルを読み込むのに新規モジュールを作ってImport Packageする必要があったみたいだけど、現在はlibsに入れるだけで使えてる。
どうやってるのかと調べてみるとaarがキャッシュで解凍されていた。
1 2 3 4 5 6 7 8 9 10 |
>> Tasks > android > androidDependencies releaseCompileClasspath - Dependencies for compilation +--- D:\AndroidStudioProject\ble\blemodule\libs\classes.jar +--- D:\AndroidStudioProject\ble\blemodule\libs\dagger-2.8.jar +--- D:\AndroidStudioProject\ble\blemodule\libs\javax.inject-1.jar +--- C:\Users\xxx\.gradle\caches\transforms-1\files-1.1\proguard-rules-1.3.2.0.aar\ef86b956bca9a8983161b2415c19b720 +--- C:\Users\xxx\.gradle\caches\transforms-1\files-1.1\rxandroidble-1.4.3.aar\bd2b75d93f6fc4a3569da3b0d4b0a68b +--- D:\AndroidStudioProject\ble\blemodule\libs\rxjava-1.3.2.jar +--- D:\AndroidStudioProject\ble\blemodule\libs\rxrelay-1.2.0.jar \--- D:\AndroidStudioProject\ble\blemodule\libs\support-annotations-25.3.1.jar |
この辺の中からclasses.jarをとってきてリネームしてもいいかもしれない。
ただ調べてもこのパスの取得方法がわからなかった。