FROM ubuntu:22.04 # 1. Системные зависимости ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ build-essential cmake wget unzip git python3 \ openjdk-17-jdk-headless gettext libz-dev ninja-build zip \ && rm -rf /var/lib/apt/lists/* # 2. Android NDK r25c ENV NDK_VERSION=r25c RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip \ && unzip -q android-ndk-${NDK_VERSION}-linux.zip -d /opt \ && rm android-ndk-${NDK_VERSION}-linux.zip ENV ANDROID_NDK_HOME=/opt/android-ndk-${NDK_VERSION} # 3. Android SDK (Command Line Tools для сборки DEX) RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -O sdk.zip \ && mkdir -p /opt/android-sdk/cmdline-tools \ && unzip -q sdk.zip -d /opt/android-sdk/cmdline-tools \ && mv /opt/android-sdk/cmdline-tools/cmdline-tools /opt/android-sdk/cmdline-tools/latest \ && rm sdk.zip # Настройка путей (добавляем компиляторы NDK в PATH для OpenSSL) ENV PATH="/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/build-tools/30.0.3:${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin:${PATH}" RUN yes | sdkmanager --sdk_root=/opt/android-sdk "platforms;android-30" "build-tools;30.0.3" # 4. Параметры сборки ENV TARGET=aarch64-linux-android ENV API=30 ENV PREFIX=/build/deps WORKDIR /build # 5. Сборка ZLIB (Static) RUN wget -q https://zlib.net/zlib-1.3.1.tar.gz && tar -xf zlib-1.3.1.tar.gz && cd zlib-1.3.1 \ && CC=$TARGET$API-clang ./configure --prefix=$PREFIX --static && make -j4 install # 6. Сборка OPENSSL (Static, API 30) # ФИКС: Ограничиваем потоки до 4, чтобы избежать ошибки .d.tmp, и чистим макросы RUN wget -q https://www.openssl.org/source/openssl-1.1.1w.tar.gz && tar -xf openssl-1.1.1w.tar.gz && cd openssl-1.1.1w \ && ./Configure android-arm64 no-shared no-tests --prefix=$PREFIX \ && sed -i "s/-D__ANDROID_API__=[0-9]*/-D__ANDROID_API__=$API/g" Makefile \ && make -j4 install_sw # 7. Сборка EXPAT (Static) RUN wget -q https://github.com/libexpat/libexpat/releases/download/R_2_5_0/expat-2.5.0.tar.gz && tar -xf expat-2.5.0.tar.gz && cd expat-2.5.0 \ && ./configure --host=$TARGET --prefix=$PREFIX --enable-static --disable-shared && make -j4 install # 8. Сборка CURL (Static с OpenSSL) RUN wget -q https://curl.se/download/curl-8.5.0.tar.gz && tar -xf curl-8.5.0.tar.gz && cd curl-8.5.0 \ && ./configure --host=$TARGET --prefix=$PREFIX --with-openssl=$PREFIX --with-zlib=$PREFIX \ --enable-static --disable-shared --disable-ldap --disable-proxy && make -j4 install # 9. Сборка GIT (Супер-Статика) RUN wget -q https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz && tar -xf git-2.43.0.tar.gz && cd git-2.43.0 \ && export LDFLAGS="-static -L$PREFIX/lib" \ && export CPPFLAGS="-I$PREFIX/include" \ && ./configure --host=$TARGET --prefix=/data/local/tmp/git \ --with-curl=$PREFIX --with-zlib=$PREFIX --with-expat=$PREFIX --with-openssl=$PREFIX \ ac_cv_fread_reads_directories=yes ac_cv_snprintf_returns_bogus=no \ && make -j4 install NO_TCLTK=1 NO_GETTEXT=1 NO_PYTHON=1 NO_INSTALL_HARDLINKS=1 # 10. Java Установщик (DEX) с автоматической регистрацией PATH через рефлексию RUN mkdir -p /build/java/ni/mandre/git && echo 'package ni.mandre.git; \n\ import android.content.Context; \n\ import java.io.*; \n\ import java.lang.reflect.*; \n\ import java.util.*; \n\ public class GitInstaller { \n\ public static void install(Context ctx, byte[] gitData) { \n\ try { \n\ File binDir = ctx.getDir("bin", Context.MODE_PRIVATE); \n\ File gitBin = new File(binDir, "git"); \n\ FileOutputStream fos = new FileOutputStream(gitBin); \n\ fos.write(gitData); fos.close(); \n\ gitBin.setExecutable(true, false); \n\ injectPath(binDir.getAbsolutePath()); \n\ System.out.println("MandreGit: Git binary registered at " + gitBin.getAbsolutePath()); \n\ } catch (Exception e) { e.printStackTrace(); } \n\ } \n\ private static void injectPath(String newPath) { \n\ try { \n\ Map env = System.getenv(); \n\ Field field = env.getClass().getDeclaredField("m"); \n\ field.setAccessible(true); \n\ Map writableEnv = (Map) field.get(env); \n\ String path = writableEnv.get("PATH"); \n\ if (path == null || !path.contains(newPath)) { \n\ writableEnv.put("PATH", newPath + ":" + (path == null ? "" : path)); \n\ } \n\ } catch (Exception e) {} \n\ } \n\ }' > /build/java/ni/mandre/git/GitInstaller.java # Компиляция в DEX RUN javac -source 8 -target 8 -cp /opt/android-sdk/platforms/android-30/android.jar /build/java/ni/mandre/git/GitInstaller.java \ && d8 --output /build/git_setup.dex /build/java/ni/mandre/git/GitInstaller.class # 11. Упаковка RUN cp /data/local/tmp/git/bin/git /build/git_arm64 && \ zip -j /build/git_bundle.zip /build/git_arm64 /build/git_setup.dex # Запуск сервера EXPOSE 7860 CMD ["python3", "-m", "http.server", "7860"]