Additional ANGLE developer instructions for all platforms (Windows, Linux, MacOS, and Android) are available here.
The full ANGLE for Android APK build uses the Chromium and Android build systems, so both the Chromium and Android repos must be cloned. Note that these instructions are only focused on building with Linux, since the Android build process is only supported on Linux and MacOS.
The following is a summary of the Checking out and building Chromium for Android page. Please refer to it for more details.
Clone the depot_tools repository:
mkdir /path/to/depot_tools && cd /path/to/depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
Add depot_tools to the end of your PATH (you will probably want to put this in your ~/.bashrc
or ~/.zshrc
).
export PATH="$PATH:/path/to/depot_tools"
Clone the Chromium repository:
mkdir /path/to/chromium && cd /path/to/chromium fetch --nohooks android
To use the ToT from the ANGLE repository in the Chromium build, modify Chromium's .gclient
file:
vi /path/to/chromium/.gclient
Update the custom_deps
section:
solutions = [ { "url": "https://chromium.googlesource.com/chromium/src.git", "managed": False, "name": "src", "custom_deps": { "src/third_party/angle": None, }, "custom_vars": {}, }, ] target_os=["android"]
Bootstrap the ANGLE build so it's got the correct .gclient
:
timvp@timvp:~/code/chromium/src/third_party/angle$ python scripts/bootstrap.py
Now update ANGLE to fetch the ToT.
The following is a summary of the directions available from the Downloading the Source page. Please refer to it for more details.
mkdir /path/to/bin/repo PATH=/path/to/bin/repo:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > /path/to/bin/repo chmod a+x /path/to/bin/repo
mkdir /path/to/android && cd /path/to/android
git config --global user.name "Your Name" git config --global user.email "you@example.com"
repo init -u https://android.googlesource.com/platform/manifest
To check out a branch other than “master”, specify it with -b. For a list of branches, see Source Code Tags and Builds.
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
To pull down the Android source tree to your working directory from the repositories as specified in the default manifest, run
repo sync
The Android source files will be located in your working directory under their project names. The initial sync operation will take an hour or more to complete.
In a shell separate from the Android shell:
cd /path/to/chromium git rebase-update gclient sync
In a shell separate from the Android shell:
cd /path/to/chromium/src/third_party/angle git rebase-update gclient sync
In a shell separate from the Chromium shell:
cd /path/to/android repo sync -c -j40 repo rebase
The first time you build the ANGLE for Android libraries on Linux:
cd /path/to/chromium/src/ ./build/install-build-deps.sh
NOTE: If the build/install-build-deps-android.sh
script fails, you may need to manually install some packages yourself, using sudo apt install
. Then, re-run the command to ensure it succeeds.
The build arguments need to be configured first:
cd /path/to/chromium/src gn args out/Default
NOTE: The gn args
command will open an editor to enter the desired ANGLE build arugments. The “Release” and “Debug” sections below contain values that can be used for either scenario.
Then the ANGLE shared objects can be built:
ninja -C out/Default third_party/angle:angle_apk
These commands will create the following ANGLE shared object libraries:
/path/to/chromium/src/out/Default/libEGL_angle.so /path/to/chromium/src/out/Default/libfeature_support_angle.so /path/to/chromium/src/out/Default/libGLESv1_CM_angle.so /path/to/chromium/src/out/Default/libGLESv2_angle.so
target_os = "android" target_cpu = "arm64" is_debug = false android32_ndk_api_level = 26 android64_ndk_api_level = 26 build_angle_deqp_tests = false dcheck_always_on = true ffmpeg_branding = "Chrome" is_component_build = false proprietary_codecs = true symbol_level = 1 angle_enable_vulkan = true angle_enable_vulkan_validation_layers = false angle_libs_suffix = "_angle" build_apk_secondary_abi = true angle_enable_null = false angle_force_thread_safety = true
target_os = "android" target_cpu = "arm64" is_debug = true android32_ndk_api_level = 26 android64_ndk_api_level = 26 build_angle_deqp_tests = true dcheck_always_on = true ffmpeg_branding = "Chrome" is_component_build = false proprietary_codecs = true symbol_level = 2 angle_enable_vulkan = true angle_enable_vulkan_validation_layers = true angle_libs_suffix = "_angle" build_apk_secondary_abi = true angle_enable_null = false angle_force_thread_safety = true
Once the Chromium ANGLE build has completed, copy the generated 32b and 64b ANGLE shared object libraries into the Android source tree:
cp /path/to/chromium/src/out/Default/android_clang_arm/lib*angle.so /path/to/android/vendor/unbundled_google/modules/ANGLEPrebuilt/lib/arm cp /path/to/chromium/src/out/Default/lib*angle.so /path/to/android/vendor/unbundled_google/modules/ANGLEPrebuilt/lib/arm64
Build the ANGLE APK:
cd /path/to/android source build/envsetup.sh tapas GoogleANGLE <arm|arm64|x86|x86_64> make -j
cd /path/to/android adb install out/target/product/generic_arm64/system/product/priv-app/GoogleANGLE/GoogleANGLE.apk
Android Q disables OpenGL ES driver preloading by default.
If the device is running something other than Q:
adb root adb shell setprop ro.zygote.disable_gl_preload 1 adb shell stop && adb shell start
For best results, it's recommended to configure Skia to use the Vulkan back-end:
adb shell setprop debug.hwui.renderer skiavk
To revert back to the default Skia backend:
adb shell setprop debug.hwui.renderer none
The ANGLE Developer Options allow for toggling various ANGLE settings:
Settings > Developer Options > ANGLE Preferences > Show dialog box when ANGLE is loaded
The “Select OpenGL Driver” section allows a user to specify which OpenGL ES driver is used for a particular package. Selecting an installed Application will present a dialog box with the following options:
Each (currently non-system) package can have a different value selected, which will persist across reboots.
adb
Commandsadb
can be used to set the necessary Global.Settings values to force package(s) to use ANGLE or the native driver.
adb shell settings put global angle_gl_driver_selection_pkgs <package name> adb shell settings put global angle_gl_driver_selection_values <driver>
The possible values for the <driver>
value are: angle
, native
, and default
, which correspond to the Developer Options selections.
For example, to enable ANGLE for the dEQP package:
adb shell settings put global angle_gl_driver_selection_pkgs com.drawelements.deqp adb shell settings put global angle_gl_driver_selection_values angle
Just like the Developer Options, this setting will persist across reboots.
ANGLE can be enabled for all packages with the following command:
adb shell settings put global angle_gl_driver_all_angle 1
This setting can be disabled by setting it back to 0
:
adb shell settings put global angle_gl_driver_all_angle 0
Note that this setting is disabled in the Developer Options, because it currently makes the device un-bootable. The only way to enable/disable this setting is with adb
to ensure that it‘s only toggled when the user has access to adb
so the device can be recovered if it’s accidentally left on across a reboot.
Part of the Android platform driver loading process is to analyze a JSON “rules file” within the ANGLE APK that specifies whether a particular package should use ANGLE or not based on certain criteria (device, GPU, Vulkan driver version, etc.).
The current rules file can be found at:
/path/to/chromium/third_party/angle/src/feature_support_util/a4a_rules.json
Modifying this file will influence the choice made by the Android GLES loader, either to enable or disable ANGLE for a package.
Additionally, a temporary rules file can be pushed to the device which will override the rules file within the ANGLE APK. After creating/modifying a new a4a_rules.json
file, it can be used by doing the following:
adb push a4a_rules.json /data/local/tmp/a4a_rules.json adb shell setprop debug.angle.rules /data/local/tmp/a4a_rules.json
This temporary file will be removed from the device and the property will be reset during the boot process, so these steps must be repeated after each boot completes.
A Toast message can be enabled with the “Show dialog box when ANGLE is loaded” setting in the ANGLE Developer Options. If enabled, whenever an app with ANGLE enabled is launched, a Toast message containing the package name will be presented indicating ANGLE is enabled.
To verify that the application is using ANGLE with logcat with verbose logging enabled (a debug Android build):
adb logcat
Verify the following text is output. In this example, “com.drawelements.deqp” is opted into ANGLE.
02-27 13:01:11.914 12134 12134 V GraphicsEnvironment: Package 'com.drawelements.deqp' should use ANGLE = 'true' [[[...]]] 02-27 13:01:11.947 12134 12157 I ANGLE : Vulkan 1.1.87(Adreno (TM) 540 (0x05040001))
Note that the Vulkan driver vender/version will likely be different.
ro.gfx.angle.supported
The system property ro.gfx.angle.supported
indicates that ANGLE is in the currently running Android image. This will cause CTS to verify that ANGLE can be enabled and disabled with the Global.Settings and rules file.
This system property must be set to true
in all Android images for devices that are required to include ANGLE.
Value | Description |
---|---|
true | ANGLE is supported in the currently running Android image. |
false | ANGLE is NOT supported in the currently running Android image. |
debug.angle.rules
The system property debug.angle.rules
can be set to the path to a temporary rules file that overrides the default rules file present in the ANGLE APK. If the path is inaccessible, the default rules file in the ANGLE APK will be used.
This property will be cleared during a reboot of the device.
Value | Description |
---|---|
/path/to/rulesFile.json | The path to the location of the temporary rules file. |
angle_gl_driver_all_angle
Force all Apps to use ANGLE. This overrides all other values that could disable ANGLE for a particular App.
NOTE: This currently makes the device unbootable when enabled due to the Android boot process, how ANGLE is loaded, and the capabilities of ANGLE. Due to this, the setting can only be enabled/disabled with adb
and not the Developer Options.
Value | Description |
---|---|
0 | Do not force all Apps to use ANGLE. |
1 | Force all Apps to use ANGLE. |
show_angle_in_use_dialog_box
Show a dialog box (Toast message) when the App is launched that indicates it is using ANGLE.
Value | Description |
---|---|
0 | Do not show the dialog box. |
1 | Show the dialog box. |
angle_gl_driver_selection_pkgs
The list of Packages that have their OpenGL driver selection being forced to a particular value. This list of packages corresponds 1:1 to the list angle_gl_driver_selection_values
.
Value | Description |
---|---|
<package name> | A package name or comma-separated list of package names. |
angle_gl_driver_selection_values
The list of Packages that have their OpenGL driver selection being forced to a particular value. This list of packages corresponds 1:1 to the list angle_gl_driver_selection_pkgs
.
Value | Description |
---|---|
angle | Force using ANGLE for the corresponding Package name. |
native | Force using the native driver for the corresponding Package name. |
default | Use the default driver determined by the rules file for the corresponding Package name. |
angle_whitelist
The list of package names present in the default rules file included in the ANGLE APK. This whitelist of package names is used to improve App startup time by only parsing the default rules file if the package name is present in the rules file.
Value | Description |
---|---|
<package name> | A package name or comma-separated list of package names. |