J'essaie d'utiliser des arguments pour un test d'instrumentation. J'ai remarqué que je pouvais lire les propriétés du système avec la fonction System.getProperty()
. J'utilise donc la commande setprop pour définir une propriété système. Par exemple: adb Shell setprop AP 123
. Dans mon code de test, j'essaie de lire cette propriété AP avec:
tmp = System.getProperty("AP");
Log.d("MyTest","AP Value = " + tmp);
Ensuite, j'utilise logcat pour afficher ce message de débogage, mais j'obtiens une valeur null pour cette propriété. Des idées sur ce qui pourrait être faux? Notez que je peux toujours lire la propriété système avec la commande adb Shell getprop AP
.
Pour obtenir la propriété définie par 'setprop', il existe deux options:
Un. utiliser Android.os.SystemProperties, il s'agit d'une API masquée. utilisez-le comme ceci:
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 + ">");
Deux. utilisez l'utilitaire '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());
Peut-être que l’utilisation des fonctions disponibles dans NDK est aussi une option, mais pourquoi s’embêter?
Les propriétés système sont lues une fois au démarrage de la racine VM (Zygote), ce qui génère d'autres machines virtuelles Dalvik comme celle de votre application. Cela signifie que vous ne pouvez pas définir les propriétés du système à la volée.
Essayez de redémarrer Zygote en utilisant adb Shell stop
(attendez jusqu'à ce qu'il soit arrêté) et adb Shell start
(attendez jusqu'à ce qu'il redémarre), puis réessayez. Ou simplement redémarrez le périphérique ou l'émulateur.
Parce qu'il y a deux types de propriété dans Android.
adb Shell getprop/setprop
.System.getProperty()/setProperty()
standard.Lorsque vous définissez une propriété de niveau système et essayez d'obtenir sa valeur au niveau du processus actuel, vous obtenez une valeur nulle dans le journal.
voici une version légèrement plus saine basée sur la réponse 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) {
}
}
Basé sur la réponse fournie, version légèrement modifiée 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);
}
}
fermer entrée et lecteur
public void closeQuietly(Closeable closeable) {
if (closeable == null) return;
try {
closeable.close();
} catch (IOException ignored) {
}
}