{
  "added_at": "2026-11-04",
  "additional_evidence_urls": [
    "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/enjarify/main.py",
    "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/enjarify.sh",
    "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/enjarify.bat",
    "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/enjarify/runtests.py",
    "https://github.com/google/enjarify/tree/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/tests",
    "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/LICENSE.txt",
    "https://github.com/google/enjarify/releases/tag/1.0.3",
    "https://github.com/Storyyeller/enjarify/tree/6364dfb30f7862873b84ec5fad1d1286c526ba0b"
  ],
  "category": "android",
  "description_en": "Pure-Python 3 translator from Dalvik bytecode to equivalent Java bytecode, so Java analysis tools and decompilers can be applied to Android apps: given an APK, with every DEX file of a multidex APK combined into one jar, or a single DEX file, it writes a jar of class files. Its README contrasts it with dex2jar and lists edge cases it handles, such as Unicode class names, constants used as several types, implicit casts, exception handlers that jump into normal control flow, very long methods and classes that reference too many constants. By default it also applies readability optimizations such as copy propagation and unused-value removal.",
  "description_zh": "用纯 Python 3 编写的转换工具，把 Dalvik 字节码转换为等价的 Java 字节码，使 Java 分析工具和反编译器可以用于 Android 应用：输入 APK（多 dex APK 中的所有 DEX 文件会合并到同一个 jar）或单个 DEX 文件，即可输出由 class 文件组成的 jar。README 将其与 dex2jar 对比，并列出它能处理的边缘情况，例如 Unicode 类名、被当作多种类型使用的常量、隐式类型转换、跳入正常控制流的异常处理器、超长方法，以及引用常量过多的类。默认还会进行复制传播、删除未使用值等提高可读性的优化。",
  "entry_url": "https://awesomerea.org/resources/enjarify/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/enjarify/",
  "evidence_url": "https://github.com/google/enjarify/blob/f2db0563aa83885ce6e6acd5b7dc9a8a1a1e1987/README.md",
  "group": "tools",
  "id": "enjarify",
  "json_url": "https://awesomerea.org/resources/enjarify/record.json",
  "kind": "tool",
  "markdown_url": "https://awesomerea.org/resources/enjarify/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/enjarify/index.md",
  "name": "Enjarify",
  "name_zh": "Enjarify Dalvik 转 Java 字节码工具",
  "record_type": "resource",
  "relationship": "foundation",
  "requirements": [
    "Archived. Latest release at review: 1.0.3, published 2016-12-20 with no assets; the last commit is from 2017-01-30. The README says this repository may be out of date and that future development moved to Storyyeller/enjarify, whose master branch is 15 commits ahead, with its last commit on 2020-03-07.",
    "Runs from a clone with Python 3 and no other dependencies. enjarify.sh prefers PyPy3, which the README calls much faster than CPython, and enjarify.bat always calls python3. Input is the analyst's own APK or DEX file; the output defaults to [inputname]-enjarify.jar, -o sets the name, -f allows overwriting and --fast skips the optimizations.",
    "Optional metadata such as source-file attributes, line numbers and annotations is not translated, and the README notes contrived cases that cannot be translated because of Android or Java limits. The output is bytecode, so reading it as source needs a separate Java decompiler. runtests.py translates the bundled fixtures, small classes.dex files with their smali sources and expected outputs in tests/test1 to tests/test7, adds the small Android API stub classes from tests/stubs and runs the result with java.",
    "Apache-2.0; the README states that it is not an official Google product."
  ],
  "requirements_zh": [
    "仓库已归档。审阅时最新版本为 1.0.3，发布于 2016-12-20，没有附件；最后一次提交在 2017-01-30。README 指出本仓库可能已过时，后续开发转到 Storyyeller/enjarify；该仓库的 master 分支领先 15 个提交，最后一次提交在 2020-03-07。",
    "从克隆的仓库直接用 Python 3 运行，无需其他依赖。enjarify.sh 优先使用 PyPy3（README 称其比 CPython 快得多），enjarify.bat 则始终调用 python3。输入是分析者自己的 APK 或 DEX 文件；输出默认为 [输入文件名]-enjarify.jar，-o 指定文件名，-f 允许覆盖，--fast 跳过优化。",
    "不会转换源文件属性、行号和注解等可选元数据；README 还提到少数刻意构造的情况受 Android 或 Java 自身限制而无法转换。输出的是字节码，要阅读源码需另用 Java 反编译器。runtests.py 会转换随附的测试夹具（tests/test1 至 tests/test7 中的小型 classes.dex 及其 smali 源码和预期输出），加入 tests/stubs 中的小型 Android API 桩类，再用 java 运行结果。",
    "Apache-2.0 许可；README 声明它不是 Google 的官方产品。"
  ],
  "targets": [
    "app"
  ],
  "url": "https://github.com/google/enjarify",
  "verification": "source-reviewed",
  "verified_at": "2026-10-27"
}
