提问



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


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

最佳参考


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





解码.apk文件的步骤,循序渐进的方法:


第1步:




  1. 创建一个新文件夹并复制要解码的.apk文件。

  2. 现在将此.apk文件的扩展名重命名为.zip(例如,从filename.apk重命名为filename.zip)并保存。现在你可以访问classes.dex文件等。在这个阶段你可以看到drawables而不是xml和java文件,所以继续。



第2步:




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

  2. 下载dex2jar并将其解压缩到同一个文件夹(或新文件夹)。[31]

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

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

  5. 下载java反编译器,双击jd-gui,点击打开文件,然后打开该文件夹中的classes.dex.dex2jar文件:现在你得到了类文件。[32]

  6. 按src名称保存所有这些类文件(在jd-gui中,单击文件 - >保存所有源)。在这个阶段你得到了java源代码,但.xml文件仍然不可读,所以继续。



第3步:



现在打开另一个新文件夹



  1. 输入要解码的.apk文件

  2. 下载最新版本的apktool AND apktool安装窗口(两者都可以从同一个链接下载)并将它们放在同一个文件夹[33]

  3. 打开命令窗口

  4. 现在运行apktool if framework-res.apk和下一个命令

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



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


第4步:



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


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

其它参考1


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



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

  4. 打开一个dos框(cmd.exe)并切换到该文件夹​​;验证是否已安装Java环境(对于Linux,还要检查有关所需库的说明)

  5. 开始:apktool decode [apk file]
    中间结果:资源文件,AndroidManifest.xml

  6. 使用您选择的解包器解压APK文件
    中间结果:classes.dex

  7. 从http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip\u0026amp;can=2\u0026amp;q=
  8. 下载并摘录dex2jar-0.0.9.15.zip
  9. classes.dex拖放到dex2jar.bat上(或在DOS框中输入<path_to>\dex2jar.bat classes.dex;对于Linux使用dex2jar.sh)
    中间结果:classes_dex2jar.jar

  10. unpack classes_dex2jar.jar(可能是可选的,具体取决于使用的反编译器)

  11. 反编译您的类文件(例如使用JD-GUI或DJ Decompiler)
    结果:源代码



注意:不允许反编译第三方包;本指南仅用于从APK文件中恢复个人源代码;最后,最终的代码很可能会被混淆[34] [35] [36] [37] [38] [39] [40]

其它参考2


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


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


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


以及如何支持它。

其它参考3


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


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

其它参考4


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


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

其它参考5


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



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

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



基本上你:



  1. 使用apktool从apk中获取资源文件

  2. 使用dex2jar以Eclipse希望的格式获取包含类的jar文件。

  3. 创建一个Eclipse项目,将其指向资源文件和新的jar文件

  4. 使用zip实用程序打开jar文件并删除现有资源

  5. 使用JDGui打开jar文件以查看源代码

  6. JDGui中获取所需的任何源代码,将其粘贴在Eclipse内的类中并进行修改

  7. 从jar文件中删除该类(因此您没有多次定义相同的类)

  8. 运行它。


其它参考6


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


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

其它参考7


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



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


    它允许您在Android Studio中打开和浏览APK。类被反编译成smali。没有提取资源,诸如Go to Definition,Find All References和调试在没有源代码的情况下工作(android studio 3.0 canary 9)。一些额外的smali功能可能适用于smalidea。[47]










  2. 使用jadx。[48]


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




  3. 使用apktool。[49]


    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...
    


其它参考8


可能很容易看到来源:


在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[50]

其它参考9


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


您可以按照 prankul garg 的前两个步骤操作。所以你有另一个机会:


第3步


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


所以,


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


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


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

其它参考10


在线工具下方:


http://www.javadecompilers.com/apk [51]


它只需点击一下就可以了:反编译的 .java文件+资源+ xml (在一个.zip文件中)有非常好的反编译器(jadx返回地方/函数中的java代码,其他编译返回函数内的注释,如无法反编译或某些android汇编程序/机器代码)

其它参考11


Apktool 用于逆向工程第三方,封闭式二进制Android应用。


它可以将资源解码为近乎原始的形式,并在进行一些修改后重建它们。


它可以逐步调试smali代码。此外,它使得使用应用程序更容易,因为类似项目的文件结构和一些重复性任务的自动化,如构建apk等。


http://ibotpeaches.github.io/Apktool/[52]

其它参考12


我个人推荐 Show Java Android App 来获取源代码。你可以从Play商店或从这里下载[53]

其它参考13


apktool 是要走的路。
在线apktool服务也存在:http://www.javadecompilers.com/apktool [54]


由于服务在线性质,显然存在一些限制:您可以提取和研究资产和清单文件,但目前无法重新编译应用程序。


不过,这是一个打开Android应用程序的麻烦方式。

其它参考14


这个网站https://www.apkdecompilers.com/自动完成。[55]


我首先尝试了在接受的答案中提到的网站,但这对我没有用。

其它参考15


你可以试试DexPatcher。它甚至可以与Android Studio集成。它在内部使用Apktool和Dex2Jar
您也可以单独使用这些工具。
Apktool反编译apk,并提取.dex文件,可以使用Dex2Jar进一步转换为jar。 Jar可以使用JD-GUI进行反编译。您可以在该工具的帮助下查看Java代码。虽然反编译代码与实际代码的相似性无法保证。市场上有一些高级代码混淆工具,它们使代码变得混乱,难以反编译/理解。例如。 Proguard [56] [57] [58] [59] [60] [61]