【ExoPlayer】 flac拡張ライブラリをGitHub Actionsで作成できるようにしてみた

Android, flac, GitHub Actions

はじめに

Androidアプリ開発グループの深沢です。
今回、ビルド環境によってflac拡張ライブラリがうまく作成できないことがありましたので、環境に依存しないようCIで作成するようにした話を紹介したいと思います。

ExoPlayerとハイレゾ楽曲

私の携わっているアプリではハイレゾ楽曲再生に対応しています。ハイレゾ楽曲にはWAVやFLACなどいくつかの形式があるのですが、このアプリではFLACをサポートしています。ExoPlayerでFLAC楽曲を再生できるようにするには、FLACをデコードするための拡張ライブラリが必要で、これはExoPlayerのバージョン毎に更新する必要があります。作成手順など詳しくはこちらをご確認ください。

起きたこと

先日targetSDKを34に上げる対応をしたところ、楽曲が再生されなくなってしまいました。調べてみると、現行アプリのExoPlayerバージョンでは PlayerNotificationManager#registerReceiver()が使用されており、これがAPI34では対応されていなかったためということがわかりました。ExoPlayerのバージョンを最新のものに変更すると PlayerNotificationManager#registerReceiver()が使用されていないことがわかったので、ExoPlayerのバージョンアップを行いました。このことに伴って、拡張ライブラリの作り直しが必要になり、私は拡張ライブラリをローカルで作成しました。aarファイルは出力され、アプリに組み込むことはできたのですが、FLAC音源がXperia/Android9などの特定端末では再生できないという事象が起きました。

原因究明

コードを確認すると、Playerをセットするときに FlacLibrary.isAvailable()というメソッドがfalseで返っていました。これはFlacLibraryが機能していないことを意味しており、FLAC対応のハードウェアデコーダーが入っていない機種では再生ができなくなっていました。
先ほどデコードするための拡張ライブラリが必要と書きましたが、一部端末ではライブラリを使用しなくても端末内のハードウェアデコーダーがFLAC楽曲を再生できるようにデコードしてくれるので、ハイレゾ楽曲が問題なく再生できました。そのため、不具合の発見が遅れてしまったので、ExoPlayerを使用するときは FlacLibrary.isAvailable()を用いて確認するようにしましょう…
ちなみに、デバイスに搭載されているハードウェアデコーダーを調べる方法もあるようです。参考

原因特定のため色々試して拡張ライブラリを作成してみたところ、javaバージョンなどの環境が違う状態で拡張ライブラリを作成すると、 FlacLibrary.isAvailable()がtrueで返ってきていることがわかりました。このライブラリを使用すると、Xperiaでもハイレゾ楽曲が再生できたため、今回の事象の要因はビルド環境であることがわかりました。

そこで、今回はGitHubActionsを用いてビルド環境を統一し、誰でも機能するflac拡張ライブラリが作成できるようにしました。

拡張ライブラリ自動作成方法

  • .github/workflows内にymlファイルを作成します。
  • ワークフロー名などを設定します。

  • Android NDKをダウンロードして、 android-ndk-r21eのパスを変数化します。ubuntuを使用しているので、linux版でダウンロードしてください。

  • ExoPlayerの特定のバージョンをクローンし、チェックアウトします。

まず、GitHubリポジトリのSettings>Secrets and variables>Actions>Variablesタブに移動します。そこでNew Repository variablesボタンを押下してください。そうしたら、変数が設定できますので、Name:EXOPLAYER_VERSION, Value:任意のExoPlayerバージョン(今回はr2.19.1)を入力して、Add variableボタンを押下してください。これにより、ExoPlayerのバージョンを設定することができました。バージョンを変更したいときは、同じ場所から編集ができます。

clip-20240723161300.jpg

次に、ymlファイルに以下のようにクローン&チェックアウトするようステップを追加します。
ExoPlayer/ExoPlayer/extension/flac/src/main/をそれぞれ変数化します。

  • 続いて、 ExoPlayer/local.propertiesを作成し、sdkのパスを記載します。

  • flacライブラリのダウンロードを行い、 flac/に移動させます。

  • Android.mkにコンパイルフラグを追加します。

  • ndk-buildスクリプトを作成します。

  • ndk-buildを実行して、JNIライブラリを作成します。

  • gradlewを実行します。これで ${{ env.EXOPLAYER }}/extensions/flac/buildout/outputs/aar/にaarファイルが作成されます。

  • 作成されたaarファイルをGitHubからダウンロードできるようにします。

いざ実行

これで、ワークフローは完成です。実際に実行してみます。
実行が成功すると、ログの下でaarファイルがダウンロードできるようになります。

clip-20240723161440.png

このファイルをアプリに組み込んで、実際にFLAC楽曲を再生してみます。

以前作成した拡張ライブラリ使用時

before.gif

今回作成した拡張ライブラリ使用時

after.gif

以前作成した拡張ライブラリを使用すると、再生しようとしてもできなかったのですが、今回作成したものを使用したところ、無事Xperia/Android9でも再生することができました。

コードを確認すると、 FlacLibrary.isAvailable()がtrueになっており、無事flac拡張ライブラリが機能していることがわかりました。

bb073810789ef0cef19dfd5cc5973e97.png

以下、ymlファイルの全体です。説明としては省きましたが、変数確認ステップなど確認のため記載していたものも載せています。

flac拡張ライブラリを作成するときは是非参考にしてみてください。