使用 Jetbrains IDES 在反编译的 jar 文件中查找文本
Posted
技术标签:
【中文标题】使用 Jetbrains IDES 在反编译的 jar 文件中查找文本【英文标题】:Find text in decompiled jar files with Jetbrains IDES 【发布时间】:2015-11-14 00:13:06 【问题描述】:我使用 Jetbrains IntelliJ(或 android Studio,如果您愿意),我的项目是使用 gradle 和我公司命名空间中的一些外部 java 库构建的。事情是很难在类中导航,因为我无法将文本搜索到 .jar 文件或解析用法。
你知道如何做到这一点吗?有插件之类的吗?也许是个把戏?
非常感谢。
【问题讨论】:
你想访问外部库中的类吗? 我有一个脚本来执行此操作,即在一组反编译的 .jar 中搜索文本。告诉我,我可以提供或粘贴到这个问题中。 【参考方案1】:没有简单的方法可以做到这一点。在库代码中搜索任何内容的唯一方法是附加源代码。附加的源代码可以是您自己反编译的代码,但 IDE 不会为您执行此操作(但我认为有人可以编写反编译整个库并附加反编译源的插件)。所以我想这可能是你需要做的“技巧”。
为什么不可能?我没有编写IDE,所以我不确定为什么。但最有可能在没有附加源的 jar 文件中查找文本的问题是文本表示取决于反编译器。没有“最好”的方法来反编译给定的类。有时反编译甚至可能是不可能的(例如,带有很多 goto/条件跳转指令的字节码不能很好地转换为循环/条件结构)。在这种情况下,反编译器可以做任何事情,从抛出异常、放入原始字节码,到只是在 java 代码中放入 goto 语句以至少显示代码在做什么。
允许在反编译代码中搜索的唯一方法(假设您不能只是在某处下载代码)是自己反编译它(例如使用 fernflower 反编译,它也被 intellij idea 使用)和附上反编译的源码。
虽然上述参数在查找方法/字段的用法时不适用,但仍然不允许这样做,这很可能是因为 IDE 分析源代码以查找用法,而不是分析字节码(编译代码)。
【讨论】:
【参考方案2】:IntelliJ IDEA(截至 2017.2 或更高版本)知道如何在没有附加源的情况下反编译 JAR 文件,即当您处于调试模式并跳入实现时。但是,这将不允许您进行全文搜索(例如查找用法)。
如果您只关心浏览 1-2 个 JAR,您可以在 IntelliJ 中手动编辑您的模块属性并添加源 JAR 文件(您需要从您的库网站下载二进制 JAR)。
另一种选择是使用 Maven,并让它从公共 Maven 存储库中下载源代码和二进制文件(如果我们谈论的是开源库)。
另一种选择是,在企业环境中,通常有人会设置一个 Artifactory(例如 https://www.jfrog.com/artifactory/),它是所有库及其源代码的源代码。
如果您使用一些最新的构建脚本(例如 Gradle),您可以构建一个 IntelliJ 项目,其中包含已链接的所有源。
希望这会有所帮助!
【讨论】:
以上是关于使用 Jetbrains IDES 在反编译的 jar 文件中查找文本的主要内容,如果未能解决你的问题,请参考以下文章