System-level KernelSU module: aapt2/aidl/zipalign (API 35), BusyBox, platform-tools, all as static arm64 binaries in the Android framework. Termux integration for Java/Kotlin/Gradle/Python via pkg. CLI tools: buildchain, bc-build, bc-sign. WebUI on :8089 for toolchain management. Turns any Android phone into a native compilation powerhouse.
196 lines
5.6 KiB
Bash
Executable File
196 lines
5.6 KiB
Bash
Executable File
#!/system/bin/sh
|
|
# BuildChain — late service: link tools into framework, hook Termux, start WebUI
|
|
MODDIR=${0%/*}
|
|
CONFIG_DIR="/data/adb/buildchain"
|
|
LOG="$CONFIG_DIR/buildchain.log"
|
|
PID_FILE="$CONFIG_DIR/webui.pid"
|
|
TOOLS="$MODDIR/tools"
|
|
TERMUX_PREFIX="/data/data/com.termux/files/usr"
|
|
TERMUX_BIN="$TERMUX_PREFIX/bin"
|
|
TERMUX_LIB="$TERMUX_PREFIX/lib"
|
|
TERMUX_ETC="$TERMUX_PREFIX/etc"
|
|
TERMUX_HOME="/data/data/com.termux/files/home"
|
|
|
|
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"; }
|
|
|
|
mkdir -p "$CONFIG_DIR"
|
|
log "BuildChain service starting"
|
|
|
|
# Wait for system to settle
|
|
sleep 8
|
|
|
|
#############################
|
|
# Detect installed components
|
|
#############################
|
|
|
|
detect_environment() {
|
|
local env_file="$CONFIG_DIR/environment.json"
|
|
|
|
local has_termux="false"
|
|
local has_termux_api="false"
|
|
local has_java="false"
|
|
local java_version=""
|
|
local has_python="false"
|
|
local python_version=""
|
|
local has_kotlin="false"
|
|
local kotlin_version=""
|
|
local has_gradle="false"
|
|
local gradle_version=""
|
|
local has_git="false"
|
|
|
|
[ -d "$TERMUX_BIN" ] && has_termux="true"
|
|
|
|
# Check Termux packages
|
|
if [ "$has_termux" = "true" ]; then
|
|
[ -f "$TERMUX_BIN/termux-api-start" ] || pm list packages 2>/dev/null | grep -q "com.termux.api" && has_termux_api="true"
|
|
if [ -f "$TERMUX_BIN/java" ]; then
|
|
has_java="true"
|
|
java_version=$("$TERMUX_BIN/java" -version 2>&1 | head -1)
|
|
fi
|
|
if [ -f "$TERMUX_BIN/python" ] || [ -f "$TERMUX_BIN/python3" ]; then
|
|
has_python="true"
|
|
python_version=$("$TERMUX_BIN/python3" --version 2>/dev/null || "$TERMUX_BIN/python" --version 2>/dev/null)
|
|
fi
|
|
if [ -f "$TERMUX_BIN/kotlin" ] || [ -f "$TERMUX_BIN/kotlinc" ]; then
|
|
has_kotlin="true"
|
|
kotlin_version=$("$TERMUX_BIN/kotlinc" -version 2>&1 | head -1)
|
|
fi
|
|
if [ -f "$TERMUX_BIN/gradle" ]; then
|
|
has_gradle="true"
|
|
gradle_version=$("$TERMUX_BIN/gradle" --version 2>/dev/null | grep "Gradle " | head -1)
|
|
fi
|
|
[ -f "$TERMUX_BIN/git" ] && has_git="true"
|
|
fi
|
|
|
|
# Arch
|
|
local arch=$(uname -m)
|
|
local api=$(getprop ro.build.version.sdk)
|
|
local device=$(getprop ro.product.model)
|
|
|
|
cat > "$env_file" << ENVJSON
|
|
{
|
|
"arch": "$arch",
|
|
"api_level": "$api",
|
|
"device": "$device",
|
|
"termux": $has_termux,
|
|
"termux_api": $has_termux_api,
|
|
"java": $has_java,
|
|
"java_version": "$java_version",
|
|
"python": $has_python,
|
|
"python_version": "$python_version",
|
|
"kotlin": $has_kotlin,
|
|
"kotlin_version": "$kotlin_version",
|
|
"gradle": $has_gradle,
|
|
"gradle_version": "$gradle_version",
|
|
"git": $has_git,
|
|
"build_tools_version": "35.0.2",
|
|
"busybox": true
|
|
}
|
|
ENVJSON
|
|
|
|
log "Environment detected: termux=$has_termux java=$has_java python=$has_python kotlin=$has_kotlin gradle=$has_gradle"
|
|
}
|
|
|
|
detect_environment
|
|
|
|
#############################
|
|
# Link build tools into system PATH (via /system/xbin overlay)
|
|
#############################
|
|
|
|
link_system_tools() {
|
|
local xbin="$MODDIR/system/xbin"
|
|
mkdir -p "$xbin"
|
|
|
|
# Build tools — always available system-wide
|
|
for tool in aapt aapt2 aidl dexdump zipalign split-select; do
|
|
[ -f "$TOOLS/build-tools/$tool" ] && ln -sf "$TOOLS/build-tools/$tool" "$xbin/$tool" 2>/dev/null
|
|
done
|
|
|
|
# Platform tools that aren't already in /system/bin
|
|
for tool in sqlite3 etc1tool hprof-conv e2fsdroid make_f2fs sload_f2fs mke2fs; do
|
|
[ -f "$TOOLS/platform-tools/$tool" ] && ln -sf "$TOOLS/platform-tools/$tool" "$xbin/$tool" 2>/dev/null
|
|
done
|
|
|
|
# Our management scripts
|
|
for script in "$MODDIR"/scripts/*; do
|
|
[ -f "$script" ] && ln -sf "$script" "$xbin/$(basename $script)" 2>/dev/null
|
|
done
|
|
|
|
log "System tools linked to $xbin"
|
|
}
|
|
|
|
link_system_tools
|
|
|
|
#############################
|
|
# Hook into Termux
|
|
#############################
|
|
|
|
hook_termux() {
|
|
if [ ! -d "$TERMUX_BIN" ]; then
|
|
log "Termux not installed — skipping hooks"
|
|
return
|
|
fi
|
|
|
|
# Symlink build tools into Termux bin (so they're on Termux's PATH too)
|
|
for tool in aapt aapt2 aidl dexdump zipalign split-select; do
|
|
[ -f "$TOOLS/build-tools/$tool" ] && ln -sf "$TOOLS/build-tools/$tool" "$TERMUX_BIN/$tool" 2>/dev/null
|
|
done
|
|
|
|
# Link our CLI scripts into Termux
|
|
for script in "$MODDIR"/scripts/*; do
|
|
[ -f "$script" ] && ln -sf "$script" "$TERMUX_BIN/$(basename $script)" 2>/dev/null
|
|
done
|
|
|
|
# Create Termux profile.d hook for environment
|
|
mkdir -p "$TERMUX_ETC/profile.d"
|
|
cat > "$TERMUX_ETC/profile.d/buildchain.sh" << 'PROFEOF'
|
|
# BuildChain — auto-sourced by Termux on shell start
|
|
[ -f /data/adb/buildchain/env.sh ] && . /data/adb/buildchain/env.sh
|
|
PROFEOF
|
|
|
|
# Write the environment file
|
|
cat > "$CONFIG_DIR/env.sh" << ENVEOF
|
|
# BuildChain environment
|
|
export BUILDCHAIN_HOME="$MODDIR"
|
|
export ANDROID_BUILD_TOOLS="$TOOLS/build-tools"
|
|
export ANDROID_PLATFORM_TOOLS="$TOOLS/platform-tools"
|
|
export ANDROID_HOME="$TERMUX_HOME/android-sdk"
|
|
export ANDROID_SDK_ROOT="\$ANDROID_HOME"
|
|
export PATH="\$ANDROID_BUILD_TOOLS:\$ANDROID_PLATFORM_TOOLS:\$PATH"
|
|
|
|
# Java — detect from Termux
|
|
for jdir in $TERMUX_PREFIX/lib/jvm/java-21-openjdk $TERMUX_PREFIX/lib/jvm/java-17-openjdk; do
|
|
if [ -d "\$jdir" ]; then
|
|
export JAVA_HOME="\$jdir"
|
|
export PATH="\$JAVA_HOME/bin:\$PATH"
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Gradle home
|
|
[ -d "$TERMUX_HOME/.gradle" ] && export GRADLE_USER_HOME="$TERMUX_HOME/.gradle"
|
|
|
|
# Kotlin
|
|
[ -d "$TERMUX_PREFIX/share/kotlin" ] && export KOTLIN_HOME="$TERMUX_PREFIX/share/kotlin"
|
|
ENVEOF
|
|
|
|
log "Termux hooks installed"
|
|
}
|
|
|
|
hook_termux
|
|
|
|
#############################
|
|
# Start WebUI
|
|
#############################
|
|
|
|
if [ -f "$PID_FILE" ]; then
|
|
kill $(cat "$PID_FILE") 2>/dev/null
|
|
rm -f "$PID_FILE"
|
|
fi
|
|
|
|
log "Starting WebUI on port 8089"
|
|
nohup sh "$MODDIR/scripts/webui-server" >> "$LOG" 2>&1 &
|
|
echo $! > "$PID_FILE"
|
|
|
|
log "BuildChain service complete (WebUI PID: $(cat $PID_FILE))"
|