博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

12306客户端(Android版)源码分析系列(一)

Posted on 2013-12-15 18:27  三块石头  阅读(5150)  评论(9)    收藏  举报

很抱歉,因为个人的原因,这篇文章被太监了,再次向大家道歉。不过还是希望下面的内容会给大家一些帮助。(2015.05.27)

 

话说神站12306出了客户端版本,这倒真是好事,盼星星,盼月亮,铁道部终于做了点利民的事情了。

在这移动互联网强势来袭的时代,你不搞个移动版出来,你都不好意思出来混。带着欣喜的心情,就

下载了客户端体验了一番。暂不评价,先看看截图:

 

从功能方面来说,已经相对比较全了,查询、购买、付款都可以了。比较赞的是还支持了支付宝,这个的确是

一个比较大的进步。但从UI体验方面来说,一个是界面比较难看,像几年前的移动应用;二是界面响应速度比

较慢,不怎么流畅,整体感觉像web页面,我都怀疑它是不是用PhoneGap写的。接下来发生的事情,还真

证明了,它丫真滴是用PhoneGap写的。

 

接下来,我们就不吐槽了,来分析分析下这个apk应用。

 

怎么去分析一个apk应用,逆向工程?对,就是反编译。看起来蛮高端大气上档次的,其实我们只要祭出Android

反编译利器apktool就可以。怎么使用我就不多说了,网上资料一大堆,我们直接看反编译后的结果。

 

上面说到它可能是用PhoneGap写的,如果是PhoneGap,它一定存在一个config.xml配置文件,用来配置

插件映射。如下图:

看来,这应用还是真是用PhoneGap做的。既然是PhoneGap做的,应该在assets目录下有资源文件,

也就是js、css、image等文件。我们看一下 assets目录,发下有如下内容:

 

除了一些图片,还有www目录下的两个zip文件。从这名字命名来看,好像是一个zip文件压缩成了两个,

这个类似于我们往论坛上上传文件,但是由于有大小限制,我们会把文件压缩成多卷。我试着解压了下,

发现解压失败,看来,这两个文件是被加密了,在后面的分析中,确实证明了,这两个文件是加密了。看不

到效果,我们暂时不管。如果大家做过Android应用,Android应用会有一个主Activity, 类似于java中的

main函数,这个配置就位于AndroidManifest.xml文件,我们可以看看里面有什么。

 

从配置文件中可以看到,应用的主启动类是 com.MobileTicket.MobileTicket, 我们可以看看这个类里面有啥,

是怎么载入页面的。不过看这个配置文件时还是有了新发现,12306客户端竟然是用IBM Worklight写的,这个

框架是IBM收购的,主要用来进行企业级移动应用开发,其底层封装了PhoneGap。由于Worklight可以免费下载

使用,这样为我们分析源码方便了很多。IBM workgiht的下载地址可以点这里

 

接下来,我们需要分析com.MobileTicket.MobileTicket到底里面做了啥。顺便提下,apktool会把apk

反编译为smali文件,这种文件有点类似汇编语言,但是要简单得多,它长成这个样子:

 

看起来有点复杂,但是我们猜还是能猜出个一二的,比如从第1~3行,我们就可以知道MobileTicket这类继承了

Worlight框架的WLDroidGap类。如果大家觉得这个太复杂,我们可以祭出第二个神器,dex2jar,它可以把apk

文件中的classes.dex文件变为jar文件,然后通过jd-gui,我们就可以查看效果了,如下图:

 

这样是不是看着亲切多了。在这个文件中,是如下非常重要的一段代码:

 

  public void onWLInitCompleted(Bundle paramBundle)
  {
    super.setIntegerProperty("splashscreen", 2130837513);
    super.loadUrl(getWebMainFilePath());
  }

 

 

onWLInitCompleted方法会在WorkLight初始化完毕后自动调用,loadUrl是PhoneGap中提供的方法,主要用

来载入网页。所以WLDroidGap应用扩展了PhoneGap(主要是org.apache.cordova.DroidGap)。要想知道

WorkLight是怎么初始化应用的,我们得分析分析WorkLight的源码了。

前面提到了dex2jar,它可以把apk转为jar,但是我发现有时候某些类它反编译出来,会出问题。所以我们还是

把WorkLight自己下载下来,看看WorkLight是否提供相应的jar包,我们再用jd-gui来反编译查看。WorkLight

下载后运行是这个样子:

 

 

比较幸运的时,WorkLight开发工具提供了jar包,我们可以直接用jd-gui来查看,如下图:

 

现在,我们知道问题的核心在WLDroidGap这个类了,下篇文章我会分析它的实现原理。