元々の目的としては,x86なAndroid端末 (具体的には,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/
make -C dlls/wineandroid.drv clean all
ここまでで,dlls/wineandroid.drv/wine-debug.apk
が生成されるはずである.適切にビルドされていれば容量は60MB程度になる.
デバイスと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に対応できるかを調査するためには時間が掛かりそうと気づいたので放置する.