Attenzione: supporto per la desugarazione dell'API Java 8+ (Android Gradle Plugin 4.0.0+)
Lo sviluppo di questa libreria ( ThreeTenABP ) è agli sgoccioli . Considera di passare al plug-in Android Gradle 4.0, java.time. * E alla sua funzione di desugarazione della libreria principale nei prossimi mesi.
Per abilitare il supporto per queste API di lingua su qualsiasi versione della piattaforma Android, aggiorna il plug-in Android alla 4.0.0 (o successiva) e includi quanto segue nel file build.gradle del tuo modulo:
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
}
Prima scoperta: perché devi usare ThreeTenABP invece di java.time , ThreeTen-Backport o persino Joda-Time
Questa è una versione davvero breve del PROCESSO MOLTO LUNGO per definire un nuovo standard. Tutti questi pacchetti sono praticamente la stessa cosa: librerie che forniscono funzionalità di gestione dei tempi buone e moderne per Java. Le differenze sono sottili ma importanti.
La soluzione più ovvia sarebbe quella di utilizzare il java.time
pacchetto integrato , poiché questo è il nuovo modo standard per gestire l'ora e le date in Java. È un'implementazione di JSR 310 , che era una nuova proposta standard per la gestione del tempo basata sulla libreria Joda-Time .
Tuttavia, è java.time
stato introdotto in Java 8 . Android fino a Marshmallow funziona su Java 7 ("Android N" è la prima versione a introdurre funzionalità del linguaggio Java 8). Pertanto, a meno che tu non stia prendendo di mira solo Android N Nougat e versioni successive, non puoi fare affidamento sulle funzionalità del linguaggio Java 8 (non sono sicuro che questo sia vero al 100%, ma è così che lo capisco). Quindi java.time
è fuori.
L'opzione successiva potrebbe essere Joda-Time , poiché JSR 310 era basato su Joda-Time. Tuttavia, come indica il readme di ThreeTenABP , per una serie di motivi, Joda-Time non è l'opzione migliore.
Il prossimo è ThreeTen-Backport , che esegue il back-port di gran parte (ma non tutte) della java.time
funzionalità Java 8 su Java 7. Questo va bene per la maggior parte dei casi d'uso, ma, come indicato nel readme ThreeTenABP , ha problemi di prestazioni con Android.
Quindi l'ultima e apparentemente corretta opzione è ThreeTenABP .
Seconda scoperta: strumenti di costruzione e gestione delle dipendenze
Poiché la compilazione di un programma - in particolare uno che utilizza un gruppo di librerie esterne - è complessa, Java utilizza quasi sempre uno "strumento di costruzione" per gestire il processo. Make , Apache Ant , Apache Maven e Gradle sono tutti strumenti di compilazione utilizzati con i programmi Java (vedere questo post per i confronti). Come notato più avanti, Gradle è lo strumento di creazione scelto per i progetti Android.
Questi strumenti di compilazione includono la gestione delle dipendenze. Apache Maven sembra essere il primo a includere un repository di pacchetti centralizzato. Maven ha introdotto il Maven Central Repository , che consente funzionalità equivalenti a php composer
con Packagist e Ruby gem
con rubygems.org. In altre parole, il Maven Central Repository è per Maven (e Gradle) ciò che Packagist è per compositore - una fonte definitiva e sicura per i pacchetti con versione.
Terza scoperta: Gradle gestisce le dipendenze nei progetti Android
In cima alla mia lista di cose da fare è leggere i documenti Gradle qui , compresi i loro eBook gratuiti. Se avessi letto queste settimane fa quando ho iniziato ad imparare Android, avrei sicuramente saputo che Gradle può usare il Maven Central Repository per gestire le dipendenze nei progetti Android. Inoltre, come dettagliato in questa risposta StackOverflow, a partire da Android Studio 0.8.9, Gradle utilizza Maven Central Repository in modo implicito tramite JCenter di Bintray, il che significa che non è necessario eseguire alcuna configurazione aggiuntiva per impostare il repository: è sufficiente elencare il dipendenze.
Quarta scoperta: le dipendenze del progetto sono elencate in [dir progetto] /app/build.gradle
Ancora una volta, ovvio per coloro che hanno qualche esperienza con Gradle in Java, ma mi ci è voluto un po 'di tempo per capirlo. Se vedi persone che dicono "Oh, basta aggiungere compile 'this-or-that.jar'
" o qualcosa di simile, sappi che compile
è una direttiva in quel file build.gradle che indica dipendenze in fase di compilazione. Ecco la pagina ufficiale di Gradle sulla gestione delle dipendenze.
Quinta scoperta: ThreeTenABP è gestito da Jake Wharton, non da ThreeTen
Ancora un altro problema che ho trascorso troppo tempo a capire. Se cerchi ThreeTen in Maven Central, vedrai solo i pacchetti threetenbp
, no threetenabp
. Se vai al repository github per ThreeTenABP , vedrai quella famigerata compile 'this-or-that'
riga nella sezione Download del file Leggimi.
Quando ho raggiunto questo repository github per la prima volta, non sapevo cosa significasse quella riga di compilazione e ho provato a eseguirlo nel mio terminale (con un errore ovvio e prevedibile). Frustrato, non ci sono tornato molto tempo dopo aver capito il resto, e finalmente ho capito che si tratta di una linea Maven Repo che punta al com.jakewharton.threetenabp
repository, al contrario del org.threeten
repository. Ecco perché pensavo che il pacchetto ThreeTenABP non fosse nel repository Maven.
Riepilogo: farlo funzionare
Ora sembra tutto abbastanza semplice. Puoi ottenere le moderne funzioni di gestione del tempo in un progetto Android assicurandoti che il tuo [project folder]/app/build.gradle
file abbia la implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
linea nella sua dependencies
sezione:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "me.ahuman.myapp"
minSdkVersion 11
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:23.4.0'
implementation 'com.android.support:design:23.4.0'
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
}
Aggiungilo anche alla classe Applicazione:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}