转载请注明出处:http://blog.youkuaiyun.com/zhaokaiqiang1992
转眼之间,毕业季已经来临,四年充实而忙碌的大学也将走到尾声,我很期待毕业后的生活呀!
首先多谢各位对我的Blog的支持,大家互相交流学习,作为回报,我把自己收藏的好文章分享给大家,详情请戳Android相关问题的好文章整理——温故而知新,可以为师矣。
除此之外呢,最近一直忙于工作和准备毕业论文,所以文章产量少了些。我的毕设当然和Android相关啦,就是“煎蛋”App的逆向工程、高仿及优化,既可以作为毕设,也可以作为自己的一个小作品,为以后面试什么的做准备~所以开了这个系列,纪录这个项目的点点滴滴,和大家分享经验,顺便当做毕业论文素材,一举多得~
PS:本系列文章中所涉及到的技术、数据和接口地址,仅供学习交流,务必不可做坏事或者是用于商业用途!否则后果自负!
逆向工程
既然是做高仿,当然需要逆向工程了,由于Android是基于Java的,所以反编译的难度并不大,各种资料很丰富,所以这里就简单介绍。
我们在反编译的时候,可以按照下面的流程进行
- 使用apktool将apk进行反编译,获取到res中的布局文件、drawable中的图片资源,AndroidManifest.xml中的组件声明和权限声明,values中的常量值等数据
- 将apk改为zip后缀,解压获取到classes.dex文件,然后使用dex2jar工具将其反编译,获取到classes.jar文件,然后使用JD-GUI进行查看即可
这个是通常的反编译流程,但是呢,我还要介绍一些其他的东西。第一步流程中,没有太多东西,一般都能获取到我们想要的资源,但是在把dex转化成jar的过程中,使用上面的做法可以查看到java源码,但是,dex2jar对Android中的switch语句解析的不是很完全,所以看起来会非常费劲,我们以“煎蛋”逆向工程之后的某个类举例,下面是使用dex2jar,然后使用JD-GUI查看的com.danielstudio.app.wowtu.a.ae类中的方法a
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