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

最近ハマった事象の備忘録(Android Studio 2.3 Canary 3 編)

はじめに

Android Studio 2.3 Canary 3 が昨日でたようですが

同じバージョンの gradle plugin はまだ出ていなくてIDEのみだと挙動評価できないんだよな。。

な話は有るようですが・・

sdkmanager | Android Studio

も AS用にカスタムされた下記のコマンドの代替のようであんまり目新しく感じませんしね。。

android update sdk

ココらへんも有りsdk自体のアップデートも今回推奨されているようです*1

因みに

$ANDROID_HOME/tools/bin

のパスに sdkmanager は設置されているようですが、path通しても

環境変数の定義がない」 とエラーが出て動かせなかったなorz*2

android gradle plugin 2.3.Canary 3

  • data-binding

一応下記は治った。

  • layout-preview
    • エラーがホバー表示になった*3
    • エラーをちんまり表示していたエリアを折りたためるようになった

エラーを根本的に表示させないみたいな改善はされないんですよね。。相変わらず。。


カスタムaarのバイナリ変更が正常に認識されない

今風の共通Libraryを作って使いまわす書き方だと、privateRepoとか作らない場合、

library projectをそのまま入れるより moduleのaar化をして、下記の書き方が推奨されるようなのですが

  • libP/build.gradle
configurations.maybeCreate("default")
artifacts.add("default", file('SDKTest-rel-1.01.aar'))

G様の予告通り Android Studio 2.3 Canary 1あたりから

デフォルトで下記が有効になっていて、カスタムLibraryのaarバイナリを差し替えただけだと変更を認識しないという話

Gradle Syncしても追加した関数とかでてこなくてすごく困りました。。。*4

ターミナルで gradlew assembleDebug自体は通るのですごく辛い状況ですた・・

  • gradle.properties
android.enableBuildCache=true //★

★が指定無しでデフォルトで動いている状態

対策として

  1. android.enableBuildCache=false 指定する 又は、
  2. キャッシュ周りを全部消してAS再起動
    1. $HOME/.android/build-cache 消しただけではダメ
    2. build/.idea 辺りも消す 1.Invalidate Cashed もおこなう

すごく大事になってる。。

一つ目のケースだと、InstantRunを使っても、明らかにビルド速度が劣化しましたorz*5

外部提供されているaarだと

$HOME/.gradle にバージョンタグ別にバイナリが入るので問題無さそうですが

バージョン変えずにaarが提供されれば、中間ファイルが強くキャッシュされて辛いことになりそうです。

これjarとかでは起きないんですよね*6

ちなみにASだと下記の指定の場合、[2]が推奨されてしまうような挙動のようです*7

ext変数によるバージョン記述外出統一とかG様のgithubサンプルでも遣っているというのに

ASのIDE的にはバージョンベタ書き推奨とか色々と逆行してる気はするかなーと

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')//[1]
    compile file("libs/xxxxx.jar")//[2]
}

InstantRunの挙動がへん。

  • InstantRunを有効にしていると
    • 初回転送/データ消去後の転送時にNavigationBar等が押せないことが多々
    • 二度目に再実行したときに押せるようになる

ASのanalize apkとかでみると

  • debug.apkの中のclass.zip には
    • 自分が作ったロジック等のクラスは入っていない(差分転送されている別バイナリapk側に入っている)
    • InstantRunを動かすためのgoogle系のクラスのみ同梱
    • InstantRunServicesというServiceクラスが同梱されていて、これ経由で実行されているよう*8

で、このServiceが初回転送時には、うまく差分転送されている別バイナリapkがロードできていない挙動な感じがする*9

で、このサービス常駐しているような挙動で

  • apkを強制終了させないと、変更差分が反映されないことが有る
  • どうしても変更が認識しない場合は、データ消去かアプリ消去が必要
    • 変更感知転送が未だうまく行っていないっぽい?

まあPC側のASサイドにしても、

  • コード変更がよく認識されなくて
    • 5回に1回はクリーンビルドしていたりする

のを考えると、厳しい状況なのかもな。。

  • InstantRunのapkを配布できる? みたいな話がありましたが
    • 最新版は無理じゃないかな?とか思ったり。
    • 出来るとしたらadb pushで転送されている 差分apkファイルはどこに存在している?

辺りが気になりました・・

自動生成されるコードの文法チェックがつらたん

  • data-binding
  • realm
  • butterKife

APT自動変換されているコードが増えてきている状況で

その手のコードで unchecked等が、あるままよくリリースされているようで*10

これは直せないので下記の修正をしました。javaCompleタスク自体はソース単位でかかるので・・

なんせ、apk実行時に下記の作りは苦痛でしかない・・

  • Logcat View/debugger Viewを開いていても
  • 強制的にエラーViewに切り替えさせられる

  • root/build/gradle

allprojects {

    //-XlintのワーニングをASのMessageタブに表示させる
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            if(it.source.asPath.indexOf("generated") != -1){ //★
            
            }
            else{
                options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
            }
        }
    }
}   

コード補完開始時に頻繁に固まるようになった

これ開発端末を macOS Sierra にした影響なのかどうなのかよくわからないのですが

  • 変数エラー時
  • コード補完開始時

に数秒固まるようになりました。いきなりキーが動かなくなるのはすごく困る・・*11

固まった瞬間に、他のアプリとかマウスで触れはするのでAS限定の状況と認識して良さそうです

CPUも瞬間的に凄い事になっている*12ようでしたが、

現在CPU Limitソフト入れて対処はしているので、OSロックする恐れの点に関しては考慮してはいませんけど・・

macOS Sierra にして変更した箇所

  • ライブ変換をOFFにする
    • これASのコード補完ともろ干渉しますw。
  • NWアドレスがデフォルトがipv6になるのでipv4に変更
    • Charlesとか使うときにすごく不便
    • Proxy Settings とか Android 6からは使えないんですよね(汗

sudo networksetup -setv6off Wi-Fi

あと不便になったところは

  • Go2Shell のソフトとか使えなくなった
  • Finder上に表示されていた DropBoxとかのリンクが消えた

あたり。

バックグラウンドのサービスとか止めて軽く動かす設定はマダ調べきれていない

ASがIDEA 2016.3 互換版になってハマった所

  • ブックマークのショートカットが F3 になっている
    • メニュー/マウス 等から操作できないので、使えないとすごくハマる

qiita.com

  • 補完キーを使う=> 書きを変更
    • KeyMap>Code>Completion
    • Basic
      • Alt+Space に変更

qiita.com

*1:というかAS自体最新のbuild toolsで使うことを強いられるから諦めが肝心?

*2:exportで指定変数定義してもだめ・・・

*3:でも画面外出る。。

*4:IDE補完が効かない状態。。

*5:どうも連携前提でInstantRunが動いてる挙動?

*6:ここらへんは従来通りのIDEAのLibraryの認識の仕方だからかも

*7:IDEdependency設定から直すと [2]が生成される

*8:これはJrebelっぽい作りになってきてる気がする。一つだけInstantRunの方の利点は端末から直起動が出来るあたりか

*9:画面が白い状態で暫く待たされるのは、なんかローディングキャッシュ作っている挙動っぽい

*10:data-bindingはエラー?検出が消えたり出現したりが特に激しいw

*11:偶に文字入力時に固まることもorz

*12:Limit限界まで振り切りました