web-dev-qa-db-fra.com

Comment définir et utiliser une propriété système dans le test d'instrumentation Android?

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.

22
Michalis

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?

20
accuya

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.

14
Matthias

Parce qu'il y a deux types de propriété dans Android.

  1. Niveau système - nous pouvons obtenir/définir avec la commande adb Shell getprop/setprop.
  2. Au niveau du processus actuel - nous pouvons obtenir/définir avec Java 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.

9
Nimesh

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) {
    }
}
5
Felipe Lima

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) {
    }
}
0
SAURABH_12