mirror of
https://github.com/okhsunrog/vpnhide.git
synced 2026-04-28 06:31:27 +00:00
Profiling the warm-cache run on PR #105 showed three remaining hot spots in the Gradle phase: installUniffiBindgen 52s ← cargo install on every CI build cargoBuildAndroidArm64Debug 30s ← Rust crate compile lintAnalyze* (3 variants) 43s ← AGP Lint × main + unit + androidTest This PR cuts the first one entirely and trims the third. - Dockerfile: pre-install uniffi-bindgen 0.29.x in the CI image so Gobley's :app:installUniffiBindgen task finds it ready instead of rebuilding it from sources on every run. Triggers a ci-image rebuild on merge — wait for that workflow to finish before merging consumers (or the first lint/lsposed run will still hit the old image and behave as before). - lsposed/gradle.properties: enable build cache + configuration cache. Verified locally: `./gradlew :app:assembleDebug --configuration-cache` reports "Configuration cache entry stored" cleanly with Gobley 0.3.7 + AGP 8.9.3 + Kotlin 2.1.20. - lsposed/app/build.gradle.kts: `lint { checkTestSources = false }`. Skips lintAnalyzeDebugUnitTest / lintAnalyzeDebugAndroidTest. Test sources here are pure JVM unit-test logic — functional bugs caught by :app:testDebugUnitTest, no Android-lifecycle code to lint. Deliberately leave `checkReleaseBuilds` at its default so ad-hoc `./gradlew :app:lint` still catches R8/ProGuard issues. - .github/workflows/ci.yml: `:app:lint` -> `:app:lintDebug`. Lints the debug variant only on PRs; release-variant Lint stays available locally / for future tag-time CI. - docs/development.md: refresh local-lint snippet. Expected effect on warm cache (cumulative on top of PR #105): lint 286s -> ~190s (3m10s, -32%) lsposed 227s -> ~130s (2m10s, -42%)
91 lines
4.2 KiB
Docker
91 lines
4.2 KiB
Docker
# CI image for vpnhide.
|
|
#
|
|
# Bakes in everything needed for all three modules:
|
|
# - Rust + NDK + cargo-ndk (zygisk)
|
|
# - JDK 17 (lsposed, test-app)
|
|
# - Google AOSP clang + cross-compile tools (kmod)
|
|
#
|
|
# Rebuilt by ci-image.yml when this Dockerfile changes (and monthly).
|
|
|
|
FROM ubuntu:24.04
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
RUN apt-get update && \
|
|
apt-get install -y --no-install-recommends \
|
|
ca-certificates curl unzip zip xz-utils \
|
|
build-essential pkg-config \
|
|
cmake ninja-build \
|
|
openjdk-17-jdk-headless \
|
|
bc kmod cpio flex bison libssl-dev libelf-dev \
|
|
binutils-aarch64-linux-gnu \
|
|
clang-format \
|
|
git && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
# ── ktlint (for lsposed / test-app Kotlin) ──────────────────────────
|
|
ENV KTLINT_VERSION=1.8.0
|
|
RUN curl -fsSL -o /usr/local/bin/ktlint \
|
|
"https://github.com/pinterest/ktlint/releases/download/${KTLINT_VERSION}/ktlint" && \
|
|
chmod +x /usr/local/bin/ktlint
|
|
|
|
# ── Android SDK (for lsposed) ────────────────────────────────────────
|
|
ENV ANDROID_HOME=/opt/android-sdk
|
|
ENV PATH="${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${PATH}"
|
|
|
|
RUN mkdir -p "${ANDROID_HOME}/cmdline-tools" && \
|
|
curl -fsSL -o /tmp/cmdline-tools.zip \
|
|
"https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" && \
|
|
unzip -q /tmp/cmdline-tools.zip -d /tmp/cmdline-tools && \
|
|
mv /tmp/cmdline-tools/cmdline-tools "${ANDROID_HOME}/cmdline-tools/latest" && \
|
|
rm -rf /tmp/cmdline-tools.zip /tmp/cmdline-tools && \
|
|
yes | sdkmanager --licenses > /dev/null 2>&1 && \
|
|
sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0" && \
|
|
chmod -R a+rx "${ANDROID_HOME}"
|
|
|
|
# ── Rust toolchain (for zygisk) ──────────────────────────────────────
|
|
ENV RUSTUP_HOME=/usr/local/rustup \
|
|
CARGO_HOME=/usr/local/cargo \
|
|
PATH=/usr/local/cargo/bin:$PATH
|
|
|
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
|
|
sh -s -- -y --default-toolchain stable --profile minimal --no-modify-path && \
|
|
rustup target add aarch64-linux-android && \
|
|
rustup component add rustfmt clippy && \
|
|
cargo install cargo-ndk --locked && \
|
|
# Pre-built uniffi-bindgen so Gobley's :app:installUniffiBindgen task
|
|
# finds it ready (instead of running `cargo install uniffi-bindgen` on
|
|
# every CI build — that took ~50 s of the lsposed/lint job each run).
|
|
# Version range matches lsposed/native/Cargo.toml's `uniffi = "0.29"`.
|
|
cargo install uniffi-bindgen --version "^0.29" --locked && \
|
|
chmod -R a+w /usr/local/rustup /usr/local/cargo
|
|
|
|
# ── Android NDK (for zygisk) ─────────────────────────────────────────
|
|
ENV ANDROID_NDK_VERSION=r28b
|
|
ENV ANDROID_NDK_HOME=/opt/android-ndk
|
|
# Gobley's cargo plugin reads ANDROID_NDK_ROOT (not _HOME) to find the NDK
|
|
# when looking up the toolchain library directory for Android Rust targets.
|
|
ENV ANDROID_NDK_ROOT=/opt/android-ndk
|
|
|
|
RUN curl -fsSL -o /tmp/ndk.zip \
|
|
"https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip" && \
|
|
unzip -q /tmp/ndk.zip -d /opt && \
|
|
mv "/opt/android-ndk-${ANDROID_NDK_VERSION}" "${ANDROID_NDK_HOME}" && \
|
|
rm /tmp/ndk.zip && \
|
|
chmod -R a+rx "${ANDROID_NDK_HOME}"
|
|
|
|
# ── Google AOSP clang (for kmod) ─────────────────────────────────────
|
|
# Same toolchain that built the Pixel GKI kernel — avoids ABI mismatches
|
|
# that cause bootloops with distro clang.
|
|
ENV AOSP_CLANG_VERSION=clang-r487747c
|
|
ENV AOSP_CLANG_DIR=/opt/aosp-clang
|
|
|
|
RUN git clone --depth=1 --filter=blob:none --sparse \
|
|
-b android-gs-shusky-6.1-android16 \
|
|
https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 \
|
|
/tmp/clang-repo && \
|
|
cd /tmp/clang-repo && \
|
|
git sparse-checkout set ${AOSP_CLANG_VERSION} && \
|
|
mv ${AOSP_CLANG_VERSION} ${AOSP_CLANG_DIR} && \
|
|
rm -rf /tmp/clang-repo && \
|
|
chmod -R a+rx ${AOSP_CLANG_DIR}
|