注意: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'
}
まずディスカバリー:なぜ持って使用ThreeTenABP代わりのjava.time、ThreeTen・バックポート、あるいはジョダタイム
これは、新しい標準を定義する非常に長いプロセスの非常に短いバージョンです。これらのパッケージはすべてほぼ同じものです。Javaに最新の優れた処理機能を提供するライブラリです。違いは微妙ですが重要です。
最も明白な解決策は、組み込みjava.time
パッケージを使用することです。これは、Javaで日時を処理するための新しい標準的な方法だからです。これは、Joda-Timeライブラリに基づく時間処理の新しい標準提案であるJSR 310の実装です。
ただし、Java 8でjava.time
導入されました。マシュマロまでのAndroid はJava 7で動作します(「Android N」はJava 8言語機能を導入した最初のバージョンです)。したがって、Android N Nougat以上のみを対象としない限り、Java 8言語機能に依存することはできません(これが100%trueであるかどうかは実際にはわかりませんが、これが私の理解です)。そうjava.time
です。
JSR 310はJoda-Timeに基づいていたため、次のオプションはJoda-Timeかもしれません。ただし、ThreeTenABPのReadmeに示されているように、さまざまな理由から、Joda -Timeは最適なオプションではありません。
次はThreeTen-Backportjava.time
です。これは、Java 8 機能の多く(すべてではない)をJava 7にバックポートします。これは、ほとんどのユースケースで問題ありませんが、ThreeTenABP readmeに示されています。問題いるように、Androidでパフォーマンスの問題があります。
したがって、最後の、一見正しいオプションはThreeTenABPです。
2番目の発見:ビルドツールと依存関係管理
プログラムのコンパイル(特に、外部ライブラリの束を使用するプログラム)は複雑であるため、Javaはほぼ常に「ビルドツール」を使用してプロセスを管理します。Make、Apache Ant、Apache Maven、およびGradleはすべて、Javaプログラムで使用されるビルドツールです(比較については、この投稿を参照してください)。後で説明するように、GradleはAndroidプロジェクト用に選択されたビルドツールです。
これらのビルドツールには、依存関係管理が含まれます。Apache Mavenは、集中化されたパッケージリポジトリを最初に組み込んだようです。MavenはMaven Central Repositoryを導入しました。これによりcomposer
、Packagist を使用したphp およびrubygems.orgを使用したRubyと同等の機能が可能になりますgem
。言い換えると、Mavenセントラルリポジトリは、Maven(およびGradle)にとって、Packagistが作曲するものであり、バージョン管理されたパッケージの確実で安全なソースです。
3番目の発見:GradleがAndroidプロジェクトの依存関係を処理する
私のやるべきことの上位は、無料の電子ブックを含むGradleのドキュメントをここで読むことです。Androidの学習を始めた数週間前に読んだとしたら、GradleがMaven Central Repositoryを使用してAndroidプロジェクトの依存関係を管理できることは確かに知っていただろう。さらに、この StackOverflowの回答で詳しく説明されているように、Android Studio 0.8.9以降では、GradleはBintrayのJCenterを介して暗黙的にMaven Central Repositoryを使用します。つまり、リポジトリを設定するために追加の構成を行う必要はありません。依存関係。
4番目の発見:プロジェクトの依存関係が[project dir] /app/build.gradleにリストされている
繰り返しますが、JavaでGradleを使用した経験のある人には明らかですが、これを理解するにはしばらく時間がかかりました。「ああ、ただ追加するcompile 'this-or-that.jar'
」または同様のことを言っている人を見かけたら、それcompile
がコンパイル時の依存関係を示すbuild.gradleファイルのディレクティブであることを確認してください。ここだ公式Gradleのページには、依存関係の管理に。
第5の発見:ThreeTenABPはThreeTenではなくJake Whartonによって管理されています
さらに別の問題で、考え出すのに時間がかかりすぎました。Maven CentralでThreeTenを検索するとthreetenbp
、のパッケージのみが表示され、は表示されませんthreetenabp
。ThreeTenABPのgithubリポジトリにアクセスするcompile 'this-or-that'
と、Readmeのダウンロードセクションの下にその悪名高い行が表示されます。
私が最初にこのgithubリポジトリにアクセスしたとき、そのコンパイル行が何を意味するのかわからなかったので、ターミナルで実行しようとしました(明らかで予測可能なエラーが発生しました)。イライラして、私は残りの部分を理解してからしばらくして戻ってきませんでしたが、最終的には、com.jakewharton.threetenabp
レポではなくレポを指すMavenレポ行であることに気付きました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);
//...
}
}