Windows環境でのInstantRunに関してのメモ(2.1-Prev)
- Android Studio 2.1 Preview
- android gradle plugn 2.1 Preview
- Windows7 64bit*1
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あたり
確かに InstantRun無効にしても/Skip Instation if Apk has not changedを無効にしても頻繁に実機転送されないんだよな<結局adbコマンドで転送してる。gradleビルド自体も2?3回… URL …
微妙なところ)
- 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ではビルドがコケる。
ただ普通にビルドするとエラーにならないので、解釈の仕方が違うのかな。。。?