programing

쓰리텐 사용법안드로이드 프로젝트의 ABP

subpage 2023. 8. 17. 21:18
반응형

쓰리텐 사용법안드로이드 프로젝트의 ABP

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)

저는 이것을 알아내려고 몇 시간 동안 검색했습니다.그 대답은 관련된 대답들의 조합에서 나왔기 때문에, 저는 제가 배운 것을 어려움을 겪고 있는 다른 사람들을 위해 문서화하기로 했습니다.답 보기.

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

Android Gradle Plugin 4.0.0+를 통해 Java 8+ API 디슈가링 지원 제공

(아래 바질 부르크의 답변 참조)

ThreeTenABP Library의 개발이 서서히 진행되고 있습니다.앞으로 몇 달 안에 Android Gradle 플러그인 4.0, java.time.* 및 핵심 라이브러리 디슈가링 기능으로 전환하는 것을 고려해 보십시오.

Android 플랫폼의 모든 버전에서 이러한 언어 API를 지원하려면 Android 플러그인을 4.0.0 이상으로 업데이트하고 모듈의 build.gradle 파일에 다음을 포함합니다(Android Developers 사이트의 Java 8 지원 페이지의 이 섹션에서).

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'
}

원답

첫 번째 검색:ThreeTen을 사용해야 하는 이유java.time, ThreeTen-backport 또는 Joda-Time 대신 ABP 사용

이것은 새로운 표준을 정의하는 매우 긴 프로세스의 매우 짧은 버전입니다.이 모든 패키지는 거의 동일합니다. 자바를 위한 현대적인 시간 처리 기능을 제공하는 라이브러리입니다.그 차이는 미묘하지만 중요합니다.

가장 확실한 해결책은 내장 패키지를 사용하는 것입니다. 이는 Java에서 시간과 날짜를 처리하는 새로운 표준 방법이기 때문입니다.Joda-Time 라이브러리를 기반으로 시간 처리를 위한 새로운 표준 제안인 JSR 310의 구현입니다.

하만지,java.timeJava 8에 도입되었습니다.Mashmallow까지 안드로이드는 자바 7에서 실행됩니다. ("안드로이드 N"은 자바 8 언어 기능을 도입한 최초의 버전입니다.)따라서 Android N N N Nougat 이상만 대상으로 하는 경우가 아니라면 Java 8 언어 기능에 의존할 수 없습니다(실제로 이것이 100% 사실인지는 모르겠지만 이렇게 이해합니다).java.time외출했습니다.

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

다음은 ThreeTen-Backport로, Java 8의 대부분(전부는 아님)을 백포트합니다.java.time기능을 제공합니다.이는 대부분의 사용 사례에 적합하지만 ThreeTenABP readme에 나와 있듯이 Android에 성능 문제가 있습니다.

따라서 마지막으로 맞는 것처럼 보이는 옵션은 쓰리텐ABP입니다.

두 번째 검색: 빌드 도구 및 종속성 관리

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

이러한 빌드 도구에는 종속성 관리가 포함됩니다.Apache Maven은 중앙 집중식 패키지 저장소를 포함한 최초의 제품으로 보입니다.메이븐은 php와 동등한 기능을 허용하는 메이븐 중앙 저장소를 도입했습니다.composer의 패키와루께함비와트스지▁▁with께함▁ruby와.gemrubygems.org.rubygems.org 에서 확인할 수 있습니다.다시 말해, 메이븐 중앙 저장소는 메이븐(그리고 Gradle)에게 Packagist가 작곡가에게 무엇인지, 즉 버전 패키지에 대한 결정적이고 안전한 소스입니다.

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

제가 해야 할 일 중 가장 중요한 것은 무료 eBook을 포함하여 Gradle 문서를 읽는 것입니다.제가 안드로이드를 배우기 시작했을 때 몇 주 전에 읽었더라면, 저는 Gradle이 Maven Central Repository를 사용하여 안드로이드 프로젝트의 종속성을 관리할 수 있다는 것을 확실히 알았을 것입니다.또한, 이 StackOverflow 답변에서 자세히 설명했듯이, Android Studio 0.8.9에서 Gradle은 Bintray의 Jcenter를 통해 암묵적으로 메이븐 Central Repository를 사용합니다. 즉, repo를 설정하기 위해 추가 구성을 수행할 필요가 없습니다. 종속성만 나열하면 됩니다.

네 번째 검색: [project dir]/app/build.gradle에 프로젝트 종속성이 나열됩니다.

자바에서 Gradle을 사용해 본 경험이 있는 사람들에게는 분명하지만, 이것을 이해하는 데 시간이 좀 걸렸습니다. 만사들오이람 "약추가요 "그세, 하냥요세오하▁if▁add▁" "라고 말하는 사람들을 , 그냥추가."라고 말하는 것을 본다면.compile 'this-or-that.jar', 또는비것한슷알아그, 세요두을것▁that요▁or▁know알세,아▁similar두.compile컴파일 시간 종속성을 나타내는 해당 build.gradle 파일의 지시어입니다.의존성 관리에 대한 공식 Gradle 페이지입니다.

다섯 번째 검색:스리텐ABP는 ThreeTen이 아닌 Jake Wharton에 의해 관리됩니다.

하지만 또 다른 문제는 제가 너무 많은 시간을 들여 알아냈다는 것입니다.메이븐 센트럴에서 쓰리텐을 찾는다면, 당신은 오직 패키지들만 볼 수 있을 것입니다.threetenbp,것은 아니다.threetenabpThreeTenABP의 깃허브 레포에 가면 그 악명 높은 것을 볼 수 있을 것입니다.compile 'this-or-that'를 클릭합니다.

처음 이 Github repo를 쳤을 때, 저는 그 컴파일 라인이 무엇을 의미하는지 몰랐고, 제 터미널에서 실행하려고 했습니다(분명하고 예측 가능한 실패).한 지 .com.jakewharton.threetenabp 대로반.org.threeten리포. 그래서 쓰리텐ABP 패키지가 메이븐 리포에 없는 줄 알았어요

요약: 작동하기

이제 모든 것이 꽤 쉬워 보입니다.Android 프로젝트에서 최신 시간 처리 기능을 사용할 수 있습니다.[project folder]/app/build.gradle파일에 다음이 있습니다.implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1' 그안 에의 한 줄.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'
}

응용 프로그램 클래스에도 추가:

public class App extends Application {    
    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
        //...
    }
}

kael이 수락한 답변이 맞습니다.추가로 몇 가지를 언급하고 java.time 기능을 얻는 것에 대한 다이어그램을 제공하겠습니다.

java.time을 Android 26+에 내장

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

거의 동일한 API

Android용 쓰리텐ABP대부분자바.time 기능을 Java 6 및 Java 7에 제공하는 ThreeTen-Backport 라이브러리를 적용한 입니다.이 백포트는 java.time과 거의 동일한 API를 공유합니다.

26보다 이전 안드로이드를 목표로 삼아서 ThreeTenABP를 사용한다고 가정해 보겠습니다.나중에 Android와 함께 번들로 제공되는 java.time 클래스를 사용하기 위해 이러한 이전 버전의 Android에 대한 지원이 중단될 수 있습니다.이 경우 (a) 전환 이외에 코드베이스를 몇 가지 변경해야 합니다.import문, 그리고 (b) 이전의 레거시 날짜-시간 클래스에 추가된 새로운 변환 방법을 사용하기 위해 걸려온 모든 통화 변경)Date,GregorianCalendar).

ThreeTen으로부터의 전환 과정ABP to java.time은 매끄럽고 거의 통증이 없어야 합니다.

어떤 프레임워크를 사용해야 하는지

다음은 세 가지 프레임워크를 보여주는 차트이며, 어떤 시나리오에서 어떤 프레임워크를 사용해야 하는지를 보여줍니다.

◦ 업데이트:Android Gradle Plugin 4.0.0+는 새로운 네 번째 옵션인 API desugaring을 제공하여 이전 Android에 원래 내장되지 않은 java.time 기능의 하위 집합을 사용할 수 있도록 합니다.Kael의 주요 답변 상단을 참조하십시오.

Table of which java.time library to use with which version of Java or Android


java.time 정보

java.time 프레임워크는 Java 8 이상에 내장되어 있습니다.이러한 클래스는 , , 및 와 같은 문제가 있는 오래된 기존 날짜/시간 클래스를 대체합니다.

자세한 내용은 오라클 튜토리얼을 참조하십시오.그리고 스택 오버플로를 검색하여 많은 예와 설명을 찾습니다.사양은 JSR 310입니다.

현재 유지보수 모드에 있는 Joda-Time 프로젝트는 java.time 클래스로 마이그레이션할 것을 권장합니다.

java.time 개체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이상을 준수하는 JDBC 드라이버를 사용합니다.문자열이 필요하지 않고, 필요하지 않습니다.java.sql.*반.최대 절전 모드 5 및 JPA 2.2는 java.time을 지원합니다.

java.time 클래스는 어디서 얻습니까?

Android Studio의 빌드 그래들(모듈 수준) 파일에 다음을 추가합니다.

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

응용 프로그램 클래스를 만들고 다음과 같이 초기화합니다.

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

언급URL : https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project

반응형