微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用于 ARM64 (Raspberry Pi 4) 的 Docker 上的 Android SDK,用于构建 APK

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

背景:

出于练习目的,我构建了一个带有 5 个 RaspBerry Pi 4 板的 Kubernetes 集群。一切正常,Jenkins 正在其上运行,后端部分(Java 微服务、Maven)可以在其上构建、部署和运行。

现在我正在尝试为 Android 应用程序部分创建一个管道,我在 React Native、Gradle 中构建了它。我只是在学习一切如何组合在一起,并且我坚持在 Jenkins 上构建 apk 文件。在本地构建它(在 Linux 上)工作正常,但我无法为 aarch64 架构 创建一个 Docker 容器,并安装了必要的 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 镜像中,并将其部署在集群上以使其可下载。 ..

解决方法

虽然这个月的问题是无效的,但我应该为以后记录我的努力。由于 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <ul id="shipping_method" class="woocommerce-shipping-methods"> <li> <div class="porto-radio"> <input type="radio" name="shipping_method[0]" data-index="0" id="shipping_method_0_flat_rate8" value="flat_rate:8" class="shipping_method porto-control-input"> <label class="porto-control-label text-capitalize font-weight-normal" for="shipping_method_0_flat_rate8"> Flat rate 5: <span class="woocommerce-Price-amount amount"> <bdi><span class="woocommerce-Price-currencySymbol">€</span>5,00</bdi> </span> </label> </div> </li> <li> <div class="porto-radio "> <input type="radio" name="shipping_method[0]" data-index="0" id="shipping_method_0_flat_rate9" value="flat_rate:9" class="shipping_method porto-control-input"> <label class="porto-control-label text-capitalize font-weight-normal" for="shipping_method_0_flat_rate9"> Flat rate 10: <span class="woocommerce-Price-amount amount"> <bdi><span class="woocommerce-Price-currencySymbol">€</span>10,00</bdi> </span> </label> </div> </li> <li> <div class="porto-radio "> <input type="radio" name="shipping_method[0]" data-index="0" id="shipping_method_0_free_shipping10" value="free_shipping:10" class="shipping_method porto-control-input" checked="checked"> <label class="porto-control-label text-capitalize font-weight-normal" for="shipping_method_0_free_shipping10">Free shipping</label> </div> </li> </ul> 使用类似输出的进度条,一些消息被覆盖,导致密钥问题难以找到:有一个依赖于 sdkmanager 的密钥安装失败。我认为是因为没有匹配的 qemu 版本。但实际上我们在编译时不需要模拟器。所以我的简单解决方案是:

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

似乎有些工具不能在 32 位系统下运行,所以不能使用他们最喜欢的 32 位树莓派操作系统。改用 64 位 Ubuntu。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。