Skip to content

🧩 ElfTranslator ​

Translator 核心 Translator 实现

.so 树条目的翻译器:输出文件大小、本机依赖(DT_NEEDED)与动态符号列表。

📁 源码:ClassySharkWS/src/com/google/classyshark/silverghost/translator/elf/ElfTranslator.java   📦 包:com.google.classyshark.silverghost.translator.elf

职责 ​

ElfTranslator 实现 Translator,处理 APK/归档中 .so 原生库条目。apply 先用静态 extractElf 从归档(ZipInputStream)扫出目标 .so 条目(经 SherlockHash 缓存到临时文件),再用两套 ELF 库读取:nl.lxtreme.binutils.elf.Elf 读共享库依赖(DT_NEEDED),再用内部 ElfReader 读动态符号表(因 binutils 不提供动态符号)。getElementsList 发出文件大小、Native Dependencies、Dynamic Symbols 三段 ELEMENT。

关键方法 / 字段 ​

名称类型说明
archiveFileFile宿主归档(apk 等)
resourceFile提取出的 .so 临时文件
elfNameString目标条目名(如 lib/.../libfoo.so)
dependenciesString本机依赖(DT_NEEDED)拼接文本
dynamicSymbolsStringBuilder动态符号拼接文本
getClassName()String返回 archiveFile.getName()
addMapper(TokensMapper)void空操作
apply()void提取 .so → 读依赖 + 读动态符号
getElementsList()List<ELEMENT>发文件大小 / 依赖 / 动态符号三段
getDependencies()List<String>返回空 LinkedList
extractElf(String, File)static File扫 zip 找条目,经 SherlockHash 缓存提取 .so

工作流程 ​

mermaid
flowchart TD
    A["apply()"] --> B["extractElf(elfName, archiveFile) → resource"]
    B --> C["new Elf(resource)  (binutils)"]
    C --> D["getSharedDependencies → DT_NEEDED 依赖列表"]
    D --> E["ElfReader.read(resource)  (内部解析器)"]
    E --> F["getDynamicSymbols → 动态符号列表"]
    F --> G["getElementsList: 发 文件大小 / Native Dependencies / Dynamic Symbols"]

设计要点 ​

  • 🧰 双 ELF 库协作 — binutils 的 Elf 能读 DT_NEEDED 共享库依赖但缺动态符号表,故另用内部 ElfReader 补动态符号,二者职责互补。
  • 📦 条目提取 + 缓存 — extractElf 用 ZipInputStream 线性扫描,命中后委托 SherlockHash.INSTANCE.getFileFromZipStream 把条目落盘(带缓存),避免重复解压。
  • 📊 复用 readableFileSize — 文件大小经 static import 自 JarInfoTranslator.readableFileSize,跨翻译器统一格式化。
  • 🏗️ 三段式输出 — getElementsList 用 TAG.DOCUMENT 与 TAG.IDENTIFIER 交替发出标题/正文,UI 可按标签着色区分段落。
  • ⚠️ 空异常吞没 — apply 的 try 块 catch (Exception e) {} 完全静默,连日志都不打。

协作关系 ​

  • 依赖:[[Translator]](实现接口)
  • 依赖:[[ElfReader]](读动态符号)
  • 依赖:[[SherlockHash]](extractElf 缓存提取)
  • 依赖:[[JarInfoTranslator]](readableFileSize)
  • 依赖:nl.lxtreme.binutils.elf.Elf(读共享库依赖)
  • 被创建:[[TranslatorFactory]](.so 分支)
  • 被调用:[[DisplayArea]](消费 getElementsList())

已知问题 / TODO ​

相关文档 ​

最后更新:

基于 Apache 2.0 协议发布