주의 : Java 8+ API 설탕 제거 지원 (Android Gradle Plugin 4.0.0+)
이 라이브러리 ( ThreeTenABP ) 에서 개발이 중단되고 있습니다. 앞으로 몇 달 안에 Android Gradle 플러그인 4.0, java.time. * 및 핵심 라이브러리 디 설명 제거 기능으로 전환 해보십시오.
모든 버전의 Android 플랫폼에서 이러한 언어 API를 지원하려면 Android 플러그인을 4.0.0 이상으로 업데이트하고 모듈의 build.gradle 파일에 다음을 포함하십시오.
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'
}
첫 번째 발견 : java.time , ThreeTen-Backport 또는 Joda-Time 대신 ThreeTenABP를 사용해야 하는 이유
이것은 새로운 표준을 정의하는 매우 긴 과정의 매우 짧은 버전입니다. 이 모든 패키지는 거의 동일합니다. Java를위한 현대적이고 우수한 시간 처리 기능을 제공하는 라이브러리입니다. 차이점은 미묘하지만 중요합니다.
가장 확실한 해결책은 내장 java.time
패키지 를 사용하는 것입니다. 이것이 Java의 시간과 날짜를 처리하는 새로운 표준 방법이기 때문입니다. JSR 310 의 구현 으로, Joda-Time 라이브러리를 기반으로하는 시간 처리를위한 새로운 표준 제안이었습니다 .
그러나 Java 8java.time
에서 도입되었습니다 . Marshmallow 이하의 Android 는 Java 7에서 실행됩니다 ( "Android N"은 Java 8 언어 기능을 도입 한 첫 번째 버전입니다). 따라서 Android N Nougat 이상만을 대상으로하지 않는 한 Java 8 언어 기능을 사용할 수는 없습니다 (실제로 이것이 100 % 사실인지 확실하지 않지만 이것이 내가 이해하는 방법입니다). 그렇습니다 .java.time
다음 옵션은 JSR 310 이 Joda-Time을 기반으로 했기 때문에 Joda-Time 일 수 있습니다 . 그러나 ThreeTenABP 추가 정보에서 알 수 있듯이 여러 가지 이유로 Joda-Time이 최선의 옵션이 아닙니다.
다음은 ThreeTen-Backport로 , Java 8 java.time
기능 의 대부분 (일부는 아님) 을 Java 7로 백 포트합니다 . 이는 대부분의 사용 사례에 적합하지만 ThreeTenABP 추가 정보에 표시된대로 Android의 성능 문제가 있습니다.
따라서 마지막으로 올바른 옵션은 ThreeTenABP 입니다.
두 번째 발견 : 빌드 도구 및 종속성 관리
프로그램 (특히 많은 외부 라이브러리를 사용하는)을 컴파일하는 것은 복잡하기 때문에 Java는 거의 항상 "빌드 도구" 를 사용하여 프로세스를 관리합니다. Make , Apache Ant , Apache Maven 및 Gradle 은 모두 Java 프로그램과 함께 사용되는 빌드 도구입니다 ( 비교는 이 게시물 참조 ). 아래에서 언급했듯이 Gradle은 Android 프로젝트에 선택된 빌드 도구입니다.
이러한 빌드 도구에는 종속성 관리가 포함됩니다. Apache Maven은 중앙 집중식 패키지 저장소를 포함하는 최초의 것으로 보입니다. Maven은 Maven Central Repository를 도입하여 PHP composer
와 Packagist, Ruby와 rubygems.org와 동등한 기능 gem
을 제공합니다. 다시 말해, Maven Central Repository는 Packagist가 작곡가에 대해 Maven (및 Gradle)을위한 것입니다. 버전 화 된 패키지를위한 결정적이고 안전한 소스입니다.
세 번째 발견 : Gradle, Android 프로젝트의 종속성 처리
할 일 목록에서 가장 높은 것은 무료 전자 책을 포함하여 여기 에서 Gradle 문서를 읽는 것 입니다. 몇 주 전에 Android 학습을 시작했을 때 Gradle이 Maven Central Repository를 사용하여 Android 프로젝트의 종속성을 관리 할 수 있다는 것을 알고 있었을 것입니다. 또한 이 StackOverflow 답변에 자세히 설명 된 것처럼 Android Studio 0.8.9부터 Gradle은 Bintray의 JCenter를 통해 Maven Central Repository를 암시 적으로 사용하므로 저장소를 설정하기 위해 추가 구성을 수행 할 필요가 없습니다. 의존성.
네 번째 발견 : 프로젝트 종속성이 [project dir] /app/build.gradle에 나열됩니다.
Java에서 Gradle을 사용한 경험이있는 사람들에게도 분명하지만 이것을 이해하는 데 시간이 걸렸습니다. "Oh, just add compile 'this-or-that.jar'
"또는 이와 유사한 것을 말하는 사람들이 있다면 , compile
컴파일 타임 종속성을 나타내는 build.gradle 파일의 지시어 라는 것을 알아야합니다 . 종속성 관리에 대한 공식 Gradle 페이지는 다음과 같습니다 .
다섯 번째 발견 : ThreeTenABP는 ThreeTen이 아니라 Jake Wharton에 의해 관리됩니다.
또 다른 문제는 알아내는 데 너무 많은 시간을 보냈습니다. 당신이 메이븐 중앙에 ThreeTen를 찾을 경우, 당신은 단지에 대한 패키지를 볼 수 있습니다 threetenbp
, 없습니다 threetenabp
. ThreeTenABP 의 github 저장소 로 이동 compile 'this-or-that'
하면 Readme의 다운로드 섹션 아래에 그 악명 높은 줄이 표시됩니다.
내가이 github 저장소에 처음 왔을 때, 나는 그 컴파일 라인이 무엇을 의미하는지 알지 못했고 터미널에서 (명확하고 예측 가능한 실패로) 실행하려고했습니다. 내가 나머지를 파악하고, 마지막으로는 가리키는 메이븐 리포 라인의 실현 후 좌절, 나는 오래 될 때까지 돌아 오지 않았다 com.jakewharton.threetenabp
받는 반대의 repo는, org.threeten
REPO. 그래서 ThreeTenABP 패키지가 Maven 저장소에 없다고 생각했습니다.
요약 : 작동시키기
이제는 매우 쉬운 것처럼 보입니다. [project folder]/app/build.gradle
파일 implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
의 dependencies
섹션 에 파일이 있는지 확인하여 Android 프로젝트에서 최신 시간 처리 기능을 사용할 수 있습니다 .
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'
}
또한 이것을 Application 클래스에 추가하십시오.
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}