Makefile 指南

前言

此文档内容是对于博客 跟我一起写Makefile 的归纳整理。

规范了文档格式,重构为参考手册的形式,不适合作为教程,适合作为参考。

Makefile 介绍

编写原则

  1. 如果这个工程没有编译过,那么所有的 C 文件都需要编译并链接;
  2. 如果这个工程的某几个 C 文件被修改,那么只编译被修改的 C 文件,并连接目标程序;
  3. 如果这个工程的头文件被改变了,那么需要编译引用了这几个头文件的 C 文件,并连接目标程序。
阅读更多

Android ClassLoader 简析

ClassLoader 加载机制

ClassLoader 是一个抽象类,它为 Java 虚拟机上运行的进程提供类加载的操作,它定义了类加载器的标准接口,具体加载类的逻辑,以及加载类的路径由其具体子类实现。

ClassLoader 对外提供一个 loadClass 方法,使用时调用此方法并传入符合 java 标准的全类名参数,将会返回一个 Class<?> 对象,通过查看 loadClass 方法的实现可以了解到类加载器的加载机制。

阅读更多

Git 常用命令

初始化

  • 首次安装后设置名字和 email 地址。
1
2
3
git config --global user.name "YourName"

git config --global user.email "email@example.com"
  • 创建 ssh Key。
1
ssh-keygen -t rsa -C "email@example.com"
  • 进入目录并初始化为 git 仓库。
1
git init
阅读更多

Xposed 框架的使用

Xposed 简介

Xposed 框架是 Android 平台上一个非常著名且强大的开源框架,使用它能够对系统进程内运行的方法进行 hook,所以可以用它来做一些系统层面的工作,它拥有无限可能的灵活性,目前市面上基于 Xposed 框架下开发 Xposed 子模块已经数不胜数了。

原理简析

Android 系统运行的核心和起点是 Zygote 进程,所有应用都是从它 fork 子进程产生的,当系统开始运行时由 init.rc 脚本启动, 使用 /system/bin/app_process 程序完成启动,它加载所需的类并调用初始化方法。

Xposed 框架将在这个地方发挥作用,当 Xposed 框架被安装时,一个被扩展的 app_process 程序将被复制到 /system/bin/ 中,这个扩展的 app_process 将向类的路径附加一个 jar 文件,并在某些位置调用其方法,可能是虚拟机创建之后,或者在 Zygote 进程的 main 方法之前。在这个方法里,我们可以在其上下文中做插桩。

阅读更多

Android 二进制 XML 文件解析

前言

Android SDK 在编译 Android 工程时,将会把诸如资源文件和清单文件之类的相关 XML 文件编译为特定的二进制格式,目的是为了压缩其容量以及优化其在运行时的解析效率。

将 XML 文件编译为二进制的 XML 文件是 Android 编译资源时的一个子步骤,Android 在完整的资源编译过程结束后将会生成一个 resources.arsc 文件,它是一个资源文件表,应用在运行时会将它映射在内存中,为了资源的查询和引用。编译 Xml 文件为生成 arsc 文件的一个子步骤,如果 Xml 文件中引用了资源,例如字符串资源,那么 Xml 文件中引用字符串的位置将会包含一个全局字串池的索引,通过索引在 arsc 文件中的全局字符串池中即可查询到引用的具体字符串。

有关 arsc 文件的结构和解析方法可参考:Android arsc 文件解析

阅读更多

Android arsc 文件解析

apk 文件结构

在使用 Android SDK 编译 Android 工程时,它会将工程的源代码和资源打包为一个 apk 文件,apk 文件实质为一个压缩包,一个未签名的 apk 文件典型结构如下:

1
2
3
4
5
6
7
apk file:
assets/ - assets 原始资源文件
lib/ - so 库文件
res/ - 资源文件
classes.dex - 编译后的代码
resources.arsc - 资源信息文件
AndroidManifest.xml - 二进制的清单文件

在 Android 项目的编译过程中,Java 代码将会被编译为 classes.dex 文件,JNI 代码被编译为 .so 文件存放在 lib 目录下,assets 目录和 res/raw 目录中文件的将不会发生变化,对于资源文件中 xml 形式的资源将会被编译为优化过的特定的二进制 xml 格式,而类似于图片这种本身为二进制的类型也不会发生变化,AndroidManifest.xml 清单文件被编译为优化过的二进制格式。

阅读更多

Android View 事件分发机制

触摸事件处理框架

Android 的 View 和 ViewGroup 采用了 Composite(组合) 设计模式,View 的组合具有高度动态性,在这种情况下,由于触摸事件是从底层驱动传递至上层 View 对象,如果按照普通对象间传递信息的方式,将会很复杂,很难处理,这里 Android 采用了 Chain of Responsibility(责任链) 设计模式,触摸事件流将通过视图树,使每个 View 对象都有机会处理事件,一旦某个 View 选择接收事件流,那么整个事件将交给它处理,如果 View 选择不处理,那么事件流会继续传递,直到找到最后的处理者,在处理触摸事件时有几个重要的方法,在弄懂 Android 事件分发机制之前,需要先了解这几个方法的作用及关系。

阅读更多