Edit

kc3-lang/angle/doc/DevSetupAndroid.md

Branch :

  • Show log

    Commit

  • Author : Cody Northrop
    Date : 2023-07-17 09:09:02
    Hash : a04d5443
    Message : Docs: Add a couple of Android pointers Hit some rough edges while setting up a clean install. Bug: angleproject:4347 Change-Id: I241cddac0c86d0eb00195e42304f50e2c7bba5e4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4688533 Auto-Submit: Cody Northrop <cnorthrop@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: Roman Lavrov <romanl@google.com> Commit-Queue: Roman Lavrov <romanl@google.com>

  • doc/DevSetupAndroid.md
  • # ANGLE for Android
    
    **Important note**: Android builds currently require Linux.
    
    ## Setting up the ANGLE build for Android
    
    Please follow the instructions in [DevSetup](DevSetup.md) to check out and bootstrap ANGLE with
    gclient. Then edit your `.gclient` to add `target_os = ['android']` to check out Android
    dependencies. Then run `gclient sync` to download all required sources and packages.
    
    The following command will open a text editor to populate GN args for an Android Release build:
    ```
    gn args out/Android
    ```
    
    Once the editor is up, paste the following GN args to generate an Android build, and save the file.
    ```
    target_os = "android"
    target_cpu = "arm64"
    is_component_build = false
    is_debug = false
    angle_assert_always_on = true   # Recommended for debugging. Turn off for performance.
    use_goma = true                 # Googlers-only! If you're not a Googler remove this.
    ```
    
    More targeted GN arg combinations can be found [below](#android-gn-args-combinations).
    
    If you run into any problems with the above, you can copy the canonical args from CI:
     - Visit the ANGLE [CI Waterfall](https://ci.chromium.org/p/angle/g/ci/console).
     - Open any recent Android build.
     - Expand the for "lookup GN args" step and copy the GN args.
     - Always omit the `goma_dir` flag.
     - If you are not a Googler, also omit the `use_goma` flag.
    
    ## Building ANGLE for Android
    
    Build all ANGLE targets using the following command:
    
    ```
    autoninja -C out/Android
    ```
    
    Most ANGLE build targets are supported. We do not support the ANGLE samples on
    Android currently. ANGLE tests will be in your `out/Android` directory, and can
    be run with various options. For instance, angle perftests can be run with:
    
    ```
    ./out/Android/angle_perftests --verbose --local-output --gtest_filter=DrawCallPerf*
    ```
    
    Additional details are in [Android Test Instructions][AndroidTest].
    
    Additional Android dEQP notes can be found in [Running dEQP on Android](dEQP.md#Running-dEQP-on-Android).
    
    If you are targeting WebGL and want to run with ANGLE, you will need to build within a full
    Chromium checkout. Please follow the [Chromium build instructions for Android][ChromeAndroid].
    Also refer to the [ANGLE Guide][ANGLEChrome] on how to work with Top of Tree ANGLE in Chromium.
    Build the `chrome_public_apk` target, and follow the [GPU Testing][GPU Testing] doc, using
    `--browser=android-chromium`. Make sure to set your `CHROMIUM_OUT_DIR` environment variable, so
    that your browser is found, otherwise the tests will use the stock browser.
    
    [AndroidTest]: https://chromium.googlesource.com/chromium/src/+/main/docs/testing/android_test_instructions.md
    [GPU Testing]: http://www.chromium.org/developers/testing/gpu-testing#TOC-Running-the-GPU-Tests-Locally
    [ChromeAndroid]: https://chromium.googlesource.com/chromium/src/+/main/docs/android_build_instructions.md
    [ANGLEChrome]: BuildingAngleForChromiumDevelopment.md
    
    ## Using ANGLE as the Android OpenGL ES driver
    
    Starting with Android 10 (Q), you can load ANGLE as your device's OpenGL ES driver.
    
    `== Important Note ==` You can only run this ANGLE with *DEBUGGABLE APPS* or when you have
    *ROOT ACCESS*. Debuggable apps are [marked debuggable][Debuggable] in the manifest. For root
    access, see the [Android documentation][UserDebug] for how to build from source.
    
    To build the ANGLE APK, you must first bootstrap your build by following the steps
    [above](#ANGLE-for-Android). The steps below will result in an APK that contains the ANGLE
    libraries and can be installed on any Android 10+ build.
    
    Apps can be opted in to ANGLE [one at a time](#ANGLE-for-a-single-OpenGL-ES-app), in
    [groups](#ANGLE-for-multiple-OpenGL-ES-apps), or [globally](#ANGLE-for-all-OpenGL-ES-apps). The
    apps must be launched by the Java runtime since the libraries are discovered within an installed
    package. This means ANGLE cannot be used by native executables or SurfaceFlinger at this time.
    
    ## Building the ANGLE APK
    
    Using `gn args` from above, you can build the ANGLE apk using:
    ```
    autoninja -C out/Android angle_apks
    ```
    
    ## Installing the ANGLE APK
    
    ```
    adb install -r -d --force-queryable out/Android/apks/AngleLibraries.apk
    ```
    You can verify installation by looking for the package name:
    ```
    $ adb shell pm path org.chromium.angle
    package:/data/app/org.chromium.angle-HpkUceNFjoLYKPbIVxFWLQ==/base.apk
    ```
    
    Note that `angle_debug_package` must be set to `org.chromium.angle` for this apk to be loaded.
    
    ## Selecting ANGLE as the OpenGL ES driver
    
    For debuggable applications or root users, you can tell the platform to load ANGLE libraries from
    the installed package.
    ```
    adb shell settings put global angle_debug_package org.chromium.angle
    ```
    Remember that ANGLE can only be used by applications launched by the Java runtime.
    
    ## ANGLE driver choices
    
    There are multiple values you can use for selecting which OpenGL ES driver is loaded by the platform.
    
    The following values are supported for `angle_gl_driver_selection_values`:
     - `angle` : Use ANGLE.
     - `native` : Use the native OpenGL ES driver.
     - `default` : Use the default driver. This allows the platform to decide which driver to use.
    
    In each section below, replace `<driver>` with one of the values above.
    
    ### ANGLE for a *single* OpenGL ES app
    
    ```
    adb shell settings put global angle_gl_driver_selection_pkgs <package name>
    adb shell settings put global angle_gl_driver_selection_values <driver>
    ```
    
    ### ANGLE for *multiple* OpenGL ES apps
    
    Similar to selecting a single app, you can select multiple applications by listing their package
    names and driver choice in comma separated lists.  Note the lists must be the same length, one
    driver choice per package name.
    ```
    adb shell settings put global angle_gl_driver_selection_pkgs <package name 1>,<package name 2>,<package name 3>,...
    adb shell settings put global angle_gl_driver_selection_values <driver 1>,<driver 2>,<driver 3>,...
    ```
    
    ### ANGLE for *all* OpenGL ES apps
    
    `Note: This method only works on a device with root access.`
    
    Enable:
    ```
    adb shell settings put global angle_gl_driver_all_angle 1
    ```
    Disable:
    ```
    adb shell settings put global angle_gl_driver_all_angle 0
    ```
    
    ## Check for success
    
    Check to see that ANGLE was loaded by your application:
    ```
    $ adb logcat -d | grep ANGLE
    V GraphicsEnvironment: ANGLE developer option for <package name>: angle
    I GraphicsEnvironment: ANGLE package enabled: org.chromium.angle
    I ANGLE   : Version (2.1.0.f87fac56d22f), Renderer (Vulkan 1.1.87(Adreno (TM) 615 (0x06010501)))
    ```
    
    Note that this might be logged by the built-in ANGLE and not the installed apk if `angle_debug_package` wasn't set.
    
    ## Clean up
    
    Settings persist across reboots, so it is a good idea to delete them when finished.
    ```
    adb shell settings delete global angle_debug_package
    adb shell settings delete global angle_gl_driver_all_angle
    adb shell settings delete global angle_gl_driver_selection_pkgs
    adb shell settings delete global angle_gl_driver_selection_values
    ```
    
    ## Troubleshooting
    
    If your application is not debuggable or you are not root, you may see an error like this in the log:
    ```
    $ adb logcat -d | grep ANGLE
    V GraphicsEnvironment: ANGLE developer option for <package name>: angle
    E GraphicsEnvironment: Invalid number of ANGLE packages. Required: 1, Found: 0
    E GraphicsEnvironment: Failed to find ANGLE package.
    ```
    Double check that you are root, or that your application is [marked debuggable][Debuggable].
    
    ## Android GN args combinations
    
    The [above](#angle-gn-args-for-android) GN args only modify default values to generate a Debug
    build for Android. Below are some common configurations used for different scenarios.
    
    To determine what is different from default, you can point the following command at your target
    directory. It will show the list of gn args in use, where they came from, their current value,
    and their default values.
    ```
    gn args --list <dir>
    ```
    
    ### Performance config
    
    This config is designed to get maximum performance by disabling debug configs and validation layers.
    Note: The oddly named `is_official_build` is a more aggressive optimization level than `Release`. Its name is historical.
    ```
    target_os = "android"
    target_cpu = "arm64"
    angle_enable_vulkan = true
    is_component_build = false
    is_official_build = true
    is_debug = false
    ```
    
    ### Debug config
    
    This config is useful for quickly ensuring Vulkan is running cleanly. It disables debug, but
    enables asserts and allows validation errors.
    ```
    target_os = "android"
    target_cpu = "arm64"
    is_component_build = false
    is_debug = true
    ```
    
    #### Application Compatibility
    
    Application compatibility may be increased by enabling non-conformant features and extensions with
    a GN arg:
    
    ```
    angle_expose_non_conformant_extensions_and_versions = true
    ```
    
    ## Accessing ANGLE traces
    
    To sync and build the ANGLE traces, jump to [ANGLE Restricted Traces](https://chromium.googlesource.com/angle/angle.git/+/HEAD/src/tests/restricted_traces/README.md#angle-restricted-traces).
    
    ## Command line for launching chrome on Android
    
    [This Makefile](https://github.com/phuang/test/blob/main/chromium/Makefile) contains many useful
    command lines for launching chrome.
    
    Targets run_chrome_public_apk_* is for launching chrome on Android.
    
    To use this Makefile, download it into chrome build tree, and use below commands (for more targets please check Makefile)
    ```
    # To edit gn args
    $ make args OUT=out_android/Release  # The OUT can be set in Makefile instead of passing it in command line
    
    # Build and run chrome on Android device with GLRenderer
    $ make run_chrome_public_apk_gl
    
    # Build and run chrome on Android device with SkiaRenderer
    $ make run_chrome_public_apk_skia
    
    # Run adb logcat
    $ make adb_logcat
    
    # Symbolize Android crash stack
    $ make android_symbol
    
    # Build and run gpu_unittests
    $ make gpu_unittests GTEST_FILTER="gtest-filters" # If GTEST_FILTER is not specified, all tests will be run.
    ```
    
    [Debuggable]: https://developer.android.com/guide/topics/manifest/application-element#debug
    [UserDebug]: https://source.android.com/setup/build/building