Как определить и использовать системное свойство в 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", "значение по умолчанию, если свойство не установлено" );