自定义博客皮肤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学习之路,总结笔记分享

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

原创 Android进程间通信之一:Binder机制学习

Binder机制学习Binder驱动Binder核心APILinux 使用两级保护机制:0 级供系统内核使用,3 级供用户程序使用。Linux 下的传统 IPC 通信原理Linux 下的传统 IPC 通信原理Binder通信过程ServiceManager进程启动MMAPBinder驱动binder驱动在以misc设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap)

2021-08-17 20:36:10 1365 9

原创 JS学习笔记

JS学习笔记js和java的异同点变量声明函数声明js中的变量提升和函数提升为什么有变量提升总结js和java的异同点首先,js的语法和kottlin的语法有些相似。比如var,方法声明用 function 方法名称 (参数名称...){ //方法内部逻辑 } 还有变量类型声明 :数据类型 : 变量名=值区别:一:js的数据类型和java类似。只不过js中的数据类型number将java中的int,double,float整合了。 二:js中可以不用声明变量

2021-03-18 19:57:11 4702 19

原创 2022年终总结-两年Androider的成长之路

半年里收获的一些技术动态技术(热修复,插件化的原理)图形渲染&opengl渲染专栏设计模式四大组件启动流程计算机网络相关知识计算机网络gradle的生命周期和可以新增简单task逻辑Gradle计算机组成原理计算机科学并发&多线程Android源码系列计算机网络安卓开发必会的一些操作系统知识(妄想学懂时间成本太高,非科班加上时间不够)数据结构(这个一定要开始看了)继续加强设计模式方面的能力关注性能方面的知识。

2022-12-22 15:19:55 1417 2

原创 2022-年终总结

后半年语雀知识库更新总字数:250154可以看到我这后半年的时间主要是用于泡在提升通用力上了,技术方面的提升几乎也没有最近这一个月才开始拾起来。找工作得话,如果大厂不好面或者进不去,最好找大厂下面的合资公司或者子公司,这样大厂的学习平台你是可以白嫖到的,大厂的学习平台都会花钱请很厉害的大咖来内部分享,我觉得这是一个不错的成长机会。

2022-12-16 00:13:06 193

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

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

2022-08-18 17:11:40 153

原创 Google I/O大会:Android 13

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

2022-05-13 08:00:00 145

原创 Google IO ——饭后小菜

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

2022-05-12 14:47:34 433

原创 Jetpack Room使用

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

2022-05-08 17:51:00 1034

原创 JetPack组件学习ViewModel

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

2022-05-08 16:56:21 283

原创 聊聊Kotlin中的元编程

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

2022-04-23 20:34:01 1577 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 372

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

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

2022-04-21 20:59:00 275

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

原创 记一次谈论心得

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

2022-04-21 20:49:44 2069

原创 Kotlin的扩展函数知识点

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

2022-04-20 00:55:43 2364

原创 内存泄漏那些事

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

2022-04-15 10:15:00 186

原创 引用那些事

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

2022-04-15 09:00:00 102

原创 内存分配管理之Largeobjectspace

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

2022-04-15 08:15:00 439 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 138

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

原创 锁的粗化和细化

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

2022-04-15 02:15:00 158

原创 分享一波学习方向

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

2022-04-15 00:45:00 48

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

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

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

原创 Android指纹解锁源码分析

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

2022-04-14 21:00:00 435

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

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

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

原创 浅析ThreadList的runcheckpoint方法

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

2022-04-14 08:00:00 180 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 304 1

原创 Choreographer响应Vsync信号流程

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

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

原创 关于volitile相关知识

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

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

原创 BaseDexClassLoader那些事

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

2022-04-14 00:30:00 136

原创 2021年终总结

技术写作经历刚开始写博客是为了记录bug,后来在学习的过程中记笔记的时候想到这些东西应该作为我的一部分陪伴在我身边见证我的成长,所以现在我已经是掘友了。更多的是为了记录自己的成长,不同阶段对一个技术点的不同理解,挺有趣,所以就记录了。我的经历去年九月份毕业,2021年伊始是我毕业的第三个月,到现在已经工作一年零三个月了。这段时间我经历的,感受的,看到的,听到的太多太多,对比一年前的自己我发现这一年我变成了另外“一个人”。那是我第一次离开我们那个城市,也是我第一次去了北京。学习经历高中毕业后没

2022-04-13 18:12:48 590 6

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

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

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

原创 学习笔记:插件化资源解决

一,资源获取getResource传入R.资源名称,通过资源名称可以找到对应的资源ID(通过R.java文件保证),之后AssetManager通过资源ID找到对应的资源文件名称(通过arsc文件保证)二,资源冲突:插件和宿主使用aapt打包资源,aapt生成R和arsc文件是根据前缀信息(在aapt逻辑中apk默认为0X71)和资源顺序来进行命名的因此会出现同一个资源ID在插件和宿主中都有对应的资源文件系统会出错。因此我们需要修改前缀即可保证,修改哪些前缀信息呢:解决方案概述根据上面的原理

2022-03-29 00:00:00 210

原创 学习笔记:插件化Activity

四大组件之Activity:名词解释AMS:AMS Binder对象AMN:app中获取AMS代理的对象ATP:ApplicationThreadProxy用于AMS和APP通信,AT的代理对象APT:ApplicationThread APP中的Binder对象。APT中会利用mh这个Handler发送消息做对应处理AT:APT会调用AT得方法,AT中给mh发消息mh:App的Handler,用于接受处理AMS等系统服务发送的消息处理原始流程startActivity交互过程如下:Ap

2022-03-28 23:45:00 170

原创 个人学习笔记:事件分发和启动Activity

AndroidView展示及事件分发wsm端流程梳理对于init,zygote,systemserver进程启动可以自行搜索资料网上有很多讲这块启动app进程:当启动四大组件,对应的应用进程没有启动的时候。AMS会利用socket和Zygote进程通信并指定fork出来的进程执行某个类的main函数(对于Zygote来说是ZygoteInit的main函数,对于systemServer进程来说是SyatemServer的main函数,应用进程则是ActivityThread的main函数)。如果是

2022-03-27 22:24:03 2230

原创 记一次优化经历杂谈

基于Android平台的编译优化方案。由于车机芯片,硬件方面等原因..应用启动,运行速度包括性能方面并不是很好达到厂商的要求,于是急需扩展Android原有编译优化策略,增加编译等级优化等措施来优化。

2022-03-18 00:22:42 2687 11

原创 并发编程基础ReentrantLock源码分析

//Note1:(双向链表。初始的时候head和tail都指向Null,之后添加新节点的时候会创建一个空Node,head和tail都指向这个空Node代表初始化完成。尾插法入队通过移动尾结点tail往前移动,出队通过移动head节点head节点往前移动。当Head节点和tail指向同一个Node时代表没有阻塞队列中没有等待的线程)//之后唤醒的时候也会通过tail尾结点一直像后遍历拿到真正处于等待状态的Node线程,然后通过LockSupport提供的Unpark指定唤醒Node线程;// 阻塞的时候

2022-02-16 22:40:12 1325 27

原创 JAVA相关编译知识

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

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

空空如也

空空如也

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

TA关注的人

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