2012-02-21 13 views
21

私たちにはアンドロイドデバイスがあり、テストの一環として、ターゲットデバイスでコンソールテストアプリケーションを実行する必要があります。テストアプリケーションがエラーを検出した場合は、-1を返します。ADBエラーコード

adbシェルを使用してターゲット上でテストアプリケーションをリモートで実行できますが、リターンコードを取得する方法が見つかりません。私はこれを必要とします。私はこれを自動テストスイートに組み込むことができます。

コンソール出力をいくつかの失敗テキストでグロッピングしようとすることはできますが、それはちょっと面倒です。誰かがより洗練されたソリューションを知っていますか?

+0

私は同じ問題があります。どのadbが実行されても、常に0が返されます。 –

+2

[Issue 3254:\t adbシェルはプログラムの終了コードを返しません](https://code.google.com/p/android/issues/detail?id=3254) – n611x007

答えて

9

これは、終了コードを取得するための回避策です。 adbシェル '{ここにあなたのコマンド}>/dev/null 2> & 1;エコー$? '

def adb(opt) 
    input = "#{adb_command} #{opt[:command]} #{opt[:params]}" 
    puts "Executing #{input}...\n" 
    output = nil 
    exit_code = 0 

    def wait_for(secs) 
    if secs 
     begin 
     Timeout::timeout(secs) { yield } 
     rescue 
     print 'execution expired' 
     end 
    else 
     yield 
    end 
    end 

    wait_for(opt[:timeout]) do 
    case opt[:command] 
    when :install, :push, :uninstall 
     output, exit_code = `#{input}`, $?.to_i 
    when :shell 
     input = "#{adb_command} shell \"#{opt[:params]}; echo \\$?\"" 
     output = `#{input}`.split("\n") 
     exit_code = output.pop.to_i 
     output = output.join("\n") 
    else 
     raise 'Error: param command to adb not defined!' 
    end 
    end 

    return if opt[:ignore_fail] and output =~ /#{opt[:ignore_fail]}/ 
    raise output unless exit_code == 0 
end 
+1

'echo¥$? 'を使う必要がありますか? – devin

4

あなたは「いつものステータス0で終了するのではなく、プログラムの終了ステータスを伝播」「Androidデバイスのためのよりよいシェル」Facebookのfb-adb、使用することができます

この

はRubyでADBのラッパーです。