我的笔记本电脑上的硬盘刚刚崩溃了,我失去了过去两个月一直在开发的应用程序的所有源代码。我手头只有一份存储在邮件中的APK文件,当时是给朋友发送的。
有没有办法从这个APK文件中提取我的源代码呢?
我的笔记本电脑上的硬盘刚刚崩溃了,我失去了过去两个月一直在开发的应用程序的所有源代码。我手头只有一份存储在邮件中的APK文件,当时是给朋友发送的。
有没有办法从这个APK文件中提取我的源代码呢?
最简单的方法:使用在线工具Decompiler,上传apk文件并获取源代码。
逐步解码 .apk 文件的过程:
新建一个文件夹,将想要解码的 .apk 文件复制到该文件夹中。
现在将此 .apk 文件的扩展名改为 .zip(从 filename.apk 改为 filename.zip)并保存。现在您可以访问 classes.dex 文件。此时,您可以看到可绘制内容,但无法查看 .xml 和 .java 文件。
现在在相同的文件夹或新文件夹中提取此 .zip 文件。
下载 dex2jar(不要下载代码,点击右侧的发布按钮,然后下载名为 dex2jar-X.X.zip
的文件),并将其提取到相同的文件夹或新文件夹中。
将 classes.dex 文件移动到 dex2jar 文件夹中。
现在打开命令提示符,并将目录更改为该文件夹。然后写入 d2j-dex2jar classes.dex
(对于 Mac 或 Ubuntu,请写入 ./d2j-dex2jar.sh classes.dex
),然后按 Enter。您现在在同一文件夹中有 classes.dex.dex2jar 文件。
下载 java 反编译器,右键单击 jd-gui,点击“打开文件”,并打开该文件夹中的 classes.dex.dex2jar 文件:现在您可以得到类文件。
保存所有这些类文件(在jd-gui中,点击“文件”->“全部源代码保存”)按src名称。此时,您可以得到Java代码,但.xml文件仍然无法阅读。
现在打开另一个新文件夹
放入要解码的.apk文件
下载最新版本的apktool 和 apktool install window(两者可以从同一个链接下载),并将它们放在同一个文件夹中
打开命令提示符
现在运行命令apktool if framework-res.apk
(如果没有,请在此处获取),然后运行
apktool d myApp.apk
(myApp.apk表示要解码的文件名)
现在您会在那个文件夹中得到一个文件夹,并且可以轻松阅读.xml文件。
这不是任何步骤,只需将两个文件夹(两个新文件夹)的内容复制到单个文件夹中
并享受源代码!
这是备用说明 - 以防上面的说明有人卡住。按照以下步骤进行:
apktool.bat
(或Linux版的apktool
)和apktool_<version>.jar
,从http://ibotpeaches.github.io/Apktool/install/下载。apktool.jar
并将两个文件放在同一个文件夹中cmd.exe
),并切换到该文件夹;确认已安装Java环境(对于Linux,请检查所需库的注释)apktool decode [apk文件]
进行解码
中间结果:资源文件,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 文件中恢复个人源代码;最终生成的代码可能会被混淆。
apktool
返回smali
文件?如何获取java
文件? - rminajclasses.dex
文件。如果没有,请检查是否存在优化的 dex 文件 - 参见 https://www.codeproject.com/Questions/720764/Some-Apk-file-doesnt-have-classes-dex。 - Trinimon尽管您可以对APK
文件进行反编译,但可能会遇到一个大问题:
它将不会返回您编写的代码。相反,它将返回编译器内联的任何内容,其中变量具有随机名称并且函数具有随机名称。尝试反编译并将其恢复为您拥有的代码可能需要更长的时间,而重新开始可能更为简单。
可悲的是,像这样的事情已经毁掉了许多项目。
对于未来,我强烈建议学习版本控制系统,如CVS、SVN和Git等,并学会如何备份。
在Play Store上也有一个新的应用程序,可以反编译apk(包括系统应用程序),并在智能手机上查看源代码。它会将文件保存到您的SD卡中,因此您也可以在计算机上查看它。不需要root或其他任何东西。
只需安装并享受乐趣。我认为这是最简单的反编译应用程序的方法。
Apktool 是你可以尝试的最好的东西。我用它保存了一些 XML,但老实说我不知道它如何与 .java 代码配合工作。
我建议你即使只有一个程序员,也要拥有一个代码仓库。我一直在使用 Project Locker 来管理自己的项目。它提供免费的 SVN 和 Git 仓库。
apktool
和dex2jar
,将一个APK
文件转换成可以构建和运行的Eclipse项目。请保留HTML标签。
基本上,您需要: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
获取一个包含Eclipse所喜欢的格式中的类的jar文件。 JDGui
打开jar文件以查看源代码 JDGui
中获取所需的源代码,将其放入Eclipse中的一个类中并进行修改apktool可以使用,您甚至不需要了解密钥库即可提取源代码(有点可怕)。主要缺点是源代码以Smali格式呈现,而不是Java格式。其他文件,如图标和main.xml,都可以完美地通过,并且花时间恢复这些文件可能是值得的。最终,您很可能需要从头开始重写Java代码。
您可以在此处找到apktool。只需下载apktool和适当的助手(适用于Windows、Linux或Mac OS)。我建议使用诸如7-zip之类的工具进行解压。
有几种方法可以做到这一点:
Use the "Profile or Debug APK" feature in Android Studio 3.0.
It allows you to open and explore APKs in Android Studio. Classes are decompiled into smali. Resources are not extracted and things like "Go to Definition", "Find All References" and debugging don't work without the source code (android studio 3.0 canary 9). Some additional smali features might work with smalidea.
Use jadx.
Jadx decompiles the code in a given APK to java source files.
Use apktool.
Apktool is a command line tool which extracts resources and decompiles code into smali for a given apk. You can recompile using apktool also. Here's an example of it in action:
$ 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...
查看源代码的简单方法:
在Android Studio 2.3中,选择 Build -> Analyze APK -> 选择要反编译的apk
即可。
您将会看到它的源代码。
参考链接:
https://medium.com/google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2
javac -decompile
,这将符合SO准则。在我看来,答案是“离题的”,而不是问题本身。 - SwiftArchitect