Android 프로젝트에서 ThreeTenABP를 사용하는 방법


193

Java 및 Android를 처음 사용하기 때문에이 질문을하고 있으며 이것을 알아 내려고 몇 시간 동안 검색했습니다. 대답은 관련 답변의 조합에서 나왔으므로 어려움을 겪고있는 다른 사람에게 배운 것을 문서화 할 것이라고 생각했습니다. 답을보십시오.

Android Studio 2.1.2를 사용하고 있으며 Java 설정은 다음과 같습니다.

>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

답변:


192

주의 : 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 MavenGradle 은 모두 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. ThreeTenABPgithub 저장소 로 이동 compile 'this-or-that'하면 Readme의 다운로드 섹션 아래에 그 악명 높은 줄이 표시됩니다.

내가이 github 저장소에 처음 왔을 때, 나는 그 컴파일 라인이 무엇을 의미하는지 알지 못했고 터미널에서 (명확하고 예측 가능한 실패로) 실행하려고했습니다. 내가 나머지를 파악하고, 마지막으로는 가리키는 메이븐 리포 라인의 실현 후 좌절, 나는 오래 될 때까지 돌아 오지 않았다 com.jakewharton.threetenabp받는 반대의 repo는, org.threetenREPO. 그래서 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);
        //...
    }
}

1
좋은 게시물 주셔서 감사합니다. 그러나 JodaTimeAndroid 도 고려했는지 궁금합니다 .
Bob

@ 밥, 나는 JodaTimeAndroid를 실험하지 않았지만, 지금 당장 필요한 것은 아무것도하지 않기 때문에. 내가 기억하는 것에서 java.time구현은 훌륭 했고 (기본적으로 JodaTime의 포트이기 때문에) 2 ~ 2 년 안에 사용자의 90 %가 Nougat +에있을 것이므로 개발을위한 실용적인 솔루션이 될 것입니다.
kael

2
@Bob, JodaTime은 기본적으로 JSR-310과 동일하지만 JSR-310은 디자인 결함 적을 것입니다 ( 예 : 이 기사 참조 ). [... 아래 계속]
M. Prokhorov

2
주석을 명확하게하기 위해… java.time 프레임 워크 ( JSR 310 )는 Joda-Time 프로젝트 의 공식적인 후속 작업입니다. 두 프로젝트 모두 같은 사람인 Stephen Colebourne이 이끈다 . Joda-Time 프로젝트는 이제 유지 보수 모드에 있으며 팀은 java.time으로의 마이그레이션을 조언합니다.
Basil Bourque

6
당신이 전화 확인 AndroidThreeTen.init(this)에 예를 들어, API를 사용하기 전에 onCreate().See 안드로이드에 ThreeTen - 백 포트 오류 - ZoneRulesException : 없음 시간대 데이터 파일 등록 .
Ole VV

5

허용 kael 의해 답변 올바른 것입니다. 또한 몇 가지 사항을 언급하고 java.time 기능을 얻는 방법 에 대한 다이어그램을 제공 합니다.

안드로이드에 내장 된 java.time 26+

Android 26 이상을 대상으로하는 경우 Android 와 번들로 제공되는 JSR 310 ( java.time 클래스) 구현을 찾을 수 있습니다. ThreeTenABP 를 추가 할 필요가 없습니다 .

거의 동일한 API

다만, 명확하게 ThreeTenABP 안드로이드에 대한이의 적응이다 ThreeTen - 백 포트의 의 가장 가져다 라이브러리 java.time의 에 기능을 자바 6자바 7 . 이 백 포트는 java.time 과 거의 동일한 API를 공유 합니다.

이제 26 이전의 Android를 대상으로하고 있으므로 ThreeTenABP 를 사용한다고 가정하십시오 . 나중에 Android 와 함께 번들로 제공되는 java.time 클래스 를 사용하기 위해 이전 버전의 Android에 대한 지원을 중단 할 수 있습니다 . 이 경우 (a) 스위칭 import문 및 (b) org.threeten.bp.DateTimeUtils기존 레거시 날짜-시간 클래스 ( Date, GregorianCalendar)에 추가 된 새 변환 방법을 사용 하기 위해 수행 한 호출 변경 이외의 코드베이스를 거의 변경하지 않아도 됩니다. .

에서 전환 과정 ThreeTenABPjava.time은 부드럽고 거의 고통되어야한다.

어떤 프레임 워크를 사용하는 경우

다음은 세 가지 프레임 워크를 보여주고 어느 시나리오에서 어느 프레임 워크를 사용해야하는지 나타내는 차트입니다.

➥ 업데이트 : Android Gradle Plugin 4.0.0+에는 이전의 Android에 내장되지 않은 java.time 기능하위 세트를 제공하기 위해 새로운 4 번째 옵션 인 API desugaring 이 제공 됩니다. kael 의 메인 답변 상단을 참조하십시오 .

Java 또는 Android 버전과 함께 사용할 java.time 라이브러리 표


java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 . Hibernate 5 & JPA 2.2는 java.time을 지원 합니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?


4

Android Studio의 빌드 gradle 파일에 다음을 추가하십시오.

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

Application 클래스를 작성하고 다음과 같이 초기화하십시오.

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.