Attention: prise en charge du désugarage de l'API Java 8+ (Android Gradle Plugin 4.0.0+)
Le développement de cette bibliothèque ( ThreeTenABP ) s'achève . Veuillez envisager de passer au plugin Android Gradle 4.0, java.time. *, Et à sa fonction de désugarage de bibliothèque principale dans les mois à venir.
Pour activer la prise en charge de ces API de langage sur n'importe quelle version de la plate-forme Android, mettez à jour le plug-in Android vers la version 4.0.0 (ou supérieure) et incluez les éléments suivants dans le fichier build.gradle de votre module:
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'
}
Première découverte: pourquoi vous devez utiliser ThreeTenABP au lieu de java.time , ThreeTen-Backport ou même Joda-Time
Il s'agit d'une version très courte du TRES LONG PROCESSUS de définition d'un nouveau standard. Tous ces packages sont à peu près la même chose: des bibliothèques qui fournissent de bonnes fonctionnalités modernes de gestion du temps pour Java. Les différences sont subtiles mais importantes.
La solution la plus évidente serait d'utiliser le java.time
package intégré, car il s'agit de la nouvelle manière standard de gérer l'heure et les dates en Java. Il s'agit d'une implémentation de JSR 310 , qui était une nouvelle proposition standard de gestion du temps basée sur la bibliothèque Joda-Time .
Cependant, a java.time
été introduit dans Java 8 . Android jusqu'à Marshmallow fonctionne sur Java 7 ("Android N" est la première version à introduire les fonctionnalités du langage Java 8). Ainsi, à moins que vous ne cibliez uniquement Android N Nougat et supérieur, vous ne pouvez pas vous fier aux fonctionnalités du langage Java 8 (je ne suis pas sûr que ce soit vrai à 100%, mais c'est ainsi que je le comprends). Ainsi java.time
est sorti.
La prochaine option pourrait être Joda-Time , puisque JSR 310 était basé sur Joda-Time. Cependant, comme l' indique le fichier readme de ThreeTenABP , pour un certain nombre de raisons, Joda-Time n'est pas la meilleure option.
Vient ensuite ThreeTen-Backport , qui transfère une grande partie (mais pas la totalité) des java.time
fonctionnalités de Java 8 vers Java 7. Cela convient à la plupart des cas d'utilisation, mais, comme indiqué dans le fichier readme de ThreeTenABP , il a des problèmes de performances avec Android.
Donc, la dernière option et apparemment correcte est ThreeTenABP .
Deuxième découverte: outils de création et gestion des dépendances
Comme la compilation d'un programme - en particulier celui qui utilise un tas de bibliothèques externes - est complexe, Java utilise presque invariablement un "outil de construction" pour gérer le processus. Make , Apache Ant , Apache Maven et Gradle sont tous des outils de construction utilisés avec les programmes Java (voir cet article pour des comparaisons). Comme indiqué plus bas, Gradle est l'outil de construction choisi pour les projets Android.
Ces outils de construction incluent la gestion des dépendances. Apache Maven semble être le premier à inclure un référentiel de packages centralisé. Maven a introduit le référentiel central Maven , qui permet des fonctionnalités équivalentes à php composer
avec Packagist et Ruby gem
avec rubygems.org. En d'autres termes, le référentiel central de Maven est pour Maven (et Gradle) ce que Packagist est pour composer - une source définitive et sécurisée pour les packages versionnés.
Troisième découverte: Gradle gère les dépendances dans les projets Android
Le haut de ma liste de choses à faire est de lire les documents Gradle ici , y compris leurs livres électroniques gratuits. Si j'avais lu ces semaines quand j'ai commencé à apprendre Android, j'aurais sûrement su que Gradle peut utiliser le référentiel central Maven pour gérer les dépendances dans les projets Android. En outre, comme détaillé dans cette réponse StackOverflow, à partir d'Android Studio 0.8.9, Gradle utilise implicitement le référentiel central Maven via JCenter de Bintray, ce qui signifie que vous n'avez pas à faire de configuration supplémentaire pour configurer le dépôt - vous listez simplement le dépendances.
Quatrième découverte: les dépendances du projet sont répertoriées dans [répertoire du projet] /app/build.gradle
Encore une fois, évident pour ceux qui ont une expérience de l'utilisation de Gradle en Java, mais il m'a fallu un certain temps pour comprendre cela. Si vous voyez des gens dire "Oh, ajoutez simplement compile 'this-or-that.jar'
" ou quelque chose de similaire, sachez que compile
c'est une directive dans ce fichier build.gradle qui indique les dépendances au moment de la compilation. Voici la page officielle Gradle sur la gestion des dépendances.
Cinquième découverte: ThreeTenABP est géré par Jake Wharton, pas par ThreeTen
Encore un autre problème que j'ai passé trop de temps à résoudre. Si vous recherchez ThreeTen dans Maven Central, vous ne verrez que les packages pour threetenbp
, pas threetenabp
. Si vous accédez au référentiel github pour ThreeTenABP , vous verrez cette infâme compile 'this-or-that'
ligne sous la section Télécharger du fichier Lisez-moi.
Quand j'ai frappé pour la première fois ce repo github, je ne savais pas ce que signifiait cette ligne de compilation et j'ai essayé de l'exécuter dans mon terminal (avec un échec évident et prévisible). Frustré, je n'y suis retourné que longtemps après avoir compris le reste et j'ai finalement réalisé qu'il s'agissait d'une ligne Maven Repo pointant vers le com.jakewharton.threetenabp
repo, par opposition au org.threeten
repo. C'est pourquoi je pensais que le package ThreeTenABP n'était pas dans le repo Maven.
Résumé: faire fonctionner
Maintenant, tout semble assez facile. Vous pouvez obtenir des fonctions de gestion des temps modernes dans un projet Android en vous assurant que votre [project folder]/app/build.gradle
fichier a la implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
ligne dans sa dependencies
section:
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'
}
Ajoutez également ceci à la classe Application:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}