2014-11-15 7 views
5

Sono confuso sul funzionamento interno delle API di Android.

Se la mia applicazione è compilato con Android 5.0, quindi è accettabile che le seguenti opere su un dispositivo con sistema operativo Android 5.0 e fino:Come può forse Build.VERSION_CODES funzionare?

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 

Tuttavia, questo funziona ancora se l'eseguo su un dispositivo che esegue versioni precedenti di Android. La mia ipotesi è che la libreria su quel dispositivo non abbia una definizione per la variabile Build.VERSION_CODES.LOLLIPOP. Quindi come può la variabile essere risolta su quei dispositivi più vecchi quando l'app esegue questo codice?

risposta

14

Quindi come può essere risolta la variabile su quei dispositivi meno recenti quando l'app esegue questo codice?

Semplice: non ci sono variabili.

Build.VERSION_CODES.LOLLIPOP è un static final int. Il javac - generato da bytecode integrerà il valore int quando si fa riferimento a Build.VERSION_CODES.LOLLIPOP anziché eseguire la ricerca di tale valore in fase di esecuzione. Poiché i bytecode contengono lo int, l'APK contiene lo int e, pertanto, non si dipende dall'edizione del dispositivo del framework per fornire all'utente lo int.

Build.VERSION.SDK_INT è non un static final int, e quindi che valore viene cercato in fase di esecuzione.

+2

Modifica: 'Build.VERSION.SDK_INT' è un [' static final int'] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/ 5.L_preview/android/os/Build.java # 139). Ma il suo valore dipende da [proprietà di sistema] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.L_preview/android/os/Build.java # 503) quindi deve essere calcolato in fase di esecuzione, mentre 'Build.VERSION_CODES.LOLLIPOP' è solo un [' int'] (http://grepcode.com/file/repository.grepcode.com/java/ext/com .google.android/android/5.L_preview/android/os/Build.java # 503). – futtetennista

Problemi correlati