Difference between revisions of "Compiling ScummVM/Android"
Praetorian (talk | contribs) |
Praetorian (talk | contribs) |
||
Line 127: | Line 127: | ||
If successful, the debug apk file will be created inside a <code>debug</code> subfolder in the ScummVM repository folder. The default name will be <code>ScummVM-debug.apk</code>. | If successful, the debug apk file will be created inside a <code>debug</code> subfolder in the ScummVM repository folder. The default name will be <code>ScummVM-debug.apk</code>. | ||
A debug build will be signed automatically by a debug certificate. This certificate will be created by default inside a <code>.android</code> subfolder in your <code>${ANDROID_SDK_HOME}</code> path, which here is the host path: <tt>~/Workspace/android-scummvm-bb/.android/</tt>. The debug keystore is named appropriately 'debug.keystore'. For instructions on how to create a debug signing certificate manually, please refer to the [https://developer.android.com/studio/publish/app-signing#debugmode Android Developers instructions here] | A debug build will be signed automatically by a debug certificate. This certificate will be created by default inside a <code>.android</code> subfolder in your <code>${ANDROID_SDK_HOME}</code> path, which here is the host path: <tt>~/Workspace/android-scummvm-bb/bshomes/sdk-home/.android/</tt>. The debug keystore is named appropriately 'debug.keystore'. For instructions on how to create a debug signing certificate manually, please refer to the [https://developer.android.com/studio/publish/app-signing#debugmode Android Developers instructions here] | ||
'''For a release build''', run the following series of commands from inside the local scummvm repository folder (you should be in there by default after running the 'docker run' command): | '''For a release build''', run the following series of commands from inside the local scummvm repository folder (you should be in there by default after running the 'docker run' command): |
Revision as of 12:04, 3 May 2021
Compiling ScummVM for Android
This page describes how to build Android packages from the ScummVM source tree. While one can manually go through the process of installing and configuring the toolchains for the target Android architectures, and cross-compiling any third party libraries (again for each target architecture), currently the recommended method is to use a Docker container that can be built using scripts from our Dockerised Buildbot repository. This page will cover how to build ScummVM for the supported target Android architecture using the Docker container method.
However, one can still attempt the manual way of setting up the Android toolchain(s), without using Docker containers, by following the logic and commands in our scripts for building the Docker images.
Preparatory work
On a Linux 64bit distribution
You will to run a recent Linux 64bit distribution, eg. Ubuntu 16.04 LTS or higher (or equivalent). These instructions were tested on a host running Ubuntu x64 20.04 LTS.
Install the git package in order to clone the ScummVM source code repository and keep it up-to-date, and also some additional packages to build the Docker toolchain containers:
sudo apt-get update sudo apt-get upgrade sudo apt-get install git m4 make
Follow the instructions on the official Docker documentation page to install the Docker Engine on Linux. We tested with Docker Engine Community Edition 19.03.12, (build 48a66213fe) using containerd.io version 1.2.13 on Linux Ubuntu x64 20.04 LTS.
On Windows 10 (version 1904 or higher) using WSL2
Please, follow the instructions on the official Docker documentation page to install the Docker Engine on Windows 10 using WSL2. This process requires rebooting your PC at least a couple of times. The instructions also link to appropriate documentation on how to enable WSL on Windows and install a Linux distribution from the Windows Store. These instructions were tested with the Ubuntu 20.04 LTS app installed.
After enabling WSL2, and running Docker Desktop (with WSL integration), launch a bash shell for your installed Linux distribution by running the respective Windows app (here, Ubuntu 20.04 LTS). You can launch multiple bash shells by running the Linux distribution app multiple times.
From the Linux bash shell do:
sudo apt-get update sudo apt-get upgrade sudo apt-get install git m4 make
- Important note: The instructions below assume that you are running the commands from a Linux bash shell. If you're on Windows, please make sure you always have Docker Desktop up and running before launching your Linux bash shell(s).
Setting up the environment
In this step we will fetch the latest code from the ScummVM source code repository, and create a few additional folders and files that will help in the building process and/or improve its ease of use (eg. by maintaining the history of submitted commands).
From your Linux host shell do:
mkdir -p ~/Workspace mkdir -p ~/Workspace/android-scummvm-bb/bshomes touch ~/Workspace/android-scummvm-bb/.bash_history sudo chmod o+rw ~/Workspace/android-scummvm-bb/.bash_history
Now clone the ScummVM repository:
cd ~/Workspace git clone https://github.com/scummvm/scummvm.git
Also clone the ScummVM dockerized buildbot repository and build the Docker containers:
git clone https://github.com/scummvm/dockerized-bb.git ~/Workspace/android-scummvm-bb/dockerized-bb cd ~/Workspace/android-scummvm-bb/dockerized-bb make toolchains/android
At this point the docker images
command should return something like the following:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE toolchains/android latest 2005faedc472 22 minutes ago 3.9GB toolchains/android-common latest c726cca9065b About an hour ago 30kB toolchains/common latest c751ec410582 About an hour ago 24.7kB
- Important note: From time to time, you may need get updates from our Dockerized buildbot code (using
git pull
) and rebuild the toolchain containers, in order to make use of the latest improvements and any additional third party cross-compiled libraries.
Launch the Docker container
Now launch the Docker container shell:
docker run -v ~/Workspace/scummvm:/data/scummvm \ -v ~/Workspace/android-scummvm-bb/bshomes:/data/bshomes/android \ -v ~/Workspace/android-scummvm-bb/.bash_history:/root/.bash_history \ -w /data/scummvm \ -it toolchains/android \ /bin/bash
Compiling
Set the environment variables
First, make sure that the required environment variables are set with the correct values:
export RO_ANDROID_ROOT=/opt/android \ ANDROID_EXTERNAL_ROOT=/data/bshomes/android \ HOST_TAG=linux-x86_64
Then run:
export ANDROID_NDK_ROOT=${RO_ANDROID_ROOT}/ndk \ ANDROID_TOOLCHAIN=${RO_ANDROID_ROOT}/ndk/toolchains/llvm/prebuilt/linux-x86_64 \ ANDROID_SDK_ROOT=${ANDROID_EXTERNAL_ROOT}/sdk \ ANDROID_SDK_HOME=${ANDROID_EXTERNAL_ROOT}/sdk-home \ GRADLE_USER_HOME=${ANDROID_EXTERNAL_ROOT}/gradle \ ANDROID_SDK_BTOOLS_VERSION=29.0.3
- Important note 1: The above command reflects the SDK build tools version installed by the container at the time of writing. This version string may need updating if the container is updated to set up a more recent version of the SDK build tools.
- Important note 2: Essentially, the set up of the SDK build tools path as an environmental variable, which is appended to the
$PATH
environemental variable below, is required only for running theapksigner
command to sign a release build manually.
Additionally, run:
export ANDROID_SDK_TOOLS=${ANDROID_SDK_ROOT}/tools \ ANDROID_SDK_BTOOLS=${ANDROID_SDK_ROOT}/build-tools/${ANDROID_SDK_BTOOLS_VERSION} \ PATH=${ANDROID_SDK_TOOLS}:${ANDROID_SDK_BTOOLS}:${PATH} \ NDK_LOG=1 \ LC_ALL=C \ CCACHE_COMPRESS=1
Also, after setting up these variables, run the following command:
mkdir -p "${ANDROID_SDK_ROOT}" "${ANDROID_SDK_HOME}" "${GRADLE_USER_HOME}" cp -R "${RO_ANDROID_ROOT}"/sdk/licenses "${ANDROID_SDK_ROOT}"/licenses
- Important note: The above command is only required to be run once, since it sets up some required folders and copies required SDK licenses to the external mounted folders (on the host Linux, outside the container itself)
Configuring and Compiling ScummVM
From your Linux host (ie. not from within the Container shell):
You should probably first make sure you are working with the latest ScummVM code. Please, run:
cd ~/Workspace/scummvm git pull
From the Docker container shell:
TODO The following instructions build for the 'android-arm64-v8a' architecture. A slightly different configure command is required for the other target architectures
Supported target architectures for the configure command (values for the --host
switch parameter):
android-arm-v7a
- for older Android devicesandroid-arm64-v8a
- for all new Android devicesandroid-x86
- ideal for emulator with 32bit imagesandroid-x86_64
- ideal for emulator with 64bit images
For a debug build, run the following series of commands from inside the local scummvm repository folder (you should be in there by default after running the docker run
command):
rm -rf android_project rm -rf debug rm -rf release CXX="ccache ${ANDROID_TOOLCHAIN}/bin/aarch64-linux-android21-clang++" PKG_CONFIG_LIBDIR="${ANDROID_TOOLCHAIN}/sysroot/usr/lib/aarch64-linux-android/21/pkgconfig" PATH=${PATH}:"${ANDROID_TOOLCHAIN}/sysroot/usr/bin/aarch64-linux-android/21" make clean; ./configure --enable-verbose-build --enable-all-engines --host=android-arm64-v8a --enable-debug make -j$(nproc) androiddistdebug
If successful, the debug apk file will be created inside a debug
subfolder in the ScummVM repository folder. The default name will be ScummVM-debug.apk
.
A debug build will be signed automatically by a debug certificate. This certificate will be created by default inside a .android
subfolder in your ${ANDROID_SDK_HOME}
path, which here is the host path: ~/Workspace/android-scummvm-bb/bshomes/sdk-home/.android/. The debug keystore is named appropriately 'debug.keystore'. For instructions on how to create a debug signing certificate manually, please refer to the Android Developers instructions here
For a release build, run the following series of commands from inside the local scummvm repository folder (you should be in there by default after running the 'docker run' command):
rm -rf android_project rm -rf debug rm -rf release CXX="ccache ${ANDROID_TOOLCHAIN}/bin/aarch64-linux-android21-clang++" PKG_CONFIG_LIBDIR="${ANDROID_TOOLCHAIN}/sysroot/usr/lib/aarch64-linux-android/21/pkgconfig" PATH=${PATH}:"${ANDROID_TOOLCHAIN}/sysroot/usr/bin/aarch64-linux-android/21" make clean; ./configure --enable-verbose-build --enable-all-engines --host=android-arm64-v8a --disable-debug --enable-release make -j$(nproc) androiddistrelease
If successful, the release apk file will be created inside a release
subfolder in the ScummVM repository folder.
Please note that a release build must be signed with a non-debug key in order to be installed on a Android device. In order to sign a release build, assuming you have created a release keystore named scummvm-release-key.keystore
and have put it in your ${ANDROID_SDK_HOME}
path on the host Linux, you will need to run a command like the following:
apksigner sign --ks ${ANDROID_SDK_HOME}/scummvm-release-key.keystore --out release/scummvm-release-signed.apk release/ScummVM-release-unsigned.apk
Installing the apk on an Android Device
The quickest way to install a debug apk or a signed release apk on your Android Device is to use the Profile or Debug APK
functionality of Android Studio.
- Important note: On Windows 10, you'll likely have Android Studio set up on the Windows host side. Hence, you will need to copy your apk from the Linux WSL2 environment to a Windows accessible folder. Since WSL2 mounts Windows folders by default under
/mnt/
, you could run from your Linux host (ie. not from inside the Docker Container) something similar to the following:
cp release/scummvm-release-signed.apk /mnt/c/scummvm-android-apks/
Android Studio setup
After compiling there in the build directory (if used) there will be a new directory called android-project, this can be opened by Android Studio. C files are not yet available, but it is possible to edit the Java source files and debug both Java & native code (in emulator or on a real device via adb connection). To enable debugging, after opening the android-project directory change Project configuration, under tab Debugger, set field Debug type to Dual