PS:本系列文章中所涉及到的技术、数据和接口地址,仅供学习交流,务必不可作坏事或者是用于商业用途!不然后果自负!html
来源:http://blog.csdn.net/zhaokaiqiang1992java
既然是作高仿,固然须要逆向工程了,因为Android是基于Java的,因此反编译的难度并不大,各类资料很丰富,因此这里就简单介绍。android
咱们在反编译的时候,能够按照下面的流程进行git
这个是一般的反编译流程,可是呢,我还要介绍一些其余的东西。第一步流程中,没有太多东西,通常都能获取到咱们想要的资源,可是在把dex转化成jar的过程当中,使用上面的作法能够查看到java源码,可是,dex2jar对Android中的switch语句解析的不是很彻底,因此看起来会很是费劲,咱们以“煎蛋”逆向工程以后的某个类举例,下面是使用dex2jar,而后使用JD-GUI查看的com.danielstudio.app.wowtu.a.ae类中的方法agithub
protected void a(g paramg) { if (isCancelled()); do { return; w.e().remove(this.b.a); } while (!(h.a(paramg)); String str1 = (String)paramg.c(); String str2 = str1.split("\\|")[1]; if (!(str1.split("\\|")[2].trim().equals("0"))) switch (this.c) { default: case 1: case 0: } while (true) { while (true) { while (true) { this.a.c(this.d); com.danielstudio.app.wowtu.f.e.a(w.c(this.a), str2); } w.a(this.a).add(this.b.a); com.danielstudio.app.wowtu.c.e locale2 = this.b; locale2.i = (1 + locale2.i); } w.b(this.a).add(this.b.a); com.danielstudio.app.wowtu.c.e locale1 = this.b; locale1.j = (1 + locale1.j); } }
上面的这种代码格式很是难看,基本看不出原来的运行逻辑,因此再给你们介绍一个反编译的工具,叫作Procyon,用法也很简单,shell
帮助 java -jar decompiler.jar 反编译单个class文件 java -jar procyon-decompiler-0.5.24.jar AutoCloseableExample.class 反编译整个Jar包 java -jar procyon-decompiler.jar -jar myJar.jar -o out
下面是使用Procyon对相同的类进行反编译以后的代码api
protected void a(final g g) { if (!this.isCancelled()) { w.g.remove(this.b.a); if (h.a(g)) { final String s = (String)g.c(); final String s2 = s.split("\\|")[1]; if (!s.split("\\|")[2].trim().equals("0")) { switch (this.c) { case 1: { this.a.e.add(this.b.a); final e b = this.b; ++b.i; break; } case 0: { this.a.f.add(this.b.a); final e b2 = this.b; ++b2.j; break; } } this.a.c(this.d); } com.danielstudio.app.wowtu.f.e.a(this.a.b, s2); } } }
代码逻辑这么清晰,有没有被惊艳到呀~
因此说,不能光知道那些人人皆知的工具,有不少其余的工具也是很是的好用的。服务器
好啦,如今咱们获得咱们想要的源代码了,咱们来简单的分析一下网络
若是你们下载过”煎蛋”的话,应该能看出来,UI上使用的是很是新的设计风格,也就是Material Design设计风格。可是真正的Material Design须要Android L版本的支持,因此要考虑兼容性,就要用到最新的support.v7兼容包和其余兼容组件,这点在上面的包结构中也有所体现。架构
com.afollestad.materialdialogs这个包,从名字上也能够看是个Material Design风格的Dialog,是为了保持风格的统一。
com.danielstudio.app.wowtu这个包,则是煎蛋App的核心包,里面是具体的逻辑代码,咱们须要重点分析的东西都在这里面
loopj.android.http这个包是否是很熟悉?这是android-async-http,一个很是出名的网络请求的开源框架,这是整个项目的网络请求核心包
com.nostra13.universalimageloader这个包没必要我多废话了,加载图片的框架,功能很强大
在下面的那些包就是用于分享的第三方SDK了,好比QQ和新浪的,umeng则是用来渠道统计和升级的第三方SDK
最下面的uk.co.senab.phtotview则是一个很强大的图片显示控件,能够根据手势自由放缩
到目前为止,咱们已经知道了这个App的主要框架了,下面我简单的说下要高仿的总体框架。
网络请求方面,我倾向于使用Volley,由于这个库针对复杂网络状况下频繁的小数据量请求进行了优化,因此对煎蛋这种内容类的App比较合适。
在图片加载方面,UIL虽然能够胜任这个工做,可是,我准备试一试FaceBook新推出的Fresco图片加载框架,以前我翻译过一篇关于Fresco的官方介绍,详情请戳FaceBook推出的Android图片加载库-Fresco。
其余的框架,好比butter knife ,也准备试一下,虽然感受在这个项目里面没有必要使用IOC框架,可是以前的项目使用的都是AFinal,因此准备入手一下,试试好用不啦~
其实主要的框架也就暂时想到这么多,更多的还须要一边作一边引入,更多的是View的开源项目,熟练的使用Githun哦~
其实,上面作的这些工做都很简单,更重要的是,咱们如何去获取数据接口,没有接口,咱们如何高仿呢,是不?因为煎蛋App是通过混淆的,大部分核心代码难以阅读,因此呢,我给你们介绍下如何在Android设备上使用TcpDump进行抓包。
TcpDump是Linux里面很强大的网络数据采集工具,也就是咱们常说的抓包工具,抓包能够干不少坏事啦,不过,咱们都是乖小孩~
由于Android系统自己就是以Linux 2.6 kenal做为内核的,因此咱们可使用TcpDump进行抓包。
首先呢,咱们须要把TcpDump上传到咱们的测试机上去,我使用的是eng工程模式的Nexus5测试机,使用Genymotion虚拟机没有成功,多是由于TcpDump不能运行在x86架构的虚拟机上,ADT原生的虚拟机是ARM架构,应该可使用,可是个人打开太慢,就没有测试,若是你要使用真机,要确保是eng工程模式。
有了测试机以后,adb链接上,而后使用下面命令查看链接设备是否成功
1
|
kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb devices List of devices attached 16e8718e device
|
链接成功以后,使用下面命令将TcpDump上传到/data/local/tcpdump路径
1
|
kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb push ~/Desktop/tcpdump /data/local/tcpdump 4189 KB/s (1801155 bytes in 0.419s) kaiqiangzhaoMacBook:~ zhaokaiqiang$
|
而后使用下面命令修改权限
1
|
kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell chmod 777 /data/local/tcpdump
|
到此为止,咱们的TcpDump就部署成功了。
咱们简单介绍几个经常使用命令。
下面的命令是用来抓包的最简单的命令
1
|
adb shell /data/local/tcpdump -n -s 0
|
-n 表明不把网络地址转换成名字
-s 0 抓取数据包时默认抓取长度为68字节。加上-s 0 后能够抓到完整的数据包
由于咱们网络请求不少,咱们须要进行过滤,好比要获取全部10.10.10.1 的主机收到的和发出的全部的数据包
1
|
kaiqiangzhaoMacBook:~ zhaokaiqiang$ adb shell /data/local/tcpdump -n -s 0 host 10.10.10.1
|
TcpDump还有不少强大的用法,我就不一一解释了,在个人收藏文章有,你们留言就得了。Android相关问题的好文章整理
咱们使用的命令是下面这样的
1
|
adb shell /data/local/tcpdump -n -s 0 -w /sdcard/jiandan.pcap host 10.10.10.your ip
|
这样咱们就能够把全部和当前ip进行通信的包抓到,而后保存到/sdcard/jiandan.pcap文件,等着咱们用下面的WireShake进行分析了
通过上面的一步,咱们已经抓到了煎蛋App和服务器之间的通信包,抓包时,有几点须要注意:
这样,咱们就能够获得咱们的pcap格式的数据包了,下一步就是使用WireShake进行数据分析。
WireShake也很强大,可是咱们这里只是简单的使用,更多强大功能本身去摸索。
咱们可使用下面的命令把文件下载下来
1
|
adb pull /sdcard/jiandan.pcap ~/Desktop/jiandan.pcap
|
下面是一个抓包的数据,用WireShark打开后,以下
注意红方框的地方。通常来讲,资讯类App获取数据都是使用Http协议的接口,而对实时性要求比较高的App,好比股票行情类的,则是使用Socket通信,显示在这里就是使用的是TCP协议。咱们能够看到,本地ip和42.120.48.125进行了Http通信,点开下面的包数据,就能够在请求文本里面看到咱们的完整的请求URL,这个就是获取段子的接口,使用page进行分页。
其实按照这种方法,咱们可以把基本上全部的使用Http协议的接口抓取出来,可是还有更好的办法,通常来讲,这些地址都是硬编码在代码里面的,知道了一个地址格式,咱们就能够直接搜索查找出其余相似的接口,好比,咱们把第一步反编译出来的类文件放在Eclipse中的Java项目里面,而后全项目查找关键词oxwlxojflwblxbsapi试试
果真出现了不少的接口地址,这样咱们就能够省下很大力气,具体接口测试很少说,本身去试。
其实一开始我想作煎蛋客户端,是经过Jsoup解析Web网址实现的,并且也解析成功了,可以正常使用,可是后来突发奇想,想看看代码怎么写的,就顺便看了下,成功获取到接口以后,可以更加方便的使用,因此就直接用了。
这个项目的段子功能模块,已经基本完成,后续功能正在作,但愿这个项目能成为新手的很好的学习资料
,我也很用心的在作,若是你看了代码,有所收获,那是极好的,若是你发现我写的代码性能很差,或者是有更好的解决方案,但愿你能告诉我,提交issue或者是pull request,我想把这个项目作的比9GAG项目更好。
下面是完成的功能
本项目的github地址:https://github.com/ZhaoKaiQiang/JianDan
感谢煎蛋的开发者DanielWangDev