Как определить и использовать системное свойство в 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 команды adb shell getprop AP команды adb shell getprop AP .

Solutions Collecting From Web of "Как определить и использовать системное свойство в Android Instrumentation test?"

Чтобы получить свойство, заданное '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, тоже возможно, но зачем беспокоиться?

Свойства системы читаются один раз, когда запускается корневая виртуальная машина (Zygote), которая, в свою очередь, генерирует другие виртуальные машины Dalvik, такие как VMware. Это означает, что вы не можете устанавливать системные свойства на лету.

Попробуйте перезапустить Zygote, используя adb shell stop (дождитесь ее остановки) и adb shell start (дождитесь ее перезапуска), а затем повторите попытку. Или просто перезагрузите устройство или эмулятор.

Потому что в Android есть два типа свойств.

  1. Системный уровень – мы можем получить / установить с помощью команды adb shell getprop/setprop .
  2. На текущем уровне процесса мы можем получить / установить с помощью регулярной java System.getProperty()/setProperty() .

Когда вы устанавливаете свойство системного уровня и пытаетесь получить его значение как текущий уровень процесса, вы получаете нулевое значение в журнале.

Вот немного более простая версия, основанная на ответе на вопрос:

 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) { } } 

Import android.os.SystemProperties

String s = SystemProterties.get ("ro.xxx.xxx", "значение по умолчанию, если свойство не установлено");