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

标签 android react-native docker jenkins arm64

我正在尝试创建一个 ARM64 Docker 镜像 它能够构建我的 React Native 应用程序的 apk 文件。
背景:
出于练习目的,我用 5 个 Raspberry Pi 4 板构建了一个 Kubernetes 集群。一切正常,Jenkins 正在其上运行,后端部分(Java 微服务、Maven)可以在其上构建、部署和运行。
现在我正在尝试为 创建一个管道。 Android 应用部分 ,我在 中构建React Native,Gradle .我只是在学习所有东西是如何组合在一起的,我是 坚持构建 apk Jenkins 的文件。本地构建它(在 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"
Jenkins 文件:
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 版本。但实际上我们在编译时不需要模拟器。所以我的简单解决方案是:

  • 在基于 x86 的 linux 上安装 Android 命令行工具
  • 安装平台工具、构建工具
  • 将模拟器目录压缩到 $ANDROID_SDK_ROOT
  • 在树莓派上安装 Android 命令行工具
  • 安装创建基本目录结构的平台工具
  • 从压缩包中提取模拟器到 $ANDROID_SDK_ROOT
  • 祝你好运

  • 似乎有些工具无法在 32 位系统下运行,因此无法使用他们最喜欢的仅 32 位的 Raspberry Pi OS。请改用 Ubuntu 64 位。
    不幸的是,经过几个小时的研究,除了可以安装构建工具之外,该解决方案无法正常工作。您无法在 AArch64(或 arm64)上编译 Android 应用程序,因为从官方存储库下载的所有工具链都是为 x86 构建的。如果想在 AArch64 CPU(例如 Raspberry PI)上构建 Android 应用程序,他们需要在该架构上构建整个工具链。

    关于Docker 上的 Android SDK for ARM64 (Raspberry Pi 4) 用于构建 APK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65421230/

    相关文章:

    android - 在 Recyclerview 中滚动后 Imageview 不在正确的行上

    docker - 如何在docker中初始化 key 表?

    docker - minimesos中的 “containersol/minimesos”图片是什么?

    java - 无法将文件从 Android 上传到 PHP 服务器

    java - Android 雅虎 Aviate 启动器页面滑动效果

    react-native - react 导航选项卡屏幕图标颜色 Prop 类型

    javascript - 带部分列表的 React-Native 导航

    ios - React Native 中输入文本的绑定(bind)值不允许我再写了

    nginx - 我应该在Kubernetes集群中使用反向代理(例如NGINX)吗?

    android - 方法 getWindow().setBackgroundDrawableResource(int resid) 在 onCreate() 之外不起作用