diff --git a/build_all.sh b/build_all.sh new file mode 100755 index 0000000..0f55f64 --- /dev/null +++ b/build_all.sh @@ -0,0 +1,152 @@ +#!/bin/bash + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 模块信息 +MODULE_ID="zygisk-myinjector" +MODULE_VERSION="1.0" +MODULE_VERSION_CODE="100" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN} Zygisk MyInjector 构建脚本${NC}" +echo -e "${GREEN}========================================${NC}" + +# 清理之前的构建 +echo -e "\n${YELLOW}[1/5] 清理旧构建文件...${NC}" +rm -rf build/magisk_module +rm -f build/*.zip +mkdir -p build + +# 构建 ConfigApp +echo -e "\n${YELLOW}[2/5] 构建 ConfigApp...${NC}" +cd configapp +if ../gradlew assembleDebug; then + echo -e "${GREEN}✓ ConfigApp 构建成功${NC}" + cd .. +else + echo -e "${RED}✗ ConfigApp 构建失败${NC}" + cd .. + exit 1 +fi + +# 构建 Magisk 模块 +echo -e "\n${YELLOW}[3/5] 构建 Magisk 模块原生库...${NC}" +cd module +if ../gradlew assembleRelease; then + echo -e "${GREEN}✓ 模块原生库构建成功${NC}" + cd .. +else + echo -e "${RED}✗ 模块原生库构建失败${NC}" + cd .. + exit 1 +fi + +# 准备打包 +echo -e "\n${YELLOW}[4/5] 准备打包文件...${NC}" + +# 创建临时目录 +TEMP_DIR="build/magisk_module" +mkdir -p $TEMP_DIR + +# 创建 module.prop +cat > $TEMP_DIR/module.prop << EOF +id=$MODULE_ID +name=Zygisk MyInjector +version=v$MODULE_VERSION +versionCode=$MODULE_VERSION_CODE +author=jiqiu +description=A Zygisk module for dynamic library injection with ConfigApp +EOF +echo -e " ${GREEN}✓ 创建 module.prop${NC}" + +# 复制 service.sh +if [ -f "module/service.sh" ]; then + cp module/service.sh $TEMP_DIR/ + chmod 755 $TEMP_DIR/service.sh + echo -e " ${GREEN}✓ 复制 service.sh${NC}" +else + echo -e " ${RED}✗ 未找到 service.sh${NC}" +fi + +# 创建 zygisk 目录并复制 so 文件 +mkdir -p $TEMP_DIR/zygisk +SO_COUNT=0 + +# 查找并复制 so 文件 +for arch in armeabi-v7a arm64-v8a x86 x86_64; do + SO_PATH="module/build/intermediates/stripped_native_libs/release/out/lib/$arch/libmyinjector.so" + if [ -f "$SO_PATH" ]; then + cp "$SO_PATH" "$TEMP_DIR/zygisk/$arch.so" + echo -e " ${GREEN}✓ 复制 $arch.so${NC}" + ((SO_COUNT++)) + fi +done + +if [ $SO_COUNT -eq 0 ]; then + echo -e " ${RED}✗ 未找到任何 SO 文件${NC}" + exit 1 +fi + +# 复制 ConfigApp APK +APK_PATH="configapp/build/outputs/apk/debug/configapp-debug.apk" +if [ -f "$APK_PATH" ]; then + cp "$APK_PATH" "$TEMP_DIR/configapp.apk" + echo -e " ${GREEN}✓ 复制 ConfigApp APK${NC}" + + # 显示 APK 信息 + APK_SIZE=$(du -h "$APK_PATH" | cut -f1) + echo -e " APK 大小: $APK_SIZE" +else + echo -e " ${RED}✗ 未找到 ConfigApp APK${NC}" + exit 1 +fi + +# 创建 META-INF 目录(Magisk 需要) +mkdir -p $TEMP_DIR/META-INF/com/google/android +touch $TEMP_DIR/META-INF/com/google/android/update-binary +touch $TEMP_DIR/META-INF/com/google/android/updater-script + +# 打包 +echo -e "\n${YELLOW}[5/5] 打包模块...${NC}" +ZIP_NAME="${MODULE_ID}-${MODULE_VERSION}.zip" +cd $TEMP_DIR +zip -r ../$ZIP_NAME * -x "*.DS_Store" > /dev/null 2>&1 +cd ../.. + +# 显示结果 +echo -e "\n${GREEN}========================================${NC}" +echo -e "${GREEN}✓ 构建完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo -e "\n模块文件: ${GREEN}build/$ZIP_NAME${NC}" + +# 显示模块内容 +echo -e "\n模块内容:" +unzip -l build/$ZIP_NAME | grep -E "(\.so|\.apk|\.prop|\.sh)" | while read line; do + echo -e " $line" +done + +# 显示模块大小 +MODULE_SIZE=$(du -h build/$ZIP_NAME | cut -f1) +echo -e "\n模块大小: ${GREEN}$MODULE_SIZE${NC}" + +# 安装说明 +echo -e "\n${YELLOW}安装方法:${NC}" +echo -e " 1. 将模块传输到手机:" +echo -e " ${GREEN}adb push build/$ZIP_NAME /sdcard/${NC}" +echo -e " 2. 在 Magisk Manager 中安装模块" +echo -e " 3. 重启手机" +echo -e "\n${YELLOW}验证安装:${NC}" +echo -e " ${GREEN}adb shell pm list packages | grep com.jiqiu.configapp${NC}" +echo -e " ${GREEN}adb shell cat /data/local/tmp/myinjector_install.log${NC}" + +# 可选:直接安装到设备 +if [ "$1" == "--install" ]; then + echo -e "\n${YELLOW}正在安装到设备...${NC}" + adb push build/$ZIP_NAME /data/local/tmp/ + adb shell su -c "magisk --install-module /data/local/tmp/$ZIP_NAME" + echo -e "${GREEN}✓ 安装完成,请重启设备${NC}" +fi \ No newline at end of file diff --git a/configapp/build.gradle b/configapp/build.gradle index 75ceb89..56e0e18 100644 --- a/configapp/build.gradle +++ b/configapp/build.gradle @@ -6,6 +6,12 @@ android { namespace 'com.jiqiu.configapp' compileSdk 34 + packagingOptions { + jniLibs { + useLegacyPackaging = true + } + } + defaultConfig { applicationId "com.jiqiu.configapp" minSdk 24 @@ -23,8 +29,9 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + coreLibraryDesugaringEnabled false } } diff --git a/module/build.gradle b/module/build.gradle index 915645c..3402c04 100644 --- a/module/build.gradle +++ b/module/build.gradle @@ -66,6 +66,17 @@ afterEvaluate { from("$buildDir/intermediates/stripped_native_libs/$variantLowered/out/lib") { into 'lib' } + // Copy service.sh + from("$projectDir") { + include 'service.sh' + } + // Copy ConfigApp APK if it exists + def apkFile = file("$rootDir/configapp/build/outputs/apk/debug/configapp-debug.apk") + if (apkFile.exists()) { + from(apkFile) { + rename { 'configapp.apk' } + } + } doLast { file("$magiskDir/zygisk").mkdir() fileTree("$magiskDir/lib").visit { f -> diff --git a/module/service.sh b/module/service.sh new file mode 100755 index 0000000..8abbbff --- /dev/null +++ b/module/service.sh @@ -0,0 +1,98 @@ +#!/system/bin/sh +MODDIR=${0%/*} + +# 确保路径定义 +export PATH=/system/bin:/system/xbin:$PATH + +# 定义日志函数 +log() { + echo "[MyInjector] $(date '+%Y-%m-%d %H:%M:%S') $1" >> /data/local/tmp/myinjector_install.log +} + +# APK 文件路径 +APK_PATH="$MODDIR/configapp.apk" + +# 检查 APK 是否存在 +if [ ! -f "$APK_PATH" ]; then + log "APK 文件不存在: $APK_PATH" + exit 1 +fi + +# 等待系统完全启动 +log "等待系统启动完成" +while [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep 1 +done +sleep 5 # 额外等待,确保服务启动完成 + +# 检查 pm 是否可用 +log "检查 pm 命令状态" +while ! pm list packages >/dev/null 2>&1; do + sleep 1 +done + +# 检查是否已安装 +INSTALLED=$(pm list packages com.jiqiu.configapp 2>/dev/null) +if [ -n "$INSTALLED" ]; then + log "ConfigApp 已安装,检查版本" + # 可以在这里添加版本检查逻辑 +else + log "ConfigApp 未安装,开始安装" +fi + +# 获取系统版本 +SDK_VERSION=$(getprop ro.build.version.sdk) +log "检测到系统版本: SDK $SDK_VERSION" + +# 根据系统版本选择安装方法 +if [ "$SDK_VERSION" -ge 29 ]; then + # 高版本 Android(SDK >= 29) + log "使用高版本安装逻辑" + { + INSTALL_SESSION=$(pm install-create -r) + if [ $? -ne 0 ]; then + log "创建安装会话失败" + exit 1 + fi + log "安装会话创建成功: $INSTALL_SESSION" + + pm install-write "$INSTALL_SESSION" 0 "$APK_PATH" + if [ $? -ne 0 ]; then + log "写入 APK 文件失败" + log "降级,使用低版本安装逻辑" + pm install -r "$APK_PATH" >> /data/local/tmp/myinjector_install.log 2>&1 + if [ $? -ne 0 ]; then + log "APK 安装失败" + exit 1 + fi + log "APK 安装完成" + exit 0 + fi + log "APK 写入成功" + + pm install-commit "$INSTALL_SESSION" + if [ $? -ne 0 ]; then + log "提交安装会话失败" + exit 1 + fi + log "APK 安装完成" + } >> /data/local/tmp/myinjector_install.log 2>&1 +else + # 低版本 Android(SDK < 29) + log "使用低版本安装逻辑" + pm install -r "$APK_PATH" >> /data/local/tmp/myinjector_install.log 2>&1 + if [ $? -ne 0 ]; then + log "APK 安装失败" + exit 1 + fi + log "APK 安装完成" +fi + +# 确保模块目录权限正确 +chmod -R 755 /data/adb/modules/zygisk-myinjector +chown -R root:root /data/adb/modules/zygisk-myinjector + +log "ConfigApp 安装脚本执行完成" + +# 脚本完成 +exit 0 \ No newline at end of file