元々の目的としては,x86なAndroid端末 (具体的には,Zenfone 2) で エロゲ 電脳紙芝居ゲームをプレイできることを確認したかったのだが,d3d周りに問題があり修正したいため,自家ビルドするための環境を整えたのでメモとして残しておく.
参考
ビルドする際には以下のサイトを参考にした.
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に対応できるかを調査するためには時間が掛かりそうと気づいたので放置する.