问题 Docker中安装的Android SDK工具失败


我正在尝试使用Shippable创建一个可用于构建Android项目的docker镜像。

问题是 android update sdk 命令,它给出以下错误:

Installing Android SDK Tools, revision 24.2
  Failed to rename directory /opt/android-sdk-linux/tools to /opt/android-sdk-linux/temp/ToolPackage.old01.
  Failed to create directory /opt/android-sdk-linux/tools

我在这里找到了一些解决方案: https://stackoverflow.com/a/8839359/867099 但它适用于Windows,并不能解决Linux上的问题。似乎在更新命令期间,当前目录正在使用中,因此无法重命名。

使用该工作方法提示我的解决方法是:

RUN cp -r /opt/android-sdk-linux/tools /opt/android-sdk-linux/tools_copy

RUN cd /opt/android-sdk-linux/tools && echo 'y' | /opt/android-sdk-linux/tools_copy/android update sdk --no-ui -a --filter tools,platform-tools,build-tools-22.0.1,android-21,extra-android-support,extra-google-google_play_services --force

为了自动接受许可,我 echo 'y' 到android命令。

但我认为 android 命令也应该在正确的目录中运行,这就是我的原因 cd 先进入它。

但是,它仍然失败。我很难解决如何解决这个问题,所以任何帮助都表示赞赏。

------更新--------

我跑了 android sdk update 没有的命令 tools 过滤器,最后,我的gradle构建成功。所以我不确定不更新它们是否有问题......


7220
2018-05-18 10:48


起源

“似乎在更新命令期间,当前目录正在使用中,因此无法重命名” - 试试 adb kill-server 在运行之前 android update sdk 命令。或者查看是否有任何其他正在运行的进程可能引用此目录。 - CommonsWare
我认为确实如此 adb 这是访问目录,但它是在我运行更新命令时启动的。所以似乎不可能及时杀死它。 - xorgate
根据这个可能与存储驱动程序有关 github.com/travis-ci/travis-ci/issues/2848 - shbi
我认为你不需要改变目录 tools/ 运行之前的文件夹 android update sdk 命令在 tools_copy/ 夹 - Jianxin Gao


答案:


这可以通过在单个Dockerfile中组合所有Android SDK命令来解决 RUN 命令。它与Docker的文件系统有关。

有关详细说明 一个帖子 在Android开源项目的问题跟踪器上:

在Docker中运行SDK更新时会导致此问题   容器。 Docker使用特殊的文件系统,其工作方式与版本相同   控制系统(例如git)并记录对所做的所有更改   文件系统。问题是SDK更新使用硬链接移动   移动'tools'目录的操作,该目录不受支持   底层Docker文件系统。

解决方案是简单地运行所有Android SDK命令   Docker中的单个“RUN”命令。这样,硬链接移动就像   正常,只要你不使用'hardlink move'之间的操作   多个RUN命令(快照)。这样做的好处还在于   您的Docker图层将更小(与运行多个图层相比)   单独的RUN命令)。

这是Dockerfile中的行:

RUN wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && \
    tar xzf android-sdk_r24.4.1-linux.tgz && \
    rm android-sdk_r24.4.1-linux.tgz && \
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter platform-tools,tools -a ) && \
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository -a) && \
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter build-tools-23.0.2,android-24 -a)

9
2017-09-15 17:47



为什么 构建工具 - 23.0.2, 并不是 25.0.0? - Igor Ganapolsky
@IgorGanapolsky 25.0.0当时不可用。 developer.android.com/studio/releases/build-tools.html - Jianxin Gao
好吧,如果“SDK更新使用硬链接移动操作来移动'tools'目录,那么我就不会说它与Docker无关。这个目录不受底层Docker文件系统的支持。” - Petrus Theron


这是我目前正在使用的,你可以在下面看到成功运行的更新命令。在我的环境中,这些是3个不同的泊坞窗图像 FROM 层次结构,所以你可能会结合很多 apt-get如果那不是你的情况。

FROM ubuntu:14.04

# Set debconf to run non-interactively
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

# Install base dependencies
RUN apt-get update && apt-get install -y -q --no-install-recommends \
        apt-transport-https \
        build-essential \
        ca-certificates \
        curl \
        git \
        libssl-dev \
        python \
        rsync \
        software-properties-common \
        wget \
    && rm -rf /var/lib/apt/lists/*

# Install the JDK
RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
    echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get update -qq && \
    DEBIAN_FRONTEND=noninteractive apt-get install -qqy --force-yes oracle-java7-installer && \
    rm -rf /var/lib/apt/lists/* /var/cache/oracle-jdk7-installer

# Install Android Dev Tools
RUN apt-get update && apt-get install -y -q --no-install-recommends \
        lib32ncurses5 \
        lib32stdc++6 \
        lib32z1 \
        libswt-gtk-3-java \
        unzip \
    && rm -rf /var/lib/apt/lists/*

RUN wget -qO- "http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz" | tar -zxv -C /opt/

RUN cd /opt/android-sdk-linux/tools/ && \
    echo y | ./android update sdk --all --filter platform-tools,build-tools-20.0.0,android-17,sysimg-17,system-image,extra-android-support --no-ui --force

ENV PATH /opt/android-sdk-linux/build-tools/20.0.0:$PATH

0
2018-05-18 14:52



你的 ./android update sdk 命令实际上没有更新“Android SDK Tools”包(tools 选项 --filter)OP在安装时遇到问题。 - Jianxin Gao
你为什么用 --force 旗? - Igor Ganapolsky