自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

北洋的博客

记录Android学习之路,总结笔记分享

  • 博客(70)
  • 收藏
  • 关注

原创 JAVA相关编译知识

JAVA相关编译知识总览语言进化史整体流程编译器整体流程词法分析语法分析语义分析中间代码生成目标代码生成器代码优化编译相关知识编译种类热点探测技术编译什么什么时候进行检测,什么时候提交编译请求?收到编译请求,之后的操作?优化措施总结总览语言进化史整体流程下面这张图是高级语言经过哪些步骤最终才能在机器平台上运行的整体流程图。编译器整体流程前端编译可以简单理解为就是将java文件转换为class字节码文件;后端编译可以理解为clas字节码转换为目标机器平台的机器语言。起始阶段刚开始的字符流

2022-02-04 20:17:17 1669 1

原创 JVM之类加载阶段详解

JVM之类加载阶段详解类加载阶段总览加载获取二进制流将字节流转换为运行时数据结构堆中生成Class对象特殊连接验证准备解析名词解释何时进行解析哪些类型初始化使用卸载类加载阶段总览注意:这些阶段的顺序虽然是确定的,但是这些阶段通常都是互相交叉混合进行的,会在一个阶段中调用,激活另外一个阶段执行加载加载阶段顾名思义,也就是Class文件所代表的的 类/接口 被加载到虚拟机中。那么什么时候(类加载的时机), 谁来加载(哪个类加载器),将哪个Class文件(Class的名称是什么)到虚拟机中呢?1

2022-01-29 18:18:46 7652 1

原创 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 1437 3

原创 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 1292 13

原创 今日头条屏幕适配深度剖析

既然有了DP密度无关,为什么我们还需要今日头条的屏幕适配方案?

2024-06-22 16:17:38 1111

原创 关于二进制的表示,左移,运算的相关知识

左移 位数 可以理解为 扩大为原来的 进制数的 位数 次方 倍,比如二进制数左移一位是 扩大为原来的 2的1次方倍 也就是两倍,左移两位就是扩大为原来的2的2次方倍也就是四倍。在对比十进制数,10左移1位 就是100也就是10的1次方倍,左移两位也就是10的2次方倍也就是100。对照着十进制去理解二进制就会非常简单而且容易理解。

2024-01-19 17:38:34 968

原创 网卡:初始化,frame组装,网卡处理电信号过程

ip模块中存储的是一堆数字信号,网卡内部会把数字信号转换成电信号或者光信号在网线中传输。网卡只是一个硬件,需要驱动程序去操作他,计算机中已经把主流网卡的驱动程序(不只是网卡的,还有鼠标,键盘这些硬件都需要驱动程序去操作运行)内置到计算机中了。

2024-01-19 17:04:32 521

原创 借助GPT理解 “ Android中 点击弹框外部 取消弹框”

https://devv.ai/zh (AI浏览器),我一般是这两个结合起来用,我发现不对劲 理解不了的时候就用这个ai搜索引擎,他里面会给出一些搜索用到的资料链接。在平常的开发工作中 或 阅读技术博客/书籍 时,难免会遇到我们不懂的知识点,网络上搜索的资料 需要有准确性,系统性,可实操性。这样的资料查询很费时间且还不一定能找到,但是如果借助训练过的的gpt,就会省下大量的时间且学到的知识也是体系化的。优先用的是stackoverflow的资源,所以会比较准确一些。

2024-01-10 19:54:00 721

原创 KT中代理属性的实现及使用案例分析

普通的delegate代理属性get/set方法,可以看到类中会声明一个数组保存需要代理的所有KProperty字段信息(包含类名,字段名称,字段签名())PS:冷知识map也可以用于委托,只要有get/set方法就可以用作委托,只不过map的key是字段的名称,value才是真正的值,这个有点限制哈哈,但是如果想要自己实现map也可以如果有多个代理属性呢?

2023-02-07 15:03:12 334 2

原创 序列探究之延迟执行的奥秘

序列本质上也是集合,他是集合的封装,为集合提供了延迟执行的能力

2023-02-07 14:53:01 560 1

原创 委托类分析——委托类:Interface by 委托实现类;委托类(属性:委托实现类):Interface by 属性

最近再学习委托的时候有些绕,做个笔记分享一下吧,顺便把kotlin的属性,字段,主从构造还有委托的实现一起从编译后的java代码分析下属性就是带val、var修饰的字段如何理解呢?看下面val,var的分析这次先分析委托类的java代码实现,后续文章在分析委托属性的set/get方法如何进行委托已经编译后的Java代码分析(看了委托的基本原来和实现思路之后相信属性的委托更能看懂)都说组合优于继承,但是java并没有在语音层面直接提供委托的写法,kotlin不一样,语言本身就支持委托。

2023-02-02 16:07:57 507 3

原创 Gradle基础知识-Wrapper,Daeman;Groovy闭包语法

gradle本质就是一个bin脚本,分为window和unix。启动gradle:启动jvm加载lib所需的库

2022-08-18 17:11:40 320

原创 Google I/O大会:Android 13

3个体验升级的方向以智能手机为场景核心、 扩大智能终端的应用边界以及实现多设备间更好地协同。具体到系统体验层,安卓13将支持图标颜色随主题更换、为不同应用设定使用的语言、新的媒体中心界面等等,同时谷歌也推出了自家的钱包应用(Google Wallet)。升级内容谷歌优化了平板的安卓体验,通知栏面积变得更大,任务栏也得到了改进,时刻固定在平板底部。通过任务栏,你可以方便的分屏,拖动照片进行分享。谷歌地图、消息应用、音乐等等多有了全新设计,更加适合平板使用。而对于第三方应用,谷歌也表示,它们会

2022-05-13 08:00:00 317

原创 Google IO ——饭后小菜

Google预览AR眼镜Google发布会最后还预览Google正在开发中的AR眼镜,戴上以后可以实时显示对方讲话时的字幕,并且可以用作翻译使用。在谷歌展示之前,有报道称这款未命名的 AR 眼镜的早期构造类似于一副滑雪护目镜,这表明目前正在测试一个笨重的原型。如果谷歌计划减少头戴式可穿戴设备的体积以方便使用,没有任何消息,但就设计而言,这就是我们所拥有的全部信息。最早有传言称谷歌将在 2024 年推出,这些未命名的 AR 眼镜将由该公司定制的 SoC 驱动,就像 Pixel 系列一样。到目前为止

2022-05-12 14:47:34 716

原创 Jetpack Room使用

Room使用回顾数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问注解说明:@Enity 作用于Class上,表示创建一张表记录该Class,Class内部属性使用@ColumnInfo声明该列名字和Type@Dao 作用于Interface,该interface主要是提供访问表进行增删改查的接口。使用对应增删改查注解标识方法@Database 声明数据库(需为abstract),该注解属性entities需声明该数据库中的所有表,

2022-05-08 17:51:00 1310

原创 JetPack组件学习ViewModel

ViewModel的使用1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中class MyViewModel : ViewModel() { //共享数据的核心在于拿到同一个LiveData实例,也就是拿到同一个ViewModel实例,其保存在ViewModelStore中 //而ViewModelStore是Activity/Fragment提供的(做了屏幕转换的恢复处理,ViewModelStor

2022-05-08 16:56:21 569

原创 聊聊Kotlin中的元编程

背景首先还是来说下为什么出现元编程?一个技术的出现肯定是不满足现状,那么元编程的出现是为了解决什么问题呢?举一个栗子,比如我们需要获取某个类的属性进行赋值取值或者获取函数信息进行调用时,我们当然可以编写代码以让外界访问这些数据,但是这样做容易出错而且特别麻烦,这个时候我们可以想到利用反射也可以达到同样的效果。对吧,获取类变量,函数信息这看起来就是反射可以做到的事情,所以其实反射也属于元编程范畴。什么是元数据顾名思义,元数据和元注解一个道理,元注解是标记注解的注解,元数据自然就是描述数据的数据,这个听

2022-04-23 20:34:01 2512 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 1064

原创 仿Flow构建器创建数据流

前两篇文章讲了flow,collect和中间操作符map的实现原理及方式,但是仅仅是看还是有点头晕,不得不说这个函数式编程太绕了,所以现在让我们自己定义一个Flow数据流,也是仅实现上述三个方法的功能。第一步首先回顾下前面的知识点:flow提供的只是一个扩展函数返回的是一个保存了这个方法的类实例,并且该类提供emit方法以供flow中调用构建Flowflow方法object Flow { fun <T> flow(collect: Collector<T>..

2022-04-21 20:59:00 467

原创 Flow之map操作符

我们接着上文回忆一下:flow方法构建的是一个扩展函数collect作用是创建这个对象调用这个扩展函数。当调用emit方法时执行collect传进来的方法。操作符map:flow构建了一个FlowCollector的扩展函数并返回了一个SafeCollector对象。map方法中会将这个flow进行包装:public inline fun <T, R> Flow<T>.map(crossinline transform: suspend (value: T) -&

2022-04-21 20:58:18 826

原创 记一次谈论心得

前几天参加了掘金的经验复盘活动,得到了一次和郭老师1V1面试指导和职业规划的机会。文章链接:春招打卡活动链接,灰常感谢掘金给的这次机会~~郭老师分享了很多关于技术方面的学习经验和简历方面的一些建议,学到了很多故写下这篇文章来记录。简历方面专业技能专业技能不需要精确到技术实现,重点突出精通某项技术,其他体现我们的能力范围。着重的技术点体现也可以让面试官在问问题时有针对性,能够针对你所准备的去面试;同时能力范围方面也要体现出对未来技术的感知项目经历项目经历也不要太细,太细容易表现得像螺丝钉或

2022-04-21 20:49:44 2166

原创 Kotlin的扩展函数知识点

为什么需要扩展一个新特性的出现必然是为了解决之前遗留的开发问题和提升目前开发效率。扩展函数也是如此。首先来介绍下OOP:开放封闭原则。软件应该是可扩展,而不可修改的。也就是对扩展开放,对修改封闭举个栗子:当某个三方库的功能无法满足现有业务时需要新增功能时。最简单的做法就是直接对库源码修改,但是这样违反了开放封闭原则:对源码修改。更合理的方案是依靠扩展。Kotlin的扩展函数很显然能够优雅的解决这种问题。扩展函数是什么首先来看下他的使用:fun MutableList<Int&gt

2022-04-20 00:55:43 3767

原创 内存泄漏那些事

最近在做内存优化方面的需求,总结出了一些常见的问题,之后会一直更新并记录,希望读者也可以进行补充,在评论区可进行补充~~定义定义:程序分配的堆内存中由于某种原因造成无法及时释放某些对象,造成内存泄漏,内存泄漏多了就容易造成内存溢出哪些情况会出现内存泄漏1.集合造成内存泄漏的原因:集合释放掉了,但时集合中还持有某些对象的引用,造成这些引用不能被及时回收解决方法:持有的对象引用和自身都需要释放资源2. 匿名内部类|非静态内部类造成内存泄漏的原因:默认情况下非静态内部类持有外部类对象的引用,当程

2022-04-15 10:15:00 1456

原创 引用那些事

普通对象普通对象在标记为垃圾时。会把他添加到一个队列中,然后唤醒一个专门用于调用finazlly的damen守护线程去掉用队列里面对象的finazlly函数。下一次垃圾回收时如果还在队列中则直接释放这个对象的内存空间。如果finazlly中更改了这个对象的引用关系即他被别人引用了那么这时候就不会释放它了,不过下一次再发生gc时不把他添加队列里了直接进行清除ps:所以finazlly方法更像是一次死亡前的讣告和binder的死亡监听很像。在binder的死亡监听中可以进行再次启动或绑定服务,finaz

2022-04-15 09:00:00 198

原创 内存分配管理之Largeobjectspace

什么是Largeobjectspace该空间是专门针对所谓需要大内存对象的内存分配器判定规则1.如果分配一个对象的内存超出了某个值就会吧这个对象放到这块空间中,可以理解为针对大对象的分配单独创建了一个largeobjectspace空间进行分配内存。2.对象的数据类型是有限制的:必须是基础类型的数组,或者是string类对象。不同于其他分配算法。这个largeobjectspace的分配内存的方式是进行直接mmap映射一块操作系统的内存进行分配内存。一个对象对应的就是一块mmap的内存其他分配算

2022-04-15 08:15:00 637 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 313

原创 flow函数和collect函数浅析

flow方法:public fun <T> flow(@BuilderInference block:suspend FlowCollector<T>.() -> Unit):Flow<T> = SafeFlow(block)public interface FlowCollector<in T> { public suspend fun emit(value: T)}会将flow传入的方法封装成一个FlowCollector的扩

2022-04-15 06:00:00 1976

原创 锁的粗化和细化

首先看下结构Mark Word结构标志位无锁标志为01。轻量级所标志位00。重量级锁10锁粗化轻量级锁指向当前程序调用栈帧中的lock record锁记录空间 。当锁的对象没有被锁过。流程第一次在当前线程的栈帧中创建一个空间lock record用来记录mark word对象头并通过cas操作(01旧值 00新值)如果cas操作成功表示还是无锁状态并且将对象的mark对象头指向线程中的lockrecord空间,如果操作失败则说明已经是轻量级锁了。当操作失败时会进行检查对象的markwor

2022-04-15 02:15:00 455

原创 分享一波学习方向

什么是“好”的技术,为什么“火”前言:这个是个人观点,技术要用在合适的业务场景中才能体现出它的优势,而不是盲目的去学,去看解决现今开发的技术痛点协程回调地狱,切换线程等功能a()//耗时任务b()当两个方法a,b执行的代码块没有依赖关系时,执行耗时任务采用异步的方式来解决,通过开线程或者通过handler post一个Runnable来执行a方法这个耗时操作,b不需要等待a结束就可以直接运行。但是如果a和b是有依赖关系的,b方法需要用到a方法返回的数据进行处理,但是又为了不影响b之后

2022-04-15 00:45:00 135

原创 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 2879

原创 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 315

原创 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 303

原创 Android指纹解锁源码分析

systemServer进程会在ZygoteInit中进行创建,而ZygoteInit是Zygote进程启动的。在systemServer进程的run方法中会启动重要服务其中就包括指纹解锁相对应的服务。指纹解锁需要和Hal层进行交互,并对上层framewrok提供接口以实现解锁功能整体流程可以大致分为:1.SystemServer中调用startOtherService方法根据设备支持的功能启动对应的服务该例中如果设备支持指纹解锁就执行接下来的方法:启动指纹解锁对应的Service,也就是Fin

2022-04-14 21:00:00 1733

原创 建立java和jin函数之间的关系

如何建立java和jin函数之间的关系:1.静态注册:借助于javah工具,该工具会在编译时对每个class文件中声明了native的函数输出一份。h头文件,在头文件中定义了这些函数对应的jni层的函数指针。流程:当java调用native的函数时,会在头文件中寻找对应的jni函数指针,然后进行保存起来映射关系。也就是编译为每个class生产一份h头文件,头文件中存储对应java方法的native函数指针,在运行时调用jni函数时,进行查找对应的函数指针运行,接着进行关系映射缓存起来下次进来找到对

2022-04-14 08:30:00 372 1

原创 浅析ThreadList的runcheckpoint方法

作用threadlist的runcheckpoint方法作用是让所有线程都执行制定的任务。threadlist的dump方法有两种实现方式:1。打印调用者线程的栈帧情况2。打印指定thread线程的栈帧情况。根据上面两个函数相信大家可以猜到可以做哪些骚操作了。接下来继续解释函数实现runcheckpoint函数实现:1。针对已经在运行的线程只需对这个线程设置kcheckpoint标志位,运行中的线程检查到kcheckpoint会自动打印当前线程的信息。而针对不在运行的线程需要先设置suspen

2022-04-14 08:00:00 375 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 892 1

原创 Choreographer响应Vsync信号流程

Choreographer中postFrameCallback的调用时机当下一个Vsync信号来临时,会按照Type取出CallbackQuenes中的链表里面存储的CallBackRecord进行遍历其run方法。那么什么时机往这个队列中添加回调呢?在ViewRootImpl中(WMS端收到NativeInputQuene消息回调InputChannel调用到APP端进行ViewRoot分发处理)会调用postFrameCallback方法,这个方法会传入一个FrameCALLback,并将默认使用

2022-04-14 02:00:00 820 2

原创 关于volitile相关知识

volitile重排序相关解释对volitile变量的写入操作之后要保证不能和读之后的读操作重排序。这是内存重排序的一种解决方案happenbeforr中规定的底层通过刚开始讲的内存屏障保证不会重排序。volitile是通过happenbefore原则保证的。普通变量的写入和读取再各个线程都有自己的缓存不能够及时同步到主存中,因此多线程下会出现问题,单线程不会出现问题是因为if-else-serial原则保障在单线程环境下即使重排序也不会改变运行的结果;但是它并没有规定多线程环境下。重排序分类后来

2022-04-14 01:00:00 633 2

原创 BaseDexClassLoader那些事

一,BaseDexClassLoader是如何创建DexElements的?makeDexElements的实现细节:1.针对如何创建DexElements的,BaseDexClassLoader这个类有三种构造方法,只分析两个(因为另外一个只不过是其中一个的扩展,对于加载DexElements的方式并没有改变)。首先parent不能少,接下来的属性就是两种创建DexElements的不同方式,其中一个构造方法是传入bytes数组,另外两个是用的dexFilePath(除此之外构造方法还需要很多参数,

2022-04-14 00:30:00 360

原创 静态链接,静态分派,动态链接

静态链接:编译时即可确认要转换成哪个直接引用。编译的时候由于能够确定变量的静态类型,所以编译时可知,也就是为什么叫做静态链接的原因。接下来解释下为什么能够确定变量的静态类型并且是怎么确定的。首先明确一个点:静态类型和实际类型都是可以改变的。唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明)。静态链接发生的阶段其实也可以分为:静态分派和解析阶段

2022-04-08 18:18:55 391 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除