結構怖いよ InstantRun
はじめに
自分の環境用のメモ。
多分、富豪環境の人は起きないんじゃないかなー(遠い目
実行環境
ちまたでRTされまくっている日本語化に関して一言
ですが、
@Gero_ika いえいえ。自分もそんなもんですw。しかもG様はリリースノートに書いてくれていない改修がてんこ盛りなので Canaryビルドは結構怖いです。TwでRTされていた日本語化も Canary版だと不安定&メモリ・CPUが3割増しぐらいになったのでやめましたし。。
2017-02-28 22:23:05 via YoruFukurou to @Gero_ika
状態なのでやめました。
適応して問題ない方々って
みなさん「富豪環境フレンズ」なんだね〜。羨まし〜。楽し〜。
誰か描くだろうと思ってたら思いのほか誰も描かないので pic.twitter.com/eNSIHXBikT
— 村上ヒサシ (@M_hisashi) 2017年2月27日
状態なんだろうな〜<苦笑*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から動かすようなコードがすごく書きづらくなってますし・・
Android StudioのVector Assetって色が黒から変更できないんだけど,tintで色つけるのが王道ってこと?
— Punk Patsy Yaeda (@yaeda) 2017年2月28日
@kgmyshin 不完全ですが、自分のリポジトリにvd-tool.jar置いてあります。参考になれば> <https://t.co/dz596SHBKl
— こにふぁー (@konifar) 2017年2月26日
どーてもいい独り言
はてなブログ の公式Topがすごく使いづらい><。
- 前はジャンルリンクがあった
- 技術カテゴリ リンクで他の方のブログとか結構読んでいた
- 現在
正直なんだかなーと思ってたりしてます・・・*11
*1:ASの富豪食いが異常なのか、干渉しているのかどうなのか・・
*2:でもエラッタ時や操作に悩んだときのググリビリティは低そう
*3:timestampとかで変更したかどうか見てるんだろうか?
*4:Mapを表示したり、GooglePlayAPI を使うのに必要
*5:いきなり not found target と表示されて? とか思ってしまった・・
*6:adbコマンドでもアクセスするすべがないから確認できない・・
*7:まあinstant run使わせたいので無効は有り得ない?
*8:Build Shurinkerで収まる範囲であればと言うやつですが。あれ関数名テーブルの個数が64K越えると言うやつみたいで a/b とかに変換される場合は同一扱いになってる