我笔记本电脑上的硬盘刚刚崩溃,我丢失了过去两个月一直在开发的应用程序的所有源代码。我只有一个APK文件,它存储在我发给朋友的电子邮件中。

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


当前回答

使用此工具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!

京东仅供非商业用途,http://jd.benow.ca/作者:Emmanuel Dupuy

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

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

Fernflower公司-开源,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下载镜像作者:帕维尔·库兹涅佐夫

其他回答

市场上有很多应用程序和方法可以将apk文件反编译为java类,但是如果应用程序是用ProGuard规则编译的,那么你就遇到了很大的麻烦,因为这个规则会将所有的dex文件缩成一个小字符的名称,然后你就无法追溯实现。看见https://developer.android.com/studio/build/shrink-code用于模式澄清。

快乐编码。。。

1.从本地Android应用程序中提取源代码

本机Android应用程序的源代码并不难获得,但它确实需要与Windows、Mac和Linux兼容的额外工具。我个人最喜欢的工具是dex2jar和JD-GUI。

如果您不熟悉这些工具,dex2jar将读取Dalvik可执行文件并将其转换为标准JAR格式。JD-GUI将读取JAR文件并对其中找到的类文件进行反编译。

为了使提取过程更容易理解,让我们先创建一个新的原生Android项目:

android create project --target 19 --name TestProject --path . --activity TestProjectActivity --package com.nraboy.testproject

上述命令将在当前命令提示符路径中留下一个Android项目。

由于我们的项目已经包含了一个Activity类,所以让我们直接进入构建过程。关于使用Ant而不是Gradle或Maven,你可以让我整天都很难,但对于本教程,我将坚持使用它。

ant debug

上面的命令将创建一个调试构建,通常在bin/TestProject-debug.apk中找到。

使用您最喜欢的解压缩工具,解压缩APK文件。7-zip是一个流行的工具,但如果你在Mac上,你可以从终端运行以下命令:

unzip TestProject-debug.apk

这将给我们留下一堆文件和文件夹,但其中一个对我们很重要。请注意classes.dex,因为它包含我们所有的源代码。要将其转换为可读的内容,我们需要在其上运行dex2jar。您可以在Mac、Linux和Windows上使用dex2jar,但我将从Mac的角度进行解释。

使用解压缩的dex2jar目录中的classes.dex文件,从终端运行以下命令:

./dex2jar.sh classes.dex

打开您下载的JD-GUI应用程序,因为现在是解码JAR和打包的类文件的时候了。打开新创建的classes_dex2jar.jar文件,应该会看到如下内容:

看看获取本地Android APK的源代码有多容易?现在你能做什么来更好地保护自己?

Android SDK附带Proguard,这是一个混淆模块。你问什么是混淆?

通过维基百科进行混淆:

模糊(或模糊)是指在沟通,使沟通混乱,故意模棱两可,而且难以解释。

虽然混淆不会对源代码进行加密,但会使其更难理解。配置Proguard后,在发布模式下运行Ant,您的代码应该在构建时被混淆。

2.从混合Android应用程序中提取源代码

到目前为止,混合应用程序的源代码是最容易提取的。您不需要在计算机上安装任何额外的软件,只需访问APK文件即可。

为了让事情更容易理解,我们先创建一个新的Apache Cordova项目,然后提取它。首先执行以下操作:

cordova create TestProject com.example.testproject TestProject
cd TestProject
cordova platform add android

在项目创建过程中,您将使用默认的Apache Cordova CSS、HTML和JavaScript模板。在这个例子中,这对我们来说很好。让我们继续将我们的项目构建为分布式APK文件:

cordova build android

您将剩下platforms/android/ant build/CodovaApp-debug.apk或类似于platforms/android/ant build/*-debug.pk的东西。

即使这是一个调试版本,它仍然非常有用。安装了7-zip或类似文件后,右键单击APK文件并选择解压缩。在解压缩的目录中,您现在应该可以访问所有基于web的源文件。我说基于web是因为ApacheCordova使用的任何Java文件都将被编译成类文件。但是,CSS、HTML和JavaScript文件不会被触及。

您刚刚看到了获取混合应用程序源代码是多么容易。那么你能做些什么来更好地保护自己呢?

您可以使代码变丑,这是一种混淆。

这样做不会加密您的代码,但会使其变得更加难以理解。

如果你想让你的代码变丑,我建议你安装UglifyJS,因为它现在基本上是标准的。如果您喜欢使用任务管理器,Grunt和Gulp也有用于UglifyJS的模块。

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

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

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

以及如何备份。

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

你可以按照“恶作剧漱口”的前两步来做。所以你还有另外一个机会:

步骤3':

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

So,

第一个-必须将.apk文件重命名为.zip

第二步-必须解码.dex文件(如果需要,可以将.apk文件解码为dex2jar)

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

使用此工具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!

京东仅供非商业用途,http://jd.benow.ca/作者:Emmanuel Dupuy

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

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

Fernflower公司-开源,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下载镜像作者:帕维尔·库兹涅佐夫