3

私はレトロラムダを使用していますが、いくつかのテストでかなり混乱しました。

私の理解は次のとおりです。

  • retrolambda を使用すると、いくつかの Java8 言語機能 (ラムダなど) を使用できますが、Java 8 クラスは使用できません: たとえば、追加のライブラリがないと、java8 ストリームを使用できません: HashSet<>.stream()は使用できません
  • Java-8 機能 (ラムダ) を使用してコードを記述します。ソースコードは java8-class ファイルに変換され、retrolambda が起動して java8-class ファイルを java7-class ファイルに変換し、古い Android バージョン (Android 6 など) で実行できるようにします。

そのため、仮定をテストするために小さなテストプロジェクトを作成しましたが、よくわからないことがいくつかあります。誰かが明確にしてくれることを願っています。Heresは私のソース コードのタグです。これを参照します。

  1. マルチモジュール Android アプリケーション (1 つの Android モジュールと Java のみのモジュール) では、java8 機能を使用するすべてのモジュール (アプリと Java) に retrolambda gradle プラグインを適用する必要があります。
    • まず、java モジュールが javac によって java8 クラスのファイルにコンパイルされ、retrolambda がそれらを java7 に変換し、jar が構築されます。
    • その後、アプリ モジュールは Java モジュールと同じ方法でコンパイルされます。ただし、jar の代わりに apk を取得します。すべてが java7 であり、Android 6 で問題なく使用できます。
  2. ソースコードには、機能しないはずの java8 コードを意図的に使用する単体テストがいくつかあります。HashSet<>.stream()
    1. Android スタジオとエミュレーター: すべてのテストが機能する
      • Android Studioとエミュレーターはretrolambdaをまったく使用せず、すべてをコンパイルしてjava8に実行するだけだと思います
      • それを変更する方法はありますか?: たとえば、いずれかのテストでこれらの問題がすでに検出されているとよいでしょう。
    2. Gradle コマンド ライン ビルド:
      • gradle clean app:test: 単体テストが機能する
      • gradle clean java:test: 単体テストは失敗します
    3. app モジュールのテストが機能し、Java モジュールのテストが失敗する理由がわかりません。なぜですか?
  3. Android 6を搭載した実際のデバイスでは、予想どおりすべてがクラッシュします
4

0 に答える 0