sterepando commited on
Commit
d300282
·
verified ·
1 Parent(s): 4e28415

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +42 -23
Dockerfile CHANGED
@@ -1,4 +1,3 @@
1
- # Используем Python 3.11 (как в Chaquopy 16.1)
2
  FROM python:3.11-slim
3
 
4
  RUN apt-get update && apt-get install -y \
@@ -13,7 +12,6 @@ RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-
13
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
14
  rm android-ndk-${NDK_VERSION}-linux.zip
15
 
16
- # Настройка Toolchain
17
  ENV NDK_ROOT=/build/android-ndk-${NDK_VERSION}
18
  ENV TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
19
  ENV API_LEVEL=30
@@ -23,37 +21,60 @@ ENV LD="$TOOLCHAIN/bin/ld"
23
  ENV AR="$TOOLCHAIN/bin/llvm-ar"
24
  ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
25
 
26
- # 2. Cython
27
  RUN pip install cython
28
 
29
- # 3. Скачиваем библиотеку
30
  RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
31
 
32
- # 4. ПАТЧ (Mocks для компиляции)
33
- RUN echo "Creating compile-time mocks..." && \
34
- printf "try:\n import java\nexcept ImportError:\n class _JavaMock:\n def __getattr__(self, name): return _JavaMock()\n def __call__(self, *args, **kwargs): return _JavaMock()\n @property\n def lang(self): return _JavaMock()\n java = _JavaMock()\n\ntry:\n OutOfMemoryError\nexcept NameError:\n class OutOfMemoryError(MemoryError): pass\n\n" > header_patch.py && \
35
- cat header_patch.py MandreLib.py > MandreLib_patched.py && \
36
- mv MandreLib_patched.py MandreLib.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
- # 5. Генерация C кода
 
 
 
 
 
39
  RUN cython -3 MandreLib.py -o MandreLib.c
40
 
41
- # =======================================================
42
- # 6. TRICK: Создаем фейковую libpython3.11.so (Stub)
43
- # =======================================================
44
- # Мы создаем пустую библиотеку под ARM64. Это нужно, чтобы линковщик (ld)
45
- # согласился прописать зависимость "NEEDED libpython3.11.so" в наш файл.
46
  RUN echo "int Py_Main(void){return 0;}" > stub.c && \
47
  $CC -shared -o libpython3.11.so stub.c
48
 
49
- # 7. Компиляция MandreLib.so
50
- # -L. : Искать библиотеки в текущей папке
51
- # -lpython3.11 : Слинковать с нашей фейковой библиотекой
52
- # -Wl,--allow-shlib-undefined : Игнорировать, что в фейковой либе нет реальных символов (Py_None и т.д.)
53
  ENV PYTHON_INCLUDE=/usr/local/include/python3.11
54
  ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL} -Wno-unused-command-line-argument"
55
 
56
- # Важно: Мы НЕ используем -undefined dynamic_lookup, мы делаем явную линковку
57
  RUN $CC $CFLAGS \
58
  -I$PYTHON_INCLUDE \
59
  -L. -lpython3.11 \
@@ -62,10 +83,8 @@ RUN $CC $CFLAGS \
62
  -shared \
63
  -Wl,--allow-shlib-undefined
64
 
65
- # 8. Чистка
66
  RUN $STRIP --strip-unneeded MandreLib.so
67
-
68
- # 9. Финал
69
  RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
70
  WORKDIR /output
71
  CMD ["python3", "-m", "http.server", "7860"]
 
 
1
  FROM python:3.11-slim
2
 
3
  RUN apt-get update && apt-get install -y \
 
12
  unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
13
  rm android-ndk-${NDK_VERSION}-linux.zip
14
 
 
15
  ENV NDK_ROOT=/build/android-ndk-${NDK_VERSION}
16
  ENV TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
17
  ENV API_LEVEL=30
 
21
  ENV AR="$TOOLCHAIN/bin/llvm-ar"
22
  ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
23
 
24
+ # 2. Dependencies
25
  RUN pip install cython
26
 
27
+ # 3. Download Source
28
  RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
29
 
30
+ # ==============================================================================
31
+ # 4. MAGIC PATCHER: Convert 'import org...' to 'jclass("org...")'
32
+ # ==============================================================================
33
+ # Мы пишем микро-скрипт на питоне, который переделает импорты MandreLib
34
+ # чтобы они работали в скомпилированном виде.
35
+ RUN echo "import re\n\
36
+ code = open('MandreLib.py', 'r', encoding='utf-8').read()\n\
37
+ \n\
38
+ # 1. Добавляем импорт jclass в начало\n\
39
+ code = 'from java import jclass\\n' + code\n\
40
+ \n\
41
+ # 2. Функция замены импортов\n\
42
+ def replace_java_import(match):\n\
43
+ pkg = match.group(1) # например 'org.telegram.messenger'\n\
44
+ imports = match.group(2).replace(' ', '').split(',') # ['ApplicationLoader', 'AndroidUtilities']\n\
45
+ lines = []\n\
46
+ for cls in imports:\n\
47
+ # Превращаем в: ApplicationLoader = jclass('org.telegram.messenger.ApplicationLoader')\n\
48
+ lines.append(f'{cls} = jclass(\"{pkg}.{cls}\")')\n\
49
+ return '\\n'.join(lines)\n\
50
+ \n\
51
+ # 3. Патчим 'from org... import' и 'from android... import'\n\
52
+ # Игнорируем обычные питоновские импорты\n\
53
+ code = re.sub(r'^from (org[\.\w]+|android[\.\w]+|java[\.\w]+) import ([\w, ]+)', replace_java_import, code, flags=re.MULTILINE)\n\
54
+ \n\
55
+ # 4. Удаляем несовместимые с Cython конструкции (если есть)\n\
56
+ # Например, прямые вызовы, которые могут крашнуть компилятор\n\
57
+ \n\
58
+ open('MandreLib.py', 'w', encoding='utf-8').write(code)\n\
59
+ print('Java imports patched successfully!')\n\
60
+ " > patcher.py && python3 patcher.py
61
 
62
+ # 5. Mocks for Cython (чтобы компилятор знал о существовании jclass)
63
+ RUN echo "try:\n import java\nexcept ImportError:\n class _M:\n def __getattr__(self, n): return _M()\n def __call__(self, *a, **k): return _M()\n java = _M()\n jclass = _M()\n" > mocks.py && \
64
+ cat mocks.py MandreLib.py > MandreLib_final.py && \
65
+ mv MandreLib_final.py MandreLib.py
66
+
67
+ # 6. Generate C
68
  RUN cython -3 MandreLib.py -o MandreLib.c
69
 
70
+ # 7. Fake Linker (чтобы библиотека знала про Python)
 
 
 
 
71
  RUN echo "int Py_Main(void){return 0;}" > stub.c && \
72
  $CC -shared -o libpython3.11.so stub.c
73
 
74
+ # 8. Compile
 
 
 
75
  ENV PYTHON_INCLUDE=/usr/local/include/python3.11
76
  ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL} -Wno-unused-command-line-argument"
77
 
 
78
  RUN $CC $CFLAGS \
79
  -I$PYTHON_INCLUDE \
80
  -L. -lpython3.11 \
 
83
  -shared \
84
  -Wl,--allow-shlib-undefined
85
 
86
+ # 9. Strip & Serve
87
  RUN $STRIP --strip-unneeded MandreLib.so
 
 
88
  RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
89
  WORKDIR /output
90
  CMD ["python3", "-m", "http.server", "7860"]