Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Android versions 5-11. #1023

Merged
merged 1 commit into from
Nov 1, 2022

Commits on Nov 1, 2022

  1. Add support for Android versions 5-11.

    **Configuration**
    
    We provide the following arguments to configure the Android version:
    - `ANDROID_NDK`
    - `ANDROID_SDK` (note that this is dependent on `ANDROID_VERSION)
    - `ANDROID_VERSION`
    - `ANDROID_SYSTEM_COMPLETE`: do a complete Android build
    - `ANDROID_SYSTEM_NONE`: do not build the Android system, disables runner support
    
    **Version Support**
    
    We now support NDK versions r10e-r25b, SDK versions 21-33, and Android versions 5.0, 5.1, 6.0, 7.0, 8.0, 8.1, 9.0, 10.0, and 11.0. We also validate that the NDK, SDK, and Android versions are compatible.
    
    For Android 12+, we do support using the NDK with the proper API level, allowing cross-compilation for the desired target, however, running or testing the generated binary is currently not supported without a complete build. Note that support for non-complete builds with Android versions 12+ is unlikely to ever occur, due to issues with APEX in the build system.
    
    **Implementation Details**
    
    Next, we've improved the removal of unittests during the build process, to ensure fast builds while maintaining compatibility with various newer Android versions. To do this, we've implemented a Python library and a script. The Python library contains a complete parser (correctly parses all valid input) for Soong blueprint files, using an LALR grammar, and a rudimentary parser for Makefiles.
    
    The Soong parser removes any `gtest` dependencies, as well as any subdirectories or scope names containing `test`. For example:
    
    ```go
    cc_library {
        name: "lib",
        srcs: ["lib.cc",],
    }
    cc_test {
        name: "test",
        defaults: ["target"],
        srcs: ["test.cc"],
    }
    ```
    
    Will become:
    
    ```go
    cc_library {
        name: "lib",
        srcs: ["lib.cc",],
    }
    ```
    
    The Makefile parser first splits the file based on conditional directives (`ifeq`, `endif`, etc.) to ensure any subsequent processing doesn't lead to unbalanced directives. Next, we split the text within each directive based on comment sections used in the Android source tree. For example:
    
    ```Makefile
    test_tags := tests
    
    include $(call subdir,$(LOCAL_PATH))
    
    c_flags := \
      -g \
      -Wall
    ```
    
    We can therefore remove the `Benchmarks` and `Unit tests` sections without removing the `Other section`.
    
    The Python library is reasonably performant (it adds no noticeable overhead to the build process) and is compact (in total, < 60KB). Also, it is much more resilient than a series of `sed` scripts.
    
    Finally, extensive unittests have been added for the Python library, for both code linting (`flake8`) and unittests (via `tox`). Since we cannot assume the presence of Python on the host machine, the tests can be optionally enabled via the `--python` flag (or `PYTHON` environment variable, to hook into the git hooks), and custom overrides for the `flake8` and `tox` commands are provided (since the user may wish to specify a specific Python version, such as `python3.7 -m flake8`).
    
    **Linker**
    
    For Android 10+, since we use a minimal Android build, we only support the bootstrap and ASAN linkers unless using a complete Android build. Supporting the APEX linker requires a nearly complete Android runtime, requiring 60+GB image sizes, slow builds, and other prohibitive factors.
    
    **Complete Builds**
    
    Complete builds are currently untested, for Androids version 12+ they exceed the default storage capacity of WSL2 images (250GB). They should work and properly install both the `/system` and `/apex` directories, however, the builds are slow and untested.
    Alexhuszagh committed Nov 1, 2022
    Configuration menu
    Copy the full SHA
    25c7121 View commit details
    Browse the repository at this point in the history