今からでもダウングレードしたい Android Studio 2.3 Beta 2

はじめに

Gradle 3.3 は本当に100倍以上の速さになったのか

なエントリが書かれるAS 2.3 Beta2 ですが

自分の体感的には、正直アップデート失敗しました。Beta1に戻したい状態

環境

MacOSX 16G

AS 2.3 Beta2

状況

つらくなった挙動

  • どうも定期的にマウスやキーボードが動かなくなる
    • バックグラウンドで何か遣っている挙動
    • Syncや補完Index作成?補完候補作成?
  • USBとかで実機繋いでるとポーリングしているようで、その瞬間重くなる
    • 重くなった瞬間、USB抜くと応答ができるようになる
  • ビルド中に重くなる
    • gradlew damemonとsyncしているよう

アクティビティモニターをみていると、瞬間的にASのCPU使用量がグンと跳ね上がる感じ

とつぶやいてるのって同じ状況じゃないかな・・?

Beta1 までは問題なかったので、正直なに変更したか知りたい。

release note見ても全然更新状況がわからん><

2017/1/16 状況追記

  • Beta2になって
    • メモリが食うようになった
    • IDEの突然死が復活した

というTwのつぶやきを見たので、メモリ使用量を見てみたら

1.5〜2倍くらいになってる・・。

完全にメモリSwapによるCPU負荷高ですね・・

これ gradle 3.3完全対応? のせいなのか、android gradle plugin 2.3-Beta2のせいなのかわからないんですけど、*1

とりあえずいつもの gradle.properties でのメモリ、forkスレッド数制限 でなんとかなりました

org.gradle.jvmargs=-Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+HeapDumpOnOutOfMemoryError - Dfile.encoding=UTF-8

org.gradle.workers.max=4
org.gradle.parallel=true

org.gradle.daemon=true
org.gradle.configureondemand=true

で、dex処理だけは2G指定しないとビルド処理が止まることが有るので、下記のおまじないは必要と・・

  • app/build.gradle
android {
  dexOptions {
    javaMaxHeapSize "2g"//data-bindingつかってるなら 3g-4g ?
  }
}

16G Macで厳しいって・・

G様の開発スタッフは32G以上のMacで開発されているんだろうか・・・

な話は分かるんですけどね。。

  • Unityがまともに動かないから=>開発環境をアップデートする

みたいなのは部署的に予算は取りやすいらしいんですけど、

ASがアップデートしたからはあんまり理由にならないみたい。。

一応IDEの方も下記の設定して、大分快適になりました。*2

-Xms1024m
-Xmx1024m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m

qiita.com


編集中にマウスが瞬間的に固まる件

ググってみたら、usbマウス等が使えなくなってる人がやはり居るみたいで

android file transfer が常駐している時と同じ現象のよう*3

とりあえずbluetoothマウスでしのぐしかないかな~(^^;)

build.gradleを編集していると頻繁に固まる

  • 補完候補をリアルタイムに探しているような状況
  • その度に編集カーソルがピクピク固まる
    • これまともに動く環境ってどれだけ高スペックなんだろうか?

因みに、

  • やたらとbuild.gradleが自動フォーマッターをかけようとするので
    • 手動でいじっている人はbuild.gradleが頻繁に壊れます
    • この状況で flavorとか追加させようとするのは正直やめて欲しい><
    • しかも標準のbuildTypeの切り替えだけで動かない仕様は糞

github.com


ビルド自体

gradle runtime が 3.3正式対応したので高速化した? との話が・・

でも実は Beta1 でも 3.3 普通に動かせていたので、たぶん関係ないんだよね・・

逆に毎回「gradle runtimeが 3.3になってないぞオラーw」

と余計な警告が出るようになったのでウザい感じも。。。

Library参照変更時に、直前の設定のバイナリを強く引きずる

gradleでLibraryのバージョン等を変更してビルドするとduplicate entryが多発。

  1. gradle sync
  2. cleanビルド

が必須になった挙動*4

2番だけやっても効かない

Build Cache が悪さをしているのか/効いているのかまではわからず*5

なんかどんどん劣化している気がするのは気のせいなのかどうか・・

特にこういう使い方には向かない

ASを複数枚開いて

  • Aのプロジェクトを参照しながら
  • Bのプロジェクトを作成

みたいなことをしようとする場合、

  • ビルドやapk転送しようとする度に
    • A/B両方のIDEに対して同期処理が走っている*6

ので厳しい状況になる*7

なんでASで複数プロジェクト開くの?

IDEAの機能に

  • Aのプロジェクトのファイル(パス)をコピーして
  • Bのプロジェクトに貼り付け
    • BのプロジェクトにAのファイルがコピーされる

という仕組みがあり、これ便利だから

でもまあこれ、多分IDEAの機能のままの実装で

  • AS独自だと
    • resをまとめて表示する機能があり
      • hdpi/ldpi/xhdpi とか
    • だがしかしこれをまとめてコピーができないのであんまり使い勝手よくない><

どうせやるならココまで拡張して欲しい。

android 4.3以上からしか使えない

PNG <=>WebP 変換メニューとか要らんからさ・・


AS 2.3になって不便になっている所

ビルド時のlintがつらたん

これ初期の andoid gradle plugin 2.3.X からだけど

  • app/AndroidManifest.xml
<uses-sdk tools:overrideLibrary="android.support.v17.leanback"/>
<uses-sdk tools:overrideLibrary="hoge.fuga.wearapp"/>
<uses-sdk android:targetSdkVersion="24" android:minSdkVersion="9"/>

とかけていたのがNG*8

  • app/AndroidManifest.xml
<uses-sdk android:targetSdkVersion="24" android:minSdkVersion="9"
   tools:overrideLibrary="hoge.fuga.wearapp,android.support.v17.leanback"
/>

でも tools:overrideLibraryの指定は255文字までなので、それ越えるとエラーになる

だから嫌でも minsdkがどんどん上げざるを得ない状況になる

  • app/AndroidManifest.xml
<uses-sdk tools:node="replace" />

で tools:overrideLibrary のかわりもいける みたいな記事も読んだこと有るんだけど

現在こっちは動かないみたいなんだよね。。(汗 *9

build-toolsの最新化を強いられる

前は低いバージョンでビルドをできていたのに、

「build tools 25.0.2を指定しろ」みたいに強いられる

まあココらへんASの指示に従って上げてしまい、

ビルドができなくなって崩壊するみたいな状況もあったりも・・

proguardのlintエラーの表示がわかりづらくなった

標準でも proguardの実行ログが大量に出るのですごくわかりづらい><

Terminal窓で

gradlew assembleRelease > log 

として Sysout上に出てくる記載を拾ったり

gradlew assembleRelease -info

として拾うパターンもあり

逆に debugビルドで Built-in Shrinker を有効化してチェックするのも良*10

  • Built-in Shrinker は
    • debugBuildにproguardをかけてサイズを小さくする

のでproguardに繰り返し格闘する場合はこちらのほうが時間の節約かも

  • app/build.gradle
debug {
    debuggable true
    minifyEnabled true //★
    useProguard false  //★
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // ← 追加
}

*1:少なくとも 2.3-Beta-1 は問題なかった・・

*2:まあこの指定でも合算で2Gは食うんだよね。最近のデフォルト設定だと何も指定無しで5〜6G近く食う時有るから、それは重いわ・・

*3:頻繁になった usbボーリングチェック が入力デバイスを邪魔する?

*4:InstantRunを無効にしてもダメ

*5:cleanビルドしている時点で ビルド高速化?な観点は正直疑問では有りますが・・

*6:gradle daemonからIDEにシグナルを送っている挙動

*7:Beta1までは問題なかったが、Beta2では2倍重くなる感じ・・・

*8: “UsesMinSdkAttributes” lintがfatal error指定にされているからが理由らしいですが・・

*9:2014年ごろの記事みたいですし。G様の過去互換ステっぷりは激しいですし・・

*10:releaseビルドよりdexオプティマイズないぶん実はビルド高速なので・・