LuaJava-.jar-to-.dex / Dockerfile
sterepando's picture
Update Dockerfile
9071793 verified
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"]