설치

Debian 및 Ubuntu에 설치

  1. Bazelisk를 설치합니다.

    공식 Bazel 문서에 따라 Bazelisk를 설치합니다.

  2. MediaPipe 저장소를 확인합니다.

    $ cd $HOME
    $ git clone --depth 1 https://github.com/google/mediapipe.git
    
    # Change directory into MediaPipe root directory
    $ cd mediapipe
    
  3. OpenCV 및 FFmpeg를 설치합니다.

    옵션 1. 패키지 관리자 도구를 사용하여 사전 컴파일된 OpenCV 라이브러리를 설치합니다. FFmpeg가 libopencv-video-dev를 통해 설치됩니다.

    OS OpenCV
    Debian 9 (stretch) 2.4
    Debian 10 (buster) 3.2
    Debian 11 (bullseye) 4.5
    Ubuntu 16.04 LTS 2.4
    Ubuntu 18.04 LTS 3.2
    Ubuntu 20.04 LTS 4.2
    Ubuntu 20.04 LTS 4.2
    Ubuntu 21.04 4.5
    $ sudo apt-get install -y \
        libopencv-core-dev \
        libopencv-highgui-dev \
        libopencv-calib3d-dev \
        libopencv-features2d-dev \
        libopencv-imgproc-dev \
        libopencv-video-dev
    

    참고: Debian 11/Ubuntu 21.04에서 OpenCV 4.5가 libopencv-video-dev와 함께 설치된 경우 libopencv-contrib-dev도 설치해야 합니다.

    $ sudo apt-get install -y libopencv-contrib-dev
    

    MediaPipe의 opencv_linux.BUILDWORKSPACE는 이미 OpenCV 2/3용으로 구성되어 있으며 모든 아키텍처에서 올바르게 작동해야 합니다.

    # WORKSPACE
    new_local_repository(
      name = "linux_opencv",
      build_file = "@//third_party:opencv_linux.BUILD",
      path = "/usr",
    )
    
    # opencv_linux.BUILD for OpenCV 2/3 installed from Debian package
    cc_library(
      name = "opencv",
      linkopts = [
        "-l:libopencv_core.so",
        "-l:libopencv_calib3d.so",
        "-l:libopencv_features2d.so",
        "-l:libopencv_highgui.so",
        "-l:libopencv_imgcodecs.so",
        "-l:libopencv_imgproc.so",
        "-l:libopencv_video.so",
        "-l:libopencv_videoio.so",
      ],
    )
    

    OpenCV 4의 경우 현재 아키텍처를 고려하여 opencv_linux.BUILD를 수정해야 합니다.

    # WORKSPACE
    new_local_repository(
      name = "linux_opencv",
      build_file = "@//third_party:opencv_linux.BUILD",
      path = "/usr",
    )
    
    # opencv_linux.BUILD for OpenCV 4 installed from Debian package
    cc_library(
      name = "opencv",
      hdrs = glob([
        # Uncomment according to your multiarch value (gcc -print-multiarch):
        #  "include/aarch64-linux-gnu/opencv4/opencv2/cvconfig.h",
        #  "include/arm-linux-gnueabihf/opencv4/opencv2/cvconfig.h",
        #  "include/x86_64-linux-gnu/opencv4/opencv2/cvconfig.h",
        "include/opencv4/opencv2/**/*.h*",
      ]),
      includes = [
        # Uncomment according to your multiarch value (gcc -print-multiarch):
        #  "include/aarch64-linux-gnu/opencv4/",
        #  "include/arm-linux-gnueabihf/opencv4/",
        #  "include/x86_64-linux-gnu/opencv4/",
        "include/opencv4/",
      ],
      linkopts = [
        "-l:libopencv_core.so",
        "-l:libopencv_calib3d.so",
        "-l:libopencv_features2d.so",
        "-l:libopencv_highgui.so",
        "-l:libopencv_imgcodecs.so",
        "-l:libopencv_imgproc.so",
        "-l:libopencv_video.so",
        "-l:libopencv_videoio.so",
      ],
    )
    

    옵션 2. setup_opencv.sh를 실행하여 소스에서 OpenCV를 자동으로 빌드하고 MediaPipe의 OpenCV 구성을 수정합니다. 이 옵션을 선택하면 옵션 3에 정의된 모든 단계가 자동으로 실행됩니다.

    옵션 3. OpenCV 문서에 따라 소스 코드에서 OpenCV를 수동으로 빌드합니다.

    MediaPipe를 자체 OpenCV 라이브러리로 가리키도록 WORKSPACEopencv_linux.BUILD를 수정해야 할 수 있습니다. OpenCV가 기본적으로 권장되는 /usr/local/에 설치된다고 가정합니다.

    OpenCV 2/3 설정:

    # WORKSPACE
    new_local_repository(
      name = "linux_opencv",
      build_file = "@//third_party:opencv_linux.BUILD",
      path = "/usr/local",
    )
    
    # opencv_linux.BUILD for OpenCV 2/3 installed to /usr/local
    cc_library(
      name = "opencv",
      linkopts = [
        "-L/usr/local/lib",
        "-l:libopencv_core.so",
        "-l:libopencv_calib3d.so",
        "-l:libopencv_features2d.so",
        "-l:libopencv_highgui.so",
        "-l:libopencv_imgcodecs.so",
        "-l:libopencv_imgproc.so",
        "-l:libopencv_video.so",
        "-l:libopencv_videoio.so",
      ],
    )
    

    OpenCV 4 설정:

    # WORKSPACE
    new_local_repository(
      name = "linux_opencv",
      build_file = "@//third_party:opencv_linux.BUILD",
      path = "/usr/local",
    )
    
    # opencv_linux.BUILD for OpenCV 4 installed to /usr/local
    cc_library(
      name = "opencv",
      hdrs = glob([
        "include/opencv4/opencv2/**/*.h*",
      ]),
      includes = [
        "include/opencv4/",
      ],
      linkopts = [
        "-L/usr/local/lib",
        "-l:libopencv_core.so",
        "-l:libopencv_calib3d.so",
        "-l:libopencv_features2d.so",
        "-l:libopencv_highgui.so",
        "-l:libopencv_imgcodecs.so",
        "-l:libopencv_imgproc.so",
        "-l:libopencv_video.so",
        "-l:libopencv_videoio.so",
      ],
    )
    

    현재 FFmpeg 설정은 ffmpeg_linux.BUILD에 정의되어 있으며 모든 아키텍처에서 작동해야 합니다.

    # WORKSPACE
    new_local_repository(
      name = "linux_ffmpeg",
      build_file = "@//third_party:ffmpeg_linux.BUILD",
      path = "/usr"
    )
    
    # ffmpeg_linux.BUILD for FFmpeg installed from Debian package
    cc_library(
      name = "libffmpeg",
      linkopts = [
        "-l:libavcodec.so",
        "-l:libavformat.so",
        "-l:libavutil.so",
      ],
    )
    
  4. GPU 가속을 사용하여 Linux에서만 (OS X가 아님) 데스크톱 예시를 실행합니다.

    # Requires a GPU with EGL driver support.
    # Can use mesa GPU libraries for desktop, (or Nvidia/AMD equivalent).
    sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev
    
    # To compile with GPU support, replace
    --define MEDIAPIPE_DISABLE_GPU=1
    # with
    --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11
    # when building GPU examples.
    
  5. C++의 Hello World 예시를 실행합니다.

    $ export GLOG_logtostderr=1
    
    # if you are running on Linux desktop with CPU only
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # If you are running on Linux desktop with GPU support enabled (via mesa drivers)
    $ bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # Should print:
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 몇 가지 일반적인 빌드 문제의 해결 방법을 찾아보세요.

CentOS에 설치

면책 조항: CentOS에서 MediaPipe를 실행하는 것은 실험용입니다.

  1. Bazelisk를 설치합니다.

    공식 Bazel 문서에 따라 Bazelisk를 설치합니다.

  2. MediaPipe 저장소를 확인합니다.

    $ git clone --depth 1 https://github.com/google/mediapipe.git
    
    # Change directory into MediaPipe root directory
    $ cd mediapipe
    
  3. OpenCV를 설치합니다.

    옵션 1. 패키지 관리자 도구를 사용하여 사전 컴파일된 버전을 설치합니다.

    $ sudo yum install opencv-devel
    

    옵션 2. 소스 코드에서 OpenCV를 빌드합니다.

    new_local_repository(
        name = "linux_opencv",
        build_file = "@//third_party:opencv_linux.BUILD",
        path = "/usr/local",
    )
    
    new_local_repository(
        name = "linux_ffmpeg",
        build_file = "@//third_party:ffmpeg_linux.BUILD",
        path = "/usr/local",
    )
    
    cc_library(
        name = "opencv",
        srcs = glob(
            [
                "lib/libopencv_core.so",
                "lib/libopencv_highgui.so",
                "lib/libopencv_imgcodecs.so",
                "lib/libopencv_imgproc.so",
                "lib/libopencv_video.so",
                "lib/libopencv_videoio.so",
            ],
        ),
        hdrs = glob([
            # For OpenCV 3.x
            "include/opencv2/**/*.h*",
            # For OpenCV 4.x
            # "include/opencv4/opencv2/**/*.h*",
        ]),
        includes = [
            # For OpenCV 3.x
            "include/",
            # For OpenCV 4.x
            # "include/opencv4/",
        ],
        linkstatic = 1,
        visibility = ["//visibility:public"],
    )
    
    cc_library(
        name = "libffmpeg",
        srcs = glob(
            [
                "lib/libav*.so",
            ],
        ),
        hdrs = glob(["include/libav*/*.h"]),
        includes = ["include"],
        linkopts = [
            "-lavcodec",
            "-lavformat",
            "-lavutil",
        ],
        linkstatic = 1,
        visibility = ["//visibility:public"],
    )
    
  4. C++의 Hello World 예시를 실행합니다.

    $ export GLOG_logtostderr=1
    # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' if you are running on Linux desktop with CPU only
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # Should print:
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 몇 가지 일반적인 빌드 문제의 해결 방법을 찾아보세요.

macOS에 설치

  1. 사전 작업:

    • Homebrew를 설치합니다.
    • xcode-select --install를 사용하여 Xcode 및 명령줄 도구를 설치합니다.
  2. Bazelisk를 설치합니다.

    공식 Bazel 문서에 따라 Bazelisk를 설치합니다.

  3. MediaPipe 저장소를 확인합니다.

    $ git clone --depth 1 https://github.com/google/mediapipe.git
    
    $ cd mediapipe
    
  4. OpenCV 및 FFmpeg를 설치합니다.

    옵션 1. HomeBrew 패키지 관리자 도구를 사용하여 사전 컴파일된 OpenCV 3 라이브러리를 설치합니다. FFmpeg는 OpenCV를 통해 설치됩니다.

    $ brew install opencv@3
    
    # There is a known issue caused by the glog dependency. Uninstall glog.
    $ brew uninstall --ignore-dependencies glog
    

    옵션 2. MacPorts 패키지 관리자 도구를 사용하여 OpenCV 라이브러리를 설치합니다.

    $ port install opencv
    
    new_local_repository(
        name = "macos_opencv",
        build_file = "@//third_party:opencv_macos.BUILD",
        path = "/opt",
    )
    
    new_local_repository(
        name = "macos_ffmpeg",
        build_file = "@//third_party:ffmpeg_macos.BUILD",
        path = "/opt",
    )
    
    cc_library(
        name = "opencv",
        srcs = glob(
            [
                "local/lib/libopencv_core.dylib",
                "local/lib/libopencv_highgui.dylib",
                "local/lib/libopencv_imgcodecs.dylib",
                "local/lib/libopencv_imgproc.dylib",
                "local/lib/libopencv_video.dylib",
                "local/lib/libopencv_videoio.dylib",
            ],
        ),
        hdrs = glob(["local/include/opencv2/**/*.h*"]),
        includes = ["local/include/"],
        linkstatic = 1,
        visibility = ["//visibility:public"],
    )
    
    cc_library(
        name = "libffmpeg",
        srcs = glob(
            [
                "local/lib/libav*.dylib",
            ],
        ),
        hdrs = glob(["local/include/libav*/*.h"]),
        includes = ["local/include/"],
        linkopts = [
            "-lavcodec",
            "-lavformat",
            "-lavutil",
        ],
        linkstatic = 1,
        visibility = ["//visibility:public"],
    )
    
  5. Python 3 및 Python 'six' 라이브러리가 설치되어 있는지 확인합니다.

    $ brew install python
    $ sudo ln -s -f /usr/local/bin/python3.7 /usr/local/bin/python
    $ python --version
    Python 3.7.4
    $ pip3 install --user six
    
  6. C++의 Hello World 예시를 실행합니다.

    $ export GLOG_logtostderr=1
    # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is currently not supported
    $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # Should print:
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 몇 가지 일반적인 빌드 문제의 해결 방법을 찾아보세요.

Windows에 설치하기

면책 조항: Windows에서 MediaPipe를 실행하는 것은 실험용입니다.

  1. MSYS2를 설치하고 %PATH% 환경 변수를 수정합니다.

    MSYS2가 C:\msys64에 설치된 경우 C:\msys64\usr\bin%PATH% 환경 변수에 추가합니다.

  2. 필요한 패키지를 설치합니다.

    C:\> pacman -S git patch unzip
    
  3. Python을 설치하고 실행 파일이 %PATH% 환경 변수를 수정하도록 허용합니다.

    https://www.python.org/downloads에서 Python Windows 실행 파일을 다운로드하여 설치합니다.

  4. Visual C++ Build Tools 및 WinSDK 설치

    Visual Studio 웹사이트로 이동하여 빌드 도구를 다운로드하고 Microsoft Visual C++ 2022 재배포 가능 패키지 및 Microsoft Build Tools 2022를 설치합니다.

    공식 Microsoft 웹사이트에서 WinSDK를 다운로드하여 설치합니다.

  5. Bazel 또는 Bazelisk를 설치하고 Bazel 실행 파일의 위치를 %PATH% 환경 변수에 추가합니다.

    옵션 1. 공식 Bazel 문서에 따라 Bazel 6.5.0 이상을 설치합니다.

    옵션 2. 공식 Bazel 문서에 따라 Bazelisk를 설치합니다.

  6. Bazel 변수를 설정합니다. Bazel 공식 문서에서 'Windows에서 빌드'에 관해 자세히 알아보세요.

    # Please find the exact paths and version numbers from your local version.
    C:\> set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio\<version>\BuildTools
    C:\> set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\<version>\BuildTools\VC
    C:\> set BAZEL_VC_FULL_VERSION=<Your local VC version>
    C:\> set BAZEL_WINSDK_FULL_VERSION=<Your local WinSDK version>
    
  7. MediaPipe 저장소를 확인합니다.

    C:\Users\Username\mediapipe_repo> git clone --depth 1 https://github.com/google/mediapipe.git
    
    # Change directory into MediaPipe root directory
    C:\Users\Username\mediapipe_repo> cd mediapipe
    
  8. OpenCV를 설치합니다.

    https://opencv.org/releases/에서 Windows 실행 파일을 다운로드하여 설치합니다. MediaPipe 0.10.x는 OpenCV 3.4.10을 지원합니다. OpenCV가 C:\opencv에 설치되어 있지 않으면 WORKSPACE 파일을 수정해야 합니다.

    new_local_repository(
        name = "windows_opencv",
        build_file = "@//third_party:opencv_windows.BUILD",
        path = "C:\\<path to opencv>\\build",
    )
    
  9. C++의 Hello World 예시를 실행합니다.

    C:\Users\Username\mediapipe_repo>bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://python_36//python.exe" mediapipe/examples/desktop/hello_world
    
    C:\Users\Username\mediapipe_repo>set GLOG_logtostderr=1
    
    C:\Users\Username\mediapipe_repo>bazel-bin\mediapipe\examples\desktop\hello_world\hello_world.exe
    
    # should print:
    # I20200514 20:43:12.277598  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.278597  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.279618  1200 hello_world.cc:56] Hello World!
    # I20200514 20:43:12.280613  1200 hello_world.cc:56] Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 몇 가지 일반적인 빌드 문제의 해결 방법을 찾아보세요.

Linux용 Windows 하위 시스템 (WSL)에 설치

  1. 안내에 따라 Linux용 Windows 하위 시스템 (Ubuntu)을 설치합니다.

  2. Windows ADB를 설치하고 Windows에서 ADB 서버를 시작합니다.

  3. WSL을 실행합니다.

  4. 필요한 패키지를 설치합니다.

    username@DESKTOP-TMVLBJ1:~$ sudo apt-get update && sudo apt-get install -y build-essential git python zip adb openjdk-8-jdk
    
  5. Bazelisk를 설치합니다.

    공식 Bazel 문서에 따라 Bazelisk를 설치합니다.

  6. MediaPipe 저장소를 확인합니다.

    username@DESKTOP-TMVLBJ1:~$ git clone --depth 1 https://github.com/google/mediapipe.git
    
    username@DESKTOP-TMVLBJ1:~$ cd mediapipe
    
  7. OpenCV 및 FFmpeg를 설치합니다.

    옵션 1. 패키지 관리자 도구를 사용하여 사전 컴파일된 OpenCV 라이브러리를 설치합니다. FFmpeg는 libopencv-video-dev를 통해 설치됩니다.

    username@DESKTOP-TMVLBJ1:~/mediapipe$ sudo apt-get install libopencv-core-dev libopencv-highgui-dev \
                           libopencv-calib3d-dev libopencv-features2d-dev \
                           libopencv-imgproc-dev libopencv-video-dev
    

    옵션 2. setup_opencv.sh를 실행하여 소스에서 OpenCV를 자동으로 빌드하고 MediaPipe의 OpenCV 구성을 수정합니다.

    옵션 3. OpenCV 문서에 따라 소스 코드에서 OpenCV를 수동으로 빌드합니다.

    new_local_repository(
        name = "linux_opencv",
        build_file = "@//third_party:opencv_linux.BUILD",
        path = "/usr/local",
    )
    
    cc_library(
        name = "opencv",
        srcs = glob(
            [
                "lib/libopencv_core.so",
                "lib/libopencv_highgui.so",
                "lib/libopencv_imgcodecs.so",
                "lib/libopencv_imgproc.so",
                "lib/libopencv_video.so",
                "lib/libopencv_videoio.so",
            ],
        ),
        hdrs = glob(["include/opencv4/**/*.h*"]),
        includes = ["include/opencv4/"],
        linkstatic = 1,
        visibility = ["//visibility:public"],
    )
    
  8. C++의 Hello World 예시를 실행합니다.

    username@DESKTOP-TMVLBJ1:~/mediapipe$ export GLOG_logtostderr=1
    
    # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is currently not supported
    username@DESKTOP-TMVLBJ1:~/mediapipe$ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
        mediapipe/examples/desktop/hello_world:hello_world
    
    # Should print:
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 여러 일반적인 빌드 문제의 해결 방법을 확인하세요.

Docker를 사용하여 설치

이렇게 하면 mediapipe 설치를 나머지 시스템에서 격리하는 Docker 이미지가 사용됩니다.

  1. 호스트 시스템에 Docker를 설치합니다.

  2. 'mediapipe' 태그가 지정된 Docker 이미지를 빌드합니다.

    $ git clone --depth 1 https://github.com/google/mediapipe.git
    $ cd mediapipe
    $ docker build --tag=mediapipe .
    
    # Should print:
    # Sending build context to Docker daemon  147.8MB
    # Step 1/9 : FROM ubuntu:latest
    # latest: Pulling from library/ubuntu
    # 6abc03819f3e: Pull complete
    # 05731e63f211: Pull complete
    # ........
    # See http://bazel.build/docs/getting-started.html to start a new project!
    # Removing intermediate container 82901b5e79fa
    # ---> f5d5f402071b
    # Step 9/9 : COPY . /edge/mediapipe/
    # ---> a95c212089c5
    # Successfully built a95c212089c5
    # Successfully tagged mediapipe:latest
    
  3. C++의 Hello World 예시를 실행합니다.

    $ docker run -it --name mediapipe mediapipe:latest
    
    root@bca08b91ff63:/mediapipe# GLOG_logtostderr=1 bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world
    
    # Should print:
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    # Hello World!
    

빌드 오류가 발생하면 문제 해결을 참고하여 여러 일반적인 빌드 문제의 해결 방법을 확인하세요.

  1. MediaPipe Android 예시를 빌드합니다.

    $ docker run -it --name mediapipe mediapipe:latest
    
    root@bca08b91ff63:/mediapipe# bash ./setup_android_sdk_and_ndk.sh
    
    # Should print:
    # Android NDK is now installed. Consider setting $ANDROID_NDK_HOME environment variable to be /root/Android/Sdk/ndk-bundle/android-ndk-r19c
    # Set android_ndk_repository and android_sdk_repository in WORKSPACE
    # Done
    
    root@bca08b91ff63:/mediapipe# bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu
    
    # Should print:
    # Target //mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu up-to-date:
    # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_deploy.jar
    # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_unsigned.apk
    # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu.apk
    # INFO: Elapsed time: 144.462s, Critical Path: 79.47s
    # INFO: 1958 processes: 1 local, 1863 processwrapper-sandbox, 94 worker.
    # INFO: Build completed successfully, 2028 total actions