File size: 5,451 Bytes
a7a3c48 095de42 d9529e0 a7a3c48 b3085b1 d9529e0 a7a3c48 b3085b1 9071793 a7a3c48 d9529e0 9071793 d9529e0 9071793 e342572 a7a3c48 e9b6dff 9071793 a7a3c48 032da65 e342572 a7a3c48 9071793 7b86128 9071793 a7a3c48 9071793 a7a3c48 e342572 a7a3c48 9071793 a7a3c48 9071793 a7a3c48 9071793 a7a3c48 9071793 a7a3c48 9071793 a7a3c48 9071793 d9529e0 a7a3c48 9071793 a7a3c48 d9529e0 a7a3c48 d9529e0 a7a3c48 9071793 e342572 b3085b1 9071793 032da65 a7a3c48 |
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 |
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"]
|