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"]