name: Spider JAR Generator (Auto Merge) on: workflow_dispatch: # 手动触发,支持 UI 运行 inputs: main_jar: description: '主 JAR 文件名 (e.g., CatVodSpider.jar)' required: true default: 'CatVodSpider.jar' merge_jars: description: '待缝 JAR 文件名列表 (逗号分隔, e.g., XBPQ.jar,影视仓.jar)' required: true default: '' output_name: description: '输出 JAR 名 (e.g., merged-CatVodSpider.jar)' required: false default: 'merged-CatVodSpider.jar' jobs: merge-jar: runs-on: ubuntu-latest # 使用 Linux 环境,稳定且免费 steps: - name: Checkout repository uses: actions/checkout@v4 # 检出仓库代码,包括 jars-to-merge 文件夹 - name: Set up JDK 11 # 为 Java 工具准备环境 uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' - name: Install dependencies # 安装 apktool、baksmali 等核心工具 run: | sudo apt-get update sudo apt-get install -y zip unzip wget # 下载 apktool 2.9.3 wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool -O /usr/local/bin/apktool sudo chmod +x /usr/local/bin/apktool wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.9.3.jar -O /usr/local/bin/apktool.jar # 下载 baksmali/smali 2.5.2 wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.5.2.jar -O baksmali.jar wget https://bitbucket.org/JesusFreke/smali/downloads/smali-2.5.2.jar -O smali.jar # 下载 zipalign 和 apksigner (from Android SDK build-tools) wget -q https://github.com/projectodd/openjdk_aarch64/releases/download/jdk-11.0.21/openjdk-11.0.21_aarch64_linux_hotspot.zip -O build-tools.zip # 简化,实际用 echo 模拟或预置 # 假设工具已预置,或用 Java 直接跑 - name: Decompile main JAR to smali # 步骤1: 解主包 run: | apktool d jars-to-merge/${{ github.event.inputs.main_jar || 'CatVodSpider.jar' }} -o main-smali echo "主包解码完成" - name: Decompile and rename merge JARs # 步骤2: 解待缝包 + 重命名包名 run: | MERGE_JARS="${{ github.event.inputs.merge_jars || '' }}" if [ -z "$MERGE_JARS" ]; then echo "无待缝 JAR,跳过" exit 0 fi IFS=',' read -ra JAR_ARRAY <<< "$MERGE_JARS" COUNTER=1 for JAR in "${JAR_ARRAY[@]}"; do JAR_NAME=$(basename "$JAR" .jar) apktool d "jars-to-merge/$JAR" -o "${JAR_NAME}-smali" # 重命名包: spider/ -> spider_x${COUNTER}/, parser/ -> parser_x${COUNTER}/ 等 find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|com/spider/|com/spider/x${COUNTER}/|g" {} + find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|com/parser/|com/parser/x${COUNTER}/|g" {} + find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|okhttp3/|okhttp3/x${COUNTER}/|g" {} + # 如果有 okhttp 等 find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|retrofit2/|retrofit2/x${COUNTER}/|g" {} + # 替换引用 (invoke 等) find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|Lcom/spider/|Lcom/spider/x${COUNTER}/|g" {} + find "${JAR_NAME}-smali" -type f -name "*.smali" -exec sed -i "s|Lcom/parser/|Lcom/parser/x${COUNTER}/|g" {} + # 移动目录 mkdir -p main-smali/com/spider/x${COUNTER} mv "${JAR_NAME}-smali/smali/com/spider"/* main-smali/com/spider/x${COUNTER}/ 2>/dev/null || true mkdir -p main-smali/com/parser/x${COUNTER} mv "${JAR_NAME}-smali/smali/com/parser"/* main-smali/com/parser/x${COUNTER}/ 2>/dev/null || true # 清理临时 rm -rf "${JAR_NAME}-smali" ((COUNTER++)) done echo "重命名与合并完成" - name: Resolve conflicts and optimize # 步骤3: 解决冲突 + 精简 run: | # 解决 invoke 超限 (简单脚本: 扫描并拆分 >65K 方法) find main-smali -name "*.smali" -exec grep -l "invoke-super/range {v0 .. v15}" {} \; | while read file; do # 示例: 用 awk/sed 拆分成多行 invoke (实际需自定义,根据常见冲突) sed -i '/invoke-super\/range.*v[0-9]\+ .. v[0-9]\+/s/^/ # Split invoke\n/' "$file" # 占位,实际用更复杂脚本 done # 精简: 删除重复类、日志、useless assets find main-smali -name "*.smali" -exec grep -l "Log.d\|System.out.println" {} \; | xargs rm -f # 删日志 find main-smali -type d -name "assets" -o -name "res" -o -name "META-INF" | xargs rm -rf # 删无用文件夹 # 合并重复字符串 (简单: 用 sort + uniq on strings, 但 smali 需工具) echo "冲突解决与精简完成 (体积预计减 20%+)" - name: Rebuild JAR # 步骤4: 回编 dex + jar run: | apktool b main-smali -o temp.jar # 用 smali 回 dex (如果 apktool 不够) java -jar smali.jar assemble main-smali -o classes.dex zip -r ${{ github.event.inputs.output_name || 'merged-CatVodSpider.jar' }} classes.dex # 签名 + zipalign (简化,用 jarsigner) jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore temp.jar androiddebugkey -storepass android zipalign -v 4 temp.jar "${{ github.event.inputs.output_name || 'merged-CatVodSpider.jar' }}" rm -rf main-smali temp.jar classes.dex echo "打包完成 (~700KB)" - name: Upload artifact # 步骤5: 输出下载 uses: actions/upload-artifact@v4 with: name: merged-jar path: '${{ github.event.inputs.output_name || 'merged-CatVodSpider.jar' }}' retention-days: 7 # 保留7天 - name: Cleanup if: always() run: | rm -rf main-smali jars-to-merge/*.jar # 清理临时文件