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

Fra*_*zzo 1218 android decompiling apk android-resources

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

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

小智 1520

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

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

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

  • 而不是在cmd中编写**dex2jar classes.dex**,试试**d2j-dex2jar classes.dex**.因为dex2jar classes.dex不推荐使用此cmd. (54认同)
  • @prankulgarg,在第3步的第5点我得到以下错误:无法访问jarfile E:\ apktojava\testt \\ apktool.jar (26认同)
  • 对于那些找不到`framework-res.apk`的人.从[这里]下载(http://www.androidfilehost.com/?fid=23212708291677144) (23认同)
  • 对于陷入第2步的人:4下载此版本,它将解决问题:https://sourceforge.net/projects/dex2jar/files/dex2jar-2.0.zip/download它为我做了.@delive (14认同)
  • 那些没有找到d2j-dex2jar.sh的人,请从这里下载dex2jar:https://dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip (12认同)
  • 嗨,我试过这一步,但我没有得到classes.dex.dex2jar文件.你可以帮我吗? (5认同)
  • 它在我的情况下毫无用处.还在评论中尝试了所有建议.浪费了我很多时间.我得到'./dex2jar:没有这样的文件或目录'和'd2j-dex2jar:command not found'错误. (5认同)
  • 我已完成此步骤,但java文件名是adc b ....它是真实的java文件名...? (4认同)
  • 那么在哪里获得`framework-res.apk`文件..我无法找到可信副本:| (4认同)
  • 如果你看到类名如"a","b","c","d",那么你正试图对其他人的ProGuarded应用程序进行逆向工程.祝你好运. (4认同)
  • 确保你从终端提供足够的权限.因此,如果在执行sh时遇到错误"permission denied",请使用以下命令:chmod + x d2j-dex2jar.sh chmod + x d2j_invoke.sh然后运行./d2j-dex2jar.sh classes.dex (4认同)
  • dex2jar不被识别为内部或外部命令.我怎么解决呢? (3认同)
  • 无法恢复XML文件,运行时出现此错误; apktoto如果framework-res.apk:线程"main"中的异常brut.androlib.AndrolibException:java.io.FileNotFound异常:framework-res.apk(系统找不到指定的文件)在brut.androlib.res.AndrolibResources. installFramework(AndrolibResource s.java:406)位于brut.apktool.Main.main(Main.的brut.apktool.Main.cmdInstallFramework(Main.java:185)的brut.androlib.Androlib.installFramework(Androlib.java:365). java:61)... [截断] (3认同)
  • **.在抽取目录中没有d2j-dex2jar.sh**..!同样我尝试了**dex2jar**,但是相同,可执行文件不在那里.建议我,如果我在这里缺少什么 (3认同)
  • 非常感谢但是我做了第3步后出了问题所有文件都来自smali格式我怎么能读它. (2认同)
  • 出现“ jd-gui.exe遇到问题,需要关闭。给您带来的不便,我们深表歉意。” 保存所有的Java源代码。 (2认同)
  • 第二个文件http://java.decompiler.free.fr/?q=jdgui在此链接上不可用..我该怎么办? (2认同)
  • @ user1451549如果你使用linux然后使用`./dex2jar` (2认同)
  • 我对主要课程有"内部错误"......有什么建议吗? (2认同)
  • 虽然经历了第二步我得到了dex2jar是不是承认使用wondows ..任何想法.. ?? (2认同)
  • 对于第5点的第3步,**错误:无法访问jarfile**我发现这个http://stackoverflow.com/a/15336703/1778834 (2认同)
  • @DroidWormNarendra也许它可以帮到你:https://dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip (2认同)
  • 对于mac上的人,如果在运行d2j-dex2jar.sh时获得权限被拒绝,请在它之前放置sudo bash并在最后一行的文件内添加sudo bash在前面 (2认同)
  • d2j-dex2jar classes.dex"unknown command" (2认同)

Tri*_*mon 121

这是另一种描述 - 以防万一有人卡在上面的描述.按照步骤:

  1. 下载apktool.bat(或apktool对于Linux)和apktool_<version>.jarhttp://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.ziphttp://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zip&can=2&q=下载并摘录
  7. 拖放classes.dexdex2jar.bat(或输入<path_to>\dex2jar.bat classes.dexDOS框;用于Linux dex2jar.sh)

    中间结果:classes_dex2jar.jar

  8. unpack classes_dex2jar.jar(可能是可选的,具体取决于使用的反编译器)
  9. 反编译您的类文件(例如使用JD-GUIDJ Decompiler)

    结果:源代码

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

  • 我还可以补充说,这个APKTool-> dex2jar-> JD-GUI路线有现代替代方案!试试名为Jadx的开源APK和DEX反编译器:https://sourceforge.net/projects/jadx/files/这里也有在线版本:http://www.javadecompilers.com/apk (6认同)
  • 允许(阅读:合法)反编译*任何* APK 文件。请参阅以下问题:http://stackoverflow.com/questions/9674557/is-it-legal-to-decompile-an-apk-and-use-part-of-its-code-in-your-app (2认同)
  • @AndrewRukin 该链接重定向到 sourceforge 的 dex2jar 页面。 (2认同)

Rya*_*ler 107

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

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

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

以及如何备份它.

  • 像Dropbox这样的服务也会有所帮助. (18认同)
  • 总有办法刻录 CD (3认同)

Cil*_*nco 50

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

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


Mac*_*rse 27

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

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


Tom*_*nen 22

这两篇文章描述了如何结合使用apktooldex2jar获取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. 运行.

  • 我知道这个问题还是有答案的,我想传递一个信息:有一个在线反编译器用于android apk http://www.decompileandroid.com/ 从本地机器上传apk,稍等片刻,下载zip格式的源代码. (2认同)
  • 听起来不错.然后decompileandroid网站也有你所有来源的副本!聪明! (2认同)

Rya*_*ger 20

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

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


SKK*_*SKK 13

可能很容易看到来源:

在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

  • 它列出了类和方法,但没有给出源代码. (6认同)

0xc*_*aff 12

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

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

    它允许您在Android Studio中打开和浏览APK.类被反编译成smali.没有提取资源,诸如"转到定义","查找所有引用"和调试之类的东西没有源代码(android studio 3.0 canary 9)就无法工作.一些额外的smali功能可能适用于smalidea.

    机器人工作室

    选择文件

    码

  2. 使用jadx.

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

    jdax-IMG

  3. 使用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...
    
    Run Code Online (Sandbox Code Playgroud)


cri*_*fan 8

根据您的情况,如果您的 android apk:

\n

条件1:不硬化(腾讯乐谷/奇虎360/...)

\n

选择1:使用在线服务

\n

例如:

\n

使用www.javadecompilers.com

\n

去:

\n\n

自动从 apk 解码为 java 源代码

\n

脚步:

\n

uploadapk 文件 + 单击Run+ 等待一段时间 + 单击Download获取 zip + 解压缩 ->

\n

sources/com/{yourCompanyName}/{yourProjectName}

\n

是你期望的java源代码

\n

选择2:自行反编译/破解

\n

自行使用相关工具反编译/破解:

\n

使用jadx/jadx-gui转换apkjava sourcecode

\n

下载jadx-0.9.0.zip然后解压到 got bin/jadx,然后:

\n
    \n
  • 命令行模式:\n
      \n
    • 在终端运行:jadx-0.9.0/bin/jadx -o output_folder /path_to_your_apk/your_apk_file.apk\n
        \n
      • 输出文件夹将显示解码sources后的resources\n
          \n
        • sources/com/{yourCompanyName}/{yourProjectName}是你的预期java sourcecode
        • \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • GUI 模式\n
      \n
    • 双击运行jadx-0.9.0/bin/jadx-gui(Linux jadx-gui.sh/Windows jadx-gui.bat)\n
        \n
      • 打开apk文件
      • \n
      • 它将自动解码 -> 查看您期望的 java 源代码
      • \n
      • save all或者save as Gradle project
      • \n
      \n
    • \n
    \n
  • \n
\n

条件2:硬化(腾讯乐谷/奇虎360/...)

\n

主要方法3 steps

\n
    \n
  1. apk/app to dex
  2. \n
  3. dex to jar
  4. \n
  5. jar to java src
  6. \n
\n

详细解释:

\n

步骤1:apk/app to dex

\n

使用工具(FDex2/DumpDex)从正在运行的应用程序中转储/挂钩(一个或多个)dex文件

\n

脚步:

\n

准备环境

\n\n

dex从正在运行的应用程序中转储

\n
    \n
  • 运行FDex2然后单击您的 apk 名称以便稍后捕获/挂钩 dex
  • \n
  • (在手机/模拟器中)运行您的应用程序
  • \n
  • /data/data/com/yourCompanyName/yourProjectName在\n中查找并复制出整个 apk 资源的转储
      \n
    • 在其根文件夹中通常会找到几个dex文件
    • \n
    \n
  • \n
\n

第2步: dex to jar

\n

使用工具(dex2jar)将(具体的,包含应用程序逻辑的)dex文件转换为jar文件

\n

下载dex2jar得到dex-tools-2.1-SNAPSHOT.zip,解压得到dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh,然后

\n

sh dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f your_dex_name.dex

\n

例如:

\n
dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.xxx.yyy8825612.dex\ndex2jar com.xxx.yyy8825612.dex -> ./com.xxx.yyy8825612-dex2jar.jar\n
Run Code Online (Sandbox Code Playgroud)\n

步骤3:jar to java src

\n

使用以下工具之一:

\n\n

转换jarjava src

\n

从jar到java src转换效果:

\n

Jadx>> Procyon>>CRFJD-GUI

\n

所以推荐使用:Jadx/jadx-gui

\n

脚步:

\n
    \n
  • 双击运行jadx-gui
  • \n
  • 打开dex文件
  • \n
  • File->save all
  • \n
\n
\n

更详细的解释可以看我的在线电子书中文教程:

\n\n


Fra*_*ata 6

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

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

第3步:

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

所以,

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

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

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

  • 这个答案提供了什么,其他人没有? (20认同)

Kam*_*ski 6

在线以下工具:

http://www.javadecompilers.com/apk

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


M. *_*han 6

这个网站https://www.apkdecompilers.com/自动完成.

我首先尝试了在接受的答案中提到的网站,但这对我不起作用.


Cod*_*ver 6

我个人建议使用Show Java Android App来获取源代码。您可以从Play商店或从此处下载


Bis*_*kar 5

Apktool逆向工程第 3 方、封闭、二进制 Android 应用程序。

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

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

http://ibotpeaches.github.io/Apktool/


And*_*kin 5

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

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

尽管如此,这是“打开”Android 应用程序的一种轻松方式。