![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码解析
文章平均质量分 71
zhouzhihao_07
在郑州发展android,需要合作的联系吧。(有创意创业的,投资的都可以合作)
展开
-
Okhttp框架总结(1)
那么connection在timeout时间类是如果失效的呢,并且如果做到有效的对连接进行清除操作以确保性能和内存空间的充足。遍历connections缓存列表,当某个连接计数的次数小于限制的大小以及request的地址和缓存列表中此连接的地址完全匹配。在timeout空闲时间内,连接不会关闭,相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。在看ConnectionPool的成员变量的时候我们了解到一个Executor的线程池是用来清理闲置的连接的。原创 2024-06-05 21:53:40 · 683 阅读 · 0 评论 -
你熟悉又陌生的Android Context 下上文详解
那么我请问,如果定义x和y作为变量传入构造方法呢,是不是上面的问题也能解决,而且性能和结构上都有一流的表现,你告诉我我为什么要用装饰者模式呢?其实装饰者模式的思想并不直,有点抽象和绕的,重点是 最开始是一个接口也就是抽象构件,然后是这个抽象装饰者是一个抽象类实现了这个抽象构件的接口,同时里面有一个这个抽象构件 接口的属性,来承接传入的要装饰的对象,然后具体的装饰者就这样通过一层一层的传入来动态的构建,不影响原来的要装饰的对象,同时构造出在原来的对象基础之上,装饰了新功能的对象。4个组件扩展不同的功能。原创 2024-06-02 13:28:41 · 269 阅读 · 0 评论 -
Android 图片加载框架Glide源码详解
值得看的是currentGenerate是下图中3个的哪一个呢,从逻辑上看3个会依次遍历,分别是先处理过的resource缓存,然后是data缓存,最后是Source网络加载, 这也是glide的三级缓存。下面就要开始讲根据model,data找modelloader的逻辑了,做好心理准备,不简单,网上大都是一笔带过(因为他们也弄不清,的确有点复杂,绕来绕去),好不容易全网找到一篇,不知道是他的版本旧的,还是他理解的不对,珍惜吧,我认为是全篇最难的地方了。给你们看一下添加的listener。原创 2023-09-17 20:03:31 · 469 阅读 · 0 评论 -
Android 线程池源码详解(一)
当线程数超过核心线程数就会调用poll方法,当poll方法阻塞了keepAliveTime指定的时间后就会返回null,getTask方法返回null,线程进行销毁。I/O密集型:核心线程数=2*CPU核心数(或 核心线程数=CPU核心数/(1-阻塞系数)) 阻塞系数在0.8~0.9之间。,里面是一个双向链表实现的FIFO队列, HashSet 来管理这些work,hashset的特点无序,是基于hash表的。CPU密集型:核心线程数=CPU核心数(或 核心线程数=CPU核心数+1)原创 2023-09-06 21:37:51 · 146 阅读 · 0 评论 -
Hashmap源码详解
接着putVal函数的逻辑走,注释里面写了逻辑,table就是前面所说的Hashmap里面的数组,item就是链表的节点Node,还有一个数组下标用 index = (n - 1) & hash 来计算的原因,因为n是table的长度,是2^N,所以 这里的(n-1)就是11111,这样的,那么(n-1)&hash就是取hash的后N位,这样的下标index一定小于2^N ,不会下标数组越界。链表:一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。原创 2023-08-27 12:29:14 · 113 阅读 · 0 评论 -
LiveDataBus 其中的一个库LiveEventBus库的源码解析
那我们接着说,那整个的精华就是这个bus 的map了,key是string的 ,value是LiveEvent 的,看下图一个LiveEvent是有一个livedata来负责观察的,也就是多个消息的时候就是多个livedata,然后是bus这个map在管理。注意,我们发送消息和接收消息都是调用了get方法,也就是下面的with方法,看看,这里可是get set方法集成到一起的,就很怪,作者这里弄的,讲道理,不符合单一职责。原创 2023-08-16 17:40:34 · 188 阅读 · 0 评论 -
Jetpack之MutableLiveData和LiveData源码分析
接着我们着重看一下liveData的源码,先看setValue方法吧,assertMainThread是判断当前是不是主线程,如果不是就抛出异常:这就是为什么postvalue可以在任何线程调用,setPost只能在主线程调用的原因,也是这两个方法的区别。上图我们知道这两个方法都是调用了livedata的各自对应的方法,我们点进去看看livedata的这两个方法是protect 的。允许子类和自己调用,而MutableLiveData重写的时候用的是public,开放出去了。下图是它的item哦。原创 2023-08-15 16:21:29 · 218 阅读 · 0 评论 -
Java反射机制,动态代理,hook以及在Retrofit源码中的应用
Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。然后我们回过头来看反射机制是 基础,动态代理里面也是用反射来实现的,动态代理对类里面的所有方法统一动态加入操作代码,java使用更多是对接口的,是生成了你想往里面塞的代码,hook把hook对象勾出来,换成自己想塞进去的,是一种手法。1.1.3使用对象.getClass() 方法,返回对象所属的类的 Class 对象。原创 2023-08-11 11:00:21 · 684 阅读 · 0 评论 -
Handler源码详解
Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce() 方法里,这也是为什么Looper是一个死循环但没有崩溃的原因。整个看下来就是一个生产者消费者模式,还有一个细节 post(Runable)的message是 Message.obtain()获取的,这个message可以复用,所以在使用的时候尽量也用这种方式,节约资源,算是个小技巧吧。message入队列。原创 2023-08-02 17:19:07 · 179 阅读 · 0 评论 -
Activiity跳转startActivity源码分析Activity启动流程(下)
这样Zygote进程就会fork出一个应用进程,然后执行应用进程的入口函数也就是我们熟悉的ActivityThread.main()函数。然后是第二种情况,新启动一个App应用的Activity:调用了AMS的.startProcessLocked方法。接着会执行translacationExecutor的execute方法。然后就是application的创建和oncreate方法的调用。然后调用了 Process.start方法,开启一个进程。调用了自己的startProcess方法。原创 2023-08-02 11:38:38 · 168 阅读 · 0 评论 -
Activiity跳转startActivity源码分析Activity启动流程(上)
分为两种情况,一种是app已经启动,只是app内部activity跳转走 realStartActivityLocked方法,否则就拉起一个新的app,像从桌面点击一个app,就属于这种情况走的就是AMS的 startProcessLocked。6.IActivityManager 是AMS 的IBinder 实现是在AMS中,最后走的是ActivityStartControl的链式调用。3.实际还是startActivityForResult 带option的方法,只不过null传过去的。原创 2023-08-01 22:43:05 · 387 阅读 · 0 评论 -
Android系统启动流程
Binder方式虽然高效,但是Binder的使用看起来就像是客户端直接通过所持有的引用对象调用了服务端的方法,类似于一种强引用调用。Zygote进程负责孵化出各个子进程,其地位非常重要,出于安全性的考虑,该场景下的Zygote进程的交互采用Socket会更合适。被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。注意,Zygote进程与其它进程的交互方式是Socket方式,不是Binder方式,这是出于安全性上的考虑。原创 2023-07-28 20:26:12 · 199 阅读 · 0 评论 -
Android源码编译FAILED: out/target/product/generic/dex_bootjars/system/framework/arm/boot.art
下面是成功的喜悦,哈哈,两年前就把源码下载好了,现在才编译通过,一定要坚持啊。WITH_DEXPREOPT=false是解决上面问题的。使用的是ubuntu 22的,android版本是9。原创 2023-04-21 17:42:12 · 1507 阅读 · 0 评论 -
LeakCanary 源码详解(2)
接着上一篇说的源码部分,分析一下这图中核心代码的意思:moveToRetained方法然后是onObjectRetained方法它其实是在下图的代码中这里添加的这个方法又指向了scheduleRetainedObjectCheck,你也看到了接着调用了heapDumpTrigger.scheduleRetainedObjectCheck(),我们看看 heapDumpTrigger.scheduleRetainedObjectCheck(),看看断点的方法 checkRetainedObjects原创 2022-06-22 17:02:45 · 644 阅读 · 0 评论 -
LeakCanary 源码详解(1)
leakcanary-android-sample 使用示例leakcanary-object-watcher-android 自动注册LeakCanary 是怎么完成自动注册的,不需要添加任何初始化注入代码?是利用android系统的app的启动流程中先启动contentProvider 然后是Application的oncreate方法。所以注册代码在LeakCanary的一个contentProvider中。插播一个,如果有人遇到无法运行sample模块的,准确说是提示安装成功,但设备上不原创 2022-06-17 14:36:36 · 442 阅读 · 0 评论 -
ArrayList源码分析
看一下add方法,大概的意思是扩容(当然里面有需不需要扩容的判断),然后赋值就完了。核心代码是接下来的grow方法:划线的第一部分可以看出来,新容积是由旧容积加上原来的旧容积的1/2,因为是右移。第二部分是copy 旧的数组到新数组中。然后说remove方法 ,采用的是将数组的元素从index+1往前index移一位,去覆盖index上的元素。待续。。。...原创 2022-06-06 13:57:42 · 92 阅读 · 0 评论 -
Arouter源码解析(三)——Javapoet 生成文件的位置
从Arouter的源码中我一直有一个疑问:module-java里面的Javapoet生成的代码的位置和我自己的测试项目的不同。看下面的图:图一是Arouter的图二是我自己的demo看到kapt底时候也这样推断过这其实是kotlin和java分开了,但我测试了demo,分别用java和kotlin的activity做测试,结果都在kapt下面:所以总觉得不对。后来我发现在Arouter 的module-kotlin模块和我是一致的,下图所示这就印证了,还是把kotlin和java分开的猜想,但当原创 2022-06-01 16:33:17 · 417 阅读 · 0 评论 -
Arouter源码解析(二)——ASM和JavaPoet
Arouter 在不使用gradle插件的情况下,是使用Apt+JavaPoet 来处理,其中调用java文件里面的方法则是用了反射的技术。这应该也是初始化时间长的问题:apt的autoService 对Animation注解 使用JavaPoet生成新的Java文件,然后反射调用LoadintoJavaPoet是生成java文件的工具,而ASM 是字节码插桩技术,是直接处理.class 文件的,不是生成新文件,是在已有的文件中插入代码看一下官方对于使用gradle插件的解释:接着我们看看grad原创 2022-05-30 17:52:30 · 477 阅读 · 0 评论 -
Arouter 源码解析(一)
一.Arouter 的结构原创 2022-05-23 16:08:59 · 260 阅读 · 0 评论 -
Android IPC Binder机制的一次拷贝理解
IPC全称为Inter-Process Communication 进程间通讯 ,android的底层是linux,但是linux ipc却没有binder这种方式 ,我们先讨论linux的进程间的通讯方式还有Android没有选择其中一种的原因:1.socket 不安全可以中途篡改,性能问题 ,网络通信的socket的性能你应该有了解,它的机制决定了它的性能 2. 管道 是一对一的,进程间的多对多的关系,每一个进程提供服务server给所有的client使用,每个进程也都可以是...原创 2022-04-25 13:40:43 · 3034 阅读 · 0 评论 -
Android Looper 是怎么保证在线程中唯一存在的
这是一道面试题,笼统的说的话可以说是map,来保证每个线程一个线程的key对应一个looper 的value。但这个map是伪的。谁都会这样说,这不代表真正的理解。很多老师或者博主讲的,我也觉得没到点上,其实真正难的是源码中ThreadLocal 里面有个内部类ThreadLocalMap,而且这个ThreadLocalMap里面又存在Entery这个键值对,以ThreadLocal对象为key,以Looper为值。这样嵌套的绕来绕去,就很难理解,很难转过弯来,我讲一下关键点在哪:1.Looper 类原创 2021-05-26 10:27:51 · 798 阅读 · 1 评论