From c3f931d075e657fe6e519f8931f1c21739cce1ca Mon Sep 17 00:00:00 2001 From: sssnake Date: Tue, 31 Mar 2026 21:23:57 -0700 Subject: [PATCH] =?UTF-8?q?BuildChain=20v1.0.0=20=E2=80=94=20on-device=20A?= =?UTF-8?q?ndroid=20build=20toolchain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KernelSU module that turns any rooted phone into a native Android compiler. Includes aapt2/aapt/aidl/zipalign/dexdump (API 35 static arm64), BusyBox, platform-tools. Hooks into Termux for Java/Kotlin/ Python/Gradle. bc-build compiles Java/Kotlin to APK or runs Gradle projects. bc-sign handles debug/release signing. WebUI dashboard on port 8089. Auto-links tools into system PATH and Termux PATH. --- .gitignore | 1 + build.sh | 19 +++++++++++ customize.sh | 79 ++++++++++++++++++++++++++++++++++++++++++++ scripts/webui-server | 29 ++++++++++++++-- 4 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100755 build.sh create mode 100755 customize.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4c4ffc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.zip diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..f25c77c --- /dev/null +++ b/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e +cd "$(dirname "$0")" + +ZIP="BuildChain-v1.0.0.zip" +rm -f "$ZIP" + +zip -r9 "$ZIP" \ + module.prop \ + customize.sh \ + post-fs-data.sh \ + service.sh \ + uninstall.sh \ + tools/ \ + scripts/ \ + webroot/ \ + -x "*.git*" "build.sh" "sepolicy/*" + +echo "Built: $ZIP ($(du -h "$ZIP" | cut -f1))" diff --git a/customize.sh b/customize.sh new file mode 100755 index 0000000..9db6d89 --- /dev/null +++ b/customize.sh @@ -0,0 +1,79 @@ +#!/system/bin/sh +# BuildChain — KernelSU installation script + +SKIPUNZIP=0 + +ui_print "================================================" +ui_print " BuildChain v1.0.0" +ui_print " On-device Android build toolchain" +ui_print "================================================" +ui_print "" + +DEVICE=$(getprop ro.product.model) +ARCH=$(uname -m) +API=$(getprop ro.build.version.sdk) + +ui_print "- Device: $DEVICE ($ARCH)" +ui_print "- Android API: $API" +ui_print "" + +# Verify arch +case "$ARCH" in + aarch64|arm64) + ui_print "- Architecture: arm64 (supported)" + ;; + *) + ui_print "! WARNING: Untested architecture: $ARCH" + ui_print "! Build tools are compiled for arm64" + ;; +esac + +ui_print "" +ui_print "- Setting up config directory..." +CONFIG_DIR="/data/adb/buildchain" +mkdir -p "$CONFIG_DIR" +echo "$MODPATH" > "$CONFIG_DIR/moddir" + +ui_print "- Setting permissions..." +set_perm_recursive $MODPATH 0 0 0755 0644 +set_perm_recursive $MODPATH/tools 0 2000 0755 0755 +set_perm_recursive $MODPATH/scripts 0 2000 0755 0755 +set_perm $MODPATH/service.sh 0 0 0755 +set_perm $MODPATH/post-fs-data.sh 0 0 0755 +set_perm $MODPATH/uninstall.sh 0 0 0755 + +# Verify tools work +ui_print "" +ui_print "- Testing build tools..." +for tool in aapt2 aidl zipalign; do + if [ -f "$MODPATH/tools/build-tools/$tool" ]; then + ui_print " [OK] $tool" + else + ui_print " [!!] $tool missing" + fi +done + +if [ -f "$MODPATH/tools/busybox" ]; then + APPLETS=$("$MODPATH/tools/busybox" --list 2>/dev/null | wc -l) + ui_print " [OK] busybox ($APPLETS applets)" +else + ui_print " [!!] busybox missing" +fi + +# Check Termux +ui_print "" +if pm list packages 2>/dev/null | grep -q "com.termux"; then + ui_print "- Termux: installed" + ui_print "- After reboot, open Termux and run:" + ui_print " buildchain setup" +else + ui_print "! Termux not installed" + ui_print "! Install Termux from F-Droid, then run: buildchain setup" +fi + +ui_print "" +ui_print "- Installation complete!" +ui_print "- Reboot to activate" +ui_print "- CLI: buildchain status" +ui_print "- WebUI: http://localhost:8089" +ui_print "" diff --git a/scripts/webui-server b/scripts/webui-server index 0ef82ee..328fa25 100755 --- a/scripts/webui-server +++ b/scripts/webui-server @@ -150,8 +150,31 @@ handle_request() { } log "Starting on port $PORT" + +# Find a working netcat +NC="" +if command -v busybox >/dev/null 2>&1 && busybox nc --help 2>&1 | grep -q "\-ll"; then + NC="busybox nc" +elif [ -f "$MODDIR/tools/busybox" ]; then + NC="$MODDIR/tools/busybox nc" +elif command -v toybox >/dev/null 2>&1; then + NC="toybox nc" +fi + +if [ -z "$NC" ]; then + log "ERROR: No working netcat found" + exit 1 +fi + +log "Using: $NC" + while true; do - handle_request | busybox nc -ll -p "$PORT" -s 127.0.0.1 2>/dev/null \ - || handle_request | toybox nc -L -p "$PORT" -s 127.0.0.1 2>/dev/null \ - || { log "ERROR: No listener"; exit 1; } + # Create a FIFO for bidirectional communication + FIFO="/data/adb/buildchain/webui.fifo" + rm -f "$FIFO" + mkfifo "$FIFO" + + # nc reads from client, pipes to handle_request, response goes back via FIFO + handle_request < "$FIFO" | $NC -l -p "$PORT" -s 127.0.0.1 > "$FIFO" 2>/dev/null + rm -f "$FIFO" done