我的笔记本电脑上的硬盘驱动器刚刚崩溃,并且丢失了过去两个月来我一直在使用的应用程序的所有源代码。我所拥有的就是 APK 文件,该文件存储在我发送给朋友时的电子邮件中。
有什么办法可以从这个 APK 文件中提取我的源代码?
简单方法:使用在线工具http://www.javadecompilers.com/apk ,上传 apk 并获取源代码。
.apk 文件解码过程,分步方法:
新建一个文件夹,然后复制要解码的. apk 文件。
现在,将此. apk 文件的扩展名重命名为. zip(例如,从 filename.apk 重命名为 filename.zip)并保存。现在,您可以访问 classes.dex 文件等。在此阶段,您可以看到可绘制对象,但看不到 xml 和 java 文件,因此继续。
现在,将此. zip 文件解压缩到同一文件夹(或 NEW FOLDER)中。
下载 dex2jar并将其解压缩到同一文件夹(或 NEW FOLDER)。
将 classes.dex 文件移动到 dex2jar 文件夹中。
现在打开命令提示符,并将目录更改为该文件夹(或 NEW FOLDER)。然后编写d2j-dex2jar classes.dex
(对于 Mac 终端或 ubuntu,请编写./d2j-dex2jar.sh classes.dex
)并按 Enter。现在,您在同一文件夹中有 classes.dex.dex2jar 文件。
下载 java decompiler ,双击 jd-gui,单击打开文件,然后从该文件夹中打开 classes.dex.dex2jar 文件:现在,您获得了类文件。
通过 src 名称保存所有这些类文件(在 jd-gui 中,单击 File-> Save All Sources)。在此阶段,您获得了 Java 源代码,但是. xml 文件仍然不可读,因此继续。
现在打开另一个新文件夹
放入您要解码的. apk 文件
下载最新版本的apktool 和 apktool 安装窗口 (均可从同一链接下载)并将它们放置在同一文件夹中
打开命令窗口
现在, apktool if framework-res.apk
运行apktool if framework-res.apk
命令(如果没有,请在此处获取 ),然后运行下一步
apktool d myApp.apk
(其中 myApp.apk 表示要解码的文件名)
现在,您在该文件夹中获得一个文件夹,并且可以轻松读取 apk 的 xml 文件。
这不是任何步骤,只需将两个文件夹(在本例中为两个新文件夹)的内容复制到一个文件夹中
并享受源代码...
这是一个替代性说明 - 以防万一有人卡在上面的说明中。按照步骤:
apktool.bat
(或 Linux 的apktool
)和apktool_<version>.jar
apktool.jar
并将两个文件放在同一文件夹中cmd.exe
)并转到该文件夹;验证是否已安装 Java 环境(对于 Linux,请同时查看有关所需库的注释) apktool decode [apk file]
中间结果 :资源文件, AndroidManifest.xml
中间结果 : classes.dex
dex2jar-0.0.9.15.zip
。 classes.dex
拖放到dex2jar.bat
(或在 DOS 框中输入<path_to>\dex2jar.bat classes.dex
;对于 Linux 使用dex2jar.sh
) 中间结果 : classes_dex2jar.jar
classes_dex2jar.jar
(根据使用的反编译器可能是可选的) 结果 :源代码
注意:不允许反编译第三方软件包;本指南仅旨在从 APK 文件中恢复个人源代码;最后,最终的代码很可能会被混淆
虽然您可以反编译APK
文件,但您可能会遇到一个大问题:
它不会返回您编写的代码。相反,它将返回编译器内联的所有内容,其中变量具有随机名称,而函数具有随机名称。与重新开始相比,尝试反编译并将其还原到您拥有的代码中可能要花费更多的时间。
可悲的是,像这样的事情已经杀死了许多项目。
对于未来,我强烈建议学习版本控制系统,例如CVS , SVN和git等。
以及如何备份。
Play 商店上还有一个新应用程序,可以通过它反编译 apk(也为系统应用程序)并在智能手机上查看源代码。它将文件保存到 SD 卡,因此您也可以在计算机上查看文件。它不需要 root 或其他东西。
只需安装并享受乐趣。我认为这是反编译应用程序的最简单方法。
apktool是您可以尝试的最好的方法。我已经保存了一些 xml,但是老实说,我不知道它如何与. java 代码一起使用。
即使您是唯一的编码器,我也建议您有一个代码存储库。我一直在为自己的项目使用Project Locker 。它为您提供了免费的 svn 和 git repos。
这两篇文章描述了如何结合使用apktool
和dex2jar
来获取APK
文件,并创建一个可以构建和运行它的 Eclipse 项目。
http://blog.inyourbits.com/2012/11/extending-existing-android-applications.html
http://blog.inyourbits.com/2012/12/extending-existing-android-applications.html
基本上,您:
apktool
将资源文件移出 apk dex2jar
获得一个 jar 文件,其中包含 Eclipse 所需格式的类。 JDGui
打开 jar 文件以查看源代码JDGui
所需的任何源代码,将其粘贴到 Eclipse 中的类中并对其进行修改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
有几种方法可以做到这一点:
使用 Android Studio 3.0 中的 “配置文件或调试 APK” 功能。
它允许您在 Android Studio 中打开和浏览 APK。将课程反编译为 smali。如果没有源代码,则不会提取资源,并且 “转到定义”,“查找所有引用” 和调试之类的内容将无法正常工作(Android Studio 3.0 Canary 9)。 smalidea可以使用一些其他的 smali 功能。
使用jadx 。
Jadx 将给定 APK 中的代码反编译为 Java 源文件。
使用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文件