1.1 View绘制流程
View绘制流程与原理 绘制起点ViewRootImpl#performTraversals()
View绘制流程与原理 绘制起点ViewRootImpl#performTraversals()
1.10.1 基础概念 * Image Stream Producers(图形流的生产者) 如OpenGL ES, Canvas 2D * Image Stream Consumers(图形流的消费者) SurfaceFilnger, 使用OpenGL和HW Composer组合surfaces * Window...
Native Debugger实现 sigaction()注册捕捉signal(SIGABRT[调用abort函数发的信号], SIGBUS[非法地址, 内存地址对齐出错], SIGFPE[算数错误], SIGILL[非法指令], SIGPIPE[管道破裂], SIGSEGV[访问未分配内存]) 通过s...
1.12.1 ANR场景 * Service Timeout, 20S无响应 * BroadcastQueue Timeout, 10S未执行完成 * InputDispatching Timeout, 输入5秒无响应
ContentProvider使用 ```java // 1. 继承ContentProvider public class XXXContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues ...
1.14.1 Bitmap优化 Bitmap Config配置 配置inDensity和inTargetDensity inJustDecodeBounds预判Bitmap大小及使用inSampleSize压缩 2.3版本inNativeAlloc的使用
ListView 流程 核心概念, activeViews缓存当前激活(显示)的View, scrapViews缓存废弃(移除屏幕)的View 两次onLayout() 第一次: layoutChild() -> 由于getChi...
1.16.1 优先级 前台进程 进程持正在与用户交互的Activity。 startForeground() 进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法 可...
Activity onCreate() onStart() onNewIntent(), 当startActivity()且Activity是singleTop, 或重新启动ActivityStack栈顶的Activity被调用… onResume() onPause() onStop(...
Handler源码分析
1.2.1 属性动画 ValueAnimator动画本质是帧刷新时, 提供相关刷新回调, 让业务可以调整View的属性 object(属性动画)必须要提供setXxx方法 TimeInterpolator(时间插值器), 根据时间的百分比来计算出当前属性值改变的百分比 TypeEvaluator...
初始化流程 Init.cpp 解析init.zygote.rc[parse_service] 启动main类型服务[do_class_start()] 启动zygote服务[service_start()] 创建Zygote进程[fork()] 创建Zygote Socket[creat...
启动流程 解析init.zygote.rc中的参数, 创建AppRuntime并调用AppRuntime#start方法 调用AndroidRuntime的startVM()方法创建虚拟机, 再调用startReg注册JNI函数 通过JNI方式调用ZygoteInit#main(), 第一次进入Ja...
启动流程 创建SystemServer进程 创建AMS, PMS, LS, DMS服务 创建PMKS, WMS, IMS, NMS, DBMS, FPS等服务 AMS, PMS, LS, DMS调用systemReady 启动systemUI, 剩余服务调用systemReady, 启动Wa...
1.6.1 Binder驱动 流程 init(), 创建/dev/binder设备节点, 调用binder_init(), 注册misc设备, 即调用misc_register() open()获取Binder Driver的文件描述符, binder_open(), 打开...
1.7.1 启动流程 startBootstrapService[SystemServer.java启动], (一)设置SystemServiceManager, (二)设置AMS的Installer, (三)初始化AMS相关的PMS, (四)设置SystemServer AMS创建, 创建Activi...
1.8.1 启动流程 1. `mSystemServiceManager#startService(Installer.class)` 启动`installer`服务 -> `PackageManagerService#main()`创建`PackageManager`服务并注册到ServiceManage...
1.9.1 启动流程 * WMS添加window的过程主要功能是添加Surface, 管理Surface布局以及Z轴排序问题 * `Systemserver`中`startOtherServices()` -> `WindowManagerService#main()`, 其中包含以下操作 * `W...
2.1.1 Java内存模型与内存管理 Young Memory Generation (年轻代) Eden S0 (幸存区, Eden满后通过Minor GC将对象移动到这) S1 (幸存区, Eden满后通过Minor GC将对象移动到这) ...
Serializable & Parcelable区别 Parcelable 效率高, 内存小, Binder的载体, 设计用于跨进程访问, 不能序列化到本地或者网络 Serializable 反射实现, 效率低, 消耗内存多, 保存到...
equals & hashcode hashcode用于HashMap等hash存储容器 hashMap会使用equals判断key是否相同, 因此需要根据规则复写hashcode equals 相同, hashcode一定相等, 基于这个点, equals复写, 一定要复写hashcode
2.2.1 锁 Java对象头和Monitor 对象在内存分为, 对象头、实例数据和对齐填充 对象头实现synchronized, 轻量锁和重量锁在Mark Word结构中定义 ObjectMonitor, wait状态的线程加入_WaitSet, 等待锁blo...
类文件结构 魔数(Magic), 存放魔数和版本信息, 保证Java虚拟机轻松分辨Java和非Java文件 Class文件的版本(Version), Java类文件的版本信息 常量池(Constant Pool), 存放字符串、类名、方法名、接口名称、final常量以及外部类的引用信息等常量。常量池...
2.4.1 Bootstrap ClassLoader 启动类加载器, C++实现, 将JAVA_HOME下的\lib中能被虚拟机识别的类库(比如rt.jar)加载到虚拟机内存中
2.7.1 类加载方案 原理:基于类加载器, DexClassLoader, 修改dexElements元素的位置实现热修复; 流程: 1. 获取当前应用的ClassLoader, 即BaseDexClassLoader, 2. 通过反射获取DexPathList属性对象PathList, 3. 通过P...
2.8.1基础用法 定义接口
2.9.1 异常捕获 Thread#setDefaultUncaughtExceptionHandler(), 类方法 Thread#setUncaughtExceptionHandler, 实例方法 备注: 未try, catch的异常, 即uncaught的情况下, UncaughtExcept...
如何分析ANR的trace
2.10.1 HashMap put() putVal() 无碰撞, 插入操作 碰撞 hash & key一致, 覆盖操作 p.next找...
2.13.1 SPI SerivceLoader#load() -> LazyIterator#hasNext() -> Classloader#getSystemResource查找META-INF/services/目录下的Java文件 -> ServiceLoader#par...
2.14.1 MVC & MVP & MVVM MVC Controller - 转发请求, 处理请求, 控制View & Model, Android上对应Activity, 处理数据、业务和UI View - 展示 & 交互, Andro...
2.15.1 观察者模式 Observable(被观察者) Observer(观察者) subscribe(订阅)、(事件) onComplete(), 事件队列结束 onNext()发事件, 需要触发onComplete() onError(), 事件队列异常
基础语法 定义函数
2.13.1 BlockCanary Looper#loop(), 主线程分发处理消息, 前后都会打印日志
2.13.1 IO Canary 流程图 找到Hook函数, 通过PLT Hook方案 (ELF Hook方案), hook掉posix的open、read、write、close函数
2.18.1 动态代理
2.13.1 AspectJ Join Points(程序中的关键函数或代码段) | Join Points | 说明 | | —————– | ——– | | method call | 函数调用, 调用的地方 | | method execution | 函数执行...
2.13.1 VirtualAPK 框架架构图(来自官网)
2.13.1 Drawable加载流程 Context#getResource().getDrawable(R.xxx.xxx) ComtextImpl#getResource - > ResourcesManager#getResource -> ResourcesMan...
2.22.1 ImageLoader 架构图(引用自Code KK)
2.23.1 架构图(引用自CodeKK)
2.22.1 okhttp使用 ```java OkHttpClient client = new OkHttpClient();
2.22.1 Glide
PLT Hook - Android Native Hook IO Canary使用的方案, 当动态链接的ELF程序里调用共享库的函数时, 第一次调用先到PLT表查找, PLT表中再跳到GOT表获得该函数的地址, 最终通过_dl_runtime_resolve获得函数的实际地址, PLT Hook通过直接修改GO...
待完善
待完善
2.29.1 gradle project, gradle待编译过程即project task, project包含一系列task, 如Java源码编译等 task的依赖关系, 定义task, 并指定assemble依赖于task xxx, 当assemble执行时, 就会先处理t...
第2章-Java内存区域与内存溢出异常
2.31.1 编译流程原理 MultiDexTransform(gradle中将multiDexEnabled设置为true, 则执行)
2.32.1 启动流程(注册监听) 创建ViewRootImpl
2.33.1 Camera详解 打开Camera
2.34.1 Java基础总结 String、StringBuffer、StringBuilder区别 String字符常量, 不可变的好处, 线程安全, 保证安全访问 StringBuffer、StringBuilder字符变量; StringBuffer优势在#appe...
待完成
第3章-对象的共享 3.1 可见性 只要有数据在多个线程之间共享, 就使用正确的同步 3.1.4 Volatile变量 volatile变量的典型用法, 检查某个状态标记以判断是否退出循环, vlatile boolean asleep; wh...
2.38.1 synchronized实现原理 实现原理 同步方法, 锁的是实例对象, 即对象锁, 方法表中的ACC_SYNCHRONIZED字段标识, 并使用该方法的对象在JVM内部对象表示的Klass作为锁对象 静态同步方法, 锁的是类对象, 即类锁, 方法表中的ACC...
2.39.1 启动加速 冷启动(App在设备刚启动或者应用被kill后首次启动即冷启动) 冷启动的开始, 系统会执行以下三个任务 加载启动App 启动后显示空白window 创建app的process ...
2.40.1 Linux线程优先级 Linux进程优先级 Linux进程优先级图 来源于杂谈Android线程优先级
2.41.1 wait() & notify()
对象通用方法 覆盖equals方法的类必须覆盖hashcode方法, 否则违反Object#hashCode的通用约定, 导致该类无法结合基于散列的集合正常运作
Android的匿名共享内存 Android可以使用Linux的一切IPC通信方式,包括共享内存,不过Android主要使用的方式是匿名共享内存Ashmem(Anonymous Shared Memory), MemoryFile是Android为匿名共享内存而封装的一个对象,这里通过使用MemoryFil...
引入泛型 类型安全 泛型主要目标是提高Java程序的类型安全 编译器可检查出因Java类型不正确导致的ClassCastException异常 符合越早出错代价越小原则 消除强制类型转换 直接得到目标类型, 消除许多强制...
反射与RRTI 反射, 即提供运行时获取类信息, 调用方法等能力, 提供动态化功能; 可用于hook, 动态代理, 依赖注入等技术 RRTI(Run-Time Type Identification)运行时类型识别, 作用是运行时识别一个对象的类型和类信息; 1). 传统的”RRTI”,它假定我们在编译...
方法调用 方法调用即确定调用方法的版本, 一切方法调用在Class文件存储都是符号引用; 而直接引用则是方法实际内存地址
启用ARCore 向manifest添加AR必备或AR可选条目 AR可选应用(包含可选AR功能)
自动内存管理 第2章 Java内存区域与内存溢出异常 2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 2.2.1 程序计数器 程序计数器(Program Counter Register)是当前线程所执行的字节码的行号指示器 ...