Windows環境でのInstantRunに関してのメモ(2.1-Prev)

DroidKaigi 2016講演資料まとめ DAY.01 | Time to live forever

に関する言及が上がってたので、最新挙動をメモしておく

前回の検証結果は



Android Studio 2.0 Beta6 までの作業差分

■2.1 Previewに関して
ダメなところ)

  • InstantRunビルドがめちゃくちゃ遅くなった
バージョン 初回ビルド
2.0-prev8 3〜5分
2.1-prev 5〜7分

ましになったところ)

  • 突発的cleanフルビルドの回数が減った
    • 転送先を変えた時点でフルビルドは変わらず

微妙なところ)

  • InstantRunなしビルド と InstantRun差分ビルドのビルド時間が殆ど変わらない
    • どちらも変数一つ書き換える程度で30秒程度
    • ファイル差分変更無しで10秒程度かかる

InstantRun自体の悪い評価の話はググっても出てこないので
WIndows環境では動かないような細工されているのか?
(JackビルドはWindowsでは動かないとIssueすでに上がっているようですし・・・)


■beta5=>beta6 に変更になったタイミング
ダメなところ)

  • beta5よりビルド時間がかかる
  • ファイル更新監視が怪しい
    • 変更差分が認識されず、ビルド自体が動かないことがよく*2

ましになったところ)

  • ビルドのタスク自体は確実に実行するようになっている

微妙なところ)

  • HotSwap/ColdSwapの実行ログがRunTerminalに出なくなった
    • 実際その手の動作動いてないと思う
    • 必ずアプリが再起動するようになった



■beta5あたりな状況。

微妙なところ)

  • HotSwap/ColdSwapの実行ログがRunTerminalに出ているが、動いているような気がしない
  • GradleSyncすると、InstantRunのチェックを外したのが元に戻ったりする*3



■prev => beta に変更になったタイミング

  • Betaに上げた瞬間にInstantRunが全く動かなくなった
    • GradleSyncしてもダメ
    • StackOverFlowでiml等を消して、プロジェクト構成ファイルを再作成したほうが良い と記述があったのでそれを実行
    • 確かに記述どおりInstantRunが動く挙動をするようになった



JRebel for Android に関して

  • 2.0-beta5の段階で、gradle pluginでの対応アクションを廃止
  • 独自でファイル監視をするようになり爆速になったとのこと
    • まあこの辺りからInstantRunのビルド安定化のためにどんどん遅くなってたので英断

自分が以前試していた段階で、layoutファイルとか1つのファイルの変更が5−10秒程度で転送されていたので*4

ただライセンス形態が、

  • 期限が来たらライセンス要求のダイアログを出して実行ブロック
  • pluginの更新自体は普通に可能

な形だったので、購入するタイミングが難しいかなと*5



追記)InstantRun周りで気になった挙動

1)GooglePlayService(LibraryProject)のMultiDex対策メモ - exception think
で以前書いた記述で修正しておかないとダメなところ

  • build.gradleの解釈 と gradleコマンドライン引数の評価は誤差があるので
    • cleanが実行されてしまう時はaarDirを参照しないようにしないとビルドがコケてしまう。。
  • build.gradle
ext.findFirstFile = {rootDir,filter ->
	println "rootDir=$rootDir"
	println "filter=$filter"
	if(rootDir==null || !rootDir.exists()){
		return null
	}
	File result
	rootDir.traverse(
		type : groovy.io.FileType.FILES,
		nameFilter : filter
	) { it -> 
		//println it
		result = it
		groovy.io.FileVisitResult.TERMINATE
	}
	result
}

def hit_f = false
def cmdTask=project.gradle.startParameter.taskNames == null ? "": project.gradle.startParameter.taskNames[0]
def aarDir = new File(project(':google_play_services_froyo').buildDir,"outputs/aar")
if(cmdTask != "clean" && findFirstFile(aarDir, ~/.*\.aar/)!=null){
	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')) {
            exclude group: "com/google/ads/**"
            exclude group: "com/google/android/gms/ads/**"
            exclude group: "com/google/android/gms/analytics/**"
            exclude group: "com/google/android/gms/appindexing/**"
            exclude group: "com/google/android/gms/appinvite/**"
            exclude group: "com/google/android/gms/appstate/**"
            exclude group: "com/google/android/gms/cast/**"
            exclude group: "com/google/android/gms/drive/**"
            exclude group: "com/google/android/gms/fitness/**"
            exclude group: "com/google/android/gms/games/**"
            exclude group: "com/google/android/gms/identity/**"
            exclude group: "com/google/android/gms/location/**"
            exclude group: "com/google/android/gms/maps/**"
            exclude group: "com/google/android/gms/nearby/**"
            exclude group: "com/google/android/gms/panorama/**"
            exclude group: "com/google/android/gms/plus/**"
            exclude group: "com/google/android/gms/safetynet/**"
            exclude group: "com/google/android/gms/wallet/**"
            exclude group: "com/google/android/gms/wearable/**"
        }
    }
}        


2) AndroidStudioでAndroid2.2対応アプリにAdMob/GooglePlayServicesを組み込む方法 - Qiita みたいな
applicationVariants.allを弄る系の記述があるとInstantRunではビルドがコケる。
ただ普通にビルドするとエラーにならないので、解釈の仕方が違うのかな。。。?

*1:8GBメモリ環境

*2:Flavorで切り替えているソースとか・・・

*3:これ最新版でも挙動変わらずorz

*4:時折gradle buildのビルドの影響でて30秒かかることはあったが。。。

*5:会社とかだと新年度の予算とかで4月からとかよくあるでしょうし。。