windowsでpecoを使う2

この記事は、モバイルDevOps Advent Calendar 2015 - Qiita の 8 日目の記事です。

以前の記事は

あたり。

以前の環境から数ヶ月たって状況や使い勝手が変わってきたので
そこら編を書き出してみる。

AS/gradlew/genymotion あたりを使ってると、

  • 転送時の再ビルドがタルくて面倒。
  • genymotion playerの立ち上げも簡易にしたい

そのために pecoを使った pinstall.bat/pplay.bat 辺りを作って使ってるわけですが <苦笑

AS2.0Prevで

  • 変更なかったらビルドしないでapk転送

これチェックデフォルトで付いてるんですが毎回ビルド走るのは変わらんのだよな*1
あれはInstant Runみたいな将来的なチェックなのでしょうかね。。(苦笑

MacだとiTermがありますが
WindowsだとConEmu あたりを使うのがベター

の話を参考にするといいかと思います

ConEmuを使うメリットの一つは
pinstall.batを実行してみるとわかるけど、
gradlew でつくられるapkのパスが深すぎてコマンドプロンプトだと枠外にでてapk名称がわからない><
ConEmuだと手軽にウインドウサイズがリサイズして見えるのがいい点だと思う



peco自体がバージョンアップした

v0.3.5 にになって

  1. --select-1 オプションのサポート

がデカいかなと思う。これは1個しか選択肢がない時に自動選択するもの。
pecoを2重ループで囲むみたいなBATを記載する場合、すごく便利。

ただwindows 64bit 環境だと

にも上がっている通り、戻ってこなくなる。
このissueだと32bit版使えば問題ない? とコメントされているけど
自分が試した感じだと Win7 64bit環境で 32bit版でも2-3回に1回は戻ってこなくなったorz すごく残念><
もちろん64bit版は100%ハングでやんすがw

今回弄ったのは

  • pinstall.bat
@echo off
rem alias installapp='find ./ -name *.apk | peco | xargs adb install -r'
set PACKAGE=com.irof.irof_history/.IrofActivity

for /f %%i in ('dir /s /b *.apk ^| peco') do (
  echo apk file %%~nxi

  for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v daemon  ^| peco --select-1 ') do ( //☆
     echo device %%j
     adb -s %%j shell rm -fr /data/local/tmp/*
     adb -s %%j shell am force-stop %PACKAGE%
     adb -s %%j install -r %%i
     adb -s %%j shell rm -fr /data/local/tmp/*
     adb -s %%j shell am start -n %PACKAGE%/%ACTIVITY% --activity-clear-top
     break
  )
  break
)

上記の状況で、VMに対してインストールするだけでも、
普通だとEnterキーを2回押さないと駄目なわけですが --select1 が動くと1回ですむ。
動けば凄い気分的に楽になります。

なので公式の新バージョンバイナリのリリース待ち状態であったりします。

12/10追加検証)
上記のbat 32bit版で 2回目実行で必ず戻ってこなくなるので
仕様的に
> --select1 ・・実行すると直ぐ exit終了する
exit終了コマンドプロンプトにもろ影響してしまうよう。


結局

  • start で別BAT起動にしないと駄目
    • start /b は入力受け付けなくなるのでNG*3
  • callで呼んだ場合は戻ってこない><
    • 1回めだけは何故か動くことも有る。。。

何度実行してもコマンドプロンプトが動かなくなるということはなくなったけど
うーんなんかすっきりしない><。

  • start 実行後にEnter押さないとプロンプト戻ってこないですし。。(汗

    • これCoEmuの方の仕様で -cur_console:n をつければ自動的に閉じるとのこと

実は実行後にEnter押すのも嫌なんだよな。。(汗

  • pinstall.bat
@echo off
for /f %%i in ('dir /s /b *.apk ^| peco') do (
  echo apk file %%~nxi
  start pinstall_func.bat -cur_console:n
  break
)
  • pinstall_func.bat
@echo off
rem alias installapp='find ./ -name *.apk | peco | xargs adb install -r'
set PACKAGE=com.irof.irof_history/.IrofActivity

 for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v daemon  ^| peco --select-1 ') do ( //☆
     echo device %%j
     adb -s %%j shell rm -fr /data/local/tmp/*
     adb -s %%j shell am force-stop %PACKAGE%
     adb -s %%j install -r %1
     adb -s %%j shell rm -fr /data/local/tmp/*
     adb -s %%j shell am start -n %PACKAGE%/%ACTIVITY% --activity-clear-top
     break
 )
exit 0 //ここ必要



genymotion 2.6.0 のライセンス購入確認のダイアログ対策

コマンドラインで geymotion player で実行できるように

  • pplay.bat

を作っていましたが、毎回 「ライセンス購入確認ダイアログ」が表示されて起動の邪魔をする。
下手するとこれでVBOXのimage自体が固まって「応答なし」になる *4
で誤ってQuitボタン押すと起動時体キャンセルされる凶悪仕様*5

これはタルいので、UWSC辺りを組み合わせて 「ライセンス購入確認ダイアログ」を突破する。

  • pplay.bat
@echo off
set player=C:/soft/Genymotion/player.exe
set uwsc_path=C:/soft/uwsc

for /f %%i in ('VBoxManage list vms ^| peco') do (

  echo boot %%i
  start /b %player% --vm-name %%i
  %uwsc_path%/uwsc.exe %uwsc_path%/accept.uws

  break
)
  • accept.uws
for i=0 To 4
     if GETKEYSTATE(VK_ESC) then exit  //ESCキーで中断できるようにする
     GID=GETGID(”Usage notice”) //ダイアログのIDを取得
     if GID > 0 then                         //ダイアログのIDが取れたら
            Hnd=GETTLHND(GID,"Qt5QWindowIcon")
            MOUSEORG(Hnd,2)  //バックグラウンド実行
            CLKITEM(GID,"Accept")   //Acceptボタンをクリック
            break   //クリックが終わったら抜ける
     endif
     sleep(5)  //5秒ウエイト
Next

まあココらへんの半自動化してて思ったけど
MacだとUWSCないよな−と思ってググるAutomator でやるといいらしいですね。

UWSCもそうだけどココらへんの自動化情報は、あんまり系統的にまとまってるサイトがなくて
何気に探してしまった(苦笑

実際はバックグラウンド実行がベターなので

らへんの情報で後で再検証してみようかと思う




追加スクリプト

  • apktool用pecoバッチ

最近 gradlewのProductFlavorで作ったapkを渡したりしてるけど

  • それって大丈夫なの??
  • ちゃんとリソースが差し替わってるか確認してるよね?

みたいな事を確認されてるのでapktool辺りとかの連携もbat組んでたりする*6

  • apkd.bat
@echo off
set APKTOOL=c:/soft/jdk8/bin/java -jar c:/soft/apktool_2.0.2.jar

for /f %%i in ('dir /s /b *.apk ^| peco') do (
  echo apk file %%~nxi
  mkdir out
  %APKTOOL% d %%i o out/%%~ni
)

差し替えたxml辺りのdiffを表示する所まで自動化出来るとよりベターだけど
今後の課題やね。。時間があったら追記しようかと思う

  • pgradle.bat

AS 2.0 Prev くんのビルドがかなり怪しいので
上手く転送されない時はコマンドラインでビルドをしていたりする今日このごろ。
でも gradlew task使ってたけど ビルドだけなら testタスクとか要らんのだよね。。

  • build.gradle
task build_tasks << {
     tasks.each{task->
             if(task.group == "build"){
                   println(task.name)
             }
     }
}

tasks.whenTaskAdded { task ->
    if (task.name.indexOf("assemble")!=-1) {
        task.group = "build"
    }
}

辺りを追加して,--queryの絞りこみ対応もして

  • pgradle.bat
@echo off
IF {%1}=={} (
   set PECO_CMD=peco
) ELSE(
   set PECO_CMD=peco --query %1
)
for /f %%i in ('gradlew build_tasks --offline ^| %PECO_CMD%') do (
  echo gradlew %%i
  gradlew %%i --offline
  break
)

と改変するのが現実解かもとは思ってる。。

でもこのコード自体
> build_tasks
の定義が無いとコケちゃうので

  • gradle のtask定義の存在をチェックする

術がないのかなーと密かに考えてしまったりも。。。

*1:実行タスクは確かに減ってるように見えるが。逆にうまくビルドされていないこともしばしば。。。<汗

*2:cygwin辺りは作業場Winにはインストーラ権限ないので無理なので。。<苦笑

*3:バックグラウンド実行の為

*4:その度にpstop.batの出番が必要になる

*5:勿論ライセンス購入してればでないそうなので問題ないわけですが。。

*6:まあ今の作業場は実は、antすら使ってなくて export apk機能のGUI手順書でリリースしてるって話だしな。。<遠い目