インストルメンテーションテストにいくつかの引数を使用しようとしています。 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
コマンドを使用してもシステムプロパティを読み取ることができることに注意してください。
'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で利用可能な関数を使用することもオプションかもしれませんが、なぜわざわざですか?
ルートVM(Zygote)が起動すると、システムプロパティが1回読み取られ、アプリケーションのような他のDalvik VMが生成されます。つまり、システムプロパティをオンザフライで設定することはできません。
adb Shell stop
(停止するまで待つ)およびadb Shell start
(再起動するまで待つ)を使用してZygoteを再起動してから、再試行してください。または、単にデバイスまたはエミュレータを再起動します。
Androidには2種類のプロパティがあるからです。
adb Shell getprop/setprop
_コマンドで取得/設定できます。System.getProperty()/setProperty()
で取得/設定できます。システムレベルのプロパティを設定し、その値を現在のプロセスレベルとして取得しようとすると、ログにnull値が表示されます。
これは、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) {
}
}
提供された回答に基づいて、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) {
}
}