在Docker容器中执行AAPT命令时遇到问题

3
我正在处理一个Dockerfile,我试图创建一个容器环境来运行需要ADB和AAPT可执行文件的Java代码。虽然我已经成功执行了ADB命令,但在尝试在Docker容器内运行AAPT命令时遇到了问题。
这是我Dockerfile的简化版本:
FROM maven:3.8.6-eclipse-temurin-19-alpine as build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

FROM eclipse-temurin:19-jdk-alpine
VOLUME /tmp
RUN apk update && \
    apk add -v --no-cache android-tools
COPY --from=build /home/app/target/*.jar /project.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /project.jar"]

我已经通过apk命令在容器中包含了android-tools软件包,这使得我能够成功运行ADB命令。然而,我无法执行AAPT命令,而我的Java代码也需要它。
如果我对AAPT的软件包选错了,那么正确的软件包是什么,可以在容器中运行apk以获取AAPT可执行文件呢?
如果有人在Docker容器中使用AAPT或者对可能导致此问题的原因有任何见解,我将非常感谢您的帮助。谢谢!
3个回答

2
由于AAPT2(Android资产打包工具)Android SDK构建工具的一部分,而该工具是Android SDK的一个组件... 将其添加到您的Dockerfile中应该会有所帮助。
我将使用android-sdk-cmdline-tools-offline
# Use a base image
FROM maven:3.8.6-eclipse-temurin-19-alpine as build

# Set environment variables
ENV ANDROID_SDK_ROOT /usr/local/android-sdk
ENV BUILD_TOOLS_VERSION 34.0.0
ENV CMDLINE_TOOLS_VERSION 9644228

# Install dependencies
RUN apk update && \
    apk add --no-cache wget unzip

# Download and extract Android SDK command-line tools
RUN wget https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINE_TOOLS_VERSION}_latest.zip -O sdk-tools.zip && \
    mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \
    unzip sdk-tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools/ && \
    mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \
    rm sdk-tools.zip

# Add the Android SDK tools to the PATH
ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin

# Install the Android Build Tools
RUN yes | sdkmanager "build-tools;${BUILD_TOOLS_VERSION}"

# Copy your project files
COPY src /home/app/src
COPY pom.xml /home/app

# Build your project
RUN mvn -f /home/app/pom.xml clean package

# Setup the runtime stage
FROM eclipse-temurin:19-jdk-alpine

# Set environment variables
ENV ANDROID_SDK_ROOT /usr/local/android-sdk
ENV BUILD_TOOLS_VERSION 34.0.0

# Install Android Build-Tools
COPY --from=build ${ANDROID_SDK_ROOT} ${ANDROID_SDK_ROOT}

# Add the Android SDK tools to the PATH
ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/build-tools/${BUILD_TOOLS_VERSION}

# Setup a volume
VOLUME /tmp

# Copy the built jar file
COPY --from=build /home/app/target/*.jar /project.jar

# Set the entry point for your container
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /project.jar"]

我添加了环境变量(ANDROID_SDK_ROOT、BUILD_TOOLS_VERSION和CMDLINE_TOOLS_VERSION),以便更容易引用Android SDK根路径和构建工具版本。我还安装了wget和unzip来下载和提取Android SDK命令行工具。
这样,我可以将Android SDK命令行工具下载和提取到指定的ANDROID_SDK_ROOT,并将Android SDK cmdline-tools二进制目录添加到PATH中。 我使用sdkmanager来安装指定版本的Android Build-Tools(根据需要调整BUILD_TOOLS_VERSION和CMDLINE_TOOLS_VERSION)。
在运行时阶段,我将整个Android SDK安装从构建阶段复制到确保aapt和其他构建工具在运行时环境中可用。并且我将构建工具目录添加到PATH中,以便在运行时容器中的PATH中可用aapt可执行文件。

0
要在容器中获取AAPT可执行文件,您需要安装android-sdk-cmdline-tools包。android-tools包只包含ADB可执行文件。要修复您的Dockerfile,您可以将apk add命令更改为以下内容:
apk add -v --no-cache android-sdk-cmdline-tools

这是更新后的Dockerfile:
FROM maven:3.8.6-eclipse-temurin-19-alpine as build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

FROM eclipse-temurin:19-jdk-alpine
VOLUME /tmp
RUN apk update && \
    apk add -v --no-cache android-sdk-cmdline-tools
COPY --from=build /home/app/target/*.jar /project.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /project.jar"]

0
要在Docker容器中包含AAPT,您需要安装Android SDK或独立的Android构建工具包,因为AAPT通常与这些工具一起捆绑安装。
以下是一个更新的Dockerfile,它会在您的容器中安装包含AAPT的Android构建工具:
FROM maven:3.8.6-eclipse-temurin-19-alpine as build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

FROM eclipse-temurin:19-jdk-alpine
VOLUME /tmp
RUN apk update && \
    apk add -v --no-cache android-tools && \
    wget https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip -O /tmp/android-tools.zip && \
    unzip -d /usr/local/android /tmp/android-tools.zip && \
    rm /tmp/android-tools.zip && \
    /usr/local/android/cmdline-tools/bin/sdkmanager --install "build-tools;30.0.3" && \
    ln -s /usr/local/android/cmdline-tools/tools/bin/aapt /usr/bin/aapt
COPY --from=build /home/app/target/*.jar /project.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /project.jar"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接