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

Aug 12 2016

나는 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)

답변

200 kael Aug 12 2016 at 23:36

주의 :이 답변은 기술적으로 정확하지만 현재 구식입니다.

이제 Android Gradle 플러그인 4.0.0 이상을 통해 Java 8+ API desugaring 지원 가능

( 아래 Basil Bourque의 답변 도 참조하십시오 )

ThreeTenABP 라이브러리 에 대한 개발 이 중단되고 있습니다. 앞으로 몇 달 내에 Android Gradle 플러그인 4.0, java.time. * 및 핵심 라이브러리 desugaring 기능으로 전환하는 것이 좋습니다.

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에서 시간과 날짜를 처리하는 새로운 표준 방식이기 때문입니다. 이것은 Joda-Time 라이브러리를 기반으로하는 시간 처리를위한 새로운 표준 제안 인 JSR 310 의 구현입니다 .

그러나 Java 8java.time 에서 도입되었습니다 . Android ~ Marshmallow 는 Java 7에서 실행됩니다 ( "Android N"은 Java 8 언어 기능을 도입 한 첫 번째 버전입니다). 따라서 Android N Nougat 이상 만 대상으로하지 않는 한 Java 8 언어 기능에 의존 할 수 없습니다 (실제로 이것이 100 % 사실인지는 모르겠지만 이것이 제가 이해하는 방법입니다). 그래서 아웃입니다.java.time

JSR 310 이 Joda-Time을 기반으로 했기 때문에 다음 옵션은 Joda-Time 일 수 있습니다 . 그러나 ThreeTenABP readme에서 알 수 있듯이 여러 가지 이유로 Joda-Time은 최선의 선택이 아닙니다.

다음은 ThreeTen-Backport로 , Java 8 java.time기능 의 대부분 (전부는 아님) 을 Java 7로 백 포팅 합니다. 대부분의 사용 사례에는 적합하지만 ThreeTenABP readme에 표시된대로 Android에서 성능 문제가 있습니다.

따라서 마지막으로 보이는 올바른 옵션은 ThreeTenABP 입니다.

두 번째 발견 : 빌드 도구 및 종속성 관리

프로그램 (특히 외부 라이브러리를 사용하는 프로그램)을 컴파일하는 것은 복잡하기 때문에 Java는 거의 항상 "빌드 도구" 를 사용하여 프로세스를 관리합니다. Make , Apache Ant , Apache MavenGradle 은 모두 Java 프로그램과 함께 사용되는 빌드 도구입니다 ( 비교 하려면 이 게시물 참조 ). 아래에서 언급했듯이 Gradle은 Android 프로젝트 용으로 선택된 빌드 도구입니다.

이러한 빌드 도구에는 종속성 관리가 포함됩니다. Apache Maven은 중앙 집중식 패키지 저장소를 처음으로 포함하는 것으로 보입니다. Maven은 Maven Central Repository를 도입하여 composerPackagist 를 사용하는 PHP 와 rubygems.org를 사용하는 Ruby와 동일한 기능을 허용합니다 gem. 즉, Maven Central Repository는 Packagist가 작성해야하는 Maven (및 Gradle)에게 버전이 지정된 패키지의 최종적이고 안전한 소스입니다.

세 번째 발견 : Gradle은 Android 프로젝트의 종속성을 처리합니다.

내 할 일 목록에서 가장 중요한 것은 무료 eBook을 포함하여 여기 에서 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);
        //...
    }
}
8 BasilBourque May 05 2020 at 07:35

kael의해 수락 된 답변 이 정확합니다. 또한 몇 가지를 언급하고 java.time 기능을 얻는 방법 에 대한 다이어그램을 제공 합니다.

Android 26 이상에 내장 된 java.time

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

거의 동일한 API

명확히하기 위해 Android 용 ThreeTenABPJava 6Java 7에 대부분의 java.time 기능을 제공 하는 ThreeTen-Backport 라이브러리를 개조 한 것입니다 . 이 백 포트는 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 기능하위 집합을 사용할 수 있도록 새로운 네 번째 옵션 인 API desugaring 을 제공합니다 . kael 의 주요 답변 상단을 참조하십시오 .


java.time 정보

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

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

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

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

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

5 RichardKamere Aug 19 2019 at 00:02

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

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

Application 클래스를 만들고 다음과 같이 초기화합니다.

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this)
    }
}