|
|
FROM ubuntu:22.04 |
|
|
|
|
|
|
|
|
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/* |
|
|
|
|
|
|
|
|
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} |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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" |
|
|
|
|
|
|
|
|
ENV TARGET=aarch64-linux-android |
|
|
ENV API=30 |
|
|
ENV PREFIX=/build/deps |
|
|
WORKDIR /build |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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"] |
|
|
|