Spaces:
Paused
Paused
Update Dockerfile
Browse files- 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.
|
| 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 |
-
#
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
-
# 5.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
#
|
| 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 |
-
#
|
| 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"]
|