手動テストをちょっと効率化するための小ネタ

この頃DBのテストとか、Preference初期化系のテストとか色々とやっているので ちょこちょこ覚書を書いておく(随時追加予定 <もちろんpecoを使う前提

SQLite関連

端末内のSqliteを確認するために をforkして修正して使っているわけですが

pull requestはしているんだけど、本体にマージされないですね(苦笑 本体の問題点は

  • BLOBデータを表示しようとしたらエラーで落ちたorz
  • DB開きっぱなので操作しながら select文で参照だとマルチアクセスでぶつかることが有る
    • testとかで結果参照するだけなら既存でもOKだが
  • appcompatが使っていないのにbuild.gradleに参照されて入ってしまっている
    • これaar形式で配布されているけど現在使っている人いないんじゃないだろうか?

結局自分の場合は、testの時だけ

のコードが組み込まれるようにして使わせていただいてたりしています

SQliteのマルチアクセスに関して言えば 下記な話もあるわけだけど、通常はテスト用コードと本体コードは別ですしね(汗

adb forwardのブリッジ(TelnetSqliteを使うにあってたっての)

最近のadb serverって、頻繁にトラブることがあって android gradle plugin からのfork java taskみたいに よく戻ってこなくて処理が止まってしまうことがある*1

現象的には

  • logcatが突然でなくなったり
  • devicesが見えなくなったり
  • apkが転送できなくなったり
    • debugモードで実行してFatal Exceptionが発生すると高確率でよく発生したり

とか

adb kill-server

するとまた復活するわけですけど、その時にブリッジ情報も初期化されるわけで 下記を作っていたりしています

  • padbf.bat
@echo off
for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v deamon  ^| peco --select-1 ') do ( 
     echo device %%j
     adb -s %%j shell forward tcp:12080 tcp:12080
     break
 )

SqliteDbの初期化

transactionを使っている場合はjournalファイルも対象 androidだとデフォルトのままだとPERSISTモードっぽい

Yukiの枝折: Android:SQLiteのジャーナルファイル らへんの話

でも正直テクブ本にもWALの話は書いてあったけど そんなに速度速い感じはしなかったんですよね・・・

Effective Android

Effective Android

  • 作者: TechBooster,小太刀御禄,出村成和,重田大助,西岡靖代,宮川大輔,柏本和俊,あんざいゆき,八木俊広,木村尭海,小林慎治,有山圭二,中西良明,わかめまさひろ,新井祐一,桝井草介,久郷達也,寺園聖文,shige0501,山下智樹,前田章博,秋葉ちひろ,末広尚義,中澤慧,日高正博,塚田翔也,井形圭介,中川幸哉,山崎誠,山下武志,なまそで,橋爪香織,さとうかずのり,l_b__,ゼロハチネット,長汐祐哉
  • 出版社/メーカー: インプレスジャパン
  • 発売日: 2014/01/17
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (8件) を見る

  • pdeldb.bat
@echo off
set PACKAGE=com.irof.irof_history
set DBNAME=hoge.db

 for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v deamon  ^| peco --select-1 ') do (
     echo device %%j
     adb -s %%j shell "run-as %PACKAGE% rm /data/data/%PACKAGE%/databases/%DBNAME%"
     adb -s %%j shell "run-as %PACKAGE% rm /data/data/%PACKAGE%/databases/%DBNAME%-journal"

     break
 )

プログラム的に遣る場合は

なお話になるよう。API16からだけど。 でもまあ下手にこの関数使うより 自分で場所指定して物理削除のほうが楽な気がする

File databaseFile = context.getDatabasePath(databaseFileName);

で場所取れるわけですし。。

その他系

アプリのデータ消去

アプリ新規インストールしなおしって 結局データの初期化なわけで、そこら辺をちょっと楽したいという話。

実際は使うデータだけ個別に消すほうが楽なんだろうけどな。

  • pclear.bat
@echo off
set PACKAGE=com.irof.irof_history
set ACTIVITY=.IrofActivity

 for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v deamon  ^| peco --select-1 ') do (
     echo device %%j
     adb -s %%j shell pm clear %PACKAGE%
     break
 )

実際はクリア後にアプリ再起動

adb shell am start -n %PACKAGE%/%ACTIVITY%

もセットにしておくと良いんでしょうけど

jrebelを使っている場合

adb shell am start -n com.irof.irof_history/com.zeroturnaround.jrebel.android.boot.JRebelActivity --ez jrebel.start true
adb shell am startservice --es serviceId <<ServiceId>> -n com.irof.irof_history/com.zeroturnaround.jrebel.android.boot.AgentStatusService --user 0

あたりなコマンドラインになり、なおかつこの状態だとSplashで止まってしまう*2

結局Kickしても起動できないのであきらめた

ServiceIdとかは

  • shared_prefs/jrebel.xml

に実はIDは入っている

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="agentVersion">1.2.24</string>
<string name="startTriggerReason">Service</string>
<string name="startTriggerId">c48ea2de-cb04-442b-8428-5fd94e779c9e</string>
<long name="startTriggerFinish" value="1469236928609" />
<boolean name="shouldTrim" value="false" />
<boolean name="startTriggerWaitForDebugger" value="false" />
<long name="startTriggerStart" value="1469236926846" />
<string name="applicationVersion">2452698253</string>
</map>

ただ後一手がわからない…

処理時間計測ログの有効化

で便利なんだけど、なぜかVERBOSE指定しか有効にできないという話 USBで複数端末繋いでる時があるので そこら辺自動化しておくと楽という話

  • tlog.bat
@echo off

 for /f %%j in ('adb devices -l ^|grep -v attached ^|grep -v deamon') do (
     echo device %%j
     adb -s %%j shell setprop log.tag.DB_ACTION VERBOSE
     break
 )

*1:自分の周りの人は良く タスクのフン詰まり って表現してる<苦笑

*2:何らかのワンクッションが必要