【问题标题】:Unable to get gradle build-tools in docker - Apple M1无法在 docker 中获取 gradle build-tools - Apple M1
【发布时间】:2022-10-07 15:10:32
【问题描述】:

我最近切换到 Apple M1,但在创建最终在 Buildkite linux CI 上运行的 docker 映像时遇到问题。相同的代码在我的配备 Intel 芯片的 MacBook 上运行良好,并成功创建了 docker 映像。

sdkmanager 尝试使用最新的commandlinetools 拉入build-tools;${ANDROID_BUILD_TOOLS_VERSION} 时,就会出现问题,它会失败并出现以下错误:

Warning: Dependant package with key emulator not found!
Warning: Unable to compute a complete list of dependencies.ates...

我能找到的最接近的问题是Install build-tools: emulator not found Error with android sdk,两者都没有任何解决方案。另请注意,我运行了sdkmanager --list,而emulator 不作为可用包存在(仅在M1 上)。

这是我的Dockerfile(我不经常使用 docker,所以如果代码不是最干净的,请原谅):

FROM gradle:7.4-jdk11

ENV SDK_URL=\"https://dl.google.com/android/repository/commandlinetools-linux-8092744_latest.zip\" \\
    ANDROID_HOME=\"/usr/local/android-sdk\" \\
    ANDROID_VERSION=32 \\
    ANDROID_BUILD_TOOLS_VERSION=32.0.0

RUN mkdir \"$ANDROID_HOME\" .android \\
    && cd \"$ANDROID_HOME\" \\
    && curl -o sdk.zip $SDK_URL \\
    && unzip sdk.zip \\
    && rm sdk.zip \\
    && yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses \\
    && $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --update \\
    && $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME \"platform-tools\" \"build-tools;${ANDROID_BUILD_TOOLS_VERSION}\" \\
    && $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME \"platforms;android-${ANDROID_VERSION}\" \\
    && apt-get update \\
    && apt-get install -y build-essential file apt-utils curl gnupg \\
    && curl -sL https://deb.nodesource.com/setup_14.x  | bash - \\
    && apt-get -y install nodejs \\
    && npm install -g firebase-tools -y \\
    && rm -rf /var/lib/apt/lists/*

边注;我不得不将 jdk8 的使用升级到 jdk11 用于 Android 构建代理,之前的实现是拉入 sdk-tools-linux-3859397.zip 而不是 commandlinetools-linux-8092744_latest.zip,并且能够通过 sdkmanager 拉入 build-tools 在 M1 上就好了还创建了一个 docker 映像。

鉴于它建立在 Intel 之上,我的任务在技术上是完整的,但从长远来看,它在 M1 上运行会容易得多。有任何想法吗?或者任何人都可以建议提出这个问题的正确地方是什么?您认为这是 google 命令行工具问题还是 docker 问题?

    标签: android docker gradle apple-m1 android-sdk-manager


    【解决方案1】:

    我刚刚在 M1 Pro 上遇到了同样的问题,this 为我解决了这个问题。

    简而言之:emulator 在 Arm (M1) 上尚不可用,因此您需要手动安装它。您可以关注official guide,但简而言之,这对我有用

    1. 下载emulator for Apple Silicon (example 或者在[官方指南](https://developer.android.com/studio/emulator_archive
    2. 解压Android SDK文件夹中的文件夹(它会创建一个SKD/emulator文件夹,里面有文件)
    3. 使用content from here 创建SDK/emulator/package.xml 文件,并将xml 的最后一部分<revision><major>31</major><minor>1</minor><micro>4</micro></revision> 更新为您下载的版本
    4. 您应该不会在 M1 上再次看到同样的错误 ?

      剧透警告:我仍然无法在 M1 上完全构建,因为在实际构建期间,我收到了错误

      qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
      

    【讨论】:

      【解决方案2】:

      我有同样的问题。我认为 linux/armv8 没有 android 'emulator' 包。因此,您将无法将 docker 与本机图像一起使用。

      我尝试配置 docker-compose 文件以使用 linux/x86_64 而不是 linux/armv8 但还有其他问题。 我在 docker-compose.yaml 中添加了这一行:

      platform: linux/x86_64
      

      像这样 :

      version: '3.7'
      services:
        android:
          platform: linux/x86_64
          build:
            dockerfile: Dockerfile
            context: ./Docker
          working_dir: /app/Android/Scripts
          volumes:
            - ../:/app:rw,cached
          command: ./build_distribution.sh
      #    command: sh -c "while true; do sleep 10; done"
      

      但是我遇到了很多网络问题。这种架构上的网络层似乎有问题,有时会卡在随机下载图像或组件......

      有没有办法让它与一个或其他架构一起工作?

      【讨论】:

        猜你喜欢
        • 2020-11-01
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-28
        • 2019-03-07
        • 2022-07-19
        • 1970-01-01
        相关资源
        最近更新 更多