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


1259

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

有什么办法可以从这个APK文件中提取我的源代码?


28
FYI有在线反编译器检查这里
埃德温·

11
这是否意味着我们可以获得价值数百万美元的应用程序(如Whatsapp或Facebook)的源代码?这都是开源的吗?
赞2015年

3
@Faizan您听说过proguard吗?
Vishwajit Palankar 2015年

1
问题的措辞的确包含了无关紧要的生活故事,因此可以解释为推荐工具。但是答案可能是javac -decompile,这将符合SO准则。在我看来,答案是题外话,而不是问题。
SwiftArchitect

2
本文中,他们解释了如何反向工程Pokemon Go
anders

Answers:


1569

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


.apk文件解码过程,分步方法:

步骤1:

  1. 新建一个文件夹,然后复制要解码的.apk文件。

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

第2步:

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

  2. 下载dex2jar并将其压缩到同一文件夹(或NEW FOLDER)。

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

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

  5. 下载java decompiler,双击jd-gui,单击打开文件,然后从该文件夹中打开classes.dex.dex2jar文件:现在您获得了类文件。

  6. 通过src名称保存所有这些类文件(在jd-gui中,单击File-> Save All Sources)。在此阶段,您获得了Java源代码,但是.xml文件仍然不可读,因此继续。

第三步:

现在打开另一个新文件夹

  1. 放入您要解码的.apk文件

  2. 下载最新版本的apktool apktool安装窗口(均可从同一链接下载)并将它们放置在同一文件夹中

  3. 打开命令窗口

  4. 像现在运行命令apktool if framework-res.apk(如果你没有它得到它在这里)和未来

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

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

第四步:

这不是任何步骤,只需将两个文件夹(在本例中为两个新文件夹)的内容复制到一个文件夹中

并享受源代码...


26
@prankulgarg,在第3步的第5点中,我收到以下错误消息:无法访问jarfile E:\ apktojava \ testt \\ apktool.jar

55
与其在cmd 中编写dex2jar classes.dex不如尝试d2j-dex2jar classes.dex。由于dex2jar classes.dex,因此不建议使用此cmd。
Umesh

23
对于那些找不到的人framework-res.apk。从这里
atulkhatri 2014年

12
找不到d2j-dex2jar.sh的人请从此处下载dex2jar: dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip
Reaz Murshed

14
对于受困于步骤2:4的用户,请下载此版本,它将解决问题:sourceforge.net/projects/dex2jar/files/dex2jar-2.0.zip/download对我有用。@delive
siriuseteor77 '16

126

这是一个替代性说明-以防万一有人卡在上面的说明中。按照步骤:

  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.dex在DOS框中输入;对于Linux使用dex2jar.sh

    中间结果classes_dex2jar.jar

  8. 打开包装classes_dex2jar.jar(根据使用的反编译器,可能是可选的)
  9. 反编译您的类文件(例如,使用JD-GUIDJ Decompiler

    结果:源代码

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


6
我可能还要补充一点,这是APKTool-> dex2jar-> JD-GUI路线的现代替代品!只需尝试名为Jadx的开源APK和DEX反编译器:sourceforge.net/projects/jadx/files 这里也有在线版本:javadecompilers.com/apk
Andrew

1
允许(阅读:法律)反编译任何 APK文件。请参见以下问题:stackoverflow.com/questions/9674557/...
Rakete1111

1
为什么这些apktool返回smali文件?如何获取java文件?
rminaj

108

尽管您可以反编译APK文件,但是您可能会遇到一个大问题:

它不会返回您编写的代码。相反,它将返回编译器内联的所有内容,其中变量具有随机名称,而函数具有随机名称。与重新开始相比,尝试反编译并将其还原到您拥有的代码中可能要花费更多的时间。

可悲的是,像这样的事情已经杀死了许多项目。
对于未来,我强烈建议学习版本控制系统,例如CVSSVNgit等。

以及如何备份。


19
Dropbox之类的服务也将提供帮助。
杰里米·洛根

1
而且总有一种刻录CD的方法
JerryGoyal

52

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

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


1
这是最简单的。
Midhun Vijayakumar,

@MidhunVijayakumar是否可以使用此方法将apk转换为源代码?
萨耶夫

28

apktool是您可以尝试的最好的方法。我已经保存了一些xml,但是老实说,我不知道它如何与.java代码一起使用。

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


如果要提取资源,你会发现apktool不可或缺的apktool的在线版本可以在这里(从Android应用程序即图像实际上,该工具有没有竞争对手可言。!):www.javadecompilers.com/apktool
安德鲁Rukin

23

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

2
我知道这个问题仍在回答中,我想传递一个信息:android apks有一个在线反 编译器decompileandroid.com 从本地计算机上上传apk,请稍等片刻,下载zip格式的源代码。
Snehal Masne 2014年

2
听起来不错。然后decompileandroid网站也提供了所有源代码的副本!聪明!
DDSports

一个问题,我有一个反编译的apk,但是在jd gui中,我不知道是否存在Java的真实类,你知道是否反编译了apk的真实类吗?

21

apktool将正常工作。您甚至不需要知道密钥库就可以提取源代码(这有点吓人)。主要缺点是源以Smali格式而不是Java表示。不过,其他文件(例如,图标和main.xml)也可以很好地通过,至少值得您恢复这些时间。最终,您很可能需要从头开始重新编写Java代码。

您可以在此处找到apktool 。只需下载apktool和适当的帮助程序(适用于Windows,Linux或Mac OS)。我建议使用7-zip之类的工具来解压缩它们。


16

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

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

    它允许您在Android Studio中打开和浏览APK。将课程反编译为smali。如果没有源代码,则不会提取资源,并且“转到定义”,“查找所有引用”和调试之类的内容将无法正常工作(Android Studio 3.0 Canary 9)。smalidea可以使用一些其他的smali功能。

    Android工作室

    选择文件

    码

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

我已经尝试过jadx,但是即使使用简单的helloworld,尽管它已将其反编译为Java,但是由于多种原因(尝试复制文件等),尝试在android studio中打开该项目并将其编译回apk失败。有什么方法可以创建可以编译回apk的java?
ransh

1
@ransh我通常使用jadx读取代码,然后使用apktool修改代码。apktool不会创建Java,但允许重新编译。
0xcaff

0xcaff,感谢您的澄清。现在有意义。由于尝试在android studio中编译反编译Java,因此无法正常工作。
ransh


7

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

您可以按照“ prankul garg ”的前两个步骤 ”。因此,您还有另一个机会:

步骤3':

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

所以,

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

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

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


20
这个答案提供了其他人没有提供的什么?
约尔根- [R

您实际上不必将其重命名为zip。我可以直接使用7-zip打开apk文件。
miva2 2015年

7

低于在线工具:

http://www.javadecompilers.com/apk

它一键即可完成所有工作:反编译.java文件+资源+ xml(在一个.zip文件中),并具有很好的反编译功能(在其他编译器返回“无法反编译”之类的函数内部注释的地方/函数中,jadx返回Java代码) android汇编器/机器码)


是的,这很好,但是它代替了函数名,而是将所有函数名更改为CS1001,依此类推。那么如何识别这些。还有一点,我们可以将这个反编译的apk直接用作我们的Android Studio项目,它可以工作吗?
Zia Ur Rahman

如果我们不能在应用程序中使用它们的功能,那么出于什么目的,我们将反编译一些apk。
Zia Ur Rahman

@ZiaUrRahman我不知道。但是,以我为例,我反编译代码以分析算法。您是否检查了该工具的反编译代码是否可以由android studio以全自动方式进行编译-还是需要一些“人工处理”?
卡米尔·基列夫斯基(KamilKiełczewski)

1
我将反编译的项目导入了android studio中,但是那里没有gradle,该项目有很多文件,但是直到我们运行它时才明白。根本没用。我需要在Android Studio中使已反编译的项目完全功能化,然后获得某些项目的某些核心功能,然后在我自己的项目中使用/嵌入该项目。那么有什么办法可以做到这一点?
Zia Ur Rahman

6

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

我首先尝试了接受的答案中提到的站点,但对我而言不起作用。


我无法获取我的Java源代码...它看起来像附件文件和..
iman kazemayni

@imankazemayni在上面的链接中,“浏览”到您的APK文件,然后单击“反编译您的APK”。如果代码未加密,将需要一些时间,然后它将为您提供源代码。
M. Usman Khan

您知道Multidex对加密有影响吗?
iman kazemayni

6

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


大多数情况下,在线编译器无法正常工作,但是此应用可以正常工作。谢谢
Sunil


3

apktool是必经之路。在线apktool服务也存在: http //www.javadecompilers.com/apktool

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

尽管如此,这仍然是“打开” Android应用程序的简便方法。


3

您可以尝试DexPatcher。它甚至与Android Studio集成。它内部使用ApktoolDex2Jar
您也可以独立使用这些工具。 Apktool会反编译apk,并提取.dex文件,然后可以使用Dex2Jar将其进一步转换为jar。可以使用JD-GUI来反编译Jar 。您可以借助该工具查看Java代码。尽管不能保证反编译代码与实际代码的相似性。市场上有一些高级的代码混淆工具,这些工具将代码弄乱了,使其难以反编译/理解。例如。保卫者


您好如何在Android Studio中使用DexPatcher?
ravi152

无法解释评论中的所有内容。Google是您的朋友:)还有一些不错的youtube教程。
Lakshmikant Deshpande

2

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

条件1:未变硬(由腾讯Legu /奇虎360 / ...)

选择一:使用在线服务

如:

使用www.javadecompilers.com

去:

自动将APK解码为Java源代码

脚步:

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

sources/com/{yourCompanyName}/{yourProjectName}

是您期望的Java源代码

Choice2:自己反编译/破解

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

使用jadx/ jadx-gui转换apkjava sourcecode

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

  • 命令行模式:
    • 在终端运行中: jadx-0.9.0/bin/jadx -o output_folder /path_to_your_apk/your_apk_file.apk
    • output_folder将显示已解码sourcesresources
      • sources/com/{yourCompanyName}/{yourProjectName} 是你的期望 java sourcecode
  • GUI模式
    • 双击运行jadx-0.9.0/bin/jadx-gui(Linux jadx-gui.sh/ Windows jadx-gui.bat
    • 打开apk文件
    • 它将自动解码->看到您期望的Java源代码
    • save all 要么 save as Gradle project

例如:

Condition2:变硬(通过腾讯乐古/奇虎360 / ...)

主要方法3 steps

  1. apk/app to dex
  2. dex to jar
  3. jar to java src

详细说明:

步骤1: apk/app to dex

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

脚步:

准备环境

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

  • 运行,FDex2然后单击您的apk名称以稍后启用以捕获/捕获dex

  • (在手机/模拟器中)运行您的应用
  • 查找并复制转储中的整个apk资源 /data/data/com/yourCompanyName/yourProjectName
    • 在其根文件夹中通常会找到几个dex文件

第2步: dex to jar

使用工具(dex2jar)将文件(包含应用逻辑的特定dex文件)转换为jar文件

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

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

例如:

dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.xxx.yyy8825612.dex
dex2jar com.xxx.yyy8825612.dex -> ./com.xxx.yyy8825612-dex2jar.jar

第三步: jar to java src

使用以下工具之一:

转换jarjava src

用于从jar到Java src转换效果:

Jadx> Procyon> CRF>>JD-GUI

所以建议使用:Jadx/jadx-gui

脚步:

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

例如:

导出的Java src:


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


2

Android Studio可让您分析任何apk文件。

1-从构建菜单中选择分析apk选项,然后选择apk文件。2-这将导致您找到classes.dex文件和其他文件。3-单击classes.dex,它将为您提供文件夹,软件包,库和文件的列表。4-从和android studio设置安装一个名为“ Dex to Jar”的插件5-单击您提取的项目的任何活动文件,然后从构建菜单中选择dex to jar。

这将为您提供Java文件的实际代码。

干杯。


1

最简单的方法是使用Apk OneClick反编译器。那是一个用于反编译和反汇编APK的工具包(Android包)。

特征

  • 所有功能都集成到Windows的右键单击菜单中。
  • 将APK类反编译为Java源代码。
  • 拆解APK以smali代码并解码其资源。
  • 右键单击将APK安装到手机。
  • 编辑smali代码和/或资源后重新编译APK。在重新编译期间:
  • 优化png图像
  • 签名APK
  • Zipalign

要求

必须安装Java Runtime Environment(JRE)。

您可以从此链接下载Apk OneClick反编译器

好好享受


1

我发现以下是最简单的方法:

  1. 将您的app.apk重命名为app.zip(将扩展名从apk更改为zip)
  2. 将zip文件解压缩到文件夹中
  3. 使用JADX工具读取出现在classes.dex文件中的源代码。

1

为此有一个应用程序,通常只需单击几下就可以完成。 https://github.com/Nuvolect/DeepDive-Android

  1. 选择应用程序,在“已安装的应用程序”下选择您的应用程序。如果不存在,则可以加载APK。
  2. 选择“提取APK”
  3. 选择“解压APK”
  4. 选择“使用Jadx反编译”。这可能需要几秒钟或几分钟的时间,具体取决于设备的速度

之后,您可以浏览源代码,使用elFinder将其下载到另一台计算机上,或者使用Lucene进行搜索。

除了Jadx,它还具有CFR和Fernflower反编译器。


0

几天来,我一直在疯狂地尝试着让dex2jar在无法正常工作的apk上在fedora 31笔记本电脑上工作。这个python 3脚本在几分钟内就完成了窍门,安装了jd-gui使类文件易于阅读。

http://java-decompiler.github.io/

https://github.com/Storyyeller/enjarify

具体来说,这就是我跑的东西:

# i installed apktool before the rest of the stuff, may not need it but here it is
$> cd /opt
$> sudo mkdir apktool
$> cd apktool/
$> sudo wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
$> sudo wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.4.1.jar
$> sudo mv apktool_2.4.1.jar apktool.jar
$> sudo mv apktool* /usr/bin/
$> sudo chmod a+x /usr/bin/apktool*

# and enjarify
$> cd /opt
$> sudo git clone https://github.com/Storyyeller/enjarify.git
$> cd enjarify/
$> sudo ln -s /opt/enjarify/enjarify.sh /usr/bin/enjarify

# and finally jd-gui
$> cd /opt
$> sudo git clone https://github.com/java-decompiler/jd-gui.git
$> cd jd-gui/
$> sudo ./gradlew build

# I made an alias to kick of the jd-gui with short commandline rather than long java -jar blahblahblah :)
$> echo "jd-gui='java -jar /opt/jd-gui/build/launch4j/lib/jd-gui-1.6.6.jar'" >> ~/.bashrc

现在应该可以朗读以下内容以获得类文件:

$> enjarify yourapkfile.apk

并启动jd-gui:

$> jd-gui

然后只需打开您的课程文件!



0

使用此工具 http://www.javadecompilers.com/

但是最近,反编译器掀起了新一波热潮: Procyon,CFR,JD,Fernflower,Krakatau和Candle。

以下是此网站上显示的反编译器列表:

CFR-免费,没有源代码,http//www.benf.org/other/cfr/作者:Lee Benfield

更新非常好的反编译器!CFR能够反编译Java的现代功能-Java 9模块,Java 8 lambda,Java 7字符串开关等。它甚至可以将其他JVM语言的类文件重新转换为Java!

JD-免费,仅供非商业用途,http ://jd.benow.ca/作者:Emmanuel Dupuy

2015年更新。具有自己的可视界面以及Eclipse和IntelliJ的插件。用C ++编写,非常快。支持Java 5。

Procyon-开源, https ://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler作者:Mike Strobel

蕨花开源,https//github.com/fesh0r/fernflower作者:Egor Ushakov

2015年更新。非常有前途的分析型Java反编译器,现已成为IntelliJ 14的组成部分。 https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler)支持Java至6 (注释,泛型,枚举)

JAD-仅出于历史原因在此给出。免费,没有源代码,jad下载镜像作者:Pavel Kouznetsov

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.