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

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

有什么办法可以从这个 APK 文件中提取我的源代码?

答案

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


.apk 文件解码过程,分步方法:

步骤 1:

  1. 新建一个文件夹,然后复制要解码的. apk 文件。

  2. 现在,将此. apk 文件的扩展名重命名为. zip(例如,从 filename.apk 重命名为 filename.zip)并保存。现在,您可以访问 classes.dex 文件等。在此阶段,您可以看到可绘制对象,但看不到 xml 和 java 文件,因此继续。

第 2 步:

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

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

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

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

  5. 下载 java decompiler ,双击 jd-gui,单击打开文件,然后从该文件夹中打开 classes.dex.dex2jar 文件:现在,您获得了类文件。

  6. 通过 src 名称保存所有这些类文件(在 jd-gui 中,单击 File-> Save All Sources)。在此阶段,您获得了 Java 源代码,但是. xml 文件仍然不可读,因此继续。

第三步:

现在打开另一个新文件夹

  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 (或 Linux 的apktool )和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. 解压缩classes_dex2jar.jar (根据使用的反编译器可能是可选的)
  9. 反编译您的类文件(例如,使用JD-GUIDJ Decompiler

    结果 :源代码

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

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

它不会返回您编写的代码。相反,它将返回编译器内联的所有内容,其中变量具有随机名称,而函数具有随机名称。与重新开始相比,尝试反编译并将其还原到您拥有的代码中可能要花费更多的时间。

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

以及如何备份。

Play 商店上还有一个新应用程序,可以通过它反编译 apk(也为系统应用程序)并在智能手机上查看源代码。它将文件保存到 SD 卡,因此您也可以在计算机上查看文件。它不需要 root 或其他东西。

只需安装并享受乐趣。我认为这是反编译应用程序的最简单方法。

apktool是您可以尝试的最好的方法。我已经保存了一些 xml,但是老实说,我不知道它如何与. java 代码一起使用。

即使您是唯一的编码器,我也建议您有一个代码存储库。我一直在为自己的项目使用Project Locker 。它为您提供了免费的 svn 和 git repos。

这两篇文章描述了如何结合使用apktooldex2jar来获取APK文件,并创建一个可以构建和运行它的 Eclipse 项目。

http://blog.inyourbits.com/2012/11/extending-existing-android-applications.html

http://blog.inyourbits.com/2012/12/extending-existing-android-applications.html

基本上,您:

  1. 使用apktool将资源文件移出 apk
  2. 使用dex2jar获得一个 jar 文件,其中包含 Eclipse 所需格式的类。
  3. 创建一个 Eclipse 项目,将其指向资源文件和新的 jar 文件
  4. 使用 zip 实用程序打开 jar 文件并删除现有资源
  5. 使用JDGui打开 jar 文件以查看源代码
  6. JDGui所需的任何源代码,将其粘贴到 Eclipse 中的类中并对其进行修改
  7. 从 jar 文件中删除该类(因此您没有多次定义相同的类)
  8. 运行。

apktool 将正常工作。您甚至不需要知道密钥库就可以提取源代码(这有点吓人)。主要缺点是源以 Smali 格式而不是 Java 表示。不过,其他文件(例如 icon 和 main.xml)也可以很好地通过,至少值得您恢复这些时间。最终,您很可能需要从头开始重新编写 Java 代码。

您可以在此处找到 apktool。只需下载 apktool 和适当的帮助程序(适用于 Windows,Linux 或 Mac OS)。我建议使用 7-zip 之类的工具来解压它们。

可能很容易看到源:

在 Android Studio 2.3 中,选择Build -> Analyze APK -> Select the apk that you want to decompile
您将看到它的源代码。

参考链接:
https://medium.com/google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2

有几种方法可以做到这一点:

  1. 使用 Android Studio 3.0 中的 “配置文件或调试 APK” 功能。

    它允许您在 Android Studio 中打开和浏览 APK。将课程反编译为 smali。如果没有源代码,则不会提取资源,并且 “转到定义”,“查找所有引用” 和调试之类的内容将无法正常工作(Android Studio 3.0 Canary 9)。 smalidea可以使用一些其他的 smali 功能。

    Android工作室

    选择文件

    码

  2. 使用jadx

    Jadx 将给定 APK 中的代码反编译为 Java 源文件。

    jdax-img

  3. 使用apktool

    Apktool 是一个命令行工具,可为给定 apk 提取资源并将代码反编译为 smali。您也可以使用 apktool 重新编译。这是一个实际的例子:

    $ apktool d test.apk
    I: Using Apktool 2.2.4 on test.apk
    I: Loading resource table...
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: 1.apk
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Baksmaling classes.dex...
    I: Copying assets and libs...
    I: Copying unknown files...
    I: Copying original files...
    $ apktool b test
    I: Using Apktool 2.2.4 on test
    I: Checking whether sources has changed...
    I: Smaling smali folder into classes.dex...
    I: Checking whether resources has changed...
    I: Building resources...
    I: Building apk file...
    I: Copying unknown files/dir...

我将向您展示其他反编译.apk文件的方法。

您可以按照 “ prankul garg ” 的前两个步骤进行操作 。因此,您还有另一个机会:

步骤 3':

下载“JD-GUI” ,就很容易找到这个。在 “jd-gui.exe” 中打开您的.jar文件。 (文件 > 打开文件 >' 找到您的.jar文件 ')。完成此过程后,您可以将所有资源保存为.zip文件。

所以,

1st-您必须将.apk文件重命名为.zip

2-您必须解码.dex文件(如果需要,可以将.apk文件解码为dex2jar ,这是可能的)

3-您必须使用JD-GUI解码.jar文件