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

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


当前回答

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的模块。

其他回答

Android工作室为您提供分析任何apk文件的功能。

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

这将生成java文件的实际代码。

干杯

在线工具下方:

http://www.javadecompilers.com/apk

它只需单击一下即可完成所有操作:反编译的.java文件+资源+xml(在一个.zip文件中)和非常好的反编译器(jadx在其他编译位置/函数中返回java代码,其他编译返回函数内的注释,如“无法反编译”或某些android汇编程序/机器代码)

Android应用程序的APK文件可以使用以下任何方法反编译:

APKTool(需要在电脑上安装Java)APKTool M(Android应用程序)JavaDecompilers(在线工具包括APKTool实用程序)

资料来源:https://droidmaze.com/how-to-extract-code-from-apk/

用于反向工程第三方、封闭的二进制Android应用程序的Apktool。

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

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

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

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

使用Android Studio 3.0中的“配置文件或调试APK”功能。它允许您在Android Studio中打开和探索APK。类被反编译为smali。如果没有源代码(android studio 3.0 canary 9),资源不会被提取,像“转到定义”、“查找所有引用”和调试都无法工作。一些额外的smali功能可能适用于smalidea。使用jadx。Jadx将给定APK中的代码反编译为java源文件。使用apktool。Apktool是一个命令行工具,它提取资源并将代码反编译为给定apk的smali。您也可以使用apktool重新编译。下面是一个实际的例子:$apktool d测试.apk一: 在test.apk上使用Apktool 2.2.4一: 正在加载资源表。。。一: 正在使用资源解码AndroidManifest.xml。。。一: 正在从文件加载资源表:1.apk一: 常规清单包。。。一: 正在解码文件资源。。。一: 正在解码值*/*XML。。。一: Baksmaling类dex。。。一: 正在复制资产和库。。。一: 正在复制未知文件。。。一: 正在复制原始文件。。。$apktool b测试一: 在测试中使用Apktool 2.2.4一: 正在检查源是否已更改。。。一: 正在将smali文件夹粉碎为classes.dex。。。一: 正在检查资源是否已更改。。。一: 正在生成资源。。。一: 正在生成apk文件。。。一: 正在复制未知文件/dir。。。