JackPeng

Keep on going never give up

Binder系列5—注册服务(addService)

基于Android 6.0的源码剖析, 本文讲解如何向ServiceManager注册Native层的服务的过程。 /framework/native/libs/binder/IServiceManager.cpp /framework/native/libs/binder/BpBinder.cpp /framework/native/libs/binder/IPCThreadSt...

Binder系列4—获取ServiceManager

基于Android 6.0的源码剖析, 本文详细地讲解defaultServiceManager流程 /framework/native/libs/binder/IServiceManager.cpp /framework/native/libs/binder/ProcessState.cpp /framework/native/libs/binder/BpBinder.cpp /...

Binder系列3—启动ServiceManager

基于Android 6.0的源码剖析, 本文详细地讲解了ServiceManager启动流程 /framework/native/cmds/servicemanager/service_manager.c /framework/native/cmds/servicemanager/binder.c 入口 ServiceManager是整个Binder IPC通信过程中的守护进...

Binder系列2—Binder Driver再探

基于Android 6.0的源码剖析,在讲解Binder原理之前,先从kernel的角度来讲解Binder Driver. /kernel/drivers/android/binder.c /kernel/include/uapi/linux/android/binder.h 一、Binder通信简述 上一篇文章Binder Driver初探介绍了Binder驱动的init、...

Binder系列1—Binder Driver初探

基于Android 6.0的源码剖析,在讲解Binder原理之前,先从kernel的角度来讲解Binder Driver. /kernel/drivers/android/binder.c /kernel/include/uapi/linux/android/binder.h 一、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系列4—执行子系统

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

Jvm系列3—类的加载

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

Jvm系列2—字节码指令

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