Как определить и использовать системное свойство в Android Instrumentation test?
Я пытаюсь использовать некоторые аргументы для теста Instrumentation. Я заметил, что я могу читать свойства системы с помощью функции System.getProperty()
. Поэтому я использую команду setprop для установки системного свойства. Например: adb shell setprop AP 123
.
Внутри моего тестового кода я пытаюсь прочитать это свойство AP с помощью:
tmp = System.getProperty("AP");
Log.d("MyTest","AP Value = " + tmp);
Затем я использую logcat для просмотра этого отладочного сообщения, но я получаю нулевое значение для этого свойства. Любые идеи о том, что может быть неправильным?
Обратите внимание, что я все еще могу прочитать системное свойство с помощью команды adb shell getprop AP
.
Ответы
Ответ 1
Чтобы получить свойство, заданное 'setprop', существует два варианта:
Один. используйте android.os.SystemProperties, это API-интерфейс hide. используйте его следующим образом:
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, тоже возможно, но зачем беспокоиться?
Ответ 2
Свойства системы читаются один раз, когда запускается корневая виртуальная машина (Zygote), которая, в свою очередь, порождает другие виртуальные машины Dalvik, подобные тем, что применяются в вашем приложении. Это означает, что вы не можете устанавливать системные свойства на лету.
Попробуйте перезапустить Zygote с помощью adb shell stop
(дождитесь его остановки) и adb shell start
(дождитесь его перезапуска), а затем повторите попытку. Или просто перезагрузите устройство или эмулятор.
Ответ 3
Потому что в Android есть два типа свойств.
- Уровень системы - мы можем получить/установить с помощью команды
adb shell getprop/setprop
.
- На текущем уровне процесса мы можем получить/установить с помощью регулярной java
System.getProperty()/setProperty()
.
Когда вы устанавливаете свойство системного уровня и пытаетесь получить его значение как текущий уровень процесса, вы получаете нулевое значение в журнале.
Ответ 4
здесь немного более простая версия, основанная на ответе 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
На основании предоставленного ответа, Немного измененная версия 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) {
}
}
Ответ 6
import android.os.SystemProperties
String s = SystemProterties.get( "ro.xxx.xxx", "значение по умолчанию, если свойство не установлено" );