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

過去互換が消えていってる気がする Android Studio 2.3 Beta 3

android gradle AS

はじめに

記載が増えたため記事分割

さわった所感

Beta2 から 実は InstantRunのHotSwap がちゃんと動くようになった?

みたいなお話をTwitterで教えてもらったのでちょっと調べてみたメモ

  • Beta3のリリースノートのリンクを見る限り*1

    • InstantRun周りの修正が多いように見える
  • 動く条件 (ActivityReload?)

    • InstantRunがまともに動く環境(target-21以上)
    • イナヅママークで転送した時
    • data-bindingを使わないレイアウト*2
    • レイアウトの修正をIDEが認識してくれて、転送可能である時*3
    • javaのコードも対応してる? らしいけど、基本アプリが再起動しているところしか見たことがない。。
  • OS5の端末だと、結構失敗しているよう

  • OS6の端末だと、比較的成功率が高い? でも基本再起動する
  • OS7の端末の端末は未入手なので検証できず*4

  • USBを複数接続するCPU使用率がすごく上がるよう

    • 端末1個のみにしておいたほうが良い
  • ASのIDEも複数立ち上げない*5ほうが良い

Beta2からは

  • instant runのhotswap対応*6
  • USBのポーリングチェック
  • IDEの補完強化

あたりでかなり高スペックを要求されるような状況になっている気がする*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自体

  • Seirraアップデート後、ローカルのディレクトリ表示が遅い
  • .android/build-cache のファイル、ディレクトリが増えるとASの起動、gradle sync が劇的に遅くなる

開発端末自体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 でもビルドエラーは引っかかる。

状況を整理すると

  1. InstantRunのモジュール関係でビルド時にDexOpt*10が引っかかる用になる
    1. AS上からは、classpathに multidexのモジュールがあれば勝手に使う*11
    2. コマンドラインからは、multidexのモジュール指定があっても使わないのでビルドが失敗するようになる

で、下記な感じで変更した。

InstantRun/Command Lineビルド安定化記述

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 pluginuseLibrary が干渉しているんだろうな・・(遠い目

*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バイナリには影響しない