Dikkat: Java 8+ API desugaring desteği (Android Gradle Plugin 4.0.0+)
Bu kütüphane ( ThreeTenABP ) üzerinde gelişme yavaşlıyor . Lütfen önümüzdeki aylarda Android Gradle eklentisi 4.0, java.time. * Ve temel kütüphane desugaring özelliğine geçmeyi düşünün.
Bu dil API'lerinin Android platformunun herhangi bir sürümünde desteğini etkinleştirmek için Android eklentisini 4.0.0 (veya daha yüksek) sürümüne güncelleyin ve modülünüzün build.gradle dosyasına şunları ekleyin:
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'
}
İlk Keşif: Neden java.time , ThreeTen-Backport ve hatta Joda-Time Yerine ThreeTenABP Kullanmalısınız ?
Bu yeni bir standart tanımlama ÇOK UZUN SÜRECİN gerçekten kısa bir versiyonudur. Tüm bu paketler hemen hemen aynı şeydir: Java için iyi, modern zaman işleme işlevselliği sağlayan kütüphaneler. Farklılıklar ince ama önemlidir.
En açık çözüm yerleşik java.time
paketi kullanmak olacaktır , çünkü bu, Java'daki zaman ve tarihlerle başa çıkmanın yeni standart yoludur. Joda-Time kütüphanesine dayanan zaman işleme için yeni bir standart teklif olan JSR 310'un bir uygulamasıdır .
Ancak, Java 8'dejava.time
tanıtıldı . Marshmallow'a kadar Android , Java 7'de çalışır ("Android N", Java 8 dil özelliklerini tanıtan ilk sürümdür). Bu nedenle, yalnızca Android N Nougat ve üstünü hedeflemezseniz , Java 8 dil özelliklerine güvenemezsiniz (aslında bunun% 100 doğru olduğundan emin değilim, ancak bunu anlıyorum). Öyleyse çıktı.java.time
Bir sonraki seçenek olabilir Joda-Time beri, JSR 310 Joda-Time dayanıyordu. Ancak, ThreeTenABP benioku dosyasının belirttiği gibi, birkaç nedenden dolayı Joda-Time en iyi seçenek değildir.
Sonraki, Java 8 işlevselliğinin çoğunu (ancak hepsini değil) Java 7'ye geri taşıyan ThreeTen-Backport'turjava.time
. Bu, çoğu kullanım durumu için iyidir, ancak ThreeTenABP benioku dosyasında belirtildiği gibi Android ile performans sorunları vardır.
Yani son ve görünüşte doğru seçenek ThreeTenABP .
İkinci Keşif: Derleme Araçları ve Bağımlılık Yönetimi
Bir programı, özellikle de bir grup harici kütüphaneyi kullanarak derlemek karmaşık olduğundan, Java işlemi yönetmek için neredeyse her zaman bir "oluşturma aracı" kullanır . Make , Apache Ant , Apache Maven ve Gradle , Java programlarında kullanılan derleme araçlarıdır ( karşılaştırmalar için bu gönderiye bakın ). Daha sonra belirtildiği gibi, Gradle Android projeleri için seçilen derleme aracıdır.
Bu oluşturma araçları bağımlılık yönetimini içerir. Apache Maven, merkezi bir paket deposunu içeren ilk kişi gibi görünüyor. Maven , Packagist ile php'lere ve rubygems.org ile Ruby's'e eşdeğer işlevsellik sağlayan Maven Central Repository'yi tanıttı. Diğer bir deyişle, Maven Merkez Deposu, Packagegist'in besteleyeceği Maven (ve Gradle) 'dir - sürümlü paketler için kesin ve güvenli bir kaynaktır.composer
gem
Üçüncü Keşif: Gradle, Android Projelerindeki Bağımlılıkları Ele Alır
Yapılacaklar listemde öne çıkanlar , ücretsiz e-Kitaplar da dahil olmak üzere Gradle belgelerini burada okumaktır . Bu haftalar önce Android öğrenmeye başladığımda okumuş olsaydım, Gradle'ın Maven Central Repository'yi Android Projelerinde bağımlılıkları yönetmek için kullanabileceğini kesinlikle biliyordum. Ayrıca, bu StackOverflow yanıtında ayrıntılı olarak açıklandığı gibi, Android Studio 0.8.9'dan itibaren Gradle, Maven Central Repository'yi Bintray'ın JCenter'ı üzerinden dolaylı olarak kullanıyor; bağımlılıkları.
Dördüncü Keşif: Proje Bağımlılıkları [project dir] /app/build.gradle'de listelenmiştir
Yine, Gradle'ı Java'da kullanma konusunda deneyimi olanlar için açık, ama bunu anlamak biraz zaman aldı. "Oh, sadece ekleyin compile 'this-or-that.jar'
" veya benzer bir şey söyleyen insanlar görürseniz compile
, derleme zamanı bağımlılıkları gösteren o build.gradle dosyasında bir yönerge olduğunu bilin. İşte bağımlılık yönetimiyle ilgili resmi Gradle sayfası.
Beşinci Keşif: ThreeTenABP Jake Wharton tarafından yönetilir, ThreeTen tarafından yönetilmez
Yine başka bir konu anlamak için çok zaman harcadım. Maven'in Central ThreeTen için bakarsanız, yalnızca paketleri göreceksiniz threetenbp
değil threetenabp
. ThreeTenABP için github repo'ya giderseniz , Beni Oku'nuncompile 'this-or-that'
İndir bölümünün altında o rezil çizgiyi göreceksiniz .
Bu github deposunu ilk vurduğumda, bu derleme satırının ne anlama geldiğini bilmiyordum ve terminalimde (açık ve tahmin edilebilir bir başarısızlıkla) çalıştırmaya çalıştım. Hayal kırıklığına uğramış, geri kalanını anladıktan sonra uzun süre geri dönmedim ve nihayet com.jakewharton.threetenabp
repoya karşılık repoya işaret eden bir Maven Repo hattı olduğunu fark ettim org.threeten
. Bu yüzden ThreeTenABP paketinin Maven deposunda olmadığını düşündüm.
Özet: İşe yaraması
Şimdi her şey oldukça kolay görünüyor. [project folder]/app/build.gradle
Dosyanızın bölümünde implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
satır olduğundan emin olarak bir Android projesinde modern zaman işleme işlevlerine sahip olabilirsiniz dependencies
:
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'
}
Bunu Uygulama sınıfına da ekleyin:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}