有没有办法从APK文件中获取源代码?
笔记本电脑上的硬盘驱动器刚刚崩溃,我丢失了过去两个月来一直在使用的应用程序的所有源代码。 我所拥有的是从我发送给朋友的邮件中存储的APK文件。
有没有什么办法从这个APK文件中提取我的源代码?
简单的方法:使用在线工具http://www.javadecompilers.com/apk ,上传apk并获取源代码。
解密.apk文件的步骤,一步一步的方法:
步骤1:
-
创build一个新文件夹并复制要解码的.apk文件。
-
现在将这个.apk文件的扩展名重命名为.zip(例如,从filename.apk重命名为filename.zip)并保存。 现在你可以访问classes.dex文件等等。在这个阶段,你可以看到drawables,但不是xml和java文件,所以继续。
第2步:
-
现在将这个.zip文件解压到同一个文件夹(或者NEW FOLDER)中。
-
下载dex2jar并将其解压到相同的文件夹(或NEW FOLDER)。
-
将classes.dex文件移动到dex2jar文件夹中。
-
现在打开命令提示符,并将目录更改为该文件夹(或新的文件夹)。 然后编写
d2j-dex2jar classes.dex
(用于macterminal或ubuntu编写./d2j-dex2jar.sh classes.dex
)并按回车。 你现在在同一个文件夹中有classes.dex.dex2jar文件。 -
下载java反编译器 ,双击jd-gui,点击打开的文件,从该文件夹打开classes.dex.dex2jar文件:现在你得到class文件。
-
保存所有这些类文件(在jd-gui中,单击文件 – >保存所有源)按src名称。 在这个阶段你会得到java源文件,但是.xml文件仍然是不可读的,所以继续。
第3步:
现在打开另一个新文件夹
-
放入你想解码的.apk文件
-
下载最新版本的apktool AND apktool安装窗口 (都可以从相同的链接下载),并将它们放在同一个文件夹
-
打开一个命令窗口
-
现在运行命令如
apktool if framework-res.apk
和next -
apktool d myApp.apk
(其中myApp.apk表示要解码的文件名)
现在你得到了该文件夹中的文件夹,并可以轻松读取apk的xml文件。
步骤4:
这不是任何一个步骤只是将两个文件夹(在这种情况下,这两个新文件夹)的内容复制到单个文件夹
并享受源代码…
这是一个替代描述 – 以防万一有人被困在上面的描述。 按照步骤:
- 从http://ibotpeaches.github.io/Apktool/install/下载;
apktool.bat
(或适用于Linux的apktool
)和apktool_<version>.jar
。 - 将上面的jar文件重命名为
apktool.jar
并将这两个文件放在同一个文件夹中 - 打开一个dos框(
cmd.exe
),并进入该文件夹; validation是否安装了Java环境(对于Linux,请检查有关所需库的注释) - 开始:
apktool decode [apk file]
中间结果 :资源文件,
AndroidManifest.xml
- 解压缩APK文件与您select的解包器
中间结果 :
classes.dex
- 从http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=下载并提取;
dex2jar-0.0.9.15.zip
- 将
classes.dex
拖放到dex2jar.bat
(或在DOS框中input<path_to>\dex2jar.bat classes.dex
; Linux使用dex2jar.sh
)中级结果 :
classes_dex2jar.jar
- 解压
classes_dex2jar.jar
(根据使用的反编译器可能是可选的) - 反编译你的类文件(例如,用JD-GUI或DJ反编译器 )
结果 :源代码
注意:不允许反编译第三方包; 本指南仅用于从APK文件恢复个人源代码; 最后,生成的代码很可能会被混淆
虽然你可能能够反编译你的APK
文件,你可能会遇到一个大问题:
它不会返回你写的代码。 相反,它将返回任何内联编译器,variables赋予随机名称,以及赋予随机名称的函数。 尝试反编译并将其还原到您的代码中可能需要更多的时间,而不是重新开始。
可悲的是,像这样的事情已经导致许多项目死亡。
对于未来,我强烈build议学习一个版本控制系统,如CVS , SVN和git等。
以及如何备份。
Play商店还有一个新的应用程序,可以反编译一个apk(系统应用程序),并在智能手机上查看源代码。 它将文件保存到您的SD卡,以便您也可以在计算机上查看它。 它不需要root或其他东西。
只需安装,玩得开心。 我认为这是反编译应用程序最简单的方法。
apktool是你可以尝试的最好的东西。 我已经保存了一些XML,但老实说,我不知道它将如何与.java代码一起工作。
我build议你有一个代码库,即使你是唯一的编码器。 我一直在使用项目更衣室为我自己的项目。 它给你免费的svn和git回购。
这两篇文章描述了如何结合使用apktool
和dex2jar
来获取APK
文件,并创build一个可以构build和运行它的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所dex2jar
格式的类。 - 创build一个Eclipse项目将其指向资源文件和新的jar文件
- 用zip实用程序打开jar文件并删除现有资源
- 用
JDGui
打开jar文件来查看源代码 - 从
JDGui
所需的任何源代码,将其粘贴到Eclipse中的类中并对其进行修改 - 从jar文件中删除那个类(所以你没有多次定义相同的类)
- 运行。
apktool将工作。 你甚至不需要知道keystore来提取源代码(这有点吓人)。 主要的缺点是源代码是以Smali格式而不是Java提供的。 其他文件,如图标和main.xml通过完美罚款,这可能是值得你的时间,至less恢复这些。 最终,您很可能需要重新编写您的Java代码。
你可以在这里findapktool。 只需下载apktool和相应的帮助程序(适用于Windows,Linux或Mac OS)。 我build议使用诸如7-zip的工具来解压缩它们。
我会告诉你另一种反编译.apk文件的方式。
您可以按照“ prankul garg ”的前两个步骤操作。 所以你有另一个机会:
步骤3':
下载“JD-GUI” ,这很容易find这一个。 在“jd-gui.exe”中打开你的.jar文件。 (文件>打开文件>'find你的.jar文件')。 完成此过程后,您可以将所有资源保存在.zip文件中。
所以,
1st – 必须将.apk文件重命名为.zip
第二 – 你必须解码.dex文件(如果你想解码的.apk文件dex2jar ,这是可能的)
3rd – 您必须使用JD-GUI解码.jar文件
可能是容易看到的来源:
在Android studio 2.3中, Build -> Analyze APK -> Select the apk that you want to decompile
。
你会看到它的源代码。
Linf供参考:
https://medium.com/google-developers/making-the-most-of-the-apk-analyzer-c066cb871ea2
Apktool反向工程第三方,封闭,二进制Android应用程序。
它可以将资源解码为几乎原始的forms,并在进行一些修改后重build它们。
它可以一步一步地debugging小代码。 此外,由于类似于项目的文件结构以及诸如构buildapk等重复性任务的自动化,它使得应用程序的工作更加轻松。
apktool是要走的路。 在线apktool服务也存在: http : //www.javadecompilers.com/apktool
显然,由于服务的“在线性”,存在一些限制:您可能会提取和研究资产和清单文件,但目前不可能重新编译应用程序。
不过,这是一个“打开”android应用程序的无障碍方式。
有几种方法可以做到这一点:
-
使用Android Studio 3.0中的“configuration文件或debuggingAPK”function。
它允许您在Android Studio中打开和探索APK。 类被反编译为smali。 没有提取资源,像“去定义”,“查找所有引用”和debugging不工作没有源代码(android studio 3.0 canary 9)。 一些额外的smalifunction可能与smalidea一起使用 。
-
使用jadx 。
Jadx将给定APK中的代码反编译为java源文件。
-
使用apktool 。
Apktool是一个命令行工具,它可以提取资源并将代码反编译为一个给定的apk文件。 你也可以使用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...
在线工具下面:
http://www.javadecompilers.com/apk
它通过一个单击完成:反编译.java文件+资源+ xml (在一个.zip文件中)与非常好的反编译器(jadx返回的地方/function其他编译返回function,如“无法反编译” android汇编/机器码)
这个网站https://www.apkdecompilers.com/自动做到了。;
我首先尝试了被接受的答案中提到的网站,但这对我并不适用。
我个人推荐显示Java Android应用程序来获取源代码。 您可以从Play商店或从这里下载