站在巨人的肩膀上学习Android开发

我们知道,一开始最好的学习方法是模仿,尤其是模仿巨人。那说到Android开发的模仿自然就是分析并研究主流程序的布局、实现方法,进而提升自己的技术。

第一招----逆向工程

要分析“巨人”们的软件,自然免不了逆向工程,即将APK程序转化为我们可以看的懂得源码。这个google官方已经帮我们做好了工具,apktool就是一款很好的逆向工具。

下载地址为:http://pan.baidu.com/s/1kTqRhaR

我们以分析微信为例来说明这个工具的使用:

你只需执行如下命令,即完成了反汇编逆向工作。完成后工具会生成weixin目录。

apktool decode weixin.apk

在目录里,你就可以看到软件的各种资源文件,包括布局文件。有了这些资源文件,自己做出和微信一模一样的界面就易如反掌了,当然程序的重点在代码逻辑,不在界面。

[email protected]:/tmp$ ls weixin/
AndroidManifest.xml  apktool.yml  assets  lib  res  smali
[email protected] $ ls weixin/res/ -a
.                     layout       values-id       values-th
..                    layout-hdpi  values-in       values-tr
anim                  layout-ldpi  values-it       values-v11
color                 layout-mdpi  values-iw       values-v14
drawable              layout-v11   values-ja       values-vi
drawable-480dpi       raw          values-ko       values-w360dp
drawable-640dpi       values       values-land     values-w480dp
drawable-en-hdpi      values-ar    values-large    values-w500dp
drawable-hdpi         values-de    values-ldpi     values-w600dp
drawable-land         values-en    values-mdpi     values-w720dp
drawable-land-hdpi    values-es    values-ms       values-xhdpi
drawable-mdpi         values-fr    values-pl       values-xlarge
drawable-xhdpi        values-hdpi  values-pt       values-zh-rCN
drawable-zh-rCN-hdpi  values-he    values-ru       values-zh-rTW
drawable-zh-rTW-hdpi  values-hi    values-sw600dp  xml

上面有一个smali目录,它就是源码目录,而这种源码smali是一种中间语言,它既不是java语言,也不是java的汇编语言,而是apktool工具的可以识别的一种特殊语言。为了进一步转化为我们看得懂得java语言,可以使用dex2jar和jd-gui这两个工具。

jd-gui下载地址:http://pan.baidu.com/s/1i3n7rPr

dex2jar下载地址:http://pan.baidu.com/s/1B2lmY

具体命令如下:

mv weixin.apk weixin.zip
unzip -o weixin.zip
//解压后就得到了classes.dex文件
dex2jarRootPath/dex2jar.sh classes.dex
//然后就得到了classes_dex2jar.jar文件
jd-gui classes_dex2jar.jar

同时,用户可以修改smali文件,然后重新用apktool生成 apk。在使用这个命令前必须下载另外一个工具aapt,apktool会用到这个工具。

大家可以在这里下载:http://pan.baidu.com/s/1i37kiVz

最后,打包的具体命令是:

[email protected]:/tmp$ apktool b Filer/ tmp.apk
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building apk file...
[email protected]:/tmp$

当然,有些程序是没法重新打包回apk,比如微信,这是因为它在resources里添加了自定义的一些变量,而这些变量在plugin文件中定义,apktool工具自然找不到。比如下面的Widget.AppCompat.Base

[email protected]:/tmp$ apktool b weixin/ tmp.apk
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
/tmp/weixin/res/values/styles.xml:59: error: Error retrieving parent for item: No resource found that matches the given name 'Widget.AppCompat.Base'.
/tmp/weixin/res/values/styles.xml:275: error: Error retrieving parent for item: No resource found that matches the given name 'Widget.AppCompat.Base'.
/tmp/weixin/res/values/styles.xml:467: error: Error retrieving parent for item: No resource found that matches the given name '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开发,布布扣,bubuko.com

时间: 2024-10-08 09:45:27

站在巨人的肩膀上学习Android开发的相关文章

站在巨人的肩膀上才能看得更加远[Amo]

本来只是路过,写详细一点.我看楼主浮躁得不得了.现在什么都不要做了,先去看几遍<不要做浮躁的嵌入式工程师>这篇文章,想清楚了,再动手吧.我做了个实例,不用ST的库来点LED,解答你的问题我的 KeilMDK 3.5我的STM32板子奋斗版是 ,IC 是 STM32F103VET6调试工具 JLINK V8LED 接在 PB5 ,高电平点亮既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?然后查了百度之后又能懂多少?(一)新建 keil 工程,IC选择 ST 公司的

站在巨人的肩膀上,谈 app 的创新性

这段时间做了.看了.听了,也想了很多,我们的成功始终是站在巨人的肩膀上的,在学习了很多工业界大牛的经验之谈之后,我经过认真的思考,特别想整理这样一篇文章,希望与许多有梦想的 IT 小伙伴儿们共享.共勉!如果说的不对的地方,欢迎大家在下面留言讨论,虚心学习. 随着移动设备的普遍和相关技术的成熟发展,我们都希望自己可以开发一个好用的应用,不管是公益性的还是旨在运营推广的app,既然练手何不做的有声有色.如果你不是在资源丰富的平台下,而是自己组队开发一个app,并向体现自己的竞争力,能够脱颖而出,那么

小游戏“跳一跳”——站在巨人的肩膀上,用技术为自己助力

在更新最新版微信之后,聊天列表下拉会出现一个崭新的模块,其中就有新推出的"跳一跳"小游戏.而在我几经努力奋斗到266分的时候,已经有技术大牛占据1999的高地... 抱着试一试的心态和蠢蠢欲动的好奇心... 实现了程序助力玩游戏... 具体代码来自gitHub的python大牛... 感兴趣的同学可以和我一起站在巨人的肩膀上... 另外说一点, 如果以后还想玩"跳一跳"的话... 不建议你接着往下看... 因为当你有了捷径... 整个游戏瞬间变得索然无味... 如果

年薪百万的程序员都是站在巨人的肩膀上开发

要想成为一名软件开发者需要学习各种专业知识.技术与框架.比如算法.数据结构.编程语言.流行框架等.但是要想成为更加出色的软件开发者,你要学习的就不仅仅是专业上的知识了. 标题过于浮夸,希望大家谅解,但本篇是满满的干货.今天我想分享一点关于软件开发者如何改进职业技能从而变得更擅长于自身工作的技巧.这里要谈的主题是通用性的,并没有针对任何特定的技术栈.其实这里要谈的大部分甚至都不是针对 IT 的.这些都是如何形成个人特质,跟同事.客户改进协作,以及拓展作为软件开发者职业生涯的一般性建议. 端到端理解

站在巨人的肩膀上,C++开源库大全

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库

站在巨人的肩膀上——人事项目数据导出word

最近在做人事项目中的,数据导出word,具体的说就是从web客户端页面获取信息,添加到信函模板中,再导出为word文档.总结一下,学会了两种方法,1.通过将word模板转换为html文件,输出word.2.利用第三方组件Aspose.Words操作word模板,输出word. 一.通过将word模板转换为html文件,输出word 1.制作word模板,在word文档中要添加内容的地方输入占位符. 2.把word模板另存为html文件. 文件-另存为-网页htm文件. 3前台代码 <asp:Bu

软件工程——站在巨人的肩膀上抱团取暖

摘要 软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科. 而工程化的最主要的特点是系统化.规范化.可量化并且严格控制流程得完成开发或生产任务,在此严格的条件下优质.高效的进行生产活动. 前言 当初懵懂无知地选择了软件工程这门专业,过了大一一年才开始程序员该有的博客之旅.而我认为“程序猿”是最需要最会站在巨人的肩膀上的,代码靠借鉴,思路靠传承,在原有的基础上创新,于是成就了无数优秀的软件. 程序员都知道 :程序 = 算法 + 数据结构 软件 = 程序 + 软件工程 软件企

站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展

距离上次更新博客,时隔略长,诸事繁琐,赶在去广州答辩之前,分享下安卓 android 中的一个 列表收缩 类---ExpandableListView 先上效果图: 如果想直接看实现此页面的代码请下滑到 红线 下 关于这个类的具体各函数的使用说明,这里不作详细说明,提供一个链接http://www.apkbus.com/android-124715-1-1.html,里面有关于此类的详细介绍. 我在这里主要通过源代码的注释和必要的说明,说明如何实现自定义的收缩列表. 必要的函数: 0-> 1 E

站在“巨人”的肩膀上运维

现实问题 之前在论坛看到一个运维工程师的帖子,内容如下: "现在的一个IT工作者最头疼的就是加班,秃顶的是IT工作者最多.单身的是IT工作者最多.没有约会,没有休闲,没有旅游还是IT工作者最多.这可怎么办呢?我是一名IT运维工程师,每天的工作量很大,更不敢离开机器半步,长期跟设备.服务器打交道,因为怕万一机器出毛病,自己负担不起业务上的麻烦,又怕经理的"炒鱿鱼",况且公司还不肯出钱雇很多IT运维人员,让我一个人看着这么多的设备,真是连眼都不敢眨一下,雇来几个人也是呆不长就走人