LSPosed 项目编译问题解决方案

LSPosed 项目编译问题解决方案

本文档记录了编译JingMatrix

LSPosed 项目时遇到的常见问题及其解决方案。

目录

  1. [Apache 模块编译失败 - ClassUtils 引用问题](#Apache 模块编译失败 - ClassUtils 引用问题)
  2. [mk.sh 脚本错误 - manager 项目不存在](#mk.sh 脚本错误 - manager 项目不存在)
  3. [Gradle 内存不足错误](#Gradle 内存不足错误)
  4. [Lint 检查错误导致编译失败](#Lint 检查错误导致编译失败)

1. Apache 模块编译失败 - ClassUtils 引用问题

问题描述

编译 apache 模块时出现错误:

复制代码
> Task :apache:compileJava FAILED

错误原因:SerializationUtilsX.java 文件中引用了 ClassUtils,但该类已被重命名为 ClassUtilsX

解决方案

1.1 修复 apache/build.gradle.kts

SerializationUtilsX 任务中添加 ClassUtilsClassUtilsX 的替换:

kotlin 复制代码
tasks.register<Copy>("SerializationUtilsX") {
    from("$lang3Src/SerializationUtils.java")
    into(localDir)
    filter { line: String -> 
        line.replace("SerializationUtils", "SerializationUtilsX")
            .replace("ClassUtils", "ClassUtilsX")  // 添加这行
    }
    rename("(.+).java", "$1X.java")
}
1.2 排除原始文件

build.gradle.kts 中排除原始的 ClassUtils.javaSerializationUtils.java

kotlin 复制代码
java {
    sourceSets {
        main {
            java {
                srcDirs("commons-lang/src/main/java", "local")
                exclude("**/ClassUtils.java", "**/SerializationUtils.java")  // 添加这行
            }
        }
    }
}
1.3 批量替换源代码中的 ClassUtils 引用

需要将以下文件中的 ClassUtils 替换为 ClassUtilsX

  • FastDatePrinter.java
  • TypeUtils.java
  • MethodUtils.java
  • MemberUtils.java
  • ConstructorUtils.java
  • FieldUtils.java
  • RecursiveToStringStyle.java
  • ReflectionToStringBuilder.java
  • ToStringStyle.java
  • ReflectionDiffBuilder.java
  • MultilineRecursiveToStringStyle.java
  • EqualsBuilder.java
  • ExceptionUtils.java
  • Validate.java
  • SystemProperties.java
  • ArrayUtils.java
  • AnnotationUtils.java

替换内容包括:

  • import org.apache.commons.lang3.ClassUtilsimport org.apache.commons.lang3.ClassUtilsX
  • ClassUtils.ClassUtilsX.
  • ClassUtils::ClassUtilsX::
  • ClassUtils.InterfacesClassUtilsX.Interfaces

可以使用以下命令批量替换:

bash 复制代码
# 替换导入语句
find apache/commons-lang/src/main/java -name "*.java" -exec sed -i '' 's/import org\.apache\.commons\.lang3\.ClassUtils;/import org.apache.commons.lang3.ClassUtilsX;/g' {} \;

# 替换方法调用
find apache/commons-lang/src/main/java -name "*.java" -exec sed -i '' 's/ClassUtils\./ClassUtilsX./g' {} \;

# 替换方法引用
find apache/commons-lang/src/main/java -name "*.java" -exec sed -i '' 's/ClassUtils::/ClassUtilsX::/g' {} \;

2. mk.sh 脚本错误 - manager 项目不存在

问题描述

运行 ./mk.sh 时出现错误:

复制代码
Cannot locate tasks that match ':manager:assembleDebug' as project 'manager' not found in root project 'LSPosed'.

解决方案

根据 settings.gradle.kts,项目名称是 app 而不是 manager。修改 mk.sh 脚本:

bash 复制代码
# 修改前
./gradlew :manager:assembleDebug

# 修改后
./gradlew :app:assembleDebug

3. Gradle 内存不足错误

问题描述

编译时出现内存不足错误:

复制代码
ERROR: R8: java.lang.OutOfMemoryError: Java heap space
The currently configured max heap space is '512 MiB' and the configured max metaspace is '384 MiB'.

解决方案

修改 gradle.properties 文件,增加内存配置:

properties 复制代码
org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

参数说明:

  • -Xmx4096m: 最大堆内存 4GB
  • -XX:MaxMetaspaceSize=1024m: 最大 Metaspace 1GB
  • -XX:+HeapDumpOnOutOfMemoryError: OOM 时生成堆转储文件
  • -Dfile.encoding=UTF-8: 文件编码 UTF-8

注意:如果系统内存较小(< 8GB),可以调整为:

properties 复制代码
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

修改后需要停止 Gradle daemon:

bash 复制代码
./gradlew --stop

4. Lint 检查错误导致编译失败

问题描述

编译时 Lint 检查失败:

复制代码
> Task :app:lintDebug FAILED
Lint found 109 errors, 56 warnings. First failure:
Error: Class referenced in the manifest, androidx.startup.InitializationProvider, was not found in the project or the libraries [MissingClass]

解决方案

修改 build.gradle.kts 中的 lint 配置:

kotlin 复制代码
lint {
    abortOnError = false  // 允许 lint 错误,不中断构建
    checkReleaseBuilds = false
    // 忽略 MissingClass 错误(因为有些类可能被 tools:node="remove" 移除)
    disable.add("MissingClass")
}

说明AndroidManifest.xml 中的 androidx.startup.InitializationProvider 使用了 tools:node="remove",表示该 provider 会被移除,但 Lint 仍会检查该类是否存在,导致错误。

替代方案

如果需要更严格地处理 lint 错误,可以创建 Lint Baseline:

bash 复制代码
./gradlew :app:updateLintBaseline

然后在 app/build.gradle.kts 中添加:

kotlin 复制代码
android {
    lint {
        baseline = file("lint-baseline.xml")
    }
}

编译项目

修复以上问题后,可以使用以下命令编译项目:

使用脚本编译(推荐)

bash 复制代码
./mk.sh

使用 Gradle 命令编译

bash 复制代码
# 编译所有模块(Debug + Release)
./gradlew clean build

# 只编译 Debug 版本(更快)
./gradlew clean assembleDebug

# 只编译 Release 版本
./gradlew clean assembleRelease

# 并行编译(更快)
./gradlew clean build --parallel --max-workers=4

编译特定模块

bash 复制代码
# 编译核心模块
./gradlew :core:assembleDebug

# 编译应用模块
./gradlew :app:assembleDebug

# 编译 Apache Commons Lang 模块
./gradlew :apache:assembleDebug

项目模块列表

根据 settings.gradle.kts,项目包含以下模块:

  • :apache - Apache Commons Lang 库
  • :app - LSPosed Manager 应用
  • :axml - Android XML 处理库
  • :core - LSPosed 核心框架
  • :daemon - 守护进程
  • :dex2oat - Dex2Oat 工具
  • :hiddenapi:stubs - Hidden API 存根
  • :hiddenapi:bridge - Hidden API 桥接
  • :magisk-loader - Magisk 模块加载器
  • :libxposed:api - Xposed API
  • :libxposed:service - Xposed 服务
  • :libxposed:compat - Xposed 兼容层
  • :services:manager-service - 管理器服务
  • :services:daemon-service - 守护进程服务

构建产物位置

编译完成后,构建产物通常在以下位置:

  • APK : app/build/outputs/apk/
  • AAR/JAR : 各模块/build/libs/
  • Magisk ZIP : magisk-loader/build/outputs/

常见问题排查

问题:编译时提示找不到某个类

  1. 检查依赖是否正确添加到 build.gradle.kts
  2. 运行 ./gradlew :模块名:dependencies 查看依赖树
  3. 检查是否有 ProGuard/R8 规则需要添加

问题:NDK 编译失败

  1. 检查 ANDROID_NDK_HOME 环境变量是否正确设置
  2. 确认 NDK 版本是否匹配(当前项目需要 NDK 26.1.10909125)
  3. 检查 CMake 配置是否正确

问题:子模块未更新

运行以下命令更新子模块:

bash 复制代码
git submodule update --init --recursive

参考资料


最后更新: 2025-01-18

相关推荐
一直都在5722 小时前
SpringBoot3 框架快速搭建与项目工程详解
java·开发语言
小北方城市网2 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
独自破碎E2 小时前
什么是Spring IOC
java·spring·rpc
lendsomething2 小时前
graalvm使用实战:在java中执行js脚本
java·开发语言·javascript·graalvm
烤麻辣烫2 小时前
java进阶--刷题与详解-2
java·开发语言·学习·intellij-idea
期待のcode2 小时前
性能监控工具
java·开发语言·jvm
Chan162 小时前
【 微服务SpringCloud | 方案设计 】
java·spring boot·微服务·云原生·架构·intellij-idea
小屁猪qAq2 小时前
设计模式总纲
开发语言·c++·设计模式
不绝1912 小时前
C#核心:多态
开发语言·c#