首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就是与“编译”相反的过程咯,也就是从apk文件开始,经过一系列工具解压最后得到源码的过程。当然,顺逆之言,说的只是起始点的逆反置换,个中具体的过程还是不尽相同的。

接着再说一下apk文件。Android的应用程序Apk文件(即app安装文件,Android系统会自动识别后缀为apk的文件,并将之认为是app安装文件,可以选着进行安装)是一个压缩文件,可以通过普通解压工具(如WinRAR、360解压等)获得里面的文件内容。

我们找来一个Apk文件
(可以下载一个软件的安装包来做实验,或者自行用Android studio通过签名生成apk文件(对签名生成apk不了解的同学,可以戳一下这里详细了解一下);这里用的就是撰写本文时用Android studio通过签名生成的apk文件app-release.apk),
然后使用普通解压工具(如WinRAR、360解压等)直接解压app-release.apk,可以得到文件夹app-release,工作目录如下:

进入文件夹app-release,目录如下,可以看到许多相对于Android开发者很熟悉的东西,类似于Android开发的时候所使用的工作目录和对应的文件夹、文件等等,
像图中——用来放置代码、音像图片等各种资源的的res目录以及可以配置应用程序和各个组件等信息的AndroidManifest.xml文件等:

但是当你试图去打开查看这些文件时,你会发现资源文件等xml文件基本无法打开,即使能打开也是如下图的乱码,这些乱码就是Android加密过的文件:(如下图的AndroidManifest.xml)

既然使用普通解压工具直接解压Apk文件是无法获得正常的应用程序,那么来看看如何使用正确的方法反编译应用程序。
首先请出三个重量级的工具,如下:


这三个工具分别负责反编译不同的部分、不同的过程。

必须说的是,现在市场上厂家生产的app基本上都是有自己很成熟的混淆规则和加密体系,所以要解析这些apk文件便需要更高超的反编译技术了,当然这种行为也是不可取的,侵犯了厂家的知识产权!所以本文讲的反编译主要是比较理想的apk条件环境,即面向开源的没有添加负责混淆规则的apk文件。让大家对反编译有一个基础的了解。

9.5.3.1 apktool

首先来反编译apk中的XML文件,利用apktool_2.3.3.jar。打开cmd命令行窗口,在命令行里边使用cd命令进入工具目录(放置所要解压的apk文件的目录),执行命令:

java -jar apktool_2.3.3.jar d -f app-release.apk 

执行完毕后,可以得到对应的输出文件:


打开这个文件夹:

这时候打开res目录中的xml文件(如下图的AndroidManifest.xml):

此时可以正确地查看这些XML文件而不是之前的乱码了。这个工具在汉化软件的时候非常有用,可以提取资源文件并进行汉化,然后执行如下命令重新打包回去(这里的打包便是顺编译的没有加密的过程了)即可:

java -jar apktool_2.3.3.jar b app-release

重新打包的命令与解码的命令相似,只是将d改为b,并选择前面解码生成的文件夹。执行该命令后,在文件夹下就会生成两个新的文件夹,如下图所示dist和build文件夹,重新打包的APK就在dist目录下:

下一步,解决Source Code。

9.5.3.2 Dex2jar、jd-gui

先回到刚刚用解压缩工具apktool解压apk后、重新打包后得出来的那个build文件夹,文件夹中有一个非常重要的文件,如下图的classes.dex文件:


这个文件就是源代码打包后的文件,将它复制到第二个解压工具dex2jar-0.0.9.15的根目录下,然后在cmd窗口使用cd命令进入工具dex2jar-0.0.9.15的目录并执行下面的代码:

d2j-apk-sign.bat classes.dex

cmd上会开始分析,分析完毕后,在工具dex2jar-0.0.9.15的目录目录下生成了一个jar文件:

到这里,打开第三个工具jd-gui.exe;


打开后的界面

选择file-open file,并选择刚刚生成的classes-dex2jar.jar文件,即可查看相关源代码:



总结思路:
使用apktool将apk反编译成文件夹,
再重新打包生成build和dist目录以及相关文件(包括classes.dex),
使用Dex2jar将classes.dex分析生成jar文件,
对jar文件使用jd-gui即可查看相关的源代码。

9.5.4 Android Apk 加密

由于Java字节码的特殊性,使得它非常容易被反编译。因此,为了能够对编译好的Java Class文件进行一些保护,通常会使用ProGuard来对Apk进行混淆处理,用无意义的字母来重命名类、字段、方法和属性。当然,ProGuard不仅仅可以用来混淆代码,还可以删除无用的类、字段、方法和属性,以及删除没用的注释,最大限度地优化字节码文件。


在Android Studio中,打开app目录下的build.gradle文件:


**这里的minifyEnabled属性就是控制ProGuard的开关,将即设置为true,即可开启混淆功能,在使用AS导出apk时,即可生成混淆。

更多相关文章

  1. 动态化部署:Android热修复之代码修复(一)
  2. 借腾讯开源 VasDolly,谈谈 Android(安卓)签名和多渠道打包的原理!
  3. Android(安卓)使用模板生成Word文档,支持手机直接查看word
  4. Android(安卓)Studio多渠道打包
  5. Kotlin 第二弹:Android(安卓)中 PDF 创建与渲染实践
  6. [置顶] 我的Android进阶之旅------>Android基于HTTP协议的多线程
  7. 【Android学习总结】之eclipse工程目录结构说明及使用
  8. No suitable java found.In order to properly use the android
  9. Android(安卓)Studio编译C++代码——Release与Debug版本的记录

随机推荐

  1. Eclipse上基于Android SDK的开发
  2. 用 Eclipse 开发 Android 应用程序
  3. Android 的视频编码 H263 MP4V H264
  4. Android 复习 Content Provider
  5. 【Android Developers Training】 53. 打
  6. Android中日期和时间控件的使用
  7. Android actionbar
  8. android 项目打包成Library
  9. android:configChanges 问题
  10. Android倒计时之 CountDownTimer