Mozc for AndroidをUbuntu 22.04でビルドする方法
以前はMozcにはAndroid版も提供されており、F-Droidから利用する事が出来た。
通常の端末では、このF-Droidでのバイナリリリースを用いれば良いのだが、F-Droidではx86リリースが提供されていない。
x86に対応した自由なIMEとしては、OpenWnn、nicoWnnGなどがあるが、これらは非常に古い上、Androidの物理キーボード設定に、日本語106/109キーボードの項目を追加しない。そのため、Androidを106/109キーボードに対応させるには、Mozcなどのインストールが必須になっている。
Android-x86やAVDなどではこのままでは利用出来ないため、自分でビルドする必要があった。
しかしながら、Google 日本語入力のAndroid版の開発が停止しGboardに移行した事により、MozcからAndroid向けビルドが削除されてしまい、今となってはそのままではビルドする事が難しくなってしまった。
そこで、僕なりにビルド方法を調べ、纏めてみる事にする。
注意事項: Androidビルドが可能なMozcのバージョンが古いため、Mozcが依存しているいくつかのライブラリは古いものを使わざるを得ない。その非常に古い依存ライブラリの中には、脆弱性が残っているものもあるため、ビルド&実行は自己責任にてお願いしたい。
ビルド環境
・Ubuntu 22.04
今回はゼロから環境構築を行なう事、仮想マシンの準備が面倒だったため、debootstrapコマンドで用意したchroot環境でビルド作業を行なう。
・Dockerは、使わない
何であんな面倒で使いづらくて厄介で意味の分からないモノを使わなくちゃいけないのよ…
Mozcプロジェクトは、Dockerを使用してのビルドを推奨しているが、Dockerは使わない。
正直Dockerを使う意義が分からない。メモリ節約のためであればchroot環境の方が遥かに高速だし、手軽で扱い易く、ファイルの操作も簡単である。
「Dockerを使え」とある記事は、大抵本質を理解出来ない者が書いたアフェリエイト記事だと僕は信じている。勿論個人の考えなので、Docker好きなあなたはDocker使えばいい。そうでないなら絶対に推奨しない。個人の考えだが。もう一度言う、個人の考えだ。
必要なもの
・Mozcのソースコード
勿論必要なMozcのソースコードだが、現行のソースコードではAndroid版Mozcのビルドをサポートしていないし、そもそもビルド出来ないようになっている。そのため、やや古いバージョンのMozcのコードを使用する必要がある。
今回は、F-Droidで提供されているもののソースコードをそのまま利用する。このソースアーカイブには、後述するものを除き必要なサブモジュール類もそのまま入っているので、展開してすぐに使用出来る。
https://f-droid.org/repo/org.mozc.android.inputmethod.japanese_6028153_src.tar.gz (直リンク)
取得したら、適当な場所に展開する。
・OpenJDK 8
Mozcのビルドには、古いバージョンのJavaが必要になる。ただし、Ubuntu 22.04のリポジトリにはOpenJDK 11以降しか提供されていない。そのため、非公式ビルドのOpenJDK 8を利用する必要がある。
Debianの古いリポジトリを使用する方法や、PPAリポジトリを追加する方法があったが、前者は利用出来なくなった。後者はセキュリティ更新がなされておらず、セキュリティ的に推奨されない。そのためここでは、AzulによってビルドされたOpenJDKを利用する。Azulはどうやら、Java関連のサポートを行なっている企業らしい。
https://www.azul.com/downloads/を開き、少し下にスクロールしたら、「Java Version」には「Java 8 (LTS)」を、「Operating System」には「Ubuntu」を、「Architecture」には「x86 64-bit」を、「Java Package」には「JDK」を指定して、最も上に出てきたものをダウンロードする。.debパッケージ版をダウンロードするのが良いだろう。ここでは.debパッケージ版を取得した前提で解説する。
取得したパッケージをインストールしたら、
sudo update-alternatives –config java
sudo update-alternatives –config javac
をそれぞれ実行し、使用するJavaとして、先程インストールしたZulu 8を指定する。
通常であれば、「/usr/lib/jvm/zulu-8-amd64/jre/bin/java」という項目を選択すれば良い筈だ。
・Android NDK r16b
Mozcのエンジンなどはネイティブコードで実行される。これがMozcがアーキテクチャ毎に分かれている所以である。そのためAndroid NDKが必要だが、最新版NDKではARMアーキテクチャ向けのビルド等で問題が発生する。
バージョンr16bを用いる。
http://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip (直リンク)
NDKを適当な場所に展開したら、展開したディレクトリのパスを「ANDROID_NDK_HOME」環境変数に格納する。
・Android SDK r24.1.2
もちろん必要なAndroid SDK。MozcはAndroid 5.1を対象にビルドされるため、やや古いバージョンr24.1.2を使う。最新のSDKではいくつかのツールが不足または場所が移動しており、ビルドする事が出来ない。
http://dl.google.com/android/android-sdk_r24.1.2-linux.tgz (直リンク)
SDKを適当な場所に展開したら、展開したディレクトリのパスを「ANDROID_HOME」環境変数に格納する。
・guava-18.0.jar
Javaのユーティリティライブラリであるguavaだが、Mozcのビルドに必要となる。しかしながら、Mozcのソースコード内には含まれていない。いや、あるにはあるのだが、中身が空のファイルが代わりに入っているのだ。
そのため、自分で取得して、手作業で所定の位置に配置する必要がある。
Mavenのリポジトリ、https://repo1.maven.org/maven2/com/google/guava/guava/18.0/guava-18.0.jar (直ファイルリンク)から、guava-18.0.jarをダウンロードする。
ここで注意したいのが、このjarには2つの脆弱性が含まれている。くれぐれも自己責任で使用するように。
ダウンロードしたら、「(展開したMozcのディレクトリ)/src/third_party/guava/」に、「guava-18.0.jar」という名前で配置する。
・protobuf-3.5.0.jar
Protocol Bufferのjarも、これまた必要だが含まれていない。
しかし、最新版のprotobufでは、問題が発生しコンパイル出来ない。このため、やや古いバージョンのprotobufを利用する。
これも、Mavenのリポジトリ、https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.5.0/protobuf-java-3.5.0.jar (直ファイルリンク)から、protobuf-3.5.0.jarをダウンロードする。
おそらく3.5.0以外でも動作すると思われるが、数が多いので検証していない。僕の環境では3.5.0で上手く行ったので、3.5.0で進める。
こちらも注意で、このjarには4つの脆弱性が含まれている。くれぐれも自己責任で使用するように。
このファイルはまだ使わないので、適当なディレクトリに一旦置いておこう。
ビルド環境の構築
ビルドに必要なパッケージや開発環境をインストールしていく。
基本的には、(Mozcのディレクトリ)/docker下にあるdockerfile内で行われている事を現行環境に合わせて実行していくが、一部は追加の操作が必要な場合もあるため順を追って説明する。
以下のコマンドでビルドに必要な基本的なパッケージをインストールする。
sudo apt install -y clang python2 pkg-config curl bzip2 unzip make ninja-build libjsr305-java ant zip libc6-i386 lib32stdc++6 lib32z1 libc++-14-dev libncurses5
現在pythonはデフォルトでPython3がインストールされるようになっているが、当時のMozcのビルドにはPython 2が必要だ。そのため明示的にpython2パッケージをインストールする。
また、Mozcのビルドシステムは、「python」コマンドを実行した際にPython 2が実行される事を前提に設計されるため、そのままではビルドに問題が発生する。そこで、pythonコマンドを実行すればpython2が実行されるようにシンボリックリンクを作成する。
sudo rm /usr/bin/python
sudo ln /usr/bin/python2 /usr/bin/python
SDKとNDKの実行ファイルのあるフォルダを環境変数PATHに通す。以下のコマンドで一括で設定出来る。
export PATH="$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_NDK_HOME}"
最後に、以下のコマンドをそれぞれ実行して、Android SDKに必要なファイルをインストールする。
android update sdk --all --force --no-ui --filter android-22
android update sdk --all --force --no-ui --filter build-tools-22.0.0
android update sdk --all --force --no-ui --filter platform-tool
環境の構築がこれで完了したので、続いてビルドのための下準備に入る。
ビルド作業
基本的には、Mozcのドキュメントに従ってビルドしていくが、所々どうしても止まる。
まずは以下のコマンドを実行する。
python build_mozc.py gyp --target_platform=Android --android_arch=x86_64
今回はx86_64版をビルドするので、「–android_arch」オプションに「x86_64」を指定する。64ビットARMなら「arm64」を指定する。他のアーキテクチャについては大概想像付くだろうし、build_mozc.pyの内容を見れば良い。
「INFO: Done」と表示されれば成功だ。
次に、実際にビルドして行く。今回はリリースビルドをビルドするので、-cオプションにはReleaseが指定されているが、デバッグを行いたい場合は-cオプションに「Debug」を指定すればよい。
python build_mozc.py build -c Release android/android.gyp:apk
ここで、しばらくビルドしていると以下のようなエラーが表示されて止まる事がある。止まらずに正常に進む場合もある。止まらずに正常に進んだ場合は以下の操作は不要だ。
[618/671] ACTION guava_library: copy_jr305_library_8758c1fea834bf01369e71d8a3c9f9a9
FAILED: ../../android/libs/jsr305.jar
cd ../../android; python ../build_tools/copy_file.py \"\" libs/jsr305.jar
No such file or directory: "/home/(ユーザー名)/mozc/src/android/"""
これは、(Mozcのディレクトリ)/src/out_android/Release/obj/android/guava_library.ninjaファイルにバグがある事が原因だ。ちなみに、Debugビルドの場合は(Mozcのディレクトリ)/src/out_android/Debug/obj/android/guava_library.ninjaとなる。
このままではビルドが進まないので、修正する。
guava_library.ninja内から「rule guava_library_target_copy_jr305_library」を含む行を探す。僕の環境では24行目に含まれている。
その行下にある「command =」行を以下のように修正する。
command = :
僕の環境での、修正前と修正後は次のようになる。
「:」、つまり”何もしない”をさせる訳だ。ここを何もしないにしてしまっても、先へは進めてしまうのでこうしている。
再度ビルドコマンドを実行すると、今度は次のようなエラーで止まる。このエラーはほぼ確実に発生するはずだ。
[dx] ...while parsing com/google/protobuf/ExtensionRegistryFactory.class
[dx]
[dx] 1 error; aborting
BUILD FAILED
この表示になったら、今度は先程ダウンロードして取っておいたprotobuf-java-3.5.0.jarの出番である。
先程のprotobuf-java-3.5.0.jarを、「(Mozcのディレクトリ)/src/android/libs/」下に、「protobuf-java.jar」という名前で配置する。元からあった同名のファイルは壊れているので、そのまま上書きしてしまってよい。
この操作の後、再度またビルドコマンドを実行する。
しばらくすると、「BUILD SUCCESSFUL」と表示され、ビルドが正常終了する。
ビルドが正常終了した場合、「(Mozcのディレクトリ)/src/android/bin/MozcForAndroid-release-unsigned.apk」が生成されている。
この状態ではまだ未署名なため、apksignerなどを使用してAPKに署名する。
これでMozcのビルドは完了である。