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


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

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


1051
2017-08-29 03:40


起源


仅供参考有在线反编译器检查 这里 - edwin
这是否意味着我们可以获得价值百万美元的应用程序的源代码,如Whatsapp或Facebook?这都是开源的吗? - Faizan
@Faizan你听说过proguard吗? - Vishwajit Palankar
5个用户可以关闭已经结束的问题 600 投票和合并答案很好 1000  这个答案很有用,并观看 五十万 次? - SwiftArchitect
问题的措辞确实包含无关的生活故事花絮,因此可以解释为 推荐一个工具。然而答案可能是 javac -decompile,那将适合SO指南。在我看来,答案是 无关不是问题。 - SwiftArchitect


答案:


简单方法:使用在线工具 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 接下来

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

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

步骤4:

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

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


1390
2018-03-13 20:09



@prankulgarg,在第3步的第5点我得到以下错误:无法访问jarfile E:\ apktojava \ testt \\ apktool.jar
而不是写作 dex2jar classes.dex 在cmd试试 d2j-dex2jar classes.dex。因为dex2jar classes.dex不推荐使用此cmd。 - Umesh
对于那些找不到的人 framework-res.apk。从中下载 这里 - atulkhatri
那些没有找到d2j-dex2jar.sh的人,从这里下载dex2jar: dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip - Reaz Murshed
对于陷入第2步的人:4下载此版本,它将解决问题: sourceforge.net/projects/dex2jar/files/dex2jar-2.0.zip/download 它对我有用。 @delive - siriuseteor77


这是另一种描述 - 以防万一有人坚持上述描述。按照步骤:

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

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

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

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

    中间结果classes.dex

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

    中间结果classes_dex2jar.jar

  8. 解压 classes_dex2jar.jar (根据使用的反编译器,可能是可选的)
  9. 反编译您的类文件(例如,使用 JD-GUI 要么 DJ Decompiler

    结果: 源代码

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


107
2017-08-29 03:58



我还可以补充说,这个APKTool-> dex2jar-> JD-GUI路线有现代替代方案!试试名为Jadx的开源APK和DEX反编译: sourceforge.net/projects/jadx/files  它还有在线版本: javadecompilers.com/apk - Andrew Rukin
允许(读取:合法)进行反编译 任何 APK文件。请参阅以下问题: stackoverflow.com/questions/9674557/... - Rakete1111


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

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

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

以及如何支持它。


96
2018-01-11 12:49



像Dropbox这样的服务也会有所帮助。 - Jeremy Logan


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

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


47
2017-08-29 12:17



这个是最简单的。 - WonderKid


apktool 是你能尝试的最好的东西。我用它保存了一些xml,但说实话,我不知道它将如何与.java代码一起使用。

即使你是唯一的编码器,我也会建议你有一个代码库。我一直在用 项目储物柜 对于我自己的项目。它为您提供免费的svn和git回购。


24
2017-12-06 01:38



如果你想提取资源(例如Android应用程序中的图像,你会发现apktool不可或缺。实际上,这个工具根本没有竞争对手!)apktool的在线版本可以在这里找到:www.javadecompilers.com/apktool - Andrew Rukin
@AndrewRukin真的吗?解压缩apk也有效。 - WSS


这两篇文章描述了如何结合使用 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

基本上你:

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

20
2017-08-29 04:02



我知道这个问题仍然有问题,我想传递一个信息:有一个针对android apks的在线反编译器 decompileandroid.com  从本地机器上传apk,稍等片刻,以zip格式下载源代码。 - Snehal Masne
听起来不错。然后decompileandroid网站也有你所有来源的副本!聪明! - DDSports
一个问题,我有一个apk反编译,但在jd gui我不知道是否有真正的java类,你知道如果一个apk反编译是否有真正的Java类? - AZH


apktool会工作。您甚至不需要知道密钥库来提取源代码(这有点可怕)。主要缺点是源代码以Smali格式而不是Java格式呈现。其他文件,如icon和main.xml虽然完美无缺,但至少可以恢复它们。最终,您很可能需要从头开始重新编写Java代码。

你可以找到apktool 这里。只需下载apktool和相应的帮助程序(适用于Windows,Linux或Mac OS)。我建议使用7-zip等工具打开包装。


16
2017-08-11 03:27