Android

Prerequisites

Currently we only support building Skia for Android on a Linux or Mac host! In addition, we only use the Mac build for local development. All shipping variants are compiled on Linux for performance reasons.

The following libraries/utilities are required in addition to those needed for a standard skia checkout:

Check out the source code

Follow the instructions here for downloading the Skia source.

Inside your Skia checkout, platform_tools/android contains the Android setup scripts, Android specific dependencies, and the Android Viewer App.

You may need to install other dependencies:

tools/install_dependencies.sh

Setup the Android SDK

To finish setting up the Android SDK you need to download use the SDK to download the appropriate API level. To do this simply go to the directory where you installed the SDK and run the following commands

# You may want to add this export to your shell's .bash_profile or .profile
export ANDROID_SDK_ROOT=/path/to/android/sdk

$ANDROID_SDK_ROOT/tools/android update sdk --no-ui --filter android-19
$ANDROID_SDK_ROOT/tools/android update sdk --no-ui --filter android-23
$ANDROID_SDK_ROOT/tools/android update sdk -a -u -t 8

From here you will need to type ‘y’ to approve the license agreement and that is all. You will then have downloaded the SDK for API level 19 and 23(Android 4.4 KitKat and Android 6.0 Marshmallow) which will be used to build the Skia Viewer app. You can download as many other Android add-ons or APIs as you want, but you only are required to have these two in order to complete the Skia build process.

The last line in the script installs Android SDK Build-tools 22.0.1. Alternatively you can download the above packages with Android Studio, by clicking the Launch Standalone SDK Manager link in Tools > Android > SDK Manger.

Setup Environment for Android

The Android build needs to set up some specific variables needed by both GYP and Make. We make this setup easy for developers by encapsulating all the details into a custom script that acts as a replacement for make.

Syncing the Source

We provide a utility to sync both our git repository as well as any third-party dependencies. Simply run the command below:

# Sync the source
./bin/sync

Custom Android Build Script

The android_ninja script is a wrapper for the ninja command (provided by depot_tools) and is specifically designed to work with the Skia‘s build system. To use the script you need to call it from Skia’s trunk directory with the -d option plus any of the options or arguments you would normally pass to ninja (see descriptions of some of the other flags here).

export ANDROID_SDK_ROOT=/path/to/android/sdk
export ANDROID_HOME=/path/to/android/sdk
export PATH=$PATH:/path/to/depot_tools

cd skia
./platform_tools/android/bin/android_ninja -d nexus_10 # or nexus_7, galaxy_nexus, etc...

The -d option enables the build system to target the build to a specific architecture such as MIPS (generic), x86 (generic) and ARM (generic and device specific flavors for Nexus devices). This in turn allows Skia to take advantage of specific device optimizations (e.g. NEON instructions).

Faster rebuilds

You can use ccache to improve the speed of rebuilding:

# You may want to add this export to your shell's .bash_profile or .profile
export ANDROID_MAKE_CCACHE=[ccache]

Build and run executables on the device

The build system packages the Skia executables as shared libraries. As such, in order to run any executable on the device you must install the library and a launcher executable on your device. To assist in this process there is a script called android_run_skia that is located in the platform_tools/android/bin directory.

Run correctness tests

First build the app and then run it on an attached device:

./platform_tools/android/bin/android_ninja [-d device_id] dm

# uploads dm binary and resources and runs dm on the attached device
./platform_tools/android/bin/android_run_skia dm --resourcePath /data/local/tmp/skia/resources/

Run performance tests

Since nanobench tests performance, it usually makes more sense to run it in Release mode.

BUILDTYPE=Release ./platform_tools/android/bin/android_ninja [-d device_id] nanobench

# uploads and runs the nanobench binary on the attached device
./platform_tools/android/bin/android_run_skia --release nanobench

If you pass nanobench SKP files, it will benchmark them too.

./platform_tools/android/bin/[linux/mac]/adb push ../skp <dst> # <dst> is dir on device

Finally to run the executable there are two approaches. The simplest of the two run the app on the device like you would do for gm or tests, however this approach will also produce the noisiest results.

# <input> is file/dir on device
./platform_tools/android/bin/android_run_skia --release nanobench --skps <input>

Build and run Viewer App

The Viewer App on Android provides a simple UI for viewing sample slides and gm images.

BUILDTYPE=Debug ./platform_tools/android/bin/android_ninja -d $TARGET_DEVICE Viewer_APK

Then, install the app onto the device:

./platform_tools/android/bin/android_install_app

Finally to run the application you can either navigate to the Skia Viewer application using the application launcher on your device or from the command line. The command line option allows you to pass additional details to the application (similar to other operating system) that specify where to find skp files and other resources. For example:

./platform_tools/android/bin/android_launch_app --resourcePath /data/local/tmp/skia

By default if no additional parameters are specified the app will also have the following default parameters:

--skps /data/local/tmp/skia
--jpgs /data/local/tmp/skia

Android Studio Support

You can also build and run Viewer App (and some other experimental apps) using Android Studio. To create the project either select “import project” from the quickstart screen or use File -> Open. In both cases you'll need to select ./platform_tools/android/apps as the root directory of your project.

Finally to be able to build within Android studio it needs to know the path to ninja so you will need to add a properties file and populate it with the path to depot_tools. The syntax and location of that file is...

#
# file location: ./platform_tools/android/apps/gradle.properties
#
depot_tools.dir=<path_to_depot_tools>

That should be all the setup you need. You should now be able to build and deploy Viewer App on ARM, Intel, and MIPS devices.

Build tools

The Android platform does not support skdiff at this time.

Clean up all generated files

make clean

Debugging on Android

We support 2 modes of debugging on Android using GDB wrapper scripts. These scripts start a gdbserver instance on the device and then enter an interactive GDB client shell on your host. All necessary symbol files should be pulled from the device and placed into a temporary folder (android_gdb_tmp).

Note: The debugging scripts do not build the app - you'll have to do that first.

# COMMAND LINE APPS
# include additional arguments in quotes (e.g. "dm --nopdf")
./platform_tools/android/bin/android_gdb_native dm

# VIEWER APP
# make sure you've installed the app on the device first
./platform_tools/android/bin/android_gdb_app [-d device_id]

When the gdb client is ready, insert a breakpoint, and continue to let the program resume execution.