2010-09-20 4 views
22

Я пытаюсь использовать некоторые аргументы для теста Instrumentation. Я заметил, что могу читать свойства системы с помощью функции System.getProperty(). Поэтому я использую команду setprop для установки системного свойства. Например: adb shell setprop AP 123. Внутри моего тестового кода я пытаюсь прочитать это свойство AP с:Как определить и использовать системное свойство в Android Instrumentation test?


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

Затем я использую LogCat для просмотра этой отладки сообщения, но я получаю нулевое значение для этого свойства. Любые идеи о том, что может быть неправильным? Обратите внимание, что я все еще могу прочитать системное свойство с помощью команды adb shell getprop AP.

+0

Предполагая, что вы хотите изменить эти свойства между тестами, и учитывая, что вы не можете применять новые системные свойства во время выполнения (см. Ответ Маттиаса), лучше всего абстрагировать настройку/получение системных свойств на вспомогательный класс , из которых вы можете обеспечить макет реализации при тестировании. –

+0

Этот поток лучше: http://stackoverflow.com/questions/2641111/where-is-android-os-systemproperties – Snicolas

ответ

13

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

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

+4

Стоит отметить, что вы должны иметь возможность устанавливать свойства во время запуска эмулятора, например. 'emulator -avd 2.3 -prop AP = 123'. –

+1

милый, я этого не знал. – Matthias

+0

Не такая хорошая идея, действительно. – accuya

8

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

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

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

19

Чтобы получить информацию, которую задает «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()); 

Возможно использование функций экранных в НКА варианта тоже, но зачем?

+0

Просто для того, чтобы заполнить это для тех, кто мне нужен. Метод метода 'Метод method = clazz.getDeclaredMethod (" set ", String.class, String.class);' – miroslavign

+0

Вам нужно добавить специальные разрешения для этого? не @miroslavign – htellez

+0

@htellez Нет вы не – miroslavign

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

импорт android.os.SystemProperties

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

+0

'android.os.SystemProperties' не является обязательным. – albusshin