android gradle plugin 1.5.X メモ
1.4.X は仕事で某ライブラリでjarの中のクラスが大文字と小文字を使ってるライブラリが有り
apk作れないんで放置して1.3.X使ってたんですが*1
1.5.Xで触ってみて動いたので色々と検証した時のメモ
>1.4.X の時の状況
Android Studio 1.4 で SVG から png が作成するためには Android Gradle Plugin を 1.4 以上にする必要があるけど、1.4.0 を指定したら無かった。1.4.+ を指定したら 1.4.0-beta3 が落ちてきた
@bina1204 gradle-plugin 1.4 ってdex margerのクラスの正規表現が変になってるので1.3に戻して使ってますね(期待値:全部小文字、対象のjarに大文字クラスがある=>jarのdexマージが出来なくて終了する
2015-10-08 22:37:59 via YoruFukurou to @bina1204
@kimukou2628 そんな罠があるんですね(゚o゚;
>1.5.X の時の状況
@osa030 さんの URL のブログを参考にしながらlibrary-projectが既にaar作成済みならaar直参照するようにbuild.gradle弄ったら、なんとかマシになったけどバッドノウハウな気もするし。。<苦笑
2015-11-09 22:25:35 via YoruFukurou to @osa030
結局何やったかというと下記みたいなbuild.gradle 書いた。
aarを一度作成したら1.3.X並の速度に戻ったけど
これASで gradle sync とか遣ってしまうと真っ先に消されてしまうコードなんだよね(苦笑。
ASはシンプルなbuild.gradleしか解釈できないから。。。
まあWindowsで実行メモリも絞って動かしているからかも*2 *3
- build.gradle
def aarDir = new File(project(':google_play_services_froyo').buildDir,"outputs/aar") def hit_f = false if(aarDir.exists()){ hit_f = true repositories{ flatDir{ dirs aarDir } } } dependencies { // ==省略== if (hit_f) { println "==== aar reference ====" releaseCompile(name:'google_play_services_froyo-release', ext:'aar') debugCompile(name:'google_play_services_froyo-debug', ext:'aar') } else { println "==== library project ====" compile project(':google_play_services_froyo') } }
- settings.gradle
include ':google_play_services_froyo' project(':google_play_services_froyo').projectDir = new File(settingsDir,'../google_play_services_lib')
11/10 追記)
下記の対応まですれば、調子がいい時は1.3並の速度がwindowsでも出るようになった。 *4
2.8以上にruntimeを変更したときtasks.withType(JavaCompile) { configure(options) { incremental = true fo… URL …
の話ですね
- wrapperのruntimeを差し替える
- ローカルにダウンロードしてきて参照するほうがベター
- 2.8以降に追加されたgraldeのoptionを追加する
- gradle/wrapper/gradle-wrapper.properties
#distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip distributionUrl=file\:/c\:/workspace/gradle-2.9-all.zip
- gradle.properties
#org.gradle.jvmargs=-Xms2048m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.jvmargs=-Xms512m -Xmx512m -XX:Metaspace =256m -XX:MaxMetaspace =256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.java.home=C:/opt/jdk8 org.gradle.workers.max=4 //CPUのコア数
jdk8の利用にして
現実的な利用確保可能なメモリサイズに変更する*5
- build.gradle
tasks.withType(JavaCompile) { configure(options) { incremental = true fork = true } }
でも android gradle plugin で paralel必須になってるわけですが
- キャッシュがおかしくなった時ビルドがだんまりして止まるので
> gralde --stop
> gradle clean
してやり直すのは必須だったりと微妙な気がします。
まあだから
- jenkinsでは、基本daemonモード禁止
- bazel待望論みたいな話が出てくるんですよね。。(苦笑
11/12 追記)
> incremental = true
は標準的なgradleマルチプロジェクト形式じゃないと動かないらしい。
まあsourceSetのremaping はandroid pluginが
独自に頑張って実装してるからだろうなというのが結論。
によると
android{ dexOptions{ incremental = true preDexLibraries = true jumboMode = true } }
で頑張れとでてくる。上記をセットすると気持ち速くなった気がするけど
結局難しいもんですね。。 *7
11/20 追記)
1 Entry per Day: Android StudioとGradle wrapperが違うdebug.keystoreを使う問題 URL
gradle plugin 1.4ベース試用してた時から認識していて
debugでもsigningConfigsを記述してるのに何でかなー *8 と思っていたら
☆のように明示的に関連付けないと、自動検索がどうも20秒ぐらい余分にかかる感じになる。
- build.gradle
signingConfigs { debug { storeFile file("../debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } release { storeFile file("../debug.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { debug { debuggable true jniDebuggable true signingConfig signingConfigs.debug//☆ } release { minifyEnabled true zipAlignEnabled true proguardFile getDefaultProguardFile('proguard-android.txt') proguardFile 'proguard-rules.pro' signingConfig signingConfigs.release//☆ } }
macではsigningConfigsな指定無くてもな話を聞くので
windows限定の話かもしれないのですけど・・・。
OSSだからWin対応が薄くなるのは仕方ないのかな−(苦笑。
bazelにしても mac/linux版 しかないわけですしね*9
減価償却的に未だ
- Win開発環境=Android
とか言ってるのは日本特有の文化なのかもしれない。。。
技術者は世界標準的には意識レベル高いひとが多いのかもしれないけど
*1:StackOverFlowにも同じ現象でて困ってる人がいた。。
*2:version UPでメモリ食いになってる可能性は有
*4:ここらへん実はMacとかならそう言うカスタム要らないかもしれないですけどね。。開発者がMacしか使ってないから動作確認してないよなOSSは結構有ります。。。
*5: 上記だと設定上は512mx4プロセス+IDE 1024m = 3G程度 な認識
*6:その場合はincrementalの差分ビルドが効かない
*7:useJack=true あたりは、4系レベルでもDEX_OPTでるので、逆にinstallすらできないですし。。
*8:GooglePlayServicesのpush通知とか周りでkey指定は必須