Docker for ARM64 (Raspberry Pi 4) 上的 Android SDK 用于构建 APK

2024-04-16

我正在尝试创建一个ARM64 Docker 镜像它能够构建我的 React Native 应用程序的 apk 文件。

背景:

为了练习目的,我使用 5 个 Raspberry Pi 4 板构建了一个 Kubernetes 集群。一切工作正常,Jenkins 正在其上运行,并且后端部分(Java 微服务、Maven)可以在其上构建、部署和运行。

现在我正在尝试创建一个管道安卓应用部分,我建立在反应本机,摇篮。我只是在学习一切如何组合在一起坚持构建 apk关于詹金斯的文件。在本地构建它(在 Linux 上)工作正常,但我无法为其创建 Docker 容器aarch64架构安装了必要的 Android SDK 来使用 Jenkins 构建它。这是我现在所拥有的(告诉我,如果我需要提供更多信息!):

Dockerfile:

FROM openjdk:8-alpine3.9

ENV ANDROID_SDK_ROOT /opt/android-sdk-linux

RUN apk add --no-cache curl wget bash unzip \
    && apk add --no-cache --update nodejs npm \
    && npm install -g react-native-cli

RUN cd /opt \
    && wget -q https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O android-commandline-tools.zip \
    && mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools \
    && unzip -q android-commandline-tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools \
    && rm android-commandline-tools.zip

ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin

RUN yes | sdkmanager --licenses

RUN touch /root/.android/repositories.cfg

# This part fails!
# RUN yes | sdkmanager "emulator" "platform-tools"

RUN yes | sdkmanager --update --channel=3
RUN yes | sdkmanager \
    "platforms;android-29" \
    "build-tools;29.0.3" \
    "build-tools;29.0.2" \
    "build-tools;29.0.1" \
    "build-tools;29.0.0"

詹金斯文件:

pipeline {
    agent {
        kubernetes {
            defaultContainer 'app-build'
            yamlFile 'kubernetes-pod.yaml'
        }
    }
    stages {
        stage ('print env vars') {
            steps {
                sh 'printenv'
                sh 'echo "JAVA-VERSION: "'
                sh 'java -version'
                sh 'echo "NODE-VERSION:"'
                sh 'node --version'
                sh 'echo "NPM version:" '
                sh 'npm --version'
                sh 'echo "REACT-NATIVE-VERSION:"'
                sh 'react-native --version'
            }
        }
       stage ('Gradle Build') {
           steps {
               sh ('react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res')
               dir ('android') {
                   // this step fails (error message below)
                   gradlew('assembleRelease', '--scan')
               }
           }
       }

       /* ... more steps ... */
    }
}

def gradlew(String... args) {
    sh "./gradlew ${args.join(' ')} -s"
}

我在 Jenkins 上收到的错误消息如下:

Starting a Gradle Daemon (subsequent builds will be faster)

> Configure project :react-native-reanimated
Warning: Dependant package with key emulator not found!

FAILURE: Build failed with an exception.

* Where:
Build file '/home/jenkins/agent/workspace/nches_CHEF-8-frontend-deployment/node_modules/react-native-reanimated/android/build.gradle' line: 89

* What went wrong:
A problem occurred configuring project ':react-native-reanimated'.
> Failed to install the following SDK components:
      build-tools;29.0.2 Android SDK Build-Tools 29.0.2
  Install the missing components using the SDK manager in Android Studio.

kubernetes-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    label: jenkins-agent
    job: build-services
  namespace: build-services
spec:
  containers:
    - name: jnlp
      image: franzbuholzer/jenkins-jnlp-arm64:4.6
      tty: true
    - name: maven
      image: maven:3.6.3-jdk-11
      tty: true
      command: ["cat"]
      volumeMounts:
        - name: repository
          mountPath: /root/.m2/repository
    - name: docker
      image: docker:19.03.13
      command: ["cat"]
      tty: true
      volumeMounts:
        - name: docker-sock
          mountPath: /var/run/docker.sock
  volumes:
    - name: repository
      persistentVolumeClaim:
        claimName: repository
    - name: docker-sock
      hostPath:
        path: /var/run/docker.sock

如果有人能帮助我解决这个问题,我会非常高兴,这样我就可以解决下一个障碍,我想这将是将生成的 apk 复制到另一个 Docker 映像中并将其部署在集群上以使其可下载......


虽然这个问题已经一个月没有活跃了,但我应该记录一下我的努力以供以后使用。自从sdkmanager使用类似输出的进度条,一些消息被覆盖,这导致关键问题很难找到:有一个关键依赖emulator是安装失败。我认为是因为没有匹配的qemu版本。但实际上我们在编译时并不需要模拟器。所以我的简单解决方案是:

  1. 在基于 x86 的 Linux 上安装 Android 命令行工具
  2. 安装平台工具、构建工具
  3. 将模拟器目录压缩到 $ANDROID_SDK_ROOT 中
  4. 在树莓派上安装Android命令行工具
  5. 安装创建基本目录结构的平台工具
  6. 将模拟器从 tarball 中提取到 $ANDROID_SDK_ROOT 中
  7. 祝你好运

似乎有些工具无法在32位系统下运行,因此无法使用他们最喜欢的32位Raspberry Pi操作系统。请改用 Ubuntu 64 位。

不幸的是,经过又一个小时的研究,除了可以安装构建工具之外,该解决方案无法工作。您不能仅仅因为从官方存储库下载的所有工具链都是为 x86 构建的,就在 AArch64(或 arm64)上编译 Android 应用程序。如果想要在 AArch64 CPU(例如 Raspberry PI)上构建 Android 应用程序,他们需要在该架构上构建整个工具链。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker for ARM64 (Raspberry Pi 4) 上的 Android SDK 用于构建 APK 的相关文章

随机推荐