联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:1602036736

RK3566 SDK 打包脚本

打包脚本使用方法

打开脚本,设置SDK源目录【SDK_DIR】和打包的输出目录【OUTPUT_BASE_DIR】,完成后在命令行执行即可。例如我将打包脚本命名为 complete_sdk_package.sh ,运行则执行:

./complete_sdk_package.sh

一键打包脚本内容

#!/bin/bash
# complete_sdk_package.sh - 完整的RK3566 SDK打包脚本(修复版)
# 版本: 3.1
# 修复了日志文件路径问题

set -e

# ================================
# 用户配置区 - 请根据实际情况修改
# ================================
SDK_DIR="/home/liguoyi/buildroot-tspi-qt5"              # 源SDK目录(必须修改)
OUTPUT_BASE_DIR="/home/liguoyi/rk3566_sdk_package"        # 输出基目录(必须修改)
SDK_NAME="rk3566_linux_sdk"                    # SDK名称
SDK_VERSION="v1.0"                       # SDK版本

# 压缩参数配置(通常无需修改)
CHUNK_SIZE="2G"              # 分卷大小(1G/2G/4G)
COMPRESSION_LEVEL=3          # 压缩级别(1-9)
MAX_MEMORY="4G"              # 最大内存使用量
MAX_THREADS=2                # 最大压缩线程数

# ================================
# 初始化设置
# ================================
SCRIPT_VERSION="3.1"
CURRENT_DATE=$(date +%Y%m%d)
CURRENT_TIME=$(date +%H%M%S)

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 临时日志函数(在OUTPUT_DIR创建前使用)
temp_log() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
}

temp_warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARN:${NC} $1"
}

temp_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR:${NC} $1"
    exit 1
}

# ================================
# 环境检测和参数调整
# ================================
detect_system_resources() {
    temp_log "1. 检测系统资源..."
    
    # 创建输出目录
    OUTPUT_DIR="$OUTPUT_BASE_DIR/${SDK_NAME}_package_${CURRENT_DATE}_${CURRENT_TIME}"
    TEMP_DIR="$OUTPUT_DIR/temp"
    LOG_FILE="$OUTPUT_DIR/packaging.log"
    
    # 创建输出目录
    mkdir -p "$OUTPUT_DIR"
    mkdir -p "$TEMP_DIR"
    
    # 重新定义日志函数(使用实际的LOG_FILE)
    log() {
        echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
    }
    
    warn() {
        echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARN:${NC} $1" | tee -a "$LOG_FILE"
    }
    
    error() {
        echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR:${NC} $1" | tee -a "$LOG_FILE"
        exit 1
    }
    
    # 从这一步开始使用新的日志函数
    log "输出目录: $OUTPUT_DIR"
    
    # 检测内存
    if command -v free >/dev/null 2>&1; then
        TOTAL_MEM=$(free -g | awk 'NR==2{print $2}')
        AVAILABLE_MEM=$(free -g | awk 'NR==2{print $7}')
        log "   总内存: ${TOTAL_MEM}GB"
        log "   可用内存: ${AVAILABLE_MEM}GB"
        
        # 根据内存调整参数
        if [ "$AVAILABLE_MEM" -lt 2 ]; then
            warn "内存严重不足,使用最低配置"
            COMPRESSION_LEVEL=1
            MAX_MEMORY="1G"
            MAX_THREADS=1
            CHUNK_SIZE="1G"
        elif [ "$AVAILABLE_MEM" -lt 4 ]; then
            warn "内存较少,使用保守配置"
            COMPRESSION_LEVEL=2
            MAX_MEMORY="2G"
            MAX_THREADS=1
        elif [ "$AVAILABLE_MEM" -lt 8 ]; then
            log "使用中等配置"
            COMPRESSION_LEVEL=3
            MAX_MEMORY="3G"
            MAX_THREADS=2
        else
            log "使用标准配置"
            COMPRESSION_LEVEL=4
            MAX_MEMORY="4G"
            MAX_THREADS=2
        fi
    else
        warn "无法检测内存,使用保守配置"
        COMPRESSION_LEVEL=2
        MAX_MEMORY="2G"
        MAX_THREADS=1
    fi
    
    # 检测磁盘空间
    if [ -d "$SDK_DIR" ]; then
        SDK_SIZE=$(du -sh "$SDK_DIR" 2>/dev/null | cut -f1 || echo "未知")
        log "   SDK大小: $SDK_SIZE"
    fi
    
    # 检查输出目录空间
    if command -v df >/dev/null 2>&1; then
        AVAILABLE_SPACE=$(df "$OUTPUT_DIR" | awk 'NR==2 {print $4}')
        AVAILABLE_SPACE_GB=$((AVAILABLE_SPACE / 1024 / 1024))
        log "   输出目录可用空间: ${AVAILABLE_SPACE_GB}GB"
        
        if [ "$AVAILABLE_SPACE_GB" -lt 10 ]; then
            warn "输出目录空间可能不足"
        fi
    fi
}

# ================================
# 前置检查
# ================================
pre_checks() {
    log "2. 执行前置检查..."
    
    # 检查SDK目录
    if [ ! -d "$SDK_DIR" ]; then
        error "SDK目录不存在: $SDK_DIR"
    fi
    
    # 检查必要工具
    for cmd in tar xz split md5sum sha256sum; do
        if ! command -v $cmd >/dev/null 2>&1; then
            error "未找到命令: $cmd,请安装: sudo apt install xz-utils coreutils"
        fi
    done
    
    log "   所有检查通过"
}

# ================================
# 清理SDK目录
# ================================
clean_sdk_directory() {
    log "3. 清理SDK目录..."
    cd "$SDK_DIR"
    
    # 清理编译中间文件
#    find . -name "*.o" -delete 2>/dev/null || true
#    find . -name "*.a" -delete 2>/dev/null || true
#    find . -name "*.ko" -delete 2>/dev/null || true
#    find . -name "*.tmp" -delete 2>/dev/null || true
#    find . -name "*.cmd" -delete 2>/dev/null || true
    
    log "   取消清理"
}

# ================================
# 生成文件校验信息
# ================================
generate_file_checksums() {
    log "4. 生成文件校验信息..."
    cd "$SDK_DIR"
    
    # 生成详细的文件列表
    log "   生成文件列表..."
    find . -type f > "$OUTPUT_DIR/file_list.txt" 2>/dev/null || true
    
    # 生成SHA256校验
    log "   生成SHA256校验(这可能需要一些时间)..."
    find . -type f -print0 | xargs -0 sha256sum > "$OUTPUT_DIR/file_checksums.sha256" 2>/dev/null || {
        warn "使用备用方法生成校验..."
        find . -type f -exec sha256sum {} \; > "$OUTPUT_DIR/file_checksums.sha256" 2>/dev/null
    }
    
    FILE_COUNT=$(wc -l < "$OUTPUT_DIR/file_list.txt" 2>/dev/null || echo "未知")
    log "   共 $FILE_COUNT 个文件,校验信息已生成"
}

# ================================
# 创建完整tar包并验证
# ================================
create_and_verify_tar() {
    log "5. 创建完整tar包..."
    cd "$SDK_DIR"
    
    # 创建tar包
    tar -cf "$TEMP_DIR/full.tar" . 2>&1 | tee -a "$LOG_FILE"
    
    # 验证tar包完整性
    log "   验证tar包完整性..."
    if ! tar -tf "$TEMP_DIR/full.tar" >/dev/null 2>&1; then
        error "tar包创建失败或已损坏"
    fi
    
    TAR_SIZE=$(du -h "$TEMP_DIR/full.tar" | cut -f1)
    log "   tar包创建成功,大小: $TAR_SIZE"
}

# ================================
# 压缩tar包
# ================================
compress_tar() {
    log "6. 压缩tar包..."
    cd "$TEMP_DIR"
    
    log "   使用xz压缩(级别: $COMPRESSION_LEVEL, 线程: $MAX_THREADS, 内存限制: $MAX_MEMORY)..."
    if ! xz -${COMPRESSION_LEVEL} \ 
          -T${MAX_THREADS} \ 
          --memlimit-compress=${MAX_MEMORY} \ 
          "full.tar" 2>&1 | tee -a "$LOG_FILE"; then
        error "压缩失败,请检查内存或磁盘空间"
    fi
    
    # 验证压缩文件
    log "   验证压缩文件..."
    if ! xz -t "full.tar.xz" 2>&1 | tee -a "$LOG_FILE"; then
        error "压缩文件损坏"
    fi
    
    COMPRESSED_SIZE=$(du -h "full.tar.xz" | cut -f1)
    log "   压缩完成,大小: $COMPRESSED_SIZE"
}

# ================================
# 分卷处理
# ================================
split_into_chunks() {
    log "7. 分卷处理..."
    cd "$TEMP_DIR"
    
    log "   将压缩包分割为 $CHUNK_SIZE 的分卷..."
    split -d -b $CHUNK_SIZE "full.tar.xz" "${SDK_NAME}_${CURRENT_DATE}.tar.xz.part."
    
    # 移动分卷到输出目录
    mv "${SDK_NAME}_${CURRENT_DATE}.tar.xz.part."* "$OUTPUT_DIR/"
    
    PART_COUNT=$(ls "$OUTPUT_DIR/${SDK_NAME}_${CURRENT_DATE}.tar.xz.part."* 2>/dev/null | wc -l)
    if [ "$PART_COUNT" -eq 0 ]; then
        error "分卷创建失败"
    fi
    
    log "   创建了 $PART_COUNT 个分卷"
}

# ================================
# 生成校验文件
# ================================
generate_checksum_files() {
    log "8. 生成分卷校验文件..."
    cd "$OUTPUT_DIR"
    
    if ls ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* >/dev/null 2>&1; then
        TOTAL_FILES=$(ls ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* | wc -l)
        
        # 生成MD5和SHA256校验
        md5sum ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* > sdk_parts_checksums.md5
        sha256sum ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* > sdk_parts_checksums.sha256
        
        log "   生成校验文件,共 $TOTAL_FILES 个分卷"
        
        # 验证校验文件
        log "   验证校验文件..."
        if sha256sum -c sdk_parts_checksums.sha256 >/dev/null 2>&1; then
            log "   ✅ 所有分卷校验通过"
        else
            warn "部分分卷校验失败"
        fi
    else
        error "未找到分卷文件"
    fi
}

# ================================
# 创建解压工具
# ================================
create_extraction_tools() {
    log "9. 创建解压工具..."
    cd "$OUTPUT_DIR"
    
    # 创建智能解压脚本
    cat > extract_sdk.sh << 'EOF'
#!/bin/bash
# RK3566 SDK 智能解压工具
# 自动验证完整性并解压

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 默认输出目录
OUTPUT_DIR="${1:-./extracted_sdk}"
SDK_PATTERN="rk3566_linux_sdk_*.tar.xz.part.*"

echo -e "${GREEN}RK3566 SDK 解压工具${NC}"
echo "================================"

# 检查文件是否存在
check_files_exist() {
    if ! ls $SDK_PATTERN >/dev/null 2>&1; then
        echo -e "${RED}错误: 未找到SDK分卷文件${NC}"
        echo "请确保以下文件存在:"
        echo "  - rk3566_linux_sdk_YYYYMMDD.tar.xz.part.* (分卷)"
        exit 1
    fi
    return 0
}

# 验证文件完整性
verify_integrity() {
    echo -e "${YELLOW}[1/4] 验证文件完整性...${NC}"
    
    if [ -f "sdk_parts_checksums.sha256" ]; then
        echo "使用SHA256验证分卷文件..."
        if sha256sum -c sdk_parts_checksums.sha256; then
            echo -e "${GREEN}✓ 所有分卷验证通过${NC}"
        else
            echo -e "${RED}✗ 分卷文件损坏,请重新下载${NC}"
            exit 1
        fi
    else
        echo -e "${YELLOW}⚠ 未找到校验文件,跳过完整性验证${NC}"
    fi
}

# 检查磁盘空间
check_disk_space() {
    echo -e "${YELLOW}[2/4] 检查磁盘空间...${NC}"
    
    local total_size=0
    for f in $SDK_PATTERN; do
        if [ -f "$f" ]; then
            size=$(stat -c%s "$f" 2>/dev/null || du -b "$f" | cut -f1)
            total_size=$((total_size + size))
        fi
    done
    
    local required_space=$((total_size * 3))  # 解压需要2-3倍空间
    local available_space=$(df . | awk 'NR==2 {print $4 * 1024}')
    
    if [ "$available_space" -lt "$required_space" ]; then
        echo -e "${RED}✗ 磁盘空间不足${NC}"
        echo "需要: $(echo "scale=2; $required_space/1024/1024/1024" | bc) GB"
        echo "可用: $(echo "scale=2; $available_space/1024/1024/1024" | bc) GB"
        exit 1
    fi
    
    echo -e "${GREEN}✓ 磁盘空间充足${NC}"
}

# 解压文件
extract_files() {
    echo -e "${YELLOW}[3/4] 解压SDK...${NC}"
    
    # 创建输出目录
    mkdir -p "$OUTPUT_DIR"
    
    echo "合并分卷文件..."
    cat $SDK_PATTERN > "$OUTPUT_DIR/combined.tar.xz"
    
    echo "解压xz压缩包..."
    cd "$OUTPUT_DIR"
    xz -d combined.tar.xz
    
    echo "解压tar包..."
    tar -xf combined.tar
    rm -f combined.tar
    
    cd ..
    echo -e "${GREEN}✓ 解压完成${NC}"
}

# 验证解压结果
verify_extraction() {
    echo -e "${YELLOW}[4/4] 验证解压结果...${NC}"
    
    if [ -f "file_checksums.sha256" ]; then
        echo "验证解压文件完整性..."
        cd "$OUTPUT_DIR"
        if sha256sum -c ../file_checksums.sha256; then
            echo -e "${GREEN}✓ 所有文件验证通过${NC}"
        else
            echo -e "${YELLOW}⚠ 部分文件验证失败${NC}"
        fi
        cd ..
    else
        echo -e "${YELLOW}⚠ 未找到文件校验信息,跳过验证${NC}"
    fi
}

# 主流程
main() {
    echo -e "${BLUE}输出目录: $OUTPUT_DIR${NC}"
    
    check_files_exist
    verify_integrity
    check_disk_space
    extract_files
    verify_extraction
    
    echo ""
    echo -e "${GREEN}================================"
    echo "SDK安装完成!"
    echo "解压位置: $OUTPUT_DIR"
    echo "================================"
    echo -e "${NC}"
}

main "$@"
EOF

    chmod +x extract_sdk.sh
    log "   解压工具创建完成"
}

# ================================
# 创建说明文档
# ================================
create_documentation() {
    log "10. 创建说明文档..."
    cd "$OUTPUT_DIR"
    
    TOTAL_FILES=$(ls ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* 2>/dev/null | wc -l)
    TOTAL_SIZE=$(du -sh . | cut -f1)
    
    cat > README.md << EOF
# RK3566 SDK 分发包

## 包信息
- **打包时间**: $(date)
- **SDK版本**: $SDK_VERSION
- **打包脚本版本**: $SCRIPT_VERSION
- **分卷数量**: $TOTAL_FILES
- **分卷大小**: $CHUNK_SIZE
- **总大小**: $TOTAL_SIZE
- **压缩级别**: $COMPRESSION_LEVEL

## 文件清单
\`\`\`
$(ls -la ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* 2>/dev/null || echo "无分卷文件")
\`\`\`

## 快速开始

### 方法一:自动解压(推荐)
\`\`\`bash
# 在当前目录解压
./extract_sdk.sh

# 指定输出目录
./extract_sdk.sh /path/to/target
\`\`\`

### 方法二:手动解压
\`\`\`bash
# 合并所有分卷
cat rk3566_linux_sdk_*.tar.xz.part.* > combined.tar.xz

# 解压
xz -d combined.tar.xz
tar -xf combined.tar

# 清理
rm combined.tar
\`\`\`

## 完整性验证
\`\`\`bash
# 验证分卷完整性
sha256sum -c sdk_parts_checksums.sha256

# 验证解压后文件完整性
sha256sum -c file_checksums.sha256
\`\`\`

## 系统要求
- **操作系统**: Linux (Ubuntu/CentOS等)
- **磁盘空间**: 至少 ${TOTAL_SIZE} 的2-3倍
- **内存**: 4GB 或以上
- **依赖工具**: tar, xz, sha256sum

## 重要提示
1. **不要**在打包文件所在目录直接解压!建议在空目录中运行解压脚本
2. 解压前请验证文件完整性
3. 确保有足够的磁盘空间

## 技术支持
如有问题请检查打包日志: $LOG_FILE

---
*由自动打包工具生成*
EOF

    # 创建简明的使用说明
    cat > QUICK_START.txt << EOF
快速开始:
1. 将所有文件复制到目标机器
2. 运行: ./extract_sdk.sh
3. SDK将被解压到 ./extracted_sdk/ 目录

验证完整性:
./extract_sdk.sh 会自动验证文件完整性

如需指定输出目录:
./extract_sdk.sh /path/to/your/target
EOF

    log "   文档创建完成"
}

# ================================
# 最终验证
# ================================
final_verification() {
    log "11. 最终验证..."
    cd "$OUTPUT_DIR"
    
    # 测试解压脚本
    log "   测试解压脚本..."
    if ! ./extract_sdk.sh "$TEMP_DIR/test_extract" >/dev/null 2>&1; then
        warn "解压测试失败,但继续完成打包"
    else
        log "   ✅ 解压测试成功"
        # 清理测试目录
        rm -rf "$TEMP_DIR/test_extract"
    fi
    
    # 生成最终报告
    log "   生成最终报告..."
    cat > PACKAGE_REPORT.txt << EOF
打包报告
=========

打包状态: 成功
打包时间: $(date)
SDK名称: $SDK_NAME
版本: $SDK_VERSION
分卷数量: $(ls ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* 2>/dev/null | wc -l)
总大小: $(du -sh . | cut -f1)

文件列表:
$(ls -l ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* 2>/dev/null | awk '{print $5, $9}')

校验信息:
$(cat sdk_parts_checksums.sha256 2>/dev/null | head -5)
...

下一步:
1. 验证: sha256sum -c sdk_parts_checksums.sha256
2. 测试: ./extract_sdk.sh test_dir
3. 分发: 将整个目录分发给用户
EOF
}

# ================================
# 完成报告
# ================================
generate_report() {
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}           🎉 打包完成!${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo -e "${BLUE}输出目录:${NC} $OUTPUT_DIR"
    echo -e "${BLUE}分卷数量:${NC} $(ls ${SDK_NAME}_${CURRENT_DATE}.tar.xz.part.* 2>/dev/null | wc -l)"
    echo -e "${BLUE}总大小:${NC} $(du -sh $OUTPUT_DIR | cut -f1)"
    echo -e "${BLUE}日志文件:${NC} $LOG_FILE"
    echo ""
    echo -e "${BLUE}生成的文件:${NC}"
    echo -e "${GREEN}----------------------------------------${NC}"
    ls -la "$OUTPUT_DIR" | tail -n +2
    echo -e "${GREEN}----------------------------------------${NC}"
    echo ""
    echo -e "${BLUE}下一步:${NC}"
    echo "1. 验证分卷完整性: cd $OUTPUT_DIR && sha256sum -c sdk_parts_checksums.sha256"
    echo "2. 测试解压: cd $OUTPUT_DIR && ./extract_sdk.sh ./test_dir"
    echo "3. 确认无误后分发给客户"
    echo -e "${GREEN}========================================${NC}"
}

# ================================
# 清理函数
# ================================
cleanup() {
    if [ -d "$TEMP_DIR" ]; then
        log "清理临时目录..."
        rm -rf "$TEMP_DIR"
    fi
}

# 确保退出时清理
trap cleanup EXIT

# ================================
# 主执行流程
# ================================
main() {
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}   RK3566 SDK 完整打包工具${NC}"
    echo -e "${GREEN}   版本: $SCRIPT_VERSION${NC}"
    echo -e "${GREEN}   时间: $(date)${NC}"
    echo -e "${GREEN}========================================${NC}"
    
    # 环境检测(这会创建OUTPUT_DIR和设置日志函数)
    detect_system_resources
    
    # 前置检查
    pre_checks
    
    # 清理工作
    clean_sdk_directory
    
    # 生成校验信息
    generate_file_checksums
    
    # 创建完整tar包
    create_and_verify_tar
    
    # 压缩tar包
    compress_tar
    
    # 分卷处理
    split_into_chunks
    
    # 生成校验文件
    generate_checksum_files
    
    # 创建解压工具
    create_extraction_tools
    
    # 创建文档
    create_documentation
    
    # 最终验证
    final_verification
    
    # 完成报告
    generate_report
}

# 执行主函数
main "$@"

打包脚本输出结果

图片#B #S #R #60% #auto

文件说明

extract_sdk.sh 是一键解压脚本,使用方法见 QUICK_START.txt 。

README.md 是这个 SDK 压缩包的说明以及使用解压方法。

tar.xz.part.xx 是 SDK 压缩包在分包后的内容,解压时需要再合成解压。

.md5 和 .sha256 文件是校验文件,检测压缩包对不对,如果有错误就需要重新下载压缩包。

QUICK_START.txt 文件是快速开始文件,教你怎么解压。

 

一键解压脚本

extract_sdk.sh

#!/bin/bash
# RK3566 SDK 智能解压工具
# 自动验证完整性并解压

set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 默认输出目录
OUTPUT_DIR="${1:-./extracted_sdk}"
SDK_PATTERN="rk3566_linux_sdk_*.tar.xz.part.*"

echo -e "${GREEN}RK3566 SDK 解压工具${NC}"
echo "================================"

# 检查文件是否存在
check_files_exist() {
    if ! ls $SDK_PATTERN >/dev/null 2>&1; then
        echo -e "${RED}错误: 未找到SDK分卷文件${NC}"
        echo "请确保以下文件存在:"
        echo "  - rk3566_linux_sdk_YYYYMMDD.tar.xz.part.* (分卷)"
        exit 1
    fi
    return 0
}

# 验证文件完整性
verify_integrity() {
    echo -e "${YELLOW}[1/4] 验证文件完整性...${NC}"
    
    if [ -f "sdk_parts_checksums.sha256" ]; then
        echo "使用SHA256验证分卷文件..."
        if sha256sum -c sdk_parts_checksums.sha256; then
            echo -e "${GREEN}✓ 所有分卷验证通过${NC}"
        else
            echo -e "${RED}✗ 分卷文件损坏,请重新下载${NC}"
            exit 1
        fi
    else
        echo -e "${YELLOW}⚠ 未找到校验文件,跳过完整性验证${NC}"
    fi
}

# 检查磁盘空间
check_disk_space() {
    echo -e "${YELLOW}[2/4] 检查磁盘空间...${NC}"
    
    local total_size=0
    for f in $SDK_PATTERN; do
        if [ -f "$f" ]; then
            size=$(stat -c%s "$f" 2>/dev/null || du -b "$f" | cut -f1)
            total_size=$((total_size + size))
        fi
    done
    
    local required_space=$((total_size * 3))  # 解压需要2-3倍空间
    local available_space=$(df . | awk 'NR==2 {print $4 * 1024}')
    
    if [ "$available_space" -lt "$required_space" ]; then
        echo -e "${RED}✗ 磁盘空间不足${NC}"
        echo "需要: $(echo "scale=2; $required_space/1024/1024/1024" | bc) GB"
        echo "可用: $(echo "scale=2; $available_space/1024/1024/1024" | bc) GB"
        exit 1
    fi
    
    echo -e "${GREEN}✓ 磁盘空间充足${NC}"
}

# 解压文件
extract_files() {
    echo -e "${YELLOW}[3/4] 解压SDK...${NC}"
    
    # 创建输出目录
    mkdir -p "$OUTPUT_DIR"
    
    echo "合并分卷文件..."
    cat $SDK_PATTERN > "$OUTPUT_DIR/combined.tar.xz"
    
    echo "解压xz压缩包..."
    cd "$OUTPUT_DIR"
    xz -d combined.tar.xz
    
    echo "解压tar包..."
    tar -xf combined.tar
    rm -f combined.tar
    
    cd ..
    echo -e "${GREEN}✓ 解压完成${NC}"
}

# 验证解压结果
verify_extraction() {
    echo -e "${YELLOW}[4/4] 验证解压结果...${NC}"
    
    if [ -f "file_checksums.sha256" ]; then
        echo "验证解压文件完整性..."
        cd "$OUTPUT_DIR"
        if sha256sum -c ../file_checksums.sha256; then
            echo -e "${GREEN}✓ 所有文件验证通过${NC}"
        else
            echo -e "${YELLOW}⚠ 部分文件验证失败${NC}"
        fi
        cd ..
    else
        echo -e "${YELLOW}⚠ 未找到文件校验信息,跳过验证${NC}"
    fi
}

# 主流程
main() {
    echo -e "${BLUE}输出目录: $OUTPUT_DIR${NC}"
    
    check_files_exist
    verify_integrity
    check_disk_space
    extract_files
    verify_extraction
    
    echo ""
    echo -e "${GREEN}================================"
    echo "SDK安装完成!"
    echo "解压位置: $OUTPUT_DIR"
    echo "================================"
    echo -e "${NC}"
}

main "$@"

 

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册