tiempo sistemas sistema señales resueltos propiedades propiedad lti los lineales invarianza invariantes estabilidad ejercicios demostrar causalidad causal android adb

sistemas - ¿Cómo definir y usar una propiedad del sistema en la prueba de instrumentación de Android?



sistema causal (6)

Estoy tratando de usar algunos argumentos para una prueba de instrumentación. Noté que puedo leer las propiedades del sistema con la función System.getProperty() . Entonces uso el comando setprop para establecer una propiedad del sistema. Por ejemplo: adb shell setprop AP 123 . Dentro de mi código de Prueba trato de leer esta propiedad AP con:

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

Luego uso logcat para ver este mensaje de depuración, pero obtengo un valor nulo para esta propiedad. ¿Alguna idea sobre lo que podría estar mal? Tenga en cuenta que todavía puedo leer la propiedad del sistema con el comando adb shell getprop AP .


Aquí hay una versión ligeramente más sensata basada en la respuesta de 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) { } }


Basado en la respuesta proporcionada, Versión ligeramente modificada de 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); } }

cerrar entrada y lector

public void closeQuietly(Closeable closeable) { if (closeable == null) return; try { closeable.close(); } catch (IOException ignored) { } }


Las propiedades del sistema se leen una vez cuando se inicia la VM raíz (Zygote), que a su vez genera otras máquinas virtuales Dalvik como la de su aplicación. Eso significa que no puede establecer las propiedades del sistema sobre la marcha.

Intente reiniciar Zygote utilizando adb shell stop (espere hasta que se haya detenido) y adb shell start (espere hasta que se reinicie), luego intente nuevamente. O simplemente reinicie el dispositivo o emulador.


Para obtener la propiedad establecida por ''setprop'', hay dos opciones:
Uno. use android.os.SystemProperties, esta es una API oculta. utilízalo así:

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 + ">");

Dos. usar la utilidad ''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());

Tal vez el uso de funciones disponibles en NDK también es una opción, pero ¿para qué molestarse?


Porque hay dos tipos de propiedad en Android.

  1. Nivel del sistema: podemos obtener / configurar con el comando adb shell getprop/setprop .
  2. En el nivel de proceso actual, podemos obtener / configurar con java regular System.getProperty()/setProperty() .

A medida que establece una propiedad de nivel de sistema y trata de obtener su valor como nivel de proceso actual, obtiene un valor nulo en el registro.


importar android.os.SystemProperties

String s = SystemProterties.get ("ro.xxx.xxx", "valor predeterminado si la propiedad no está establecida");