安卓反编译初体验

在一个iOS群里看到有人在学安卓,讨论怎么下IDE。Android Studio,刚出来的时候我就想下来玩玩,无奈那时候穿墙姿势不优雅,IDE是下回来了,磕磕碰碰到最后SDK还是没下回来。那现在就下回来跑跑以前刚学Java时写的安卓小程序。
这次下载安装AS、下SDK、下模拟器ROM包用了半个钟头左右,随便跑个helloworld是可以的,但是之前写的那个查区号的源代码不见了,当时都不知道github是什么,电脑都换了一次,也不是什么重要的东西,看来是删了。这个程序我打包过的,发到以前在顺丰做兼职时的群里,于是我下来装在了那台mt15i上,突然想到,听说安卓反编译很简单啊,我这个菜鸟写的源码,搞出源码应该不难吧,说干就干,上Google爬教程。

反编译前配置

配置apktool

主要是用来反编译出AndroidMainfest和一些资源文件的

  • 右键保存为apktool
  • 下载最新版的apktool.jar并改名为apktool.jar.
  • 将上面的两个文件拷贝到/usr/local/bin并给执行权限,chmod +x,这样就可以直接在终端执行了

dex2jar下载配置

这个用来获取class,一个jar包

  • 下载解压dex2jar
  • cd到解压目录下修改shell文件的权限
1
chmod a+x *.sh

下载jd-gui

jd-gui下载地址
解压打开就能用。

开始反编译

获取AndroidManifest和资源文件

把需要反编译的apk拷贝到一个新建文件夹,接着到终端执行

1
apktool d testapp.apk

执行完后,该目录下会多一个名字和app一样的文件夹,里面有AndroidManifest、res文件夹和一些其它资源。

获取Jar包

把dex2jar解压后的文件夹拖到与apk文件同一个目录下,执行

1
sh dex2jar-2.0/d2j-dex2jar.sh testapp.apk

执行完后,会有生成一个jar包

获取Java源码

用jd-gui打开上面那个jar,这时就能开到源码了,再保存源码。

导入工程

在获得资源文件夹里新建一个src文件夹,把源码拖到这个文件夹里,删除BuildConfig.java和R.java再用AS导入工程即可。

按照第一篇看的文章来说,这时工程项目应该能跑起来,事实上源码里有关资源文件的调用,反编译出全是int,由于资源文件重新绑定,所以这些资源id都是不对的,如果是小程序还好说,大不了按照原来R.java一个个来改,但是如果界面稍微多点控件,几十上百次的的资源文件调用,改起来就废力了,而且这个源码的也不全对啊,一些业务逻辑看着就坑爹。解决方法如下

使用jadx反编译

jd-gui用来看看jar还行,反编译还是得靠jad,而jadx更是为反编译安卓Java源码而写的。
github下最新的,有图形界面,打开apk,保存所有文件即可。
这时获得的源码可以说和原来的没什么差别了,除了中文直接以编码格式出来,不改也没关系,反正设备显示出来是中文,要改的话,可以输出一次这个编码,复制输出替换原来的编码就行,更简单的可以复制到百度搜索框就变换了……总觉得做得好傻,不过也不纠结了,解决了问题就好。除此之外,还免了第二步获取class,也就是jar包。

更简单的安卓反编译

只要没什么加密,其实有更简单的办法

一键反编译

github地址
这个其实是apktool、dex2jar、jad的工具集合,只不过它帮你一键处理了,需要在windows下执行bat

jad官网在线反编译

apk反编译
jad官网可以提交apk,然后在线反编译,我看了下,跟自己用jadx反编译出来的是一样的。

另外,这个网站http://www.androiddevtools.cn 关于安卓开发的应有尽有,包括反编译

结语

时隔四年,安卓开发各方面都有很大变化,要什么资源都有,还不用翻墙,一些技术博客文章看着就高大上,不像以前,有问题百度出来的文章没几篇靠谱的,而且Android系统本身也完善了很多,遥想当年还是拟物化风格iOS 5Android 2.3对比起来简直不是同一个时代的东西,