我正在开发一个 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 的经验,或者对可能导致此问题的原因有任何见解,我将非常感谢您的帮助。谢谢!
由于 AAPT2(Android 资产打包工具) 是 Android SDK Build-Tools 的一部分,它是 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 bin 目录添加到 PATH 中。sdkmanager
安装指定版本的 Android Build-Tools(根据需要调整 BUILD_TOOLS_VERSION
和 CMDLINE_TOOLS_VERSION
)。
在运行时阶段,我从构建阶段复制了整个Android SDK安装,以确保
aapt
和其他构建工具在运行时环境中可用。我将 build-tools 目录添加到 PATH 中,以使 aapt
可执行文件在运行时容器的 PATH 中可用。