結構怖いよ InstantRun

はじめに

自分の環境用のメモ。

多分、富豪環境の人は起きないんじゃないかなー(遠い目

実行環境

  • macOS Sierra
  • 16G
  • HDDタイプのiMac
  • AS 2.3 RC1

ちまたでRTされまくっている日本語化に関して一言

ですが、

状態なのでやめました。

適応して問題ない方々って

みなさん「富豪環境フレンズ」なんだね〜。羨まし〜楽し〜

状態なんだろうな〜<苦笑*1

日本語化に関して追記 (2017/3/3)

作者の方に直してもらったPluginの状況を追記

かなりピーキーかも知れない Android Studio 2.3正式版 - exception think

IDEA単体であれば、eclipseのときの Pleiades の1割増し程度の負荷ではいけてるみたい・・*2


さて本題

自分の開発環境状況

gitでこまめに機能ごとにbranchを切って作業しています

A--------------- マスタブランチ
   |
   B----|--------  機能実装A
        |
        C-------  機能実装B

みたいな感じで、変更差分をgit applyで適応する形(A=>B=>C) みたいな形

Instant Runで認知していたこと

  • BuildCacheが切り替わらないので、
    • 同一クラスの変更差分を認識してくれない*3
    • 切り替えたバイナリを正常にビルドしてくれなくてクラッシュすることが有る
./gradlew clean

は必ず必須。それを実行すれば変更が反映された

で認識外だったこと

上記を参考にして

  • release.keystore から debug用の署名キーを作成
  • debug.keystoreを debug DSLで指定して追加

理由は、GooglePlaySerivce の同じフィンガープリントの署名キーが欲しかったため*4

    signingConfigs {
        debug {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('../debug.keystore') 
            storePassword 'android'
        }
        release {
            keyAlias 'hoge'
            keyPassword 'fuga'
            storeFile file('./release.keystore')
            storePassword 'fuga'
        }
    }
    
    buildTypes {
        debug {
            debuggable true
            signingConfig signingConfigs.debug
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

この状態で InstantRunを実行

/data/app/XXX−tmp18374/split_lib_slice_1_apk.apk is invalide Error

InstantRunの差分適応apkがエラーが出てる。

cleanビルドしてからInstantRunし直しても駄目

ググって出て来る対処法というと・・・

  • Invalide Error が出た時
adb -s $DEVICE uninstall $PACKAGE
  • 一旦apkを消しましょう あたりが出てくるんですけど、
    • 本体のapkは消える
    • InstantRun差分apkは消えない
/data/app/XXX−tmp18374 

なパッケージなんか有るわけ無いから削除できないみたい。><

因みにinstall先に署名が違うapkが有る場合、一旦uninstallがされる処理が動くんだけど

adb uninstall $PACKAGE

が発行されているのは何故?*5

なんか以前は -s $DEVICE つきで発行されていたんですけど、デグレッテルんですかね・・

それとも G様的に「InstantRunで 開発するときに複数台つなぐなよ」という思し召しなんでしょうか<汗

この状態でコマンドラインビルド

これは無事成功する

./gradlew clean assembleDebug

で、3時間ほど悩んでた・・

原因

署名された split_lib_slice_1_apk.apk あたりの実体を BuildCache にもっているみたい

対処方法

./gradlew --stop
./jkill.sh

./gradlew cleanBuildCache
./gradlew clean

をTerminal窓で打ってからInstant Run実行 =>成功

実行ログ見てて不安になったこと

adb -s $DEVICE push /data/app/XXX−tmp19242/split_lib_slice_1_apk.apk

cleanBuildCache すると「XXX−tmp19242」 と 前回とディレクトリが違うんですけどw

このよくわかんないディレクトリちゃんと消えるんでしょうか・・<汗

もしかするとどんどんゴミファイル端末に溜まっているんではないかと不安になりました・・*6


ちょっとした備忘メモ

android 4系での挙動の変化

  • 2.2時代
    • 端末転送をブロック
  • 2.3-beta
    • そのまま転送しようとしてクラッシュ
  • 2.3-RC1
    • Instant runを自動offしてビルド転送

賢くはなったかなと。ただ

  • instant run の有効無効をプロジェクト単位で
  • 簡単にONOFF出来るボタンほしいかな*7

あたりは改善されないかな~

multiDex と Build Shurinker は共存できないのか?

multiDexEnabled true 

をコメントにすればできます。*8

そもそもこのフラグがある時に Build Shurinker 記述をチェックしてエラーにする処理が残っているだけ。

  • そもそも dependencies に multidexのライブラリ参照を記述している*9
  • Build Shurinker自体、debugビルドにproguadをかける機能
    • MultiDexApplication が release.apk で普通に動くのだから当たり前といえばそう。
    • multiDexKeepProguard file(‘multi-dex-keep.txt’) は書いておいたほうがいい
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    //マニュフェストエントリ
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23

       //multiDexEnabled = true
       multiDexKeepProguard file('multi-dex-keep.txt') 
    }
  
  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'
        }
     }
  }
  
  dataBinding { enabled = true } 

  dexOptions {
      javaMaxHeapSize "3G" //◎ Betaまでは2GでOKでしたorz
  }  
}

dependencies { 
    compile 'com.android.support:multidex:1.0.1' //★
}
  • ◎ AS 2.3 RC1 でdata-binding 使ってたら Dex処理が 2Gでたりなくなってた・・・
  • ★ MultiDexApplication を使っていなければ -provided でも動く-。InstantRunが multidex 使っているみたい
    • 2.3正式版からはaarはprovided禁止!とlintエラーになるようです。debugCompile指定が無難ですね。

TLメモ

Vector AssetStudio

minsdk がさらに上がっちゃうから使えないんだよな。Android 5.0からでしたっけ。。

低いsdkサポートしつつ、特定versionから動かすようなコードがすごく書きづらくなってますし・・


どーてもいい独り言

はてなブログ の公式Topがすごく使いづらい><。

  • 前はジャンルリンクがあった
    • 技術カテゴリ リンクで他の方のブログとか結構読んでいた
  • 現在
    • 有名人のブログ*10 1-3件しかTopにでてこない。
    • ググって到達する場合以外で、面白い技術記事探せないんじゃないだろうか?
    • モヒカンSlackも見てると殆ど Qittaリンク or Google公式ブログRT だしな・・

正直なんだかなーと思ってたりしてます・・・*11

*1:ASの富豪食いが異常なのか、干渉しているのかどうなのか・・

*2:でもエラッタ時や操作に悩んだときのググリビリティは低そう

*3:timestampとかで変更したかどうか見てるんだろうか?

*4:Mapを表示したり、GooglePlayAPI を使うのに必要

*5:いきなり not found target と表示されて? とか思ってしまった・・

*6:adbコマンドでもアクセスするすべがないから確認できない・・

*7:まあinstant run使わせたいので無効は有り得ない?

*8:Build Shurinkerで収まる範囲であればと言うやつですが。あれ関数名テーブルの個数が64K越えると言うやつみたいで a/b とかに変換される場合は同一扱いになってる

*9:data-bindingのように android gradle plugin と密結合で配布されていない

*10:ブクマが多いか、はてなが評定したブログ

*11:Twitter/Line公式アプリのニュースタブとか正直いらないしな・・。だいたい内容ダブってますし・・