with Come definire e utilizzare una proprietà di sistema nel test di Strumentazione Android?




top bar android studio (5)

Sto cercando di utilizzare alcuni argomenti per un test di strumentazione. Ho notato che posso leggere le proprietà del sistema con la funzione System.getProperty() . Quindi uso il comando setprop per impostare una proprietà di sistema. Ad esempio: adb shell setprop AP 123 . All'interno del mio codice di prova provo a leggere questa proprietà AP con:


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

Quindi utilizzo logcat per visualizzare questo messaggio di debug, ma ottengo un valore nullo per questa proprietà. Qualche idea su cosa potrebbe essere sbagliato? Si noti che posso ancora leggere la proprietà di sistema con il comando adb shell getprop AP .


Per ottenere la proprietà impostata da 'setprop', ci sono due opzioni:
Uno. usa android.os.SystemProperties, questa è un'API nascosta. usalo in questo modo:

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

Due. usa l'utility '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());

Forse anche usare le funzioni disponibili in NDK è un'opzione, ma perché preoccuparsi?


importare android.os.SystemProperties

String s = SystemProterties.get ("ro.xxx.xxx", "valore predefinito se la proprietà non è impostata");


Le proprietà del sistema vengono lette una volta all'avvio della root VM (Zygote), che a sua volta genera altre macchine virtuali Dalvik come quella della tua applicazione. Ciò significa che non è possibile impostare le proprietà di sistema al volo.

Prova a riavviare Zygote usando adb shell stop (attendi fino a quando non si è fermato) e adb shell start (attendi che sia riavviato), quindi riprova. O semplicemente riavvia il dispositivo o l'emulatore.


Perché ci sono due tipi di proprietà in Android.

  1. Livello di sistema: possiamo ottenere / impostare con comando adb shell getprop/setprop .
  2. Nel livello di processo corrente - possiamo ottenere / impostare con java regolare System.getProperty()/setProperty() .

Mentre si imposta una proprietà a livello di sistema e si tenta di ottenere il suo valore come livello di processo corrente, si ottiene il valore nullo nel registro.


In base alla risposta fornita, versione leggermente modificata di 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);
    }
}

chiudi Input e reader

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




adb