Spaces:
Build error
Build error
| 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<String, String> env = System.getenv(); \n\ | |
| Field field = env.getClass().getDeclaredField("m"); \n\ | |
| field.setAccessible(true); \n\ | |
| Map<String, String> writableEnv = (Map<String, String>) 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"] | |