跳转到主要内容
Native Mods 是编译为 DEX、直接加载到 Aether 进程中的 Kotlin 类。它们提供最深层次的扩展能力 — 直接访问 Android API、Jetpack Compose 以及所有 Aether 内部实现。

何时使用 Native Mods

在需要以下任一能力时,选择 Native Mod 而非 Script Mod:
  • 注册新的服务实现 — 通过按优先级排序的服务注册表替换或增强 Aether 内置服务。
  • 用完整 Compose 代码包裹或替换 Compose 组件 — Script 组件使用声明式 UI 树;Native 组件则提供不受限的 Jetpack Compose。
  • 访问宿主方法未暴露的 Android 平台 APIContextPackageManager、平台传感器等。
  • 对性能敏感的操作 — 受益于在应用进程中直接运行、经编译优化的 Kotlin。
  • 通配操作拦截"*")— 拦截通过 mod kernel 分发的每一个操作。

AetherNativeMod 接口

每个 Native Mod 入口类都实现此接口:
onLoad 在进程启动加载 mod 时调用一次。接口定义了 onUnload,但当前 Native Mod 管理器不会调用它。

AetherNativeModContext

传入 onLoadcontext 参数是访问 mod kernel 全部能力的入口:

DEX 编译要求

Aether 使用 Android 的 DexClassLoader 加载 Native Mod 代码。请注意以下约束:
  • DexClassLoader 接受 .dex.apk,或包含 classes.dex 的 jar/zip 文件。
  • 普通 JVM .class jar 不够 — 需对编译输出运行 Android D8R8 以生成 DEX 产物。
  • Compose 渲染器必须使用与目标 Aether 构建兼容的 Compose 编译器版本编译。
  • 当 Aether 实现类或 Kotlin/Compose 工具链变更时,请重新构建 native mods。这种耦合是有意为之,类似于与版本绑定的 Minecraft mods。

package.json 中的 classpath 格式

package.jsonaether.native 下声明 DEX 产物、可选的原生库目录,以及入口类名:
package.json
  • classpath — 一个或多个相对包根目录的 .dex.apk,或包含 DEX 的 zip/jar 路径。
  • libraryPath — 可选目录,包含 .so 原生库。
  • entrypoints — 实现 AetherNativeMod 的完全限定类名。同一包中的多个入口都会被加载。

最小示例

MyNativeMod.kt
Native Mods 属于不受限制的层级。它们可以使用反射、JNI,并直接访问 Aether 实现类。没有权限沙箱。请只安装你完全信任的 Native Mods。
Native Mods 在进程启动时加载。安装、更新、移除或更改 Native Mod 后,需重启 Aether 才会生效。