Как определить и использовать системное свойство в тесте Android Instrumentation? - PullRequest
22 голосов
/ 20 сентября 2010

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


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

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

Ответы [ 6 ]

21 голосов
/ 24 июля 2012

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

14 голосов
/ 09 апреля 2011

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

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

9 голосов
/ 07 июня 2011

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

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

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

5 голосов
/ 01 августа 2015

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

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) {
    }
}
0 голосов
/ 09 октября 2018

На основании предоставленного ответа, слегка измененная версия 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 голосов
/ 28 апреля 2017

import android.os.SystemProperties

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...