web-dev-qa-db-ja.com

Android Instrumentation test)でシステムプロパティを定義して使用する方法

インストルメンテーションテストにいくつかの引数を使用しようとしています。 System.getProperty()関数を使用してシステムプロパティを読み取ることができることに気付きました。そのため、setpropコマンドを使用してシステムプロパティを設定します。例:adb Shell setprop AP 123。テストコード内で、このAPプロパティを次のように読み取ろうとします。


tmp = System.getProperty("AP"); 
Log.d("MyTest","AP Value = " + tmp);

次に、logcatを使用してこのデバッグメッセージを表示しますが、このプロパティの値がnullになります。何が悪いのかについてのアイデアはありますか? adb Shell getprop APコマンドを使用してもシステムプロパティを読み取ることができることに注意してください。

23
Michalis

'setprop'によって設定されたプロパティを取得するには、2つのオプションがあります。
1。 Android.os.SystemPropertiesを使用してください。これは非表示APIです。次のように使用します。

Class clazz = null;
clazz = Class.forName("Android.os.SystemProperties");
Method method = clazz.getDeclaredMethod("get", String.class);
String prop = (String)method.invoke(null, "AP");
Log.e("so_test", "my prop is: <" + prop  + ">");

二。 「getprop」ユーティリティを使用します。

Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/getprop", "AP"});
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
Log.e("so_test", "my prop is: " + reader.readLine());

NDKで利用可能な関数を使用することもオプションかもしれませんが、なぜわざわざですか?

21
accuya

ルートVM(Zygote)が起動すると、システムプロパティが1回読み取られ、アプリケーションのような他のDalvik VMが生成されます。つまり、システムプロパティをオンザフライで設定することはできません。

adb Shell stop(停止するまで待つ)およびadb Shell start(再起動するまで待つ)を使用してZygoteを再起動してから、再試行してください。または、単にデバイスまたはエミュレータを再起動します。

14
Matthias

Androidには2種類のプロパティがあるからです。

  1. システムレベル-_adb Shell getprop/setprop_コマンドで取得/設定できます。
  2. 現在のプロセスレベル-通常のJava System.getProperty()/setProperty()で取得/設定できます。

システムレベルのプロパティを設定し、その値を現在のプロセスレベルとして取得しようとすると、ログにnull値が表示されます。

9
Nimesh

これは、accuyaの回答に基づいた、少し正気なバージョンです。

public static String readSystemProperty(String name) {
    InputStreamReader in = null;
    BufferedReader reader = null;
    try {
        Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/getprop", name});
        in = new InputStreamReader(proc.getInputStream());
        reader = new BufferedReader(in);
        return reader.readLine();
    } catch (IOException e) {
        return null;
    } finally {
        closeQuietly(in);
        closeQuietly(reader);
    }
}

public static void closeQuietly(Closeable closeable) {
    if (closeable == null) return;
    try {
        closeable.close();
    } catch (IOException ignored) {
    }
}
5
Felipe Lima

提供された回答に基づいて、SetPropertyのわずかに変更されたバージョン

    public void setSystemProperty(String Key, String value){
    InputStreamReader in = null;
    BufferedReader reader = null;
    try {
        Process proc = Runtime.getRuntime().exec("/system/bin/setprop "+Key+" "+value);
        in = new InputStreamReader(proc.getInputStream());
        reader = new BufferedReader(in);

        String line = null;
        Log.d("Saurabh Shell" ,"<OUTPUT>");
        while ( (line = reader.readLine()) != null)
            Log.d("Shell" , line);
        Log.d("Saurabh Shell", "</OUTPUT>");
        int exitVal = proc.waitFor();
        Log.d("Saurabh Shell","Process exitValue: " + exitVal);

    } catch (IOException e) {
       e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        closeQuietly(in);
        closeQuietly(reader);
    }
}

入力とリーダーを閉じる

    public  void closeQuietly(Closeable closeable) {
    if (closeable == null) return;
    try {
        closeable.close();
    } catch (IOException ignored) {
    }
}
0
SAURABH_12