wake-up-neo.net

Wie definiere und verwende ich eine Systemeigenschaft im Android Instrumentation-Test?

Ich versuche, einige Argumente für einen Instrumentationstest zu verwenden. Mir ist aufgefallen, dass ich Systemeigenschaften mit der Funktion System.getProperty() lesen kann. Also setze ich den Befehl setprop, um eine Systemeigenschaft festzulegen. Zum Beispiel: adb Shell setprop AP 123. In meinem Testcode versuche ich, diese AP-Eigenschaft mit zu lesen: 


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

Dann verwende ich logcat, um diese Debug-Nachricht anzuzeigen, erhalte jedoch einen Nullwert für diese Eigenschaft. Irgendwelche Ideen, woran das liegen könnte? Beachten Sie, dass ich die Systemeigenschaft immer noch mit dem Befehl adb Shell getprop AP lesen kann.

22
Michalis

Um die Eigenschaft von 'setprop' festzulegen, gibt es zwei Optionen:
Ein. Verwenden Sie Android.os.SystemProperties. Dies ist eine API zum Ausblenden. benutze es so:

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

Zwei. Verwenden Sie das Dienstprogramm '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());

Möglicherweise ist auch die Verwendung von in NDK verfügbaren Funktionen eine Option, aber warum sollten Sie sich die Mühe machen?

20
accuya

Die Systemeigenschaften werden einmalig gelesen, wenn der Stamm VM (Zygote) gestartet wird, wodurch wiederum andere Dalvik-VMs wie die Ihrer Anwendung erzeugt werden. Das bedeutet, dass Sie die Systemeigenschaften nicht sofort einstellen können.

Starten Sie Zygote erneut mit adb Shell stop (warten Sie, bis es angehalten wurde) und adb Shell start (warten Sie, bis es neu gestartet wurde), und versuchen Sie es erneut. Oder starten Sie einfach das Gerät oder den Emulator neu.

14
Matthias

Weil es in Android zwei Arten von Eigenschaften gibt.

  1. Systemebene - wir können mit dem Befehl adb Shell getprop/setprop abrufen/einstellen.
  2. In der aktuellen Prozessebene können wir mit regulärem Java System.getProperty()/setProperty() abrufen/einstellen.

Wenn Sie eine Eigenschaft auf Systemebene festlegen und versuchen, ihren Wert als aktuelle Prozessebene abzurufen, wird im Protokoll ein Nullwert angezeigt.

9
Nimesh

hier ist eine etwas gesündere Version basierend auf der Antwort von 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

Basierend auf der bereitgestellten Antwort, leicht modifizierte Version von 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);
    }
}

schließen Sie Eingabe und Leser

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