decompiler

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 26, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Overview

Package decompiler 提供 Worker 侧反编译能力:解析/缓存 CFR 反编译器 jar, 并经实例/系统 JDK 受控调起 CFR 把 class/jar 反编译为 Java 源码。

全程只读 + 超时 + 体积上限 + 受控 exec(CFR 静态分析字节码,不加载/运行目标代码、 不写工作目录、不联网执行)。参见 ADR-018。

Index

Constants

View Source
const (
	// DefaultTimeout 是单次反编译的默认超时。超时 kill 子进程并降级。
	DefaultTimeout = 30 * time.Second
	// MaxOutputBytes 是捕获 CFR stdout 源码的上限,超出截断。
	MaxOutputBytes = 4 * 1024 * 1024
)

反编译安全上限(ADR-018 决策 4)。

View Source
const (
	// CFRVersion 是本 Worker 约定的 CFR 版本。
	CFRVersion = "0.152"
)

CFR 版本与内容指纹(构建期常量,升级 CFR 时同步改这三项)。 SHA-256 pin 用于校验「按需下载」的内容可信(不信任传输通道,只信内容指纹, 与 ADR-022 客户端 manifest 信任模型同构)。

Variables

This section is empty.

Functions

func ResolveJavaBin

func ResolveJavaBin(jdkPath, jdkBinPath string, systemCandidates []string) string

ResolveJavaBin 解析用于运行 CFR 的 java 可执行文件路径。 优先级:实例绑定 JDK 的 bin(jdkBinPath 或 jdkPath/bin)> 系统候选(systemCandidates)> PATH 上的 java。 返回空串表示无可用 JDK(调用方据此降级)。

Types

type Config

type Config struct {
	// ConfigPath 显式 CFR jar 路径(可空)。
	ConfigPath string
	// CacheDir 数据根下的缓存目录(CFR jar 落地于此,可空则仅用配置/内嵌)。
	CacheDir string
	// Embedded 返回内嵌 jar 字节(可空)。
	Embedded EmbeddedJarFunc
	// AllowDownload 是否允许从 Maven Central 按需下载(默认应开启)。
	AllowDownload bool
	// HTTPClient 按需下载 CFR 所用出站 client(经进程级代理,FR-174/ADR-037)。
	// 为 nil 时回退一个 60s 超时的默认 client(向后兼容;测试也可经此注入 httptest client)。
	HTTPClient *http.Client
	// HTTPClientProvider 运行时出站持有者(FR-185/ADR-043):非空时每次下载取当前 client,
	// 使 CP 经心跳下发的代理改动即时生效。优先于 HTTPClient。
	HTTPClientProvider func() *http.Client
}

Config 构造 Provider 的参数。

type EmbeddedJarFunc

type EmbeddedJarFunc func() []byte

EmbeddedJarFunc 返回内嵌 CFR jar 字节(缺失返回 nil)。 由调用方注入(worker embed 包),避免本包反向依赖。

type Options

type Options struct {
	// JavaBin 是用于运行 CFR 的 java 可执行文件路径(实例绑定 JDK 优先,否则系统 JDK)。
	JavaBin string
	// CFRJar 是已解析的 CFR jar 路径。
	CFRJar string
	// Target 是反编译目标的绝对路径(工作目录内 .class 或 .jar,或从 jar 抽出的临时 .class)。
	Target string
	// JarEntry 非空时表示只反编译 jar 内某 class 条目(传给 CFR 作为「仅该类」过滤)。
	// 当 Target 本身是单个 .class(已从 jar 抽出)时留空。
	JarEntry string
	// Timeout 覆盖默认超时(<=0 用 DefaultTimeout)。
	Timeout time.Duration
}

Options 是一次反编译调用的输入。

type Provider

type Provider struct {
	// contains filtered or unexported fields
}

Provider 负责解析出一个可用的 CFR jar 路径并缓存结果。 解析优先级(ADR-018 决策 3):

  1. 显式配置路径(configPath);
  2. 内嵌 jar(embedded,写到缓存目录复用);
  3. 数据根缓存(cacheDir/cfr-<ver>.jar);
  4. 按需下载(download URL + sha256 pin 校验)。

Provider 可被多 goroutine 并发调用 Resolve;首次解析加锁串行,之后走缓存。

func NewProvider

func NewProvider(cfg Config) *Provider

NewProvider 创建 CFR jar 解析器。

func (*Provider) Resolve

func (p *Provider) Resolve() (string, error)

Resolve 解析出一个可用的 CFR jar 路径(按优先级),命中后缓存结果。 全部来源都不可用时返回错误,调用方据此把反编译降级为「无 CFR」错误。

type Result

type Result struct {
	// Source 是反编译出的 Java 源码(截断到 MaxOutputBytes)。
	Source string
	// Truncated 表示源码因超上限被截断。
	Truncated bool
	// Decompiler 是反编译器标识(如 "CFR 0.152")。
	Decompiler string
}

Result 是一次反编译的结果。

func Run

func Run(ctx context.Context, opts Options) (*Result, error)

Run 受控调起 CFR 反编译 opts.Target,返回 Java 源码。 CFR 仅静态分析字节码并把源码输出到 stdout:不加载/运行目标代码、不写工作目录、不联网。 超时 / CFR 非 0 退出 / 无输出一律返回错误,由调用方降级为结构化失败。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL