Android

1.1 View绘制流程

5 minute read

View绘制流程与原理 绘制起点ViewRootImpl#performTraversals()

1.10 SurfaceFlinger

4 minute read

1.10.1 基础概念 * Image Stream Producers(图形流的生产者) 如OpenGL ES, Canvas 2D * Image Stream Consumers(图形流的消费者) SurfaceFilnger, 使用OpenGL和HW Composer组合surfaces * Window...

1.11 Native Debugger

less than 1 minute read

Native Debugger实现 sigaction()注册捕捉signal(SIGABRT[调用abort函数发的信号], SIGBUS[非法地址, 内存地址对齐出错], SIGFPE[算数错误], SIGILL[非法指令], SIGPIPE[管道破裂], SIGSEGV[访问未分配内存]) 通过s...

1.12 ANR场景与触发流程

less than 1 minute read

1.12.1 ANR场景 * Service Timeout, 20S无响应 * BroadcastQueue Timeout, 10S未执行完成 * InputDispatching Timeout, 输入5秒无响应

1.13 ContentProvider机制

less than 1 minute read

ContentProvider使用 ```java // 1. 继承ContentProvider public class XXXContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues ...

1.14 Bitmap杂谈

1 minute read

1.14.1 Bitmap优化 Bitmap Config配置 配置inDensity和inTargetDensity inJustDecodeBounds预判Bitmap大小及使用inSampleSize压缩 2.3版本inNativeAlloc的使用

1.15 ListView & RecyclerView

less than 1 minute read

ListView 流程 核心概念, activeViews缓存当前激活(显示)的View, scrapViews缓存废弃(移除屏幕)的View 两次onLayout() 第一次: layoutChild() -> 由于getChi...

1.16 进程

less than 1 minute read

1.16.1 优先级 前台进程 进程持正在与用户交互的Activity。 startForeground() 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法 可...

1.17 Activity & Fragment生命周期

less than 1 minute read

Activity onCreate() onStart() onNewIntent(), 当startActivity()且Activity是singleTop, 或重新启动ActivityStack栈顶的Activity被调用… onResume() onPause() onStop(...

1.2 动画流程与原理

less than 1 minute read

1.2.1 属性动画 ValueAnimator动画本质是帧刷新时, 提供相关刷新回调, 让业务可以调整View的属性 object(属性动画)必须要提供setXxx方法 TimeInterpolator(时间插值器), 根据时间的百分比来计算出当前属性值改变的百分比 TypeEvaluator...

1.3 init进程初始化流程

less than 1 minute read

初始化流程 Init.cpp 解析init.zygote.rc[parse_service] 启动main类型服务[do_class_start()] 启动zygote服务[service_start()] 创建Zygote进程[fork()] 创建Zygote Socket[creat...

1.4 Zygote启动流程

less than 1 minute read

启动流程 解析init.zygote.rc中的参数, 创建AppRuntime并调用AppRuntime#start方法 调用AndroidRuntime的startVM()方法创建虚拟机, 再调用startReg注册JNI函数 通过JNI方式调用ZygoteInit#main(), 第一次进入Ja...

1.5 SystemServer启动流程

less than 1 minute read

启动流程 创建SystemServer进程 创建AMS, PMS, LS, DMS服务 创建PMKS, WMS, IMS, NMS, DBMS, FPS等服务 AMS, PMS, LS, DMS调用systemReady 启动systemUI, 剩余服务调用systemReady, 启动Wa...

1.6 Binder机制

1 minute read

1.6.1 Binder驱动 流程 init(), 创建/dev/binder设备节点, 调用binder_init(), 注册misc设备, 即调用misc_register() open()获取Binder Driver的文件描述符, binder_open(), 打开...

1.7 ActivityManagerService

2 minute read

1.7.1 启动流程 startBootstrapService[SystemServer.java启动], (一)设置SystemServiceManager, (二)设置AMS的Installer, (三)初始化AMS相关的PMS, (四)设置SystemServer AMS创建, 创建Activi...

1.8 PackageManagerService

less than 1 minute read

1.8.1 启动流程 1. `mSystemServiceManager#startService(Installer.class)` 启动`installer`服务 -> `PackageManagerService#main()`创建`PackageManager`服务并注册到ServiceManage...

1.9 WindowManagerService

less than 1 minute read

1.9.1 启动流程 * WMS添加window的过程主要功能是添加Surface, 管理Surface布局以及Z轴排序问题 * `Systemserver`中`startOtherServices()` -> `WindowManagerService#main()`, 其中包含以下操作 * `W...

2.1 GC

1 minute read

2.1.1 Java内存模型与内存管理 Young Memory Generation (年轻代) Eden S0 (幸存区, Eden满后通过Minor GC将对象移动到这) S1 (幸存区, Eden满后通过Minor GC将对象移动到这) ...

2.11 Serializable & Parcelable

less than 1 minute read

Serializable & Parcelable区别 Parcelable 效率高, 内存小, Binder的载体, 设计用于跨进程访问, 不能序列化到本地或者网络 Serializable 反射实现, 效率低, 消耗内存多, 保存到...

2.12 equals & hashcode

less than 1 minute read

equals & hashcode hashcode用于HashMap等hash存储容器 hashMap会使用equals判断key是否相同, 因此需要根据规则复写hashcode equals 相同, hashcode一定相等, 基于这个点, equals复写, 一定要复写hashcode

2.2 多线程

2 minute read

2.2.1 锁 Java对象头和Monitor 对象在内存分为, 对象头、实例数据和对齐填充 对象头实现synchronized, 轻量锁和重量锁在Mark Word结构中定义 ObjectMonitor, wait状态的线程加入_WaitSet, 等待锁blo...

2.3 类文件结构

less than 1 minute read

类文件结构 魔数(Magic), 存放魔数和版本信息, 保证Java虚拟机轻松分辨Java和非Java文件 Class文件的版本(Version), Java类文件的版本信息 常量池(Constant Pool), 存放字符串、类名、方法名、接口名称、final常量以及外部类的引用信息等常量。常量池...

2.4 类加载器

less than 1 minute read

2.4.1 Bootstrap ClassLoader 启动类加载器, C++实现, 将JAVA_HOME下的\lib中能被虚拟机识别的类库(比如rt.jar)加载到虚拟机内存中

2.7 热修复方案

1 minute read

2.7.1 类加载方案 原理:基于类加载器, DexClassLoader, 修改dexElements元素的位置实现热修复; 流程: 1. 获取当前应用的ClassLoader, 即BaseDexClassLoader, 2. 通过反射获取DexPathList属性对象PathList, 3. 通过P...

2.9 Java异常

less than 1 minute read

2.9.1 异常捕获 Thread#setDefaultUncaughtExceptionHandler(), 类方法 Thread#setUncaughtExceptionHandler, 实例方法 备注: 未try, catch的异常, 即uncaught的情况下, UncaughtExcept...

2.13 Java SPI & WMRouter解析

less than 1 minute read

2.13.1 SPI SerivceLoader#load() -> LazyIterator#hasNext() -> Classloader#getSystemResource查找META-INF/services/目录下的Java文件 -> ServiceLoader#par...

2019-01-31 2.15 RxJava

less than 1 minute read

2.15.1 观察者模式 Observable(被观察者) Observer(观察者) subscribe(订阅)、(事件) onComplete(), 事件队列结束 onNext()发事件, 需要触发onComplete() onError(), 事件队列异常

2.17 Matrix源码解析

2 minute read

2.13.1 IO Canary 流程图 找到Hook函数, 通过PLT Hook方案 (ELF Hook方案), hook掉posix的open、read、write、close函数

2.19 AOP

1 minute read

2.13.1 AspectJ Join Points(程序中的关键函数或代码段) | Join Points | 说明 | | —————– | ——– | | method call | 函数调用, 调用的地方 | | method execution | 函数执行...

2.21 ResourceManager源码解析

less than 1 minute read

2.13.1 Drawable加载流程 Context#getResource().getDrawable(R.xxx.xxx) ComtextImpl#getResource - > ResourcesManager#getResource -> ResourcesMan...

2.26 Android Hook

1 minute read

PLT Hook - Android Native Hook IO Canary使用的方案, 当动态链接的ELF程序里调用共享库的函数时, 第一次调用先到PLT表查找, PLT表中再跳到GOT表获得该函数的地址, 最终通过_dl_runtime_resolve获得函数的实际地址, PLT Hook通过直接修改GO...

2.29 gradle和打包

less than 1 minute read

2.29.1 gradle project, gradle待编译过程即project task, project包含一系列task, 如Java源码编译等 task的依赖关系, 定义task, 并指定assemble依赖于task xxx, 当assemble执行时, 就会先处理t...

2.31 MultiDex原理

6 minute read

2.31.1 编译流程原理 MultiDexTransform(gradle中将multiDexEnabled设置为true, 则执行)

2.34 Android面试锦集

less than 1 minute read

2.34.1 Java基础总结 String、StringBuffer、StringBuilder区别 String字符常量, 不可变的好处, 线程安全, 保证安全访问 StringBuffer、StringBuilder字符变量; StringBuffer优势在#appe...

2.37 读书

4 minute read

第3章-对象的共享 3.1 可见性 只要有数据在多个线程之间共享, 就使用正确的同步 3.1.4 Volatile变量 volatile变量的典型用法, 检查某个状态标记以判断是否退出循环, vlatile boolean asleep; wh...

2.38 Java并发笔记

5 minute read

2.38.1 synchronized实现原理 实现原理 同步方法, 锁的是实例对象, 即对象锁, 方法表中的ACC_SYNCHRONIZED字段标识, 并使用该方法的对象在JVM内部对象表示的Klass作为锁对象 静态同步方法, 锁的是类对象, 即类锁, 方法表中的ACC...

2.39 Android性能优化笔记

1 minute read

2.39.1 启动加速 冷启动(App在设备刚启动或者应用被kill后首次启动即冷启动) 冷启动的开始, 系统会执行以下三个任务 加载启动App 启动后显示空白window 创建app的process ...

2.40 Android线程优先级

less than 1 minute read

2.40.1 Linux线程优先级 Linux进程优先级 Linux进程优先级图 来源于杂谈Android线程优先级

2.42 读书

less than 1 minute read

对象通用方法 覆盖equals方法的类必须覆盖hashcode方法, 否则违反Object#hashCode的通用约定, 导致该类无法结合基于散列的集合正常运作

2.43 Android匿名共享内存

2 minute read

Android的匿名共享内存 Android可以使用Linux的一切IPC通信方式,包括共享内存,不过Android主要使用的方式是匿名共享内存Ashmem(Anonymous Shared Memory), MemoryFile是Android为匿名共享内存而封装的一个对象,这里通过使用MemoryFil...

2.44 泛型

less than 1 minute read

引入泛型 类型安全 泛型主要目标是提高Java程序的类型安全 编译器可检查出因Java类型不正确导致的ClassCastException异常 符合越早出错代价越小原则 消除强制类型转换 直接得到目标类型, 消除许多强制...

2.45 反射原理

1 minute read

反射与RRTI 反射, 即提供运行时获取类信息, 调用方法等能力, 提供动态化功能; 可用于hook, 动态代理, 依赖注入等技术 RRTI(Run-Time Type Identification)运行时类型识别, 作用是运行时识别一个对象的类型和类信息; 1). 传统的”RRTI”,它假定我们在编译...

2.46 Java方法调用原理

less than 1 minute read

方法调用 方法调用即确定调用方法的版本, 一切方法调用在Class文件存储都是符号引用; 而直接引用则是方法实际内存地址

2.47 ARCore开发指南

1 minute read

启用ARCore 向manifest添加AR必备或AR可选条目 AR可选应用(包含可选AR功能)

2.48 读书<深入理解Java虚拟机3>

17 minute read

自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 2.2.1 程序计数器 程序计数器(Program Counter Register)是当前线程所执行的字节码的行号指示器 ...