协慌网

登录 贡献 社区

有没有办法从 APK 文件中获取源代码?

我的笔记本电脑上的硬盘驱动器崩溃了,我丢失了过去两个月一直在处理的应用程序的所有源代码。我所拥有的是从我发送给朋友时存储在我的电子邮件中的 APK 文件。

有没有办法从这个 APK 文件中提取我的源代码?

答案

简单方法:使用在线工具http://www.javadecompilers.com/apk ,上传 apk 并获取源代码。


解码. apk 文件的步骤,循序渐进的方法:

步骤 1:

  1. 创建一个新文件夹并复制要解码的. apk 文件。

  2. 现在将此. apk 文件的扩展名重命名为. zip(例如,从 filename.apk 重命名为 filename.zip)并保存。现在你可以访问 classes.dex 文件等了。在这个阶段你可以看到 drawables 而不是 xml 和 java 文件,所以继续。

第 2 步:

  1. 现在将此. zip 文件解压缩到同一文件夹(或 NEW FOLDER)中。

  2. 下载 dex2jar并将其压缩到同一文件夹(或新文件夹)。

  3. 将 classes.dex 文件移动到 dex2jar 文件夹中。

  4. 现在打开命令提示符并将目录更改为该文件夹(或 NEW FOLDER)。然后编写d2j-dex2jar classes.dex (对于 mac 终端或 ubuntu 写./d2j-dex2jar.sh classes.dex )并按 Enter 键。您现在在同一文件夹中有 classes.dex.dex2jar 文件。

  5. 下载 java 反编译器 ,双击 jd-gui,单击打开文件,然后打开该文件夹中的 classes.dex.dex2jar 文件:现在获取类文件。

  6. 通过 src 名称保存所有这些类文件(在 jd-gui 中,单击文件 - > 保存所有源)。在这个阶段你得到 java 源代码,但. xml 文件仍然不可读,所以继续。

第 3 步:

现在打开另一个新文件夹

  1. 放入要解码的. apk 文件

  2. 下载最新版本的apktool apktool 安装窗口 (两者都可以从同一个链接下载)并将它们放在同一个文件夹中

  3. 打开命令窗口

  4. 现在运行像apktool if framework-res.apk命令apktool if framework-res.apk (如果你没有它在这里得到它 )和下一个

  5. apktool d myApp.apk (其中 myApp.apk 表示要解码的文件名)

现在你在该文件夹中获得了一个文件夹,可以轻松读取 apk 的 xml 文件。

第 4 步:

这不是任何步骤只是将两个文件夹的内容(在这种情况下都是新文件夹)复制到单个文件夹

并享受源代码......

这是另一种描述 - 以防万一有人卡在上面的描述。按照步骤:

  1. http://ibotpeaches.github.io/Apktool/install/下载apktool.bat (或apktool for Linux)和apktool_<version>.jar
  2. 将 jar 文件从上面重命名为apktool.jar并将两个文件放在同一个文件夹中

  3. 打开一个 dos 框( cmd.exe )并切换到该文件夹; 验证是否已安装 Java 环境(对于 Linux,请检查有关所需库的说明)
  4. 开始: apktool decode [apk file]

    中间结果 :资源文件, AndroidManifest.xml

  5. 用你选择的解包器解压缩 APK 文件

    中级结果classes.dex

  6. http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=下载并解压缩dex2jar-0.0.9.15.zip
  7. classes.dex拖放到dex2jar.bat (或在 DOS 框中输入<path_to>\dex2jar.bat classes.dex ; 对于 Linux 使用dex2jar.sh

    中间结果classes_dex2jar.jar

  8. unpack classes_dex2jar.jar (可能是可选的,具体取决于使用的反编译器)
  9. 反编译您的类文件(例如使用JD-GUIDJ Decompiler

    结果 :源代码

注意:不允许反编译第三方包; 本指南仅用于从 APK 文件中恢复个人源代码; 最后,生成的代码很可能会被混淆

虽然您可能能够反编译您的APK文件,但您可能会遇到一个大问题:

它不会返回你写的代码。相反,它将返回编译器内联的任何内容,变量给定随机名称,以及给定随机名称的函数。尝试将其反编译并恢复到您拥有的代码中可能需要更多的时间,而不是重新开始。

可悲的是,像这样的事情已经扼杀了很多项目。
对于未来,我强烈建议学习版本控制系统,如CVSSVNgit等。

以及如何备份它。