diff options
Diffstat (limited to 'android')
| -rw-r--r-- | android/BuildInstructions.md | 145 | ||||
| -rw-r--r-- | android/README.md | 4 |
2 files changed, 149 insertions, 0 deletions
diff --git a/android/BuildInstructions.md b/android/BuildInstructions.md new file mode 100644 index 0000000000..5566a6d310 --- /dev/null +++ b/android/BuildInstructions.md @@ -0,0 +1,145 @@ +These instructions are for building the app for Android **under Linux**. + +# Set up build environment + +These instructions are probably not complete. If you find something more that needs installing +on your platform please submit an issue or a pull request. + +- Docker is required to build `wireguard-go`. Follow the + [instructions](https://docs.docker.com/engine/install/debian/) for your distribution. + +- Install a protobuf compiler (version 3 and up), it can be installed on most major Linux distros + via the package name `protobuf-compiler` (Fedora also requires `protobuf-devel`). + +## Android toolchain + +- Install the JDK + + ```bash + sudo apt install zip default-jdk + ``` + +- Install the SDK + + The SDK should be placed in a separate directory, like for example `~/android` or `/opt/android`. + This directory should be exported as the `$ANDROID_HOME` environment variable. + + ```bash + cd /opt/android # Or some other directory to place the Android SDK + export ANDROID_HOME=$PWD + + wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip + unzip commandlinetools-linux-6609375_latest.zip + ./tools/bin/sdkmanager "platforms;android-29" "build-tools;29.0.3" "platform-tools" + ``` + + If `sdkmanager` fails to find the SDK root path, pass the option `--sdk_root=$ANDROID_HOME` + to the command above. + +- Install the NDK + + The NDK should be placed in a separate directory, which can be inside the `$ANDROID_HOME` or in a + completely separate path. The extracted directory must be exported as the `$ANDROID_NDK_HOME` + environment variable. + + ```bash + cd "$ANDROID_HOME" # Or some other directory to place the Android NDK + wget https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip + unzip android-ndk-r20b-linux-x86_64.zip + + cd android-ndk-r20b + export ANDROID_NDK_HOME="$PWD" + ``` + +## Configuring Rust + +- Get the latest **stable** Rust toolchain via [rustup.rs](https://rustup.rs/). + +### Install Rust Android targets + +Some environment variables must be exported so that some Rust dependencies can be +cross-compiled correctly: +``` +export NDK_TOOLCHAIN_DIR="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin" +export AR_aarch64_linux_android="$NDK_TOOLCHAIN_DIR/aarch64-linux-android-ar" +export AR_armv7_linux_androideabi="$NDK_TOOLCHAIN_DIR/arm-linux-androideabi-ar" +export AR_x86_64_linux_android="$NDK_TOOLCHAIN_DIR/x86_64-linux-android-ar" +export AR_i686_linux_android="$NDK_TOOLCHAIN_DIR/i686-linux-android-ar" +export CC_aarch64_linux_android="$NDK_TOOLCHAIN_DIR/aarch64-linux-android21-clang" +export CC_armv7_linux_androideabi="$NDK_TOOLCHAIN_DIR/armv7a-linux-androideabi21-clang" +export CC_x86_64_linux_android="$NDK_TOOLCHAIN_DIR/x86_64-linux-android21-clang" +export CC_i686_linux_android="$NDK_TOOLCHAIN_DIR/i686-linux-android21-clang" +``` + +```bash +rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android +``` + +### Set up cargo to use the correct linker and archiver + +This block assumes you installed everything under `/opt/android`, but you can install it wherever +you want as long as the `ANDROID_HOME` variable is set accordingly. + +Add to `~/.cargo/config.toml`: +``` +[target.aarch64-linux-android] +ar = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar" +linker = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang" + +[target.armv7-linux-androideabi] +ar = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar" +linker = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang" + +[target.x86_64-linux-android] +ar = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android-ar" +linker = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang" + +[target.i686-linux-android] +ar = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android-ar" +linker = "/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android21-clang" +``` + +# Building a debug build + +Run `build-apk.sh` with `--dev-build` to build the Rust daemon and the UI in debug mode and sign the +APK with automatically generated debug keys: +```bash +../build-apk.sh --dev-build +``` + +If the above fails with an error related to compression, try allowing more memory to the JVM: +```bash +echo "org.gradle.jvmargs=-Xmx4608M" >> ~/.gradle/gradle.properties +./gradlew --stop +``` + +# Building a release build + +## Configure signing key + +In order to build release APKs, they need to be signed. First, a signing key must be generated and +stored in a keystore file. In the example below, the keystore file will be +`/home/user/app-keys.jks` and will contain a key called `release`. + +``` +keytool -genkey -v -keystore /home/user/app-keys.jks -alias release -keyalg RSA -keysize 4096 -validity 10000 +``` + +Fill in the requested information to generate the key and the keystore file. Suppose the file was +protected by a password `keystore-password` and the key with a password `key-password`. This +information should then be added to the `android/keystore.properties` file: + +``` +keyAlias = release +keyPassword = key-password +storeFile = /home/user/app-keys.jks +storePassword = keystore-password +``` + +## Building and packaging the app + +Running the `build-apk.sh` script will build the necessary Rust daemon for all supported ABIs and +build the final APK: +```bash +../build-apk.sh +``` diff --git a/android/README.md b/android/README.md index c45092b4da..3dbcb3be61 100644 --- a/android/README.md +++ b/android/README.md @@ -2,6 +2,10 @@ This directory contains the files specific to the Android app. +## Building the app + +See the [build instructions](BuildInstructions.md) for help building the app. + ## Translations / Localization ### How to update translations |
