Files
BuildChain/service.sh

196 lines
5.6 KiB
Bash
Raw Normal View History

#!/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))"