站在巨人的肩膀上学习Android开发
我们知道,一开始最好的学习方法是模仿,尤其是模仿巨人。那说到Android开发的模仿自然就是分析并研究主流程序的布局、实现方法,进而提升自己的技术。
第一招----逆向工程
要分析“巨人”们的软件,自然免不了逆向工程,即将APK程序转化为我们可以看的懂得源码。这个google官方已经帮我们做好了工具,apktool就是一款很好的逆向工具。
下载地址为:http://pan.baidu.com/s/1kTqRhaR
我们以分析微信为例来说明这个工具的使用:
你只需执行如下命令,即完成了反汇编逆向工作。完成后工具会生成weixin目录。
[python] view plain copy
- apktooldecodeweixin.apk
在目录里,你就可以看到软件的各种资源文件,包括布局文件。有了这些资源文件,自己做出和微信一模一样的界面就易如反掌了,当然程序的重点在代码逻辑,不在界面。
[python] view plain copy
- itleaks@ITLeaks:/tmp$lsweixin/
- AndroidManifest.xmlapktool.ymlassetslibressmali
- itleaks@ITLeaks$lsweixin/res/-a
- .layoutvalues-idvalues-th
- ..layout-hdpivalues-invalues-tr
- animlayout-ldpivalues-itvalues-v11
- colorlayout-mdpivalues-iwvalues-v14
- drawablelayout-v11values-javalues-vi
- drawable-480dpirawvalues-kovalues-w360dp
- drawable-640dpivaluesvalues-landvalues-w480dp
- drawable-en-hdpivalues-arvalues-largevalues-w500dp
- drawable-hdpivalues-devalues-ldpivalues-w600dp
- drawable-landvalues-envalues-mdpivalues-w720dp
- drawable-land-hdpivalues-esvalues-msvalues-xhdpi
- drawable-mdpivalues-frvalues-plvalues-xlarge
- drawable-xhdpivalues-hdpivalues-ptvalues-zh-rCN
- drawable-zh-rCN-hdpivalues-hevalues-ruvalues-zh-rTW
- drawable-zh-rTW-hdpivalues-hivalues-sw600dpxml
上面有一个smali目录,它就是源码目录,而这种源码smali是一种中间语言,它既不是java语言,也不是java的汇编语言,而是apktool工具的可以识别的一种特殊语言。为了进一步转化为我们看得懂得java语言,可以使用dex2jar和jd-gui这两个工具。
jd-gui下载地址:http://pan.baidu.com/s/1i3n7rPr
dex2jar下载地址:http://pan.baidu.com/s/1B2lmY
具体命令如下:
[python] view plain copy
- mvweixin.apkweixin.zip
- unzip-oweixin.zip
- //解压后就得到了classes.dex文件
- dex2jarRootPath/dex2jar.shclasses.dex
- //然后就得到了classes_dex2jar.jar文件
- jd-guiclasses_dex2jar.jar
同时,用户可以修改smali文件,然后重新用apktool生成 apk。在使用这个命令前必须下载另外一个工具aapt,apktool会用到这个工具。
大家可以在这里下载:http://pan.baidu.com/s/1i37kiVz
最后,打包的具体命令是:
[python] view plain copy
- itleaks@ITLeaks:/tmp$apktoolbFiler/tmp.apk
- I:Checkingwhethersourceshaschanged...
- I:Checkingwhetherresourceshaschanged...
- I:Buildingapkfile...
- itleaks@ITLeaks:/tmp$
当然,有些程序是没法重新打包回apk,比如微信,这是因为它在resources里添加了自定义的一些变量,而这些变量在plugin文件中定义,apktool工具自然找不到。比如下面的Widget.AppCompat.Base
[python] view plain copy- itleaks@ITLeaks:/tmp$apktoolbweixin/tmp.apk
- I:Checkingwhethersourceshaschanged...
- I:Checkingwhetherresourceshaschanged...
- I:Buildingresources...
- /tmp/weixin/res/values/styles.xml:59:error:Errorretrievingparentforitem:Noresourcefoundthatmatchesthegivenname'Widget.AppCompat.Base'.
- /tmp/weixin/res/values/styles.xml:275:error:Errorretrievingparentforitem:Noresourcefoundthatmatchesthegivenname'Widget.AppCompat.Base'.
- /tmp/weixin/res/values/styles.xml:467:error:Errorretrievingparentforitem:Noresourcefoundthatmatchesthegivenname'Theme.AppCompat.Base'.
第二招----查看view布局
Android还提供了另外一个很强大的工具hierarchyviewer,这个工具的原理我在屏幕自由截图文章中有大概描述过,感兴趣的可以去看看那篇文章。这个工具在android-sdk/tools里可以找到。这个工具究竟干什么用的?它是用来查看程序的UI的,具体使用过程如下:
1)执行命令启动后,软件会列出所有正在运行的程序
2)选择你感兴趣的程序,双击即可查看该程序的UI,该界面每个方框代表一个view,并每个方框下都显示了该view
的id,这样就可以根据id很好的找出该view在layoutxx.xml中对应的view.
3)然后选择某个view,双击即可看到该view的UI。
4)单击右边的layout还可以看到具体view的layout信息,比如高度,宽度,位置等信息。
有了这两个工具,大家应该就能比较方便的分析市面上任意程序的界面构成了。
附录:
以上的apktool, aapt,大家最好将这两个文件拷贝到执行路径,比如/usr/bin,这样apktool才能在执行中找到aapt这个文件。还有,本文中的所有工具都是linux下的,如果想在window下执行,大家可以搜索并下载window版本。需要注意的是,hierarchyviewer工具是基于adb的,要想使用它,必须保证,adb devices能够显示到你要访问的Android设备,一般出厂设备默认是没法使用的,需要root。
/********************************
* 本文来自博客 “爱踢门”
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/
更多相关文章
- android 跨应用程序广播发送接受
- Android 中下载文件到sdcard和进度条小结
- Google自己出品的dex转jar工具enjarify的介绍
- Android应用程序线程消息循环模型分析(1)
- 在 Android 中调用二进制可执行程序(native executable )
- android 中处理崩溃异常并重启程序
- android 内部文件读取