查看平台源码

查看内核源码

Android的内核源码很大,有几个G,仔细找找网上有许多下载的地方。作为普通开发者,一般不需要阅读内核源码,但一点都不了解好像也不行,因为实际开发中有时候就得会那么一点点。下面几个源码目录,是开发者在实际开发中可以参考的:
\system\core\toolbox : linux后台命令的源码,如ls、rm、kill、chmod、top、netstat等等。
\packages\apps : Android自带的应用程序的源码,如计算器、日历、相机、浏览器、联系人、音乐、拨号、设置等等。
\sdk : Android开发的辅助工具源码,如eclipse插件、emulator模拟器、ddms管理工具、draw9patch点九制图工具。
\frameworks\base\core\java\android : 提供给开发者的SDK开发框架的源码,基本与“Android SDK Manager”上下载的SDK一致。

查看SDK源码

SDK源码就是大多数开发者需要的了,只要不是初级工程师,都要会看。因为实际开发写个什么自定义控件,或者了解每个函数的详细用法,都得经常阅读SDK源码。
每个版本的Android,都有自己的一套SDK源码,具体目录是“sdk\sources\android-版本号”,下面是几个常用子目录的说明:
android : Android组件的源码。
java : Java内核的源码。
org : 几个自带的辅助工具源码。如Google的json解析工具、xml的三种解析工具(pull、dom、sax)。
javax : Java增强的源码。如加密Cipher、安全协议SSL、XML解析XPath等等。

虽然SDK有自带源码,但是我们在开发中看到某个Android函数,按下“Ctrl+鼠标左键”,打开的却是看不懂的class文件,而不是期望的直接看到SDK源码。幸好Eclipse有个反编译插件叫做Eclipse Class Decompiler,我们在ADT上装好该插件,便能随意跳转查看SDK源码,好像SDK代码就是我们工程的一部分,很方便。

查看应用源码

反编译

常常我们看到某个APP界面很炫,也想在自己的APP中用上相同的功能,但是自己(比如博主)技术不到家,百度了也没有结果。但又不甘心,那有没有办法呢?有是有,就是得破解这个APP,想办法把它的源码反编译出来。咳,我们反编译不是山寨,而是为了学习嘛,软件设计思想人人有份,比如大学生都知道相对论的著名公式:能量等于质量乘以光速的平方。

废话少说,既然要破解,那还是先准备反编译的三个工具,分别是apktool、dex2jar、jd-gui,注意要下载最新版的。它们的作用分别是:
apktool : 对apk文件进行解包,可解析出res资源,代码可解为smali格式。也可
dex2jar : 可将apk包中的classes.dex转为jar包。
jd-gui : 可将dex2jar解析出来的jar包反编译为java源码。

下面是反编译apk的具体步骤(以Window环境举例说明):
1、进入命令行,运行“apktool.bat d -f 解包后的保存目录名 包名.apk”,反编译通过,即可在当前目录下看到指定目录。apktool主要目的是解析出res资源文件,包括AndroidManifest.xml、layout、values、drawable等等。
2、先用压缩软件如Winrar打开apk包,解压出classes.dex文件,然后运行命令“d2j-dex2jar.bat classes.dex”,如果成功即可在当前目录下看到classes_dex2jar.jar。
3、打开jd-gui,把classes_dex2jar.jar拖到jd-gui界面中,程序就会自动把jar包反编译为java文件。当然多数时候jar包因为经过代码混淆处理,所以常常看到a、b、c、d这样的目录或者java文件,这只是加大了源码破解的难度。回到jd-gui界面,选择菜单“File”——“Save All Sources”,这时会在指定目录生成zip文件,解压zip文件就能看到反编译后的全部java代码了。

重新打包

apktool同时也用来将解包后的资源重新打包为apk,另外还需要签名工具signapk.jar,以及签名所需的key文件。

下面是重新打包apk的具体步骤(以Window环境举例说明):
1、进入命令行,运行“apktool.bat b 待打包的目录名 包名.apk”,打包成功,即可在当前目录下看到指定的apk包。不过这个apk还无法直接安装,Android上的app都要经过签名后方可正常使用。
2、签名工具是Android自带的signapk.jar,源码路径是“\build\tools\signapk\SignApk.java”,不过要想编译出jar还得把整个Android都编译通过,煞是麻烦。幸好网络上别人已编译好的,直接拿过来用好了。进入到signapk.jar路径,运行“java -jar signapk.jar testkey.x509.pem testkey.pk8 old.apk new.apk”,就得到完成签名的apk包了。

smali语法

前面提到,反编译后可以得到jar包(dex2jar方式)或者得到smali文件(apktool方式)。虽然Android的app采用Java开发,但是Android运行的是自己的虚拟机Dalvik,因此java代码编译产生的是smali文件,而不是J2EE常见的class文件。尽管通过jd-gui可以得到反编译后的java源码,我们还是有必要了解smali的语法。毕竟反编译后的java代码在很多地方让人丈二摸不着头脑,甚至有时部分代码片段干脆解析失败。

smali类似汇编语言,有相关基础的朋友掌握起来会快些。首先了解一下smali的变量类型,下面是smali与java两套变量类型的对应关系:
基本类型
V : void (只能用于返回值类型) 
Z : boolean
B : byte
S : short
C : char
I : int
J : long
F : float
D : double
对象类型 
Ljava/lang/Integer; : Integer
Ljava/lang/Double; : Double
Ljava/lang/String; : String
Lcom/app/Util; : 类名,对应java中的com.app.Util
数组类型
[I : int[]
[[I : int[][]
[Ljava/lang/String; : String[]

smali文件中经常看到v0、v1、v2,以及p0、p1、p2等标识,v开头的表示寄存器,后面的数字表示第几个寄存器;p开头的表示参数,后面的参数表示第几个参数。下面是方法与参数的smali写法:
.method : 表示方法开始。
(***)V : 括号内部表示该方法的输入参数,参数类型由上面变量类型的代码组成,比如“(IFDLjava/lang/String;)”表示第一个参数是I类型(即int),第二个参数是F类型(即float),第三个参数是D类型(即double),第四个参数是String类型;括号外部表示该方法的返回值,V表示返回值为void类型。
.end method : 表示方法结束。
.field : 声明一个变量。

具体执行指令时,smali都要把参数放入寄存器中,然后再对寄存器进行运算。参数放入寄存器有三种方式:
1、直接从参数或者常量赋值,使用const指令;
2、把另一个寄存器的值搬过来,使用move指令;
3、对参数转换类型后赋值,使用int-to-float、float-to-double等类型转换指令;
接下来就可以对寄存器进行算术四则运算,具体对应关系如下:
加 + add
减 - sub
乘 * mul
除 / div
取余数 % rem

最后了解几个流程关键字对应的smali指令:
分支if/else : 开始分支判断使用if指令,结束分支使用goto指令。
循环for/while : smali采用if指令和goto指令联合实现循环功能。
函数调用 : 对应smali的invoke指令。
函数返回 : return。

点此查看Android开发笔记的完整目录

Android开发笔记(七十)反编译初步相关推荐

  1. Android开发笔记(十五)淡入淡出动画TransitionDrawable

    说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换.如果我们想要从A图片逐渐变为B图片,也就是要实 ...

  2. Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

  3. Android开发笔记(十八)书籍翻页动画PageAnimation

    前面几节的动画都算简单,本文就介绍一个复杂点的动画--书籍翻页动画.Android有自带的翻页动画ViewPager,不过ViewPager只实现了平移效果.即便使用补间组合动画或者属性动画,也只是把 ...

  4. Android开发笔记(十六)秋千摇摆动画SwingAnimation

    上节博主介绍了AlphaAnimation和淡入淡出动画的使用,其实AlphaAnimation只是四种补间动画中的一种.那么为了加深对其他补间动画的理解,我想说说旋转动画RotateAnimatio ...

  5. Android开发笔记(十四)圆弧进度动画CircleAnimation

    一个好看的APP,都有不少精致的动画效果.熟练运用各种动画技术,可让我们的APP灼灼生辉.Android在技术上把动画分为了三类,分别是帧动画FrameAnimation.补间动画TweenAnima ...

  6. Android开发笔记(十二)测量尺寸与下拉刷新

    尺寸测量的配置 控件宽和高的设置方式 大家知道,自定义视图的目的就是要在屏幕上显示期望的图案,那在绘制图案之前,我们得先知道这个图案的尺寸(如宽多少高多少). 一般在xml中给控件的宽和高有三种赋值方 ...

  7. Android开发笔记(十)常用的图片加工操作

    APP开发自然少不了各种图片的加工处理,虽然说加工图片是美工干的活,但是码农会些简单的操作总归是好事.一些简单的加工如缩放.旋转.裁剪.格式转换,使用ACDSee就够用了,不过有些稍微复杂的操作得借助 ...

  8. android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

  9. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

  10. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

最新文章

  1. 输出程序运行的时间(精确到微秒)
  2. python 字符串 删除 空格 换行符
  3. Springboot,SSM框架比较,区别
  4. 最短路径(floyed)
  5. Linux基础——bash基础应用及文件系统基础命令
  6. LeetCode题库第1题 两数之和
  7. 记最近分析的一个锁屏幕病毒
  8. vant状态页组件van-empty - 使用篇
  9. ubuntu配置安装KBEngine服务器
  10. python人脸识别教程_50行Python代码+OpenCV实现人脸识别!史上最详细的教程!
  11. div+css布局与seo的关系
  12. 学习用TypeScript写React组件
  13. Python数据库模块pymssql连接SQLServer数据库操作详解
  14. 从零学物联网技术:较大影响了我们生活的物联网技术应用有哪些?
  15. 对嵌入式开发方向的一些思考:在物联网方向
  16. 康托尔点集matlab实数,仿照科赫曲线程序 , 按照课件上的算法写出康托尔点集 – MATLAB中文论坛...
  17. 2020年 “十大热词” 出炉了,你知道它们的含义和出处吗?
  18. JavaScript头像上传器的实现
  19. 杰理之Dongle【篇】
  20. 微信运动刷步数软件有哪些?微信运动刷步软件推荐[

热门文章

  1. redis_基础_基本使用
  2. HDU 3584 三维树状数组
  3. Vue源码学习(三)——数据双向绑定
  4. 华为-RH5885 V3 远程KVM
  5. springcloud21---Config-bus实现配置自动刷新
  6. 第二:RobotFrameWork接口用例设计规范
  7. 达梦数据charindex_更新日志 · dotnetcore/FreeSql Wiki · GitHub
  8. 倾斜模型精细化处理_基于倾斜摄影和近景摄影技术的实景三维模型结合(CC与 DPModeler结合)...
  9. 侧边栏_第四课 侧边栏和过滤器
  10. python飞机大战游戏高级_05.python实现飞机大战游戏