
笔记
文章平均质量分 81
~~1112233
这个作者很懒,什么都没留下…
展开
-
Jetpack Room使用
Room使用回顾数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问注解说明:@Enity 作用于Class上,表示创建一张表记录该Class,Class内部属性使用@ColumnInfo声明该列名字和Type@Dao 作用于Interface,该interface主要是提供访问表进行增删改查的接口。使用对应增删改查注解标识方法@Database 声明数据库(需为abstract),该注解属性entities需声明该数据库中的所有表,原创 2022-05-08 17:51:00 · 1351 阅读 · 0 评论 -
JetPack组件学习ViewModel
ViewModel的使用1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中class MyViewModel : ViewModel() { //共享数据的核心在于拿到同一个LiveData实例,也就是拿到同一个ViewModel实例,其保存在ViewModelStore中 //而ViewModelStore是Activity/Fragment提供的(做了屏幕转换的恢复处理,ViewModelStor原创 2022-05-08 16:56:21 · 619 阅读 · 0 评论 -
聊聊Kotlin中的元编程
背景首先还是来说下为什么出现元编程?一个技术的出现肯定是不满足现状,那么元编程的出现是为了解决什么问题呢?举一个栗子,比如我们需要获取某个类的属性进行赋值取值或者获取函数信息进行调用时,我们当然可以编写代码以让外界访问这些数据,但是这样做容易出错而且特别麻烦,这个时候我们可以想到利用反射也可以达到同样的效果。对吧,获取类变量,函数信息这看起来就是反射可以做到的事情,所以其实反射也属于元编程范畴。什么是元数据顾名思义,元数据和元注解一个道理,元注解是标记注解的注解,元数据自然就是描述数据的数据,这个听原创 2022-04-23 20:34:01 · 2592 阅读 · 2 评论 -
聊聊Kotlin中的lambda
聊聊Kotlin中的lambda本质kotlin中的lambda使用创建类和调用类实现。实现原理将lambda定义的方法变成一个function类,其invoke方法体内容也就是lambda的方法体。在lambda执行的时候会创建这个function类再调用其invoke方法实现。代码演示fun main(args: Array<String>) { foo { println("dive into Kotlin...") }原创 2022-04-22 16:27:26 · 1116 阅读 · 0 评论 -
Kotlin的扩展函数知识点
为什么需要扩展一个新特性的出现必然是为了解决之前遗留的开发问题和提升目前开发效率。扩展函数也是如此。首先来介绍下OOP:开放封闭原则。软件应该是可扩展,而不可修改的。也就是对扩展开放,对修改封闭举个栗子:当某个三方库的功能无法满足现有业务时需要新增功能时。最简单的做法就是直接对库源码修改,但是这样违反了开放封闭原则:对源码修改。更合理的方案是依靠扩展。Kotlin的扩展函数很显然能够优雅的解决这种问题。扩展函数是什么首先来看下他的使用:fun MutableList<Int>原创 2022-04-20 00:55:43 · 3822 阅读 · 0 评论 -
锁的粗化和细化
首先看下结构Mark Word结构标志位无锁标志为01。轻量级所标志位00。重量级锁10锁粗化轻量级锁指向当前程序调用栈帧中的lock record锁记录空间 。当锁的对象没有被锁过。流程第一次在当前线程的栈帧中创建一个空间lock record用来记录mark word对象头并通过cas操作(01旧值 00新值)如果cas操作成功表示还是无锁状态并且将对象的mark对象头指向线程中的lockrecord空间,如果操作失败则说明已经是轻量级锁了。当操作失败时会进行检查对象的markwor原创 2022-04-15 02:15:00 · 484 阅读 · 0 评论 -
内存泄漏那些事
最近在做内存优化方面的需求,总结出了一些常见的问题,之后会一直更新并记录,希望读者也可以进行补充,在评论区可进行补充~~定义定义:程序分配的堆内存中由于某种原因造成无法及时释放某些对象,造成内存泄漏,内存泄漏多了就容易造成内存溢出哪些情况会出现内存泄漏1.集合造成内存泄漏的原因:集合释放掉了,但时集合中还持有某些对象的引用,造成这些引用不能被及时回收解决方法:持有的对象引用和自身都需要释放资源2. 匿名内部类|非静态内部类造成内存泄漏的原因:默认情况下非静态内部类持有外部类对象的引用,当程原创 2022-04-15 10:15:00 · 1504 阅读 · 0 评论 -
引用那些事
普通对象普通对象在标记为垃圾时。会把他添加到一个队列中,然后唤醒一个专门用于调用finazlly的damen守护线程去掉用队列里面对象的finazlly函数。下一次垃圾回收时如果还在队列中则直接释放这个对象的内存空间。如果finazlly中更改了这个对象的引用关系即他被别人引用了那么这时候就不会释放它了,不过下一次再发生gc时不把他添加队列里了直接进行清除ps:所以finazlly方法更像是一次死亡前的讣告和binder的死亡监听很像。在binder的死亡监听中可以进行再次启动或绑定服务,finaz原创 2022-04-15 09:00:00 · 225 阅读 · 0 评论 -
Kotlin之DataClass学习
数据类 dataclass:顾名思义数据类只应关心data(和具体行为解耦)。好处不必像java中的javabean繁琐的写set,get,equal,hashcode方法,由Kotlin编译器自动生成。特性:1.主构造函数中的参数必须声明var或val,理解:需要将参数作为这个类的变量2.主构造函数中的参数会按照声明顺序提供commentnN方法。也可以自定义需加operta关键字,从构造函数不会生成commentn方法。作用:将类属性提取变得更加方便,本质commentn函数按照参数顺序原创 2022-04-15 00:30:00 · 2962 阅读 · 0 评论 -
内存分配管理之Largeobjectspace
什么是Largeobjectspace该空间是专门针对所谓需要大内存对象的内存分配器判定规则1.如果分配一个对象的内存超出了某个值就会吧这个对象放到这块空间中,可以理解为针对大对象的分配单独创建了一个largeobjectspace空间进行分配内存。2.对象的数据类型是有限制的:必须是基础类型的数组,或者是string类对象。不同于其他分配算法。这个largeobjectspace的分配内存的方式是进行直接mmap映射一块操作系统的内存进行分配内存。一个对象对应的就是一块mmap的内存其他分配算原创 2022-04-15 08:15:00 · 666 阅读 · 1 评论 -
获取资源那些事
查找资源过程先从R.java中找到对应ID所对应的资源名称,再去arsc后缀文件中查找对应的资源路径利用AssetManager在native层打开该资源文件大致链路:Context的getResource—》Resource----》AssetManager—》Native层AssetManager打开资源文件Zygote替你做的事zygote会进行调用prepareresource方法,这个方法创建了Resource中的msystem(代表系统资源)和Assetmanager中的mAsset(原创 2022-04-15 07:30:00 · 341 阅读 · 0 评论 -
Java Mq和Native Mq之间的关系
相关名词mq:消息队列MessageQuene的缩写流程java的mq初始化的时候会先初始化native的mq再native的mq中又创建了native层的looper。同时native层把自己mq传入到了java中mq的mptr对象java消息队列中调用nativepollonce(javaMq中的next方法)最终会调用到mtpr的nativepollonce(mtpr是native层的消息队列对象)该方法用于等待一个java层的消息来临native的mq的nativepollonce会调用l原创 2022-04-14 23:00:00 · 342 阅读 · 0 评论 -
Binder交互浅析
相关知识1.binder系统中里面了一个资源池用于存放bbinder。2.客户端会根据索引在binder系统中查找到对应的bbinder,接着构造bbinder对应的bpbinder。3.bpbinder底层会调用ipcthreadstate的talkwithdrive来调用到对应的bbinder。binder处理完成后再回调过去。4.其实servicemsnsger也是普通的service,只不过他在启动的时候通过iotcl的形式告诉了自己指定的hsndler是0。这样binder系统中0就是对应原创 2022-04-14 22:30:00 · 327 阅读 · 0 评论 -
Android指纹解锁源码分析
systemServer进程会在ZygoteInit中进行创建,而ZygoteInit是Zygote进程启动的。在systemServer进程的run方法中会启动重要服务其中就包括指纹解锁相对应的服务。指纹解锁需要和Hal层进行交互,并对上层framewrok提供接口以实现解锁功能整体流程可以大致分为:1.SystemServer中调用startOtherService方法根据设备支持的功能启动对应的服务该例中如果设备支持指纹解锁就执行接下来的方法:启动指纹解锁对应的Service,也就是Fin原创 2022-04-14 21:00:00 · 1864 阅读 · 0 评论 -
建立java和jin函数之间的关系
如何建立java和jin函数之间的关系:1.静态注册:借助于javah工具,该工具会在编译时对每个class文件中声明了native的函数输出一份。h头文件,在头文件中定义了这些函数对应的jni层的函数指针。流程:当java调用native的函数时,会在头文件中寻找对应的jni函数指针,然后进行保存起来映射关系。也就是编译为每个class生产一份h头文件,头文件中存储对应java方法的native函数指针,在运行时调用jni函数时,进行查找对应的函数指针运行,接着进行关系映射缓存起来下次进来找到对原创 2022-04-14 08:30:00 · 430 阅读 · 1 评论 -
浅析ThreadList的runcheckpoint方法
作用threadlist的runcheckpoint方法作用是让所有线程都执行制定的任务。threadlist的dump方法有两种实现方式:1。打印调用者线程的栈帧情况2。打印指定thread线程的栈帧情况。根据上面两个函数相信大家可以猜到可以做哪些骚操作了。接下来继续解释函数实现runcheckpoint函数实现:1。针对已经在运行的线程只需对这个线程设置kcheckpoint标志位,运行中的线程检查到kcheckpoint会自动打印当前线程的信息。而针对不在运行的线程需要先设置suspen原创 2022-04-14 08:00:00 · 414 阅读 · 2 评论 -
Vsync信号和View绘制流程的关系
VSync信号vsync是有两个信号的,一个是vsync-app用于生成当前帧的数据;(CPU计算和GPU渲染)一个用于消费数据(合成图像到Display上,vsync-surface) 。三缓冲机制:CPU缓存为了防止GPU计算超时,提前生成数据 GPU:将数据放到缓冲池防止屏幕渲染超时一,vsync信号来源vsync可以由底层HardWare提供经由Display发送,当底层Hardware不能提供时也会发送vsync信号到Display。vsync屏蔽了底层Hal,使得没有Vsync原创 2022-04-14 07:00:00 · 960 阅读 · 1 评论 -
Choreographer响应Vsync信号流程
Choreographer中postFrameCallback的调用时机当下一个Vsync信号来临时,会按照Type取出CallbackQuenes中的链表里面存储的CallBackRecord进行遍历其run方法。那么什么时机往这个队列中添加回调呢?在ViewRootImpl中(WMS端收到NativeInputQuene消息回调InputChannel调用到APP端进行ViewRoot分发处理)会调用postFrameCallback方法,这个方法会传入一个FrameCALLback,并将默认使用原创 2022-04-14 02:00:00 · 904 阅读 · 2 评论 -
关于volitile相关知识
volitile重排序相关解释对volitile变量的写入操作之后要保证不能和读之后的读操作重排序。这是内存重排序的一种解决方案happenbeforr中规定的底层通过刚开始讲的内存屏障保证不会重排序。volitile是通过happenbefore原则保证的。普通变量的写入和读取再各个线程都有自己的缓存不能够及时同步到主存中,因此多线程下会出现问题,单线程不会出现问题是因为if-else-serial原则保障在单线程环境下即使重排序也不会改变运行的结果;但是它并没有规定多线程环境下。重排序分类后来原创 2022-04-14 01:00:00 · 667 阅读 · 2 评论 -
JAVA相关编译知识
JAVA相关编译知识总览语言进化史整体流程编译器整体流程词法分析语法分析语义分析中间代码生成目标代码生成器代码优化编译相关知识编译种类热点探测技术编译什么什么时候进行检测,什么时候提交编译请求?收到编译请求,之后的操作?优化措施总结总览语言进化史整体流程下面这张图是高级语言经过哪些步骤最终才能在机器平台上运行的整体流程图。编译器整体流程前端编译可以简单理解为就是将java文件转换为class字节码文件;后端编译可以理解为clas字节码转换为目标机器平台的机器语言。起始阶段刚开始的字符流原创 2022-02-04 20:17:17 · 1716 阅读 · 1 评论 -
JVM之类加载阶段详解
JVM之类加载阶段详解类加载阶段总览加载获取二进制流将字节流转换为运行时数据结构堆中生成Class对象特殊连接验证准备解析名词解释何时进行解析哪些类型初始化使用卸载类加载阶段总览注意:这些阶段的顺序虽然是确定的,但是这些阶段通常都是互相交叉混合进行的,会在一个阶段中调用,激活另外一个阶段执行加载加载阶段顾名思义,也就是Class文件所代表的的 类/接口 被加载到虚拟机中。那么什么时候(类加载的时机), 谁来加载(哪个类加载器),将哪个Class文件(Class的名称是什么)到虚拟机中呢?1原创 2022-01-29 18:18:46 · 7801 阅读 · 1 评论 -
静态链接,静态分派,动态链接
静态链接:编译时即可确认要转换成哪个直接引用。编译的时候由于能够确定变量的静态类型,所以编译时可知,也就是为什么叫做静态链接的原因。接下来解释下为什么能够确定变量的静态类型并且是怎么确定的。首先明确一个点:静态类型和实际类型都是可以改变的。唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明)。静态链接发生的阶段其实也可以分为:静态分派和解析阶段原创 2022-04-08 18:18:55 · 436 阅读 · 1 评论 -
JVM之Class结构属性表
JVM之Class结构属性表概述属性表属性总览属性结构常见属性CodeExceptionsLineNumberTableLocalVariableTable,LocalVariableTypeTableConstantValueDeprecated及Synthetic属性StackMapTableMethodParameters概述上篇文章提到过在Class结构表中,属性表存在于Class表,字段表和方法表中,是为了描述额外的信息。属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我原创 2022-01-10 22:00:00 · 2009 阅读 · 6 评论 -
JVM之Class结构速记
JVM之Class结构详解Class文件规范Class文件大结构总览magicClass文件版本号Constant_Pool常量池各个表对应的含义反编译代码示例常量池中常量表对应数据结构内容access_flags访问标识class的继承实现关系字段表access_flags访问标识名称索引和描述符的索引存储额外信息方法表access_flags访问标识名称索引和描述符的索引存储额外信息属性表Class文件规范根据《JAVA虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储原创 2022-01-05 23:02:17 · 1479 阅读 · 3 评论 -
JVM之历代垃圾收集器详解
JVM之历代垃圾收集器讲解总览分类并行和并发年轻代垃圾回收器Serial收集器特点优点缺点PartNew收集器特点:Parallel Scavenge收集器特点老年代垃圾回收器Serial Old收集器Parallel Old收集器组合CMS收集器特点工作流程1.初始标记2.并发标记3.重新标记4.并发清除G1 收集器特点实现优点缺点工作流程总结总览分类一,采用分代理念的垃圾回收器:1.年轻代:SerialPartNewParallel Scavenge2.老年代:CMSSerial O原创 2021-12-25 20:10:13 · 1927 阅读 · 6 评论 -
JVM之关于GC的扩展知识
关于GC的扩展知识1.GC Roots遍历提升效率以往做法可优化地方以及优化原理2.提升了GC Roots遍历效率却不知道怎么安插?3.safePoint我又该放到哪里4.如何实现STW?优化5.一个"小Bug":线程如果不执行呢?6. GC Roots会随着运行时间变长而增加吗?基础知识介绍记忆集最常用的精度本章主要是对上一篇文章讲的垃圾回收机制的扩展,垃圾回收其实本身是有很多可以优化的点的,本章就进行对这些优化点进行介绍。1.GC Roots遍历提升效率以往做法当垃圾回收器线程进行GC时,第一原创 2021-12-22 21:34:18 · 1341 阅读 · 13 评论 -
JVM之垃圾回收算法详解
JVM之垃圾回收算法详解现有的垃圾回收算法分类垃圾收集器的设计原则标记-清除算法缺点标记-复制算法“Apple回收策略”缺点标记-整理算法缺点总结现有的垃圾回收算法分类根据如何判定对象是垃圾,垃圾回收算法分为两类:1、引用计数式垃圾收集(判定垃圾是通过引用计数器)别名:直接垃圾收集2、追踪式垃圾收集(判定垃圾是通过GC Roots)别名:间接垃圾收集主流虚拟机采用的是第二种追踪式垃圾收集,所以本文讲解第二种垃圾收集的算法垃圾收集器的设计原则根据两个分代假说:1.绝大部分对象是熬不过第一原创 2021-12-20 23:04:00 · 4445 阅读 · 1 评论 -
JVM之对象创建流程及对象内存布局
JVM之内存区域及对象创建流程对象创建流程分配内存并发解决方法设置初始值在程序中可能会出现的问题设置对象头对象头数据结构Class文件的<.init>对象的内存布局对象创建流程当JAVA虚拟机碰到new字节码指令时,首先会去常量池中查找是否有对应的类名(也就是去查找是否有对应的符号引用),然后去检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有会先进行刚才说的类加载过程。当类加载后,虚拟机将会为其分配内存,为其分配的内存大小是可知的,下面的内存布局将会讲解为什么是可知的。分原创 2021-12-19 18:42:29 · 1658 阅读 · 4 评论 -
JVM之认识程序运行本质
JVM之内存结构模型详解JVM是什么汇编语言高级语言虚拟机是什么java代码如何转换成机器识别的代码JVM是什么刚入门的时候老师教我们写代码是这样的:写JAVA文件然后用javac命令编译成class文件运行即可。随着学习的不断拓展和工作中业务代码的积累,对于“为什么会这样”的困惑越来越多,于是写了这篇博客~。计算机能看懂的是二进制,也就是0和1。那么我们的JAVA程序和计算机又有什么关联呢?他们是怎么联系到一起的?汇编语言计算机只能识别0和1,人们发现利用0和1可以做很多事情:比如可原创 2021-12-17 12:38:09 · 1099 阅读 · 4 评论 -
JVM之JVM初探
JVM初探JVM执行文件类装入子系统执行引擎垃圾回收器堆中的内存回收方法区中的内存回收JVM执行文件JVM执行的文件为class文件,这个执行文件是什么意思呢,就是虚拟机能够识别的文件,类加载器加载链接初始化后将数据保存在JVM运行时数据区中的文件。类装入子系统JVM的类加载器为ClassLoader采用双亲委派模型机制进行加载类。双亲委派模型机制:根据父子关系一直往顶层找是否被其他父级parent类加载器加载过,如果找到加载过,返回;如果没有找到,在返回一个一个查找是否有加载的权限,如果原创 2021-12-14 00:05:51 · 2008 阅读 · 5 评论 -
JVM之前世今生实现讲解
JVM之前世今生实现讲解前世今生虚拟机始祖JDK1.0Classic虚拟机JDK1.2Exact VMHotSpot VM(第一)特点天下第二:BEA JRockit/ IBM J9 VMBEA JRockit VM研究方向后续IBM J9 VM研究方向优点后续专有虚拟机VEA Liquid VM简介后续Zing优点前世今生首先放出一张图,这张图是《深入理解JAVA虚拟机》中的配图,本文也是根据这本书进行的记录。虚拟机始祖虚拟机始祖——Classic/Exact VMJDK1.0虚拟机Vir原创 2021-12-09 23:26:03 · 1493 阅读 · 0 评论 -
协程原理再议
协程再议关于协程的一些理解基础框架层源码分析实战分析反编译后代码分析关于协程的一些理解协程挂起让异步代码可以像同步代码一样调用,但其本质还是同步,即协程体中的代码其实是同步。因为协程也只是对线程池的封装,所以需要了解些线程的一些知识。线程本身已经有的协程也会有,但是协程有的线程不一定有编译器会为每一个挂起函数生成一个匿名内部类,其继承SuspendLabmba类重写其invokeSuspend方法,这个方法里面即为协程体的代码【大致内容请先了解】编译器会对协程体中的挂起函数和普通函数原创 2021-12-03 19:58:47 · 1323 阅读 · 30 评论 -
协程理解心得-初探
这篇文章是我个人对协程的理解,在探索的过程当中写下的体会,这篇博客会一直有改动(对协程的理解更加深入,排版比较丑,后期博客更新完会调整排版)协程一,协程作用域Scope二,协程的挂起和恢复三,我是谁?【协程】一,协程作用域Scope属性:协程作用域里面就一个变量context协程的上下文,协程上下文是一组符加到协程中的对象,它是各种不同元素的"集合",可以包括协程执行的主元素Job、负责协程线程策略的元素CoroutineDispatcher、协程标识和名称CoroutineName、处理未被捕原创 2021-11-18 22:50:15 · 3837 阅读 · 0 评论 -
Android 四大组件之一:BroadCastReceiver动态注册广播流程
动态注册广播流程动态注册广播流程广播发送流程动态注册广播流程1.在Activity中动态注册广播时,调用registerReceiver方法,会调用到ContextWrapper的registerReceiver方法:2.这个方法内部,mBase其实就是一个ContextImpl类型的对象,所以会执行ContextImpl类的registerReceiver方法经过registerReceiver重载最终会调用到registerReceiverInternal这个方法中,在这个方法中会先将s原创 2021-10-05 12:36:13 · 6687 阅读 · 0 评论 -
AndroidV1,V2,V3签名原理详解
AndroidV1,V2,V3签名原理及APK加密技术原理背景介绍不同的签名版本之间的区别V1采用方案V2采用方案V3采用方案背景介绍一,Android打包完APK都要进行签名才能够安装到手机上,这是因为在安装的时候系统会进行检测,平时我们直接点AS里面那个绿色的运行按钮也能够直接安装到手机上,这是因为其实它也进行了签名,只不过AS自动帮我们做了这个操作有个默认的签名。二,签完名后的APK安装包安装到手机上时,系统会保存我们这个签名文件,之后启动我们的APP的时候根据使用的签名版本(V1,V2,V3)原创 2021-10-02 18:10:37 · 7111 阅读 · 1 评论 -
Service中是如何产生ANR的?
Service中是如何产生ANR的?Service中是如何产生ANR的?Service启动流程遗留问题:Service中是如何产生ANR的?Service有两种,前台服务超时为SERVICE_TIMEOUT=20S后台服务超时为SERVICE_BACKGROUD_TIMEOUT=200S根据变量ProcessRecord.execServicesFg来决定是前台服务还是后台服务Service TimeOut是位于“ActivityManager”线程中的AMS.MainHandler收到SERVI原创 2021-08-28 12:43:18 · 1326 阅读 · 0 评论