LSPosed 项目编译问题解决方案

17 阅读4分钟

LSPosed 项目编译问题解决方案

本文档记录了编译 JingMatrix LSPosed 项目时遇到的常见问题及其解决方案。

目录

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

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

  3. Gradle 内存不足错误

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


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

问题描述

编译 apache 模块时出现错误:


> Task :apache:compileJava FAILED

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

解决方案

1.1 修复 apache/build.gradle.kts

SerializationUtilsX 任务中添加 ClassUtilsClassUtilsX 的替换:


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


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

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


# 替换导入语句

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 脚本:


# 修改前

./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 文件,增加内存配置:


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),可以调整为:


org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

修改后需要停止 Gradle daemon:


./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 配置:


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:


./gradlew :app:updateLintBaseline

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


android {

lint {

baseline = file("lint-baseline.xml")

}

}


编译项目

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

使用脚本编译(推荐)


./mk.sh

使用 Gradle 命令编译


# 编译所有模块(Debug + Release)

./gradlew clean build

  


# 只编译 Debug 版本(更快)

./gradlew clean assembleDebug

  


# 只编译 Release 版本

./gradlew clean assembleRelease

  


# 并行编译(更快)

./gradlew clean build --parallel --max-workers=4

编译特定模块


# 编译核心模块

./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 配置是否正确

问题:子模块未更新

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


git submodule update --init --recursive


参考资料


最后更新: 2025-01-18