読者です 読者をやめる 読者になる 読者になる

android gradle plugin 1.5.X メモ

1.4.X は仕事で某ライブラリでjarの中のクラスが大文字と小文字を使ってるライブラリが有り
apk作れないんで放置して1.3.X使ってたんですが*1
1.5.Xで触ってみて動いたので色々と検証した時のメモ

>1.4.X の時の状況

>1.5.X の時の状況


結局何やったかというと下記みたいな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

の話ですね

  1. wrapperのruntimeを差し替える
    1. ローカルにダウンロードしてきて参照するほうがベター
  2. 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必須になってるわけですが

  • マルチスレッドコンパイルなので
    • キャッシュのヒット率が結構悪い *6
  • キャッシュがおかしくなった時ビルドがだんまりして止まるので

> gralde --stop
> gradle clean

してやり直すのは必須だったりと微妙な気がします。
まあだから



11/12 追記)
> incremental = true

は標準的なgradleマルチプロジェクト形式じゃないと動かないらしい。
まあsourceSetのremaping はandroid pluginが
独自に頑張って実装してるからだろうなというのが結論。

によると

android{
   dexOptions{
       incremental = true
       preDexLibraries = true
       jumboMode = true
   }
}

で頑張れとでてくる。上記をセットすると気持ち速くなった気がするけど
結局難しいもんですね。。 *7



11/20 追記)

の話のような、証明書の自動検索がおかしい話は
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

減価償却的に未だ

とか言ってるのは日本特有の文化なのかもしれない。。。

技術者は世界標準的には意識レベル高いひとが多いのかもしれないけど

*1:StackOverFlowにも同じ現象でて困ってる人がいた。。

*2:version UPでメモリ食いになってる可能性は有

*3:CPU使用率も1.3.xより上がってる気がする...

*4:ここらへん実はMacとかならそう言うカスタム要らないかもしれないですけどね。。開発者がMacしか使ってないから動作確認してないよなOSSは結構有ります。。。

*5: 上記だと設定上は512mx4プロセス+IDE 1024m = 3G程度 な認識

*6:その場合はincrementalの差分ビルドが効かない

*7:useJack=true あたりは、4系レベルでもDEX_OPTでるので、逆にinstallすらできないですし。。

*8:GooglePlayServicesのpush通知とか周りでkey指定は必須

*9:あれGoベースのビルドスクリプトみたいなもんでしたっけ?