Gityuan

Keep on going never give up

[置顶]Android 操作系统架构开篇

基于Android 6.0或更高版本的源码,专注于分享Android系统原理、架构分析的原创文章,这是Android系列文章的开篇。

[置顶]Flutter 跨平台演进及架构开篇

基于Flutter 1.5.4或更高版本的源码,专注于分享Flutter引擎、框架、虚拟机等架构与原理解读的原创文章。

Binder系列2—Binder Driver再探

基于Android 6.0的源码剖析,在讲解Binder原理之前,先从kernel的角度来讲解Binder Driver. 一、Binder通信简述 上一篇文章Binder Driver初探介绍了Binder驱动的init、open、mmap、ioctl这4个核心方法,并说明与Binder相关的常见结构体。 Client进程通过RPC(Remote Procedure Call...

Binder系列1—Binder Driver初探

基于Android 6.0的源码剖析,在讲解Binder原理之前,先从kernel的角度来讲解Binder Driver. kernel/drivers/ (不同Linux分支路径略有不同) - staging/android/binder.c - android/binder.c 一、Binder驱动概述 1.1 概述 Binder驱动是Android专用的,但...

Binder系列—开篇

基于Android 6.0的源码剖析 一、概述 Android系统中,每个应用程序是由Android的Activity,Service,Broadcast,ContentProvider这四剑客的中一个或多个组合而成,这四剑客所涉及的多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder I...

Linux内存管理

关于Linux的内存管理,本文分别从内核空间和用户空间两个视角来阐述 一、内核空间 1.1 页 页(page)是内核的内存管理基本单位。 ==> linux/mm_types.h struct page { page_flags_t flags; 页标志符 atomic_t _count; 页引用计数 atomic_t _map...

Jvm系列5—执行子系统

字节码执行引擎 概述 执行引擎是Java虚拟机非常最核心的部分,对于物理级的执行引擎是直接建立在处理器、硬件、指令集合操作系统层面,而虚拟机执行引擎则是由自行定制的指令集与执行引擎的结构体系。执行引擎在执行Java会有解释执行(通过解释器)和编译执行(通过JIT生成的本地代码)两种选择,对于Android ART又多了一种提前编译器(AOT)。 接下来,主要讲解虚拟机的方法执行过...

Jvm系列4—类的加载

一、概述 本文主要讲述虚拟机如何把 Class文件加载到内存的过程。校验、转换解析和初始化,最终形成可被虚拟机使用的Java类型,这就是虚拟机的类加载机制。类型的加载、连接和初始化都是在程序运行期间完成,这样做的优劣势,如下: 优势:提高Java程序的灵活性,Java动态扩展的语言特性就是依赖运行期动态加载和动态连接。当面向接口的应用程序,可以等到运行时指定实现类;可以通过类加载器,...

Jvm系列3—字节码指令

介绍java虚拟机的指令功能,至少能阅读java代码生成的字节码指令含义 一、概述 Java虚拟机采用基于栈的架构,其指令由操作码和操作数组成。 操作码:一个字节长度(0~255),意味着指令集的操作码个数不能操作256条。 操作数:一条指令可以有零或者多个操作数,且操作数可以是1个或者多个字节。编译后的代码没有采用操作数长度对齐方式,比如16位无符号整数需使用两个字...

Jvm系列2—Class文件格式

Java编译过程是将Java文件转换为Claaa文件,从而实现了跨平台的功能, 本文详细讲述Class文件结构。 一、 概述 计算机只能识别0和1,所以大家编写的程序都需要经过编译器,转换为由0和1组成的二进制本地机器码(Native Code)。随着虚拟机的不断发展,很多程序语言开始选择与操作系统和机器指令集无关的格式作为编译后的存储格式(Class文件),从而实现”Write ...

Jvm系列1—运行时内存结构

java是在java虚拟机上运行,一般地大家讲到的Java运行时内存结构其实就是Jvm内存 一、运行时内存结构 Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java运行时内存结构,也就是指Java虚拟机的运行时内存结构。 作为Java开发人员来说,并不需要像C/C++开发人员,需要时刻注意内存的释放,而是全权...

ps进程命令

概述 在adb shell终端,输入 ps,可查看手机当前所有的进程状态,其中ps的英文全称是Process Status。 ps命令对于分析系统异常情况时都是必备的技能,需要通过这个简单命令来查看系统真实的状态。 命令参数 -t 显示进程里的所有子线程 -c 显示进程耗费的CPU时间 -p 显示进程优先级、nice值、调度策略 -P 显示进程,通常是bg(后台进程)...

Dalvik与ART虚拟机的GC调试日志

本文主要讲述Dalvik与ART两种Android虚拟机,在GC时产生log信息的含义,便于分析。 一、Dalvik 1.1 GC含义 Dalvik虚拟机,每一次GC打印内容格式: D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats...

Android进程生命周期与ADJ

做为应用开发者,对于进程生命周期和进程中的内存回收是透明的,但了解生命周期对加深对Andorid体系的理解很有帮助 一、 进程生命周期 Android系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入“重要性层次结构”中。 必要时,系统会首先...

进程优先级

线程与进程的最大区别就是是否共享父进程的地址空间,内核角度来看没有线程与进程之分,都用task_struct结构体来表示,调度器操作的实体便是task_struct。 一、 进程优先级 进程可划分为普通进程和实时进程,那么优先级与nice值的关系图: 优先级值越小表示进程优先级越高,3个进程优先级的概念: 静态优先级: 不会时间而改变,内核也不会修改,只能...

APP优化小建议

从代码角度,列举一些针对Android的App开发的优化小建议 1. 广播 应用程序内部广播通信,优先采用LocalBroadcastManager,安全性更好,运行效率更高。 见文章LocalBroadcastManager原理分析 2. 线程池 线程创建优先采用线程池ThreadPoolExecutor,而不是new Thread(); 另外设置线程优先级为后台运行...

Android Launcher源码

一、引言 最近遇到同一芯片平台的两款手机,在桌面滑动跟手性为何还有所差异呢,于是乎研究了一下Launcher滑动相关源码。 本文主要是介绍Launcher3屏幕滑动过程,首先需要了解Android的触摸事件分发机制。关于分发机制,可查看文章Android事件分发机制。 1.1 常用类简介 Launcher.java: launcher主要的activity,是launcher桌面...