Wine for Android-x86をビルドする

元々の目的としては,x86Android端末 (具体的には,Zenfone 2) で エロゲ 電脳紙芝居ゲームをプレイできることを確認したかったのだが,d3d周りに問題があり修正したいため,自家ビルドするための環境を整えたのでメモとして残しておく.

参考

ビルドする際には以下のサイトを参考にした.

wiki.winehq.org

joshumax.github.io

OS

Debian 9 (stretch) を使用した.Debian 10 (buster)でOpenJDK 8を入れようとすると依存関係で嵌るのので,stretchを用いた方が良い.

環境構築

まずはaptで必要なパッケージを導入する.

apt install openjdk-8-jdk zip unzip curl 
apt build-dep wine

次はAndroid SDK Toolsのインストール.SDKのURLは最新版を確認して適宜変更してほしい. platformsとbuild-toolsのバージョンについては,API Levelに関係してそうな気がしたのでとりあえず23を指定した.このあたり詳しい方がいればご教示いただきたい. なお,$ANDROID_HOMEはユーザの書き込み権限がある場所 (ex: $HOME/android-sdk) を指定してほしい.

wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux-4333796.zip
export ANDROID_HOME="`pwd`/android-sdk"
export PATH="$ANDROID_HOME/tools/bin:$PATH"

sdkmanager "platforms;android-23"
sdkmanager "build-tools;23.0.3"
sdkmanager "ndk;20.0.5594570"
sdkmanager "platform-tools"
sdkmanager --licenses

export PATH="$ANDROID_HOME/platform-tools:$PATH"

NDKのtoolchainを構築.

export NDK_ROOT=$ANDROID_HOME/ndk/20.0.5594570
export TOOLCHAIN_VERSION="x86-4.9"
export TOOLCHAIN_TRIPLE="i686-linux-android"
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-23 --install-dir=android-toolchain --toolchain=$TOOLCHAIN_VERSION
export PATH=`pwd`/android-toolchain/bin:$PATH

SDKMAN!を導入し,SDKMAN!を用いてgradleを導入する.gradleのバージョンが新しすぎるとビルドに失敗する.gradle pluginが対応できるバージョンの範囲に収まっている必要があるらしい.

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install gradle 2.14.1

ビルド環境用Wineのビルド

今回はWine-4.11をビルドした.4.13くらいまでは公式ビルドでは動作したが,それより新しいバージョンでは起動時のSetting up ...画面から進まないバグがある.

wget https://dl.winehq.org/wine/source/4.x/wine-4.11.tar.xz
tar xf wine-4.11.tar.xz
cp wine-4.11 wine-4.11-native

Wineのコンパイルに必要なビルドツールはビルド環境で動作する必要があるため,ネイティブ版を一旦ビルドする.

cd wine-4.11-native
./configure --enable-win64
make -j4
cd ..

ターゲット用ライブラリのビルド

Wineが利用するライブラリをビルドする.今回はfreetype, libpng, mpg123をビルドしたが,公式ビルドではこれに加えてlibcups, libgmp, libgnutls, liblber-2.4, liblcms2, libldap_r-2.4, libtiff, libwjpeg, libxml2, libxsltが含まれている.

wget https://download.savannah.gnu.org/releases/freetype/freetype-2.10.0.tar.bz2
tar xf freetype-2.10.0.tar.bz2

cd freetype-2.10.0
./configure --host=$TOOLCHAIN_TRIPLE --prefix=`pwd`/output --without-zlib --with-png=no --with-harfbuzz=no
make -j4 && make install
cd ..
wget https://download.sourceforge.net/libpng/libpng-1.6.37.tar.xz
tar xf libpng-1.6.37.tar.xz

cd libpng-1.6.37
./configure --host=$TOOLCHAIN_TRIPLE --prefix=`pwd`/output
make -j4 && make install
cd ..

mpg123はビルドに失敗するが,src/libmpg123/.libs/libmpg123.soが生成されていればよい.

wget https://www.mpg123.de/download/mpg123-1.25.13.tar.bz2
tar xf mpg123-1.25.13.tar.bz2

cd mpg123-1.25.13
./configure --host=$TOOLCHAIN_TRIPLE --prefix=`pwd`/output --with-audio=dummy
make -j4
cd ..

ターゲット用Wineのビルド

cd wine-4.11
export CFLAGS="-O2"
export FREETYPE_CFLAGS="-I`pwd`/../freetype-2.10.0/output/include/freetype2"
export FREETYPE_LIBS="-L`pwd`/../freetype-2.10.0/output/lib"
export PNG_CFLAGS="-I`pwd`/../libpng-1.6.37/output/include"
export PNG_LIBS="-L`pwd`/../libpng-1.6.37/output/lib"
export MPG123_CFLAGS="-I`pwd`/../mpg123-1.25.13/src/libmpg123"
export MPG123_LIBS="-L`pwd`/../mpg123-1.25.13/src/libmpg123/.libs -lmpg123"

./configure --host=$TOOLCHAIN_TRIPLE host_alias=$TOOLCHAIN_TRIPLE --with-wine-tools=../wine-4.11-native --prefix=`pwd`/dlls/wineandroid.drv/assets

make -j4 && make install

# 先にビルドした共有ライブラリのコピー
cp ../freetype-2.10.0/output/lib/libfreetype.so dlls/wineandroid.drv/assets/x86/lib/
cp ../libpng-1.6.37/output/lib/libpng16.so dlls/wineandroid.drv/assets/x86/lib/
cp ../mpg123-1.25.13/src/libmpg123/.libs/libmpg123.so dlls/wineandroid.drv/assets/x86/lib/

# dlls/wineandroid.drv/assets にインストールされたファイルを含めてapkを生成し直す
make -C dlls/wineandroid.drv clean all

ここまでで,dlls/wineandroid.drv/wine-debug.apkが生成されるはずである.適切にビルドされていれば容量は60MB程度になる.

Android端末へのインストール

バイスとUSBで接続し,adbに接続する.

sudo -E `which adb` start-server
adb devices

バイス名の横にdeviceと表示されることを確認する.unauthorizedであれば,USBデバッグを許可する.

バイスへpush installする.-rは再インストール時に指定するもので,初回インストール時は不要である.また,公式ビルドは事前にアンインストールする必要がある.

abd install -r dlls/wineandroid.drv/wine-debug.apk

あとがき

結局のところ,ほとんどのエロゲ 電脳紙芝居ゲーム (というより,ゲームエンジン) は動作しなかった.調査したところ,wined3dはOpenGLを想定して書かれており,OpenGL ESしか使用できないAndroid (6.0) 環境には対応しきれていないようだった.簡単に修正できればと思いビルド環境を構築したが,OpenGL及びOpenGL ESには詳しくないため,どのようにすればOpenGL ESに対応できるかを調査するためには時間が掛かりそうと気づいたので放置する.