BLOGSpeee開発陣による技術情報発信ブログです。基調講演をやらせてもらいました。#2の様子はこちらです。tech.speee.jp社内でこういうイベントがあるのはとてもいいですね。今回は自由テーマだったので、各人の興味分野が知れて大変楽しい一日でした。私も普段の仕事とはあまり関係ない自由研究として、Retropilerというツールを開発して発表しました。当日のプレゼンテーションはQiitaにあります。https://github.com/retropiler/retropilerこの資料はwhatにフォーカスしているので、それを補間すべくwhyとhowをこのエントリで書きます。このretropilerを開発した動機は、「Androidで最新のJavaを使えない」という問題に対して何かできないかと思ったためです。鳴かぬなら鳴かせてみせようホトトギスの精神というわけです。アプリでも実行できます。FOO});詳細はQiitaにポストした資料をご覧ください。Androidで最新のJavaを使えないとはどういうことかさて本題です。Androidの開発環境における「Javaのバージョン」はいくつかの考え方があり、自明ではありません。ここでは3つに分けて考えます。OS、それにバンドルされているDalvik処理系(仮想マシン)がどのJVMバージョンに相当するかというものです。feature)」として言及される場合はこのバージョンです。6相当と考えられています。6相当のDalvikバイトコードを生成するようです。OS、それにバンドルされているJava標準ライブラリのバージョンです。7以降はほぼJava8相当といえます。これはAndroidの公式ドキュメントでは「JavaのAPI」のバージョンと呼ばれています。最後に、Androidアプリケーションを開発する際にJavaコンパイラに与えるバージョンです。OSのバージョンとある程度独立しているため、ビルドツールの進歩により改善する余地があります。してアプリケーションをビルドできます。ここでdesugarとよばれるツールにより、一部のJava8の言語機能、たとえばラムダ式をminSdkVersionに関わらず使うことができます*1。OS)に機能を追加できるわけではありません。パッケージ、streamなどの標準ライブラリは使えません。これがAndroid開発の現状であり、「Androidで最新のJavaを使えない」という問題です。Retropilerが示したものさて、現状はこのとおりです。SDKに含まれる予定のdesugarは、ラムダなどの一部の言語機能をJava6のJVM向けに変換し、それをDalvikバイトコードに変換しますが、標準ライブラリに関しては何もしません。OSにバンドルされていない新しいJava標準ライブラリ相当のものを差し込むことはできるはずなのです。このコンセプトを証明するためにRetropilerを開発してみた結果、ビルドフェーズにおける標準ライブラリの差し替えが可能であることを実証できました。OSに足りないものを足してしまおうという発想です。世界のありようが気に入らなければ世界のほうを変えましょう。実装Retropilerは、Javassistを使ってバイトコードを編集するツールです。APIを使って実装しています。Javassistを使えばバイトコードをかなり自由に変更できます。バイトコードの知識は必要になりますが、Javassistができることはまさに魔法です。いうわけで、RetropilerはJava8のクラスライブラリをランタイムライブラリとして提供する必要があります。