LSPosed 项目编译问题解决方案
本文档记录了编译JingMatrix
LSPosed 项目时遇到的常见问题及其解决方案。
目录
- [Apache 模块编译失败 - ClassUtils 引用问题](#Apache 模块编译失败 - ClassUtils 引用问题)
- [mk.sh 脚本错误 - manager 项目不存在](#mk.sh 脚本错误 - manager 项目不存在)
- [Gradle 内存不足错误](#Gradle 内存不足错误)
- [Lint 检查错误导致编译失败](#Lint 检查错误导致编译失败)
1. Apache 模块编译失败 - ClassUtils 引用问题
问题描述
编译 apache 模块时出现错误:
> Task :apache:compileJava FAILED
错误原因:SerializationUtilsX.java 文件中引用了 ClassUtils,但该类已被重命名为 ClassUtilsX。
解决方案
1.1 修复 apache/build.gradle.kts
在 SerializationUtilsX 任务中添加 ClassUtils → ClassUtilsX 的替换:
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.java 和 SerializationUtils.java:
kotlin
java {
sourceSets {
main {
java {
srcDirs("commons-lang/src/main/java", "local")
exclude("**/ClassUtils.java", "**/SerializationUtils.java") // 添加这行
}
}
}
}
1.3 批量替换源代码中的 ClassUtils 引用
需要将以下文件中的 ClassUtils 替换为 ClassUtilsX:
FastDatePrinter.javaTypeUtils.javaMethodUtils.javaMemberUtils.javaConstructorUtils.javaFieldUtils.javaRecursiveToStringStyle.javaReflectionToStringBuilder.javaToStringStyle.javaReflectionDiffBuilder.javaMultilineRecursiveToStringStyle.javaEqualsBuilder.javaExceptionUtils.javaValidate.javaSystemProperties.javaArrayUtils.javaAnnotationUtils.java
替换内容包括:
import org.apache.commons.lang3.ClassUtils→import org.apache.commons.lang3.ClassUtilsXClassUtils.→ClassUtilsX.ClassUtils::→ClassUtilsX::ClassUtils.Interfaces→ClassUtilsX.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/
常见问题排查
问题:编译时提示找不到某个类
- 检查依赖是否正确添加到
build.gradle.kts - 运行
./gradlew :模块名:dependencies查看依赖树 - 检查是否有 ProGuard/R8 规则需要添加
问题:NDK 编译失败
- 检查
ANDROID_NDK_HOME环境变量是否正确设置 - 确认 NDK 版本是否匹配(当前项目需要 NDK 26.1.10909125)
- 检查 CMake 配置是否正确
问题:子模块未更新
运行以下命令更新子模块:
bash
git submodule update --init --recursive
参考资料
最后更新: 2025-01-18