注意:この回答は技術的には正しいですが、現在は古くなっています
Android Gradle Plugin 4.0.0+ を介して、Java 8+ API desugar のサポートが利用可能になりました
(以下の Basil Bourque の回答も参照してください)
ThreeTenABP ライブラリの開発は終了しています。今後数か月以内に、Android Gradle プラグイン 4.0、java.time.*、およびそのコア ライブラリの desugar 機能への切り替えを検討してください。
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.timeJava で時刻と日付を処理する新しい標準的な方法であるため、最も明白な解決策は組み込みパッケージを使用することです。Joda-Timeライブラリをベースにした時間処理の新しい標準提案であるJSR 310の実装です。
ただし、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 の readmeが示すように、多くの理由から、Joda-Time は最適なオプションではありません。
次はThreeTen-Backportで、Java 8 のjava.time機能の多く (すべてではない) を Java 7 にバックポートします。これはほとんどのユースケースで問題ありませんが、ThreeTenABP の readmeに示されているように、Android ではパフォーマンスの問題があります。
したがって、最後の一見正しいオプションはThreeTenABPです。
2 つ目の発見: ビルド ツールと依存関係の管理
プログラムのコンパイル (特に多数の外部ライブラリを使用するプログラム) は複雑であるため、Java はほぼ常に「ビルド ツール」を使用してプロセスを管理します。Make、Apache Ant、Apache Maven、およびGradleはすべて、Java プログラムで使用されるビルド ツールです (比較については、この記事を参照してください)。後述するように、Gradle は Android プロジェクトのビルド ツールとして選ばれています。
これらのビルド ツールには、依存関係管理が含まれています。Apache Maven は、一元化されたパッケージ リポジトリを最初に組み込んだようです。Maven はMaven Central Repositoryを導入しました。これにより、Packagist を使用した phpcomposerおよび rubygems.org を使用した Ruby と同等の機能が可能になりますgem。言い換えれば、Maven (および Gradle) にとっての Maven セントラル リポジトリは、Composer にとっての Packagist と同じものであり、バージョン管理されたパッケージの決定的で安全なソースです。
3 つ目の発見: Gradle は Android プロジェクトの依存関係を処理する
私のやることリストの上位にあるのは、無料の電子ブックを含むここの Gradle ドキュメントを読むことです。Android を学び始めた数週間前にこの記事を読んでいれば、Gradle が Maven セントラル リポジトリを使用して Android プロジェクトの依存関係を管理できることを知っていたでしょう。さらに、このStackOverflow の回答で詳しく説明されているように、Android Studio 0.8.9 の時点で、Gradle は Bintray の JCenter を介して暗黙的に Maven セントラル リポジトリを使用します。つまり、リポジトリをセットアップするために追加の構成を行う必要はありません。依存関係。
4 つ目の発見: プロジェクトの依存関係が [project dir]/app/build.gradle にリストされている
繰り返しになりますが、Java で Gradle を使用した経験がある人には明らかですが、これを理解するのにしばらく時間がかかりました。「ああ、追加してください」などと言っている人を見かけたら、それがビルド時の依存関係を示す build.gradle ファイル内のディレクティブであることをcompile 'this-or-that.jar'知っておいてください。依存関係管理に関する Gradle の公式ページは次のとおりです。compile
第 5 の発見: ThreeTenABP は ThreeTen ではなく Jake Wharton によって管理されています
私が理解するのにあまりにも多くの時間を費やしたさらに別の問題。Maven Central で ThreeTen を探すとthreetenbp、 ではなくのパッケージのみが表示されますthreetenabp。ThreeTenABPのgithub リポジトリにアクセスcompile 'this-or-that'すると、Readme の [ダウンロード] セクションの下に悪名高い行が表示されます。
最初にこの github リポジトリにアクセスしたとき、そのコンパイル行の意味がわからなかったので、端末で実行しようとしました (明らかで予測可能な失敗がありました)。com.jakewharton.threetenabpイライラして、残りを理解してからしばらくしてから、レポではなく、レポを指している Maven Repo 行であることに最終的に気付きましたorg.threeten。そのため、ThreeTenABP パッケージは Maven リポジトリにないと思いました。
まとめ: 機能させる
今ではすべてがとても簡単に思えます。[project folder]/app/build.gradleファイルのセクションに次のimplementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'行があることを確認することで、Android プロジェクトで最新の処理関数を取得できます。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'
}
これも Application クラスに追加します。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
//...
}
}