2010-09-20 14 views
22

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. Dentro il mio codice di prova provo a leggere questa proprietà AP con:Come definire e utilizzare una proprietà di sistema nel test di Strumentazione Android?


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

allora io uso logcat per visualizzare questo messaggio di debug, ma ottengo un valore null 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.

+0

Supponendo che si desidera modificare queste proprietà tra i test e dato che non è possibile applicare nuove proprietà di sistema in fase di esecuzione (consultare la risposta di Matthias), è probabilmente meglio astrarre l'impostazione/acquisizione delle proprietà di sistema in una classe helper , di cui è possibile fornire un'implementazione simulata durante il test. –

+0

Questa discussione è migliore: http://stackoverflow.com/questions/2641111/where-is-android-os-systemproperties – Snicolas

risposta

13

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 dell'applicazione. Ciò significa che non è possibile impostare le proprietà di sistema al volo.

Provare a riavviare Zygote utilizzando adb shell stop (attendere fino a quando non si è arrestato) e adb shell start (attendere fino al riavvio), quindi riprovare. O semplicemente riavvia il dispositivo o l'emulatore.

+4

Vale la pena ricordare che dovresti essere in grado di impostare le proprietà al momento dell'avvio dell'emulatore, ad es. 'emulatore -avd 2.3 -prop AP = 123'. –

+1

bello, non lo sapevo. – Matthias

+0

Non è una buona idea, davvero. – accuya

8

Perché in Android esistono due tipi di proprietà.

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

Come 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.

19

Per ottenere la proprietà impostata da 'setprop', ci sono due opzioni:
Uno. usa android.os.SystemProperties, questa è un'API nascosta. usarlo 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. utilizzare l'utilità '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 utilizzando le funzioni availble in NDK è un'opzione troppo, ma perché preoccuparsi?

+0

Solo per completare questo per quelli come me che avevano bisogno del metodo Set 'Metodo metodo = clazz.getDeclaredMethod (" set ", String.class, String.class);' – miroslavign

+0

Hai bisogno di aggiungere permessi speciali per farlo? @miroslavign – htellez

+0

@htellez No non ne – miroslavign

4

Ecco una versione leggermente più sano in base alla risposta del 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) { 
    } 
} 
-1

android.os.SystemProperties importazione

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

+0

'android.os.SystemProperties' non è importabile. – albusshin

Problemi correlati