aboutsummaryrefslogtreecommitdiffstats
path: root/docker/focal/test-android.Dockerfile
blob: 5f479e4fce334f94b2a831ff6f8938d9e80e3f54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#
# Android SDK/NDK + Qt for Android for testing Qbs
#
FROM ubuntu:focal
LABEL Description="Ubuntu test environment for Qbs and Qt for Android"

# Allow colored output on command line.
ENV TERM=xterm-color

#
# Make it possible to change UID/GID in the entrypoint script. The docker
# container usually runs as root user on Linux hosts. When the Docker container
# mounts a folder on the host and creates files there, those files would be
# owned by root instead of the current user. Thus we create a user here who's
# UID will be changed in the entrypoint script to match the UID of the current
# host user.
#
ARG USER_UID=1000
ARG USER_NAME=devel
RUN apt-get update -qq && \
    apt-get install -qq -y \
        ca-certificates \
        gosu \
        sudo && \
    groupadd -g ${USER_UID} ${USER_NAME} && \
    useradd -s /bin/bash -u ${USER_UID} -g ${USER_NAME} -o -c "" -m ${USER_NAME} && \
    usermod -a -G sudo ${USER_NAME} && \
    echo "%devel         ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers

COPY docker/focal/entrypoint.sh /sbin/entrypoint.sh
ENTRYPOINT ["/sbin/entrypoint.sh"]

# Qbs build dependencies
RUN apt-get update -qq && \
    apt-get install -qq -y --no-install-recommends \
        ca-certificates \
        curl \
        libasan5 \
        libglib2.0-0 \
        locales \
        openjdk-8-jdk-headless \
        p7zip-full \
        unzip

# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
RUN echo "export JAVA_HOME=${JAVA_HOME}" > /etc/profile.d/android.sh && \
    echo "export PATH=${JAVA_HOME}/bin:\${PATH}" >> /etc/profile.d/android.sh

ARG ANDROID_NDK_VERSION

ENV ANDROID_HOME="/home/${USER_NAME}/android"
ENV ANDROID_SDK_ROOT=${ANDROID_HOME}
ENV ANDROID_NDK_ROOT=${ANDROID_HOME}/"ndk"/${ANDROID_NDK_VERSION}
ENV PATH="${JAVA_HOME}:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/bin:$PATH"
RUN echo "export ANDROID_HOME=/home/${USER_NAME}/android" >> /etc/profile.d/android.sh && \
    echo "export ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}" >> /etc/profile.d/android.sh && \
    echo "export ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}" >> /etc/profile.d/android.sh && \
    echo "export PATH=${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/bin:\$PATH" >> /etc/profile.d/android.sh

#
# We ned to run the following steps as the target user
#
USER ${USER_NAME}
RUN mkdir ${ANDROID_HOME}

# Get Android command line tools
ARG COMMAND_LINE_TOOLS_VERSION="6858069"
RUN curl -s https://dl.google.com/android/repository/commandlinetools-linux-${COMMAND_LINE_TOOLS_VERSION}_latest.zip > ${ANDROID_HOME}/commandlinetools.zip && \
    unzip ${ANDROID_HOME}/commandlinetools.zip -d ${ANDROID_HOME} && \
    rm -v ${ANDROID_HOME}/commandlinetools.zip

# Accept SDK license
ARG ANDROID_PLATFORM="android-30"
ARG BUILD_TOOLS="29.0.2"
RUN yes | sdkmanager "--sdk_root=${ANDROID_HOME}" --verbose --licenses && \
          sdkmanager "--sdk_root=${ANDROID_HOME}" --update && \
          sdkmanager "--sdk_root=${ANDROID_HOME}" "platforms;${ANDROID_PLATFORM}"

RUN yes | sdkmanager "--sdk_root=${ANDROID_HOME}" "build-tools;${BUILD_TOOLS}"
RUN yes | sdkmanager "--sdk_root=${ANDROID_HOME}" "platform-tools"
RUN yes | sdkmanager "--sdk_root=${ANDROID_HOME}" "tools"
RUN yes | sdkmanager "--sdk_root=${ANDROID_HOME}" "ndk;${ANDROID_NDK_VERSION}"

RUN /usr/lib/jvm/java-8-openjdk-amd64/bin/keytool -genkey -keystore /home/${USER_NAME}/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname 'CN=Android Debug,O=Android,C=US'

# Install ndk samples in ${ANDROID_NDK_ROOT}/samples
RUN cd ${ANDROID_NDK_ROOT} && \
    curl -sLO https://github.com/android/ndk-samples/archive/master.zip && \
    unzip -q master.zip && \
    rm -v master.zip && \
    mv ndk-samples-master samples

# Install android-BasicMediaDecoder in ${ANDROID_SDK_ROOT}/samples
RUN mkdir ${ANDROID_SDK_ROOT}/samples && \
    cd ${ANDROID_SDK_ROOT}/samples && \
    curl -sLO https://github.com/googlearchive/android-BasicMediaDecoder/archive/master.zip && \
    unzip -q master.zip && \
    rm -v master.zip && \
    mv android-BasicMediaDecoder-master android-BasicMediaDecoder

# Download buildtool to generate aab packages in ${ANDROID_SDK_ROOT}
RUN cd ${ANDROID_SDK_ROOT} && \
    curl -sLO https://github.com/google/bundletool/releases/download/1.3.0/bundletool-all-1.3.0.jar

USER root

#
# Install Qt and Qbs for Linux from qt.io
#
ARG QT_VERSION
COPY scripts/install-qt.sh install-qt.sh
RUN if [ "${QT_VERSION}" \< "5.14" ] || [ ! "${QT_VERSION}" \< "6.0.0" ]; then \
        QT_ABIS="android_armv7 android_arm64_v8a android_x86 android_x86_64"; \
    else \
        QT_ABIS="any"; \
    fi; \
    if [ ! "${QT_VERSION}" \< "6.0.0" ]; then \
        ./install-qt.sh --version ${QT_VERSION} qtbase qtdeclarative icu; \
        if [ "${QT_VERSION}" \< "6.1.0" ]; then \
            QT_COMPONENTS="qtbase qtdeclarative qttools qtquickcontrols2 qtquicktimeline svg"; \
        else \
            QT_COMPONENTS="qtbase qtdeclarative qttools qtquicktimeline svg"; \
        fi; \
    else \
        QT_COMPONENTS="qtbase qtdeclarative qttools qtimageformats"; \
    fi; \
    for abi in ${QT_ABIS}; do \
        ./install-qt.sh --version ${QT_VERSION} --target android --toolchain ${abi} ${QT_COMPONENTS}; \
    done && \
    echo "export QT_VERSION=${QT_VERSION}" >> /etc/profile.d/qt.sh