From 5e7998532de5dff8a287d248568582b68e430f19 Mon Sep 17 00:00:00 2001 From: 7a72 Date: Wed, 3 Dec 2025 08:19:33 +0800 Subject: [PATCH] fix: ksu install --- build.sh | 246 +++++++++++------------------------------- template/customize.sh | 219 ++----------------------------------- template/module.prop | 2 +- 3 files changed, 70 insertions(+), 397 deletions(-) mode change 100755 => 100644 build.sh diff --git a/build.sh b/build.sh old mode 100755 new mode 100644 index f959641..7736739 --- a/build.sh +++ b/build.sh @@ -10,8 +10,7 @@ NC='\033[0m' BASE_URL="https://magic-mount.zrlab.org/download" UPDATE_JSON_URL="https://magic-mount.zrlab.org/version" CHANGELOG_URL="https://magic-mount.zrlab.org/changelog" -MODULE_ID="org.zrlab.magic_mount" -SHIM_ID="meta-mm" +MODULE_ID="meta-mm" # Build state BUILD_TYPES=() @@ -19,7 +18,6 @@ VERSION="" VERSION_FULL="" GIT_COMMIT="" TEMP_DIRS=() -BUILD_SHIM=false # Logging functions log_info() { echo -e "${GREEN}$*${NC}" >&2; } @@ -33,7 +31,6 @@ cleanup() { log_warn "Cleaning up temporary directories..." - # Clean up other temp directories for dir in "${TEMP_DIRS[@]}"; do if [ -d "$dir" ]; then rm -rf "$dir" @@ -59,23 +56,16 @@ usage() { Usage: $0 [OPTIONS] OPTIONS: - --release Build release version - --debug Build debug version - --shim Build shim versions (creates both normal and shim variants) + --release Build release version only + --debug Build debug version only -h, --help Show this help message - (no option) Build both release and debug versions - -When --shim is combined with --release or --debug, both normal and shim -versions will be built, sharing binaries for efficiency. + (no option) Build both versions Version is automatically obtained from git tags. EXAMPLES: - $0 # Build release and debug (normal) - $0 --release # Build release only (normal) - $0 --release --shim # Build release normal + shim - $0 --debug --shim # Build debug normal + shim - $0 --shim # Build both types, each with normal + shim + $0 # Build both release and debug + $0 --release # Build release only EOF exit 1 } @@ -84,9 +74,8 @@ EOF parse_args() { while [[ $# -gt 0 ]]; do case $1 in - -r|--release) BUILD_TYPES+=("release"); shift ;; - -d|--debug) BUILD_TYPES+=("debug"); shift ;; - -s|--shim) BUILD_SHIM=true; shift ;; + --release) BUILD_TYPES+=("release"); shift ;; + --debug) BUILD_TYPES+=("debug"); shift ;; -h|--help) usage ;; *) log_error "Unknown parameter: $1"; usage ;; esac @@ -200,7 +189,7 @@ EOF build_binaries() { local build_type=$1 - log_step 2 9 "Building binaries ($build_type)" + log_step 2 8 "Building binaries ($build_type)" cd src || return 1 make clean > /dev/null 2>&1 @@ -220,19 +209,8 @@ configure_module() { local build_dir=$1 local build_type=$2 local version_code=$3 - local is_shim=${4:-false} # Optional parameter, defaults to false - # Determine module ID and metamodule value based on variant type - local module_id_to_use="$MODULE_ID" - local metamodule_value="1" - - if [ "$is_shim" = true ]; then - module_id_to_use="$SHIM_ID" - metamodule_value="0" - log_info " Configuring shim variant (ID: $module_id_to_use, metamodule: $metamodule_value)" - else - log_info " Configuring normal variant (ID: $module_id_to_use, metamodule: $metamodule_value)" - fi + log_step 3 8 "Configuring module files" # Configure module.prop local module_prop="$build_dir/module.prop" @@ -243,20 +221,19 @@ configure_module() { local module_version="$VERSION_FULL" - sed -i "s|^id=.*|id=$module_id_to_use|" "$module_prop" + sed -i "s|^id=.*|id=$MODULE_ID|" "$module_prop" sed -i "s|^version=.*|version=$module_version|" "$module_prop" sed -i "s|^versionCode=.*|versionCode=$version_code|" "$module_prop" sed -i "s|^updateJson=.*|updateJson=$UPDATE_JSON_URL|" "$module_prop" - sed -i "s|^metamodule=.*|metamodule=$metamodule_value|" "$module_prop" - log_info " module.prop configured ($module_version, code $version_code)" + log_info "module.prop configured ($module_version, code $version_code)" } # Generate checksums for all files generate_checksums() { local build_dir=$1 - log_info " Generating checksums" + log_step 5 8 "Generating checksums" local checksum_file="$build_dir/checksums" @@ -271,14 +248,14 @@ generate_checksums() { fi local count=$(wc -l < "$checksum_file") - log_info " Generated checksums for $count files" + log_info "Generated checksums for $count files" } # Normalize timestamps for reproducible builds normalize_timestamps() { local build_dir=$1 - log_info " Normalizing timestamps" + log_step 6 8 "Normalizing timestamps for reproducible build" # Use git commit timestamp for reproducibility local git_timestamp=$(git log -1 --format=%ct 2>/dev/null) @@ -295,6 +272,13 @@ normalize_timestamps() { log_error "Failed to convert git timestamp" return 1 fi + + # Show human-readable commit time + local human_time=$(date -d "@$git_timestamp" '+%Y-%m-%d %H:%M:%S %Z' 2>/dev/null) + if [ -z "$human_time" ]; then + human_time=$(date -r "$git_timestamp" '+%Y-%m-%d %H:%M:%S %Z' 2>/dev/null) + fi + log_info "Using git commit time: $human_time" else timestamp=$(date '+%Y%m%d%H%M.%S') log_warn "Git timestamp not available, using current time" @@ -305,190 +289,86 @@ normalize_timestamps() { return 1 fi - log_info " Timestamps normalized" + log_info "All timestamps normalized to: $timestamp" } -# Package variant -package_variant() { - local base_dir=$1 - local output_name=$2 - local is_shim=$3 - local variant_name=$4 - - log_info " Packaging $variant_name variant" - - # Create a copy for this variant - local variant_dir="${base_dir}_${variant_name}" - if ! cp -r "$base_dir" "$variant_dir"; then - log_error "Failed to create variant directory" - return 1 - fi - - # Determine module ID and metamodule value - local module_id="$MODULE_ID" - local metamodule_value="1" - - if [ "$is_shim" = true ]; then - module_id="$SHIM_ID" - metamodule_value="0" - log_info " Configuring as shim (ID: $module_id, metamodule: $metamodule_value)" - fi - - # Configure for this module ID and metamodule setting - local module_prop="$variant_dir/module.prop" - sed -i "s|^id=.*|id=$module_id|" "$module_prop" - sed -i "s|^metamodule=.*|metamodule=$metamodule_value|" "$module_prop" - - # Regenerate checksums with the new module.prop - if ! (cd "$variant_dir" && \ - find . -type f ! -name "checksums" -print0 | \ - LC_ALL=C sort -z | \ - xargs -0 sha256sum | \ - sed 's|^\./||' > checksums); then - log_error "Failed to regenerate checksums" - return 1 - fi - - # Re-normalize timestamps - local git_timestamp=$(git log -1 --format=%ct 2>/dev/null) - if [ -n "$git_timestamp" ]; then - local timestamp=$(date -d "@$git_timestamp" '+%Y%m%d%H%M.%S' 2>/dev/null) - if [ -z "$timestamp" ]; then - timestamp=$(date -r "$git_timestamp" '+%Y%m%d%H%M.%S' 2>/dev/null) - fi - else - timestamp=$(date '+%Y%m%d%H%M.%S') - fi - find "$variant_dir" -exec touch -m -t "$timestamp" {} + - - # Package - if ! (cd "$variant_dir" && zip -qr "../../build/$output_name" ./*); then - log_error "Failed to create package" - return 1 - fi - - # Clean up variant directory - rm -rf "$variant_dir" - - local size=$(du -h "build/$output_name" | cut -f1) - log_info " Created: $output_name ($size)" -} - -# Build single type with variants +# Build single type build_single_type() { local build_type=$1 - local build_shim=$2 - + local build_dir="build/${build_type}_temp" local version_code=$(git rev-list --count HEAD) + local output_name="meta-magic_mount-${VERSION_FULL}-${build_type}.zip" - # Set base directory and register for cleanup - BASE_DIR="build/${build_type}_base" - - # Register other directories for cleanup - TEMP_DIRS+=("src/bin" "$BASE_DIR") + # Register this temp directory for cleanup + TEMP_DIRS+=("$build_dir") + TEMP_DIRS+=("src/bin") log_info "" log_info "========================================" - if [ "$build_shim" = true ]; then - log_info "Building $build_type (normal + shim variants)" - else - log_info "Building $build_type (normal)" - fi + log_info "Building $build_type version" log_info "Version: $VERSION_FULL" log_info "========================================" # Clean and create build directory - rm -rf "$BASE_DIR" - mkdir -p "$BASE_DIR" || { - log_error "Failed to create build directory: $BASE_DIR" + rm -rf "$build_dir" + mkdir -p "$build_dir" || { + log_error "Failed to create build directory: $build_dir" return 1 } # Step 1: Copy template - log_step 1 9 "Copying template" - if ! cp -r template/* "$BASE_DIR/"; then + log_step 1 8 "Copying template" + if ! cp -r template/* "$build_dir/"; then log_error "Failed to copy template" return 1 fi - # Step 2: Build binaries (shared) + # Step 2: Build binaries build_binaries "$build_type" || return 1 - # Step 3: Initial configuration (will be overridden per variant) - log_step 3 9 "Configuring base module files" - configure_module "$BASE_DIR" "$build_type" "$version_code" false || return 1 + # Step 3: Configure module + configure_module "$build_dir" "$build_type" "$version_code" || return 1 - # Step 4: Copy binaries (shared) - log_step 4 9 "Copying binaries" + # Step 4: Copy binaries + log_step 4 8 "Copying binaries" if [ ! -d "src/bin" ]; then log_error "src/bin not found" return 1 fi - if ! cp -r src/bin "$BASE_DIR/"; then + if ! cp -r src/bin "$build_dir/"; then log_error "Failed to copy binaries" return 1 fi - # Step 5: Generate checksums (will be regenerated per variant) - log_step 5 9 "Generating base checksums" - generate_checksums "$BASE_DIR" || return 1 + # Step 5: Generate checksums + generate_checksums "$build_dir" || return 1 - # Step 6: Normalize timestamps (will be reapplied per variant) - log_step 6 9 "Normalizing timestamps" - normalize_timestamps "$BASE_DIR" || return 1 + # Step 6: Normalize timestamps + normalize_timestamps "$build_dir" || return 1 - # Step 7: Package variants - log_step 7 9 "Packaging variants" - - local built_artifacts=() - - # Normal variant - local normal_output="meta-magic_mount-${VERSION_FULL}-${build_type}.zip" - if package_variant "$BASE_DIR" "$normal_output" false "normal"; then - built_artifacts+=("$normal_output") - else - log_error "Failed to package normal variant" + # Step 7: Package + log_step 7 8 "Creating package" + if ! (cd "$build_dir" && zip -qr "../../build/$output_name" ./*); then + log_error "Failed to create package" return 1 fi - # Shim variant (if requested) - if [ "$build_shim" = true ]; then - local shim_output="meta-magic_mount-${VERSION_FULL}-${build_type}-shim.zip" - if package_variant "$BASE_DIR" "$shim_output" true "shim"; then - built_artifacts+=("$shim_output") - else - log_error "Failed to package shim variant" - return 1 - fi - fi - - # Step 8: Generate misc files - log_step 8 9 "Generating metadata files" + # Step 8: Generate misc for release if [ "$build_type" = "release" ]; then - # Generate changelog once (shared between variants) + log_step 8 8 "Generating misc" generate_changelog - - # Generate update JSON only for normal variant - # Shim variant doesn't need separate version.json since it converts to normal module after installation - generate_update_json "$normal_output" "$version_code" - log_info " Generated version.json (normal variant only)" + generate_update_json "$output_name" "$version_code" else - log_info " Skipped (debug build)" + log_step 8 8 "Skipping misc (debug build)" fi - log_step 9 9 "Done. " - + local size=$(du -h "build/$output_name" | cut -f1) log_info "" log_info "=========================================" - log_info "Build complete for $build_type:" - for artifact in "${built_artifacts[@]}"; do - local size=$(du -h "build/$artifact" | cut -f1) - log_info " - $artifact ($size)" - done + log_info "Build complete: $output_name ($size)" log_info "=========================================" - # Return artifacts via global variable - artifacts=("${built_artifacts[@]}") + artifact="$output_name" } # Main build process @@ -503,12 +383,12 @@ main() { # Build each type local success=0 local failed=0 - local all_built_files=() + local built_files=() for build_type in "${BUILD_TYPES[@]}"; do - if build_single_type "$build_type" "$BUILD_SHIM"; then + if build_single_type "$build_type"; then ((success++)) - all_built_files+=("${artifacts[@]}") + built_files+=("$artifact") else ((failed++)) log_error "Failed to build $build_type" @@ -522,20 +402,14 @@ main() { log_info "========================================" log_info "Version: $VERSION_FULL" log_info "Commit: $GIT_COMMIT" - log_info "Build mode: $([ "$BUILD_SHIM" = true ] && echo "NORMAL + SHIM" || echo "NORMAL ONLY")" - log_info "Module IDs: $MODULE_ID$([ "$BUILD_SHIM" = true ] && echo ", $SHIM_ID" || echo "")" log_info "Success: $success | Failed: $failed" log_info "----------------------------------------" log_info "Generated files:" - - # Show metadata files if [[ " ${BUILD_TYPES[*]} " =~ " release " ]]; then log_info " build/changelog.md" log_info " build/version.json" fi - - # Show all artifacts - for file in "${all_built_files[@]}"; do + for file in "${built_files[@]}"; do local size=$(du -h "build/$file" | cut -f1) log_info " build/$file ($size)" done diff --git a/template/customize.sh b/template/customize.sh index d8a03f7..253e99e 100644 --- a/template/customize.sh +++ b/template/customize.sh @@ -3,42 +3,9 @@ SKIPUNZIP=1 # Module configuration -module_id="org.zrlab.magic_mount" +module_id="meta-mm" module_data_dir="/data/adb/magic_mount" metamodule_link="/data/adb/metamodule" -module_shim_id="meta-mm" - -after_shim() { - if [ "$INSTALL_TYPE" != "shim" ]; then - return 0 - fi - - local std_dir="$modules_dir/$module_id" - local shim_dir="$modules_dir/$module_shim_id" - local upd_std_dir="$modules_update_dir/$module_id" - local upd_shim_dir="$modules_update_dir/$module_shim_id" - - if [ -d "$std_dir" ]; then - ui_print " ℹ Detected existing standard installation, processing shim cleanup..." - - if [ -d "$shim_dir" ]; then - ui_print " - Removing existing shim directory" - rm -rf "$shim_dir" - fi - - if [ -d "$upd_shim_dir" ]; then - ui_print " - Migrating shim update dir to standard ID" - rm -rf "$upd_std_dir" 2>/dev/null - mv "$upd_shim_dir" "$upd_std_dir" - fi - - touch "${std_dir}/update" - - ui_print " ✓ Shim cleanup completed" - fi -} - -trap after_shim EXIT ui_print "- File integrity check" @@ -150,7 +117,8 @@ module_dirs=" # Copy regular module files for f in ${module_files}; do if [ ! -f "$TMPDIR/$f" ]; then - abort " ! Failed: $f not found" + ui_print " ! Warning: $f not found, skipping" + continue fi if ! cp "$TMPDIR/$f" "$MODPATH/$f"; then @@ -164,7 +132,8 @@ done # Copy executable scripts for f in ${executable_scripts}; do if [ ! -f "$TMPDIR/$f" ]; then - abort " ! Failed: $f not found" + ui_print " ! Warning: $f not found, skipping" + continue fi if ! cp "$TMPDIR/$f" "$MODPATH/$f"; then @@ -211,77 +180,6 @@ else ui_print " ℹ Existing configuration preserved" fi -# Detect current installation type -ui_print "- Detecting installation type" - -current_modid=$(basename "$MODPATH") -modules_dir="/data/adb/modules" -modules_update_dir="/data/adb/modules_update" - -if [ "$current_modid" = "$module_shim_id" ]; then - ui_print " ⚠ Shim installation detected" - INSTALL_TYPE="shim" -elif [ "$current_modid" = "$module_id" ]; then - ui_print " ✓ Normal installation detected" - INSTALL_TYPE="normal" -else - ui_print " ! Unknown installation type: $current_modid" - INSTALL_TYPE="unknown" -fi - -# Handle shim cleanup for normal installations -if [ "$INSTALL_TYPE" = "normal" ]; then - ui_print "- Checking for existing shim installation" - - shim_removed=0 - - # Check and remove shim from modules directory - if [ -d "$modules_dir/$module_shim_id" ]; then - ui_print " Found shim in modules directory" - - # Verify it's actually a shim by checking module.prop - if [ -f "$modules_dir/$module_shim_id/module.prop" ]; then - shim_real_id=$(grep "^id=" "$modules_dir/$module_shim_id/module.prop" | cut -d'=' -f2) - - if [ "$shim_real_id" = "$module_id" ]; then - ui_print " Removing shim installation: $module_shim_id" - rm -rf "$modules_dir/$module_shim_id" - shim_removed=1 - fi - else - # No valid module.prop, safe to remove - ui_print " Removing invalid shim directory" - rm -rf "$modules_dir/$module_shim_id" - shim_removed=1 - fi - fi - - # Check and remove shim from modules_update directory - if [ -d "$modules_update_dir/$module_shim_id" ]; then - ui_print " Found shim in modules_update directory" - - if [ -f "$modules_update_dir/$module_shim_id/module.prop" ]; then - shim_real_id=$(grep "^id=" "$modules_update_dir/$module_shim_id/module.prop" | cut -d'=' -f2) - - if [ "$shim_real_id" = "$module_id" ]; then - ui_print " Removing shim from updates: $module_shim_id" - rm -rf "$modules_update_dir/$module_shim_id" - shim_removed=1 - fi - else - ui_print " Removing invalid shim from updates" - rm -rf "$modules_update_dir/$module_shim_id" - shim_removed=1 - fi - fi - - if [ $shim_removed -eq 1 ]; then - ui_print " ✓ Shim cleanup completed" - else - ui_print " ℹ No shim installation found" - fi -fi - ui_print "- Managing metamodule status" # Check if metamodule symlink exists and points to a different module @@ -291,9 +189,8 @@ if [ -L "$metamodule_link" ]; then if [ -n "$metamodule_path" ]; then metamodule_id=$(basename "$metamodule_path") - # Consider both real module_id and shim_id as valid for this module - if [ "$metamodule_id" != "$module_id" ] && [ "$metamodule_id" != "$module_shim_id" ]; then - ui_print " Switching from $metamodule_id to $current_modid" + if [ "$metamodule_id" != "$module_id" ]; then + ui_print " Switching from $metamodule_id to $module_id" # Mark old metamodule for removal if [ -f "$metamodule_path/module.prop" ]; then @@ -303,10 +200,6 @@ if [ -L "$metamodule_link" ]; then # Remove old symlink rm -f "$metamodule_link" - elif [ "$metamodule_id" = "$module_shim_id" ] && [ "$current_modid" = "$module_id" ]; then - # Update link from shim to normal - ui_print " Updating metamodule link from shim to normal" - rm -f "$metamodule_link" else ui_print " ✓ Already active metamodule" fi @@ -319,116 +212,22 @@ fi # Create new metamodule symlink if needed if [ ! -e "$metamodule_link" ]; then - if ln -sf "$modules_dir/$current_modid" "$metamodule_link"; then + if ln -sf "/data/adb/modules/$module_id" "$metamodule_link"; then ui_print " ✓ Activated as metamodule" else ui_print " ! Warning: Failed to create metamodule link" fi fi -# Shim-specific post-install setup -if [ "$INSTALL_TYPE" = "shim" ]; then - if [ -d "$modules_dir/$module_id" ]; then - ui_print " ℹ Standard module already exists; shim migration script NOT created" - else - ui_print "- Setting up shim migration" - # Create a post-install script to handle the rename - cat > "$MODPATH/post-fs-data.sh" << 'EOF' -#!/system/bin/sh - -module_id="org.zrlab.magic_mount" -module_shim_id="meta-mm" -metamodule_link="/data/adb/metamodule" -modules_dir="/data/adb/modules" - -# Function to safely rename module directory -rename_module() { - local source_dir="$1" - local source_id="$2" - local target_id="$3" - - if [ -d "$source_dir/$source_id" ]; then - # Check if target already exists - if [ -e "$source_dir/$target_id" ]; then - # Target exists, check if it's valid - if [ -f "$source_dir/$target_id/module.prop" ]; then - target_real_id=$(grep "^id=" "$source_dir/$target_id/module.prop" | cut -d'=' -f2) - - if [ "$target_real_id" = "$module_id" ]; then - # Valid target module exists, remove shim - rm -rf "$source_dir/$source_id" - return 0 - fi - fi - - # Invalid target, remove it - rm -rf "$source_dir/$target_id" - fi - - # Perform rename - if mv "$source_dir/$source_id" "$source_dir/$target_id"; then - return 0 - else - return 1 - fi - fi - - return 2 # Source doesn't exist -} - -# Only run once -if [ -f "$modules_dir/$module_id/.shim_migrated" ]; then - exit 0 -fi - -# Also check if we're still in shim directory -if [ ! -d "$modules_dir/$module_shim_id" ]; then - exit 0 -fi - -# Rename in modules directory -if rename_module "$modules_dir" "$module_shim_id" "$module_id"; then - # Update metamodule link if it points to shim - if [ -L "$metamodule_link" ]; then - link_target=$(readlink "$metamodule_link") - if [ "$link_target" = "$modules_dir/$module_shim_id" ] || \ - [ "$(basename "$(realpath "$metamodule_link" 2>/dev/null)")" = "$module_shim_id" ]; then - rm -f "$metamodule_link" - ln -sf "$modules_dir/$module_id" "$metamodule_link" - fi - fi - - # Mark migration as complete - touch "$modules_dir/$module_id/.shim_migrated" 2>/dev/null -fi - -# Remove this script after execution -rm -f "$modules_dir/$module_id/post-fs-data.sh" - -exit 0 -EOF - - chmod 755 "$MODPATH/post-fs-data.sh" - ui_print " ✓ Post-install migration script created" - ui_print " ℹ Module will be renamed on next boot" -fi +ui_print "- Finalizing installation" ui_print "" ui_print "=========================================" ui_print " Magic Mount Installation Information" ui_print "=========================================" ui_print " Module ID: $module_id" -ui_print " Install Dir: $current_modid" -if [ "$INSTALL_TYPE" = "shim" ]; then - ui_print " Install Type: Shim (will migrate on reboot)" -else - ui_print " Install Type: Normal" -fi ui_print " Architecture: $ABI" ui_print " Binary: $ARCH_BINARY" ui_print " Data directory: $module_data_dir" ui_print "=========================================" ui_print "" - -ui_print "- Finalizing installation" - diff --git a/template/module.prop b/template/module.prop index 0039883..cb5ece4 100644 --- a/template/module.prop +++ b/template/module.prop @@ -1,5 +1,5 @@ id=id -metamodule=1 +metamodule=0 name=Magic Mount version=version versionCode=versionCode