問題タブ [retrolambda]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - レトロラムダ/マルチモジュールの混乱
私はレトロラムダを使用していますが、いくつかのテストでかなり混乱しました。
私の理解は次のとおりです。
- retrolambda を使用すると、いくつかの Java8 言語機能 (ラムダなど) を使用できますが、Java 8 クラスは使用できません: たとえば、追加のライブラリがないと、java8 ストリームを使用できません: HashSet<>.stream()は使用できません
- Java-8 機能 (ラムダ) を使用してコードを記述します。ソースコードは java8-class ファイルに変換され、retrolambda が起動して java8-class ファイルを java7-class ファイルに変換し、古い Android バージョン (Android 6 など) で実行できるようにします。
そのため、仮定をテストするために小さなテストプロジェクトを作成しましたが、よくわからないことがいくつかあります。誰かが明確にしてくれることを願っています。Heresは私のソース コードのタグです。これを参照します。
- マルチモジュール Android アプリケーション (1 つの Android モジュールと Java のみのモジュール) では、java8 機能を使用するすべてのモジュール (アプリと Java) に
retrolambda gradle プラグインを適用する必要があります。
- まず、java モジュールが javac によって java8 クラスのファイルにコンパイルされ、retrolambda がそれらを java7 に変換し、jar が構築されます。
- その後、アプリ モジュールは Java モジュールと同じ方法でコンパイルされます。ただし、jar の代わりに apk を取得します。すべてが java7 であり、Android 6 で問題なく使用できます。
- ソースコードには、機能しないはずの java8 コードを意図的に使用する単体テストがいくつかあります。
HashSet<>.stream()
- Android スタジオとエミュレーター: すべてのテストが機能する
- Android Studioとエミュレーターはretrolambdaをまったく使用せず、すべてをコンパイルしてjava8に実行するだけだと思います
- それを変更する方法はありますか?: たとえば、いずれかのテストでこれらの問題がすでに検出されているとよいでしょう。
- Gradle コマンド ライン ビルド:
gradle clean app:test
: 単体テストが機能するgradle clean java:test
: 単体テストは失敗します
- app モジュールのテストが機能し、Java モジュールのテストが失敗する理由がわかりません。なぜですか?
- Android スタジオとエミュレーター: すべてのテストが機能する
- Android 6を搭載した実際のデバイスでは、予想どおりすべてがクラッシュします
android - Retrolambda を Android Studio 3.0 Java 8 組み込み機能に置き換える
私のプロジェクトでは、人気のあるライブラリretrolambdaを使用しています。新しい Android Studio 3.0 Canary 1 をダウンロードしました。
新しいバージョンの Gradle などを使用するようにプロジェクトを更新しました。すべて問題ありません。
Android Studio 3 の新機能には、一部の Java8 機能のサポートが組み込まれています。新しい AS3 は、retrolambda を削除してこれらの機能を使用することを提案しています。
レトロラムダを削除しました。Gradle ビルドは成功しましたが、アプリがこのエラーでクラッシュしています (ラムダがある場所で)
プロジェクトで RxJava2 を使用しています。これが関連しているかどうかはわかりませんが、私の場合、Java8 の組み込み機能が機能していないようです。たぶん、「どこかに」何かを設定する必要がありますか?
私のGradleファイル
ルート プロジェクト
アプリモジュール