windowsでpecoを使う2
この記事は、モバイルDevOps Advent Calendar 2015 - Qiita の 8 日目の記事です。
- 昨日は ここが変だよ、AndroidStudio2.0 preview2 - exception think のお話です
- 明日は asmz - Qiitaさんの iOSアプリのデプロイ自動化にbuddybuildを使ってみた話 - OTOBANK Engineering Blogのお話です
以前の記事は
あたり。
以前の環境から数ヶ月たって状況や使い勝手が変わってきたので
そこら編を書き出してみる。
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自体がバージョンアップした
- Releases · peco/peco · GitHub に記載されている通り
v0.3.5 にになって
- --select-1 オプションのサポート
がデカいかなと思う。これは1個しか選択肢がない時に自動選択するもの。
pecoを2重ループで囲むみたいなBATを記載する場合、すごく便利。
ただwindows 64bit 環境だと
にも上がっている通り、戻ってこなくなる。
このissueだと32bit版使えば問題ない? とコメントされているけど
自分が試した感じだと Win7 64bit環境で 32bit版でも2-3回に1回は戻ってこなくなったorz すごく残念><
もちろん64bit版は100%ハングでやんすがw
今回弄ったのは
- pinstall.bat
- 参考は バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法 - みちしるべ あたり
- grep -v 使うために Native Win32 ports of some GNU utilities 辺りを導入*2
- ☆のあたりを修正
- 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もそうだけどココらへんの自動化情報は、あんまり系統的にまとまってるサイトがなくて
何気に探してしまった(苦笑
実際はバックグラウンド実行がベターなので
- UWSCのバックグラウンド操作でGETCTLHNDの引数にあるアイテム名というのはど... - Yahoo!知恵袋
- UWSCを使ってClicker Heroes(クリッカーヒーローズ)で連打する(試作版) - ハムログ
- MOUSEORG | 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定義の存在をチェックする
術がないのかなーと密かに考えてしまったりも。。。