diff --git a/container/Dockerfile b/container/Dockerfile new file mode 100644 index 00000000..84b2493f --- /dev/null +++ b/container/Dockerfile @@ -0,0 +1,65 @@ +# Run with: +# podman build -t scrcpy-builder . + +FROM debian:trixie + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + sudo wget unzip gcc git pkg-config meson ninja-build libsdl2-dev \ + libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \ + libswresample-dev libusb-1.0-0-dev openjdk-21-jdk + +RUN groupadd -g 1000 debian \ + && useradd -m -u 1000 -g 1000 -s /bin/bash debian +RUN echo "debian ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +ENV ANDROID_HOME=/opt/android/sdk +RUN mkdir -p "$ANDROID_HOME" \ + && chown debian:debian "$ANDROID_HOME" + +USER debian +WORKDIR /home/debian + +ENV CMDLINETOOLS_URL=https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip +ENV CMDLINETOOLS_SHA256=7ec965280a073311c339e571cd5de778b9975026cfcbe79f2b1cdcb1e15317ee + +RUN wget -q "$CMDLINETOOLS_URL" -O cmdlinetools.zip \ + && echo "$CMDLINETOOLS_SHA256 cmdlinetools.zip" | sha256sum -c + +RUN mkdir tmp \ + && unzip -q cmdlinetools.zip -d tmp \ + && mkdir -p "$ANDROID_HOME/cmdline-tools" \ + && mv tmp/cmdline-tools "$ANDROID_HOME/cmdline-tools/latest" \ + && rmdir tmp \ + && rm cmdlinetools.zip +# To get the licence hash, run manually: "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --licenses +# Build-tools 35 is still needed for the current AGP version +RUN mkdir -p "$ANDROID_HOME/licenses" \ + && echo 24333f8a63b6825ea9c5514f83c2829b004d1fee > "$ANDROID_HOME/licenses/android-sdk-license" \ + && $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-36" "build-tools;35.0.0" "build-tools;36.0.0" + +# For scrcpy build scripts +ENV GRADLE_VERSION=8.14.3 +ENV GRADLE_HOME=/opt/gradle-$GRADLE_VERSION +ENV GRADLE_URL=https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip +ENV GRADLE_SHA256=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 +ENV GRADLE=gradle +ENV PATH=$GRADLE_HOME/bin:$PATH + +USER root +RUN wget -q "$GRADLE_URL" -O gradle.zip \ + && echo "$GRADLE_SHA256 gradle.zip" | sha256sum -c +RUN unzip -q gradle.zip -d /opt \ + && rm gradle.zip + +USER debian + +# Pre-download gradle dependencies for scrcpy +RUN mkdir -p /home/debian/fake-scrcpy/app +COPY fake.gradle /home/debian/fake-scrcpy/build.gradle +COPY fake_app.gradle /home/debian/fake-scrcpy/app/build.gradle +RUN echo "include ':app'" > /home/debian/fake-scrcpy/settings.gradle \ + && gradle -p /home/debian/fake-scrcpy dependencies androidDependencies --no-daemon \ + && rm -rf /home/debian/fake-scrcpy diff --git a/container/fake.gradle b/container/fake.gradle new file mode 100644 index 00000000..1fc6f2a5 --- /dev/null +++ b/container/fake.gradle @@ -0,0 +1,17 @@ +// Fake build.gradle to pre-download gradle dependencies +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.13.0' + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} diff --git a/container/fake_app.gradle b/container/fake_app.gradle new file mode 100644 index 00000000..b06fb432 --- /dev/null +++ b/container/fake_app.gradle @@ -0,0 +1,21 @@ +// Fake app/build.gradle to pre-download gradle dependencies +apply plugin: 'com.android.application' +apply plugin: 'checkstyle' + +android { + buildToolsVersion = "36.0.0" + namespace = "com.genymobile.scrcpy" + compileSdk 36 + defaultConfig { + minSdkVersion 21 + targetSdkVersion 36 + } +} + +checkstyle { + toolVersion = '10.12.5' +} + +dependencies { + testImplementation 'junit:junit:4.13.2' +}