過去互換が消えていってる気がする Android Studio 2.3 Beta 3
- はじめに
- さわった所感
- 他の気づいた事
- instant run自体
- android gradle plugin
- useLibrary と CustomBuildType or ProductFlavorを使うとビルドが失敗する
はじめに
記載が増えたため記事分割
さわった所感
Beta2 から 実は InstantRunのHotSwap がちゃんと動くようになった?
みたいなお話をTwitterで教えてもらったのでちょっと調べてみたメモ
Beta3のリリースノートのリンクを見る限り*1
- InstantRun周りの修正が多いように見える
動く条件 (ActivityReload?)
OS5の端末だと、結構失敗しているよう
- OS6の端末だと、比較的成功率が高い? でも基本再起動する
OS7の端末の端末は未入手なので検証できず*4
USBを複数接続するとCPU使用率がすごく上がるよう
- 端末1個のみにしておいたほうが良い
- ASのIDEも複数立ち上げない*5ほうが良い
Beta2からは
あたりでかなり高スペックを要求されるような状況になっている気がする*7
で教えていただいた方の指摘通り
- JRebel for Android 辺りを一緒に動かそうとするとクラッシュする
- まあこれに関しては同じような挙動をしようとして干渉しているのかな・・
- InstantRunを無効にすれば正常に動く
まあこれに関して言えば、Beta1の時点から
compileSdkVersion "Google Inc.:Google APIs:24"
とかの一部の記述が
- InstantRunを有効にしているとコンパイルエラーが出る
- 無効にすると何故かビルドが通る
- dependency libraryでInstantRunが有効だとビルドできないやつも有る *8
- もちろん Built-in Shrinker も InstantRunとは共存できない
とか普通にあるので、特定の条件下で最適化するような処理が行われているのかと思われる
ちなみに、InstantRunを無効にすると Beta1=>Beta2に切り替わった時点で激遅くなった
ので、多分G様的には、InstantRun環境下でしか開発者テスト*9してないんだろうと思う。
他の気づいた事
data-bindingがデグれった?暗黙の仕様変更?
- _がついてるidが抽出対象にならない
- a_bc が aBcという変数に変換されて抽出されない
pluginアップデートしたらいきなりコンパイルエラーでヒビリマシタ。
layout previewがリアルタイムに反映されない
- 一回開き直さないとだめ
- もしくはclean/rebuild等か必須
instant run自体
開発端末自体SSD環境前提なんですかね~(^^;)
android gradle plugin
InstantRun/data-binding有効にしているだけで、multi-dexがやたら出やすくなった
- 下記のbuild.gradleの記述のみで何故かビルドが通る
- Application で MultiDexApplication等継承しなくても何故かOK
- しかも毎回ビルドが失敗するわけではなく、2−3回に1回ビルドが失敗する
とか謎挙動
- app/build.gradle
android{ buildTypes { debug { //★ 下記の記述は要らない。居るのはMultiDexApplicationとか継承する時のみ //multiDexEnabled true //multiDexKeepProguard file('multi-dex-keep.txt') } } dexOptions { javaMaxHeapSize "2G" } } dependencies { debugCompile 'com.android.support:multidex:1.0.1' }
しかもこれ コマンドライン debugBuild でもビルドエラーは引っかかる。
状況を整理すると
- InstantRunのモジュール関係でビルド時にDexOpt*10が引っかかる用になる
で、下記な感じで変更した。
InstantRun/Command Lineビルド安定化記述
- AS上からはInstantRunを実行
- コマンドラインはBuild-Shurinkerを実行
buildTypes { debug{ debuggable true //AS上からInstantRunが実行されたときのみ適応☆ def isIdeBuild = "false" def compilation = project.properties['android.optional.compilation'] as String if(compilation != null && compilation.indexOf("INSTANT_DEV")!= -1){ isIdeBuild = "true" } ant.echo "[isIdeBuild]:"+isIdeBuild if("true".equalsIgnoreCase(isIdeBuild)){ defaultConfig.minSdkVersion 21 } else{ //=== Build Shurinkerを実行 === minifyEnabled true //★ useProguard false //★ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'shrinker-rules.pro' // ← 追加 } } dexOptions { javaMaxHeapSize "2G" } } dependencies { debugCompile 'com.android.support:multidex:1.0.1' }
MultiDexApplicationを使えばいいじゃん的な話があるんだけど
- 4系以上に限定されてしまう
- 動かしている感じServices等でApplication参照を使うとたまに挙動がおかしい?
- 元々Application参照は安定していない気もしますが、更に輪をかけておかしくなる
iOSチックに省電力対応とかやろうとして不安定になっているのかな。。(遠い目
useLibrary と CustomBuildType or ProductFlavorを使うとビルドが失敗する
- AAPTエラーが何故か発生
- ProductFlavorを外す かつ release / debug ビルドなら正常にビルドできる
- useLibraryの指定を外すと問題ない
android { useLibrary 'org.apache.http.legacy' buildTypes { debug { /* デバッグ用のパッケージのパッケージ名に接尾辞を付けて、 デバッグ用インストール時に本番リリース用のパッケージを 上書きしないようにする */ packageNameSuffix ".debug" } /* 社内リリース用に新たにビルドの種類を定義する */ inhouse.initWith(buildTypes.release) //★ inhouse { packageNameSuffix ".inhouse" } } }
上記だと ★ビルド時のみAAPTエラー
これって、android gradle plugin と useLibrary が干渉しているんだろうな・・(遠い目
*1:今回からIssueにリンクが貼られたので修正不具合がわかりやすくはなった
*2:単なるfindViewById省略のための<layout>で囲んだだけのやつなら再起動しない場合があり
*3:ちょっとした変更の時、変更差分がないと認識されないことがたまにある。。
*4:genymotionでやる限り OS6に近い状態
*5:複数のプロジェクトを参照しない
*6:5系端末以降。4系端末だとアプリがクラッシュするようになったosz
*7:AS2.3正式版になったら、多分宰相スペックも上がりそうだよな。。<汗
*8:でもJake先生みたいに ButterKife直してくれるのを期待できなければ外すしかないよね。Daggerとか・・<汗
*9:動かして触ってる?
*10:メソッド過多64kオーバー
*11:apkバイナリには影響しない