
android
文章平均质量分 88
luoluofeixia
这个作者很懒,什么都没留下…
展开
-
源码阅读系列——基础篇(Android SparseArray 集合源码分析)
之前我们了解了很多JAVA的集合源码分析,我们继续开坑学习Android集合源码实现1、构造函数public class SparseArray<E> implements Cloneable { private int[] mKeys; // 存放key的数组 private Object[] mValues; // 存放value的数组 private int mSize; public SparseArray(int initialCapacity)原创 2020-10-02 16:05:45 · 169 阅读 · 0 评论 -
源码阅读系列——进阶篇(Android的线程分析)你是否真的了解线程
1、线程概念我们知道,在linux系统里,有进程和线程的概念。进程是linux最小的资源管理单位,而线程时最小的执行单元。进程与线程不一样,他拥有自己独立的内存空间,而线程则是共享进程的内存空间。所以,相对而言,会更好的利用资源。当然,学习过linux内核的人,也知道,不管是线程还是进程,在内核中都理解为进程,因为linux内核本身在cpu调度的时候,进程为最小单元,所以线程在内核中表现为一个轻量化的进程,而至于用户态下线程的管理,则是通过进程首次建立就自动创建的管理线程进行管理,例如线程的停止,线程的原创 2020-09-06 20:55:14 · 429 阅读 · 0 评论 -
三方库详细解读——BlockCanary的实现
综述之前,我们讲解了LeakCanary的源码,有兴趣的同学可以参考解析:https://blog.youkuaiyun.com/luoluofeixia/article/details/107494261本节讲解一下分析UI卡顿的SDK——BlockCanary。初始化正常我们使用BlockCanary进行初始化,涉及到构造函数以及install方法:private BlockCanary() { BlockCanaryInternals.setContext(BlockCanaryContext原创 2020-08-20 14:43:26 · 969 阅读 · 0 评论 -
详细解读Android Handler中Native挂起唤醒逻辑实现
简述如果没有阅读过上篇Handler机制解析的,可以先翻看上篇wiki:https://blog.youkuaiyun.com/luoluofeixia/article/details/107544100我们知道MessageQueue中,每次在next(),取message的时候,如果没有message了,他就会处于挂起状态(这样做的目的),当有消息到来,或者下一个消息的时间到达之后,都会唤醒线程,那么这个是如何实现的呢。挂起线程jni方法Java层定义private native void native原创 2020-08-18 17:48:31 · 1052 阅读 · 0 评论 -
详细解读Android Handler机制
1、你是否真的了解Handler机制很多同学如果只看过博客的解析,可能没有完全了解到整个Handler机制中的实现,我们了解Handler不能浮于表面,在面试的过程中,发现很多同学并没有从根本上了解这一机制,此篇文章我们去好好捋一捋,重新认识一下他的实现。2、Looper我们写过JAVA知道,他总是由一个 public static void main(String[] args)方法开始的,同样我们通过zygote fork的进程也是由此法开始。按照进程的规则,会伴随一个主线程的创建,而我们在mai原创 2020-07-24 20:18:30 · 200 阅读 · 0 评论 -
三方库详细解读——LeakCanary的实现
综述我们知道LeakCanary是用来检查Activity和Fragment是否存在内存泄漏的。那么他是如何监测的呢?我们本篇文章就来解析监测生命周期监测Activity生命周期public final class ActivityRefWatcher { public static void install(@NonNull Context context, @NonNull RefWatcher refWatcher) { Application application = (Ap原创 2020-07-21 18:05:52 · 249 阅读 · 0 评论 -
WindowManager窗口添加管理流程分析一
WindowManagerService窗口添加管理流程分析Api中窗口定义与使用WindowManagerService初始化新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入Api中窗口定义与使用我们知道Android原创 2020-07-15 16:54:41 · 478 阅读 · 0 评论 -
android 内存消耗分析
1、如何查看memory 的总消耗linux的命令top -h 以及PS 都可以查看到内存PSS和VSS的内存消耗。android提供了工具,可以更全面的分析到内存的分布情况。先看procrank,这个工具没有,可以通过下载编译放在android /system/xbin/目录下。然后分别执行:adb rootadb shell procrank我们看一下内存分布结果: PID Vss Rss Pss Uss Swap PSwap US原创 2020-07-10 16:39:31 · 2019 阅读 · 0 评论 -
Android 9.0——ActivityManagerService代码分析
1、AMS初始化9.0的代码google同样做了一些改变,但是大体的流程与8.0接近。ActivityManagerService同样通过SystemServer启动(Zygote孵化),我们看一下实现。首先定位SystemServer的主线程的方法:public static void main(String[] args) { new SystemServer().run();}我们看一下run方法执行了什么:private void run() {// 省略代码,主要是一些系统原创 2020-07-07 23:33:58 · 834 阅读 · 0 评论 -
源码阅读系列——基础篇(ConcurrentHashMap 集合源码分析)
上篇我们讲到HashMap,从整个代码的实现上,我们看到没有任何一个关于synchronized或者Lock的字眼,所以HashMap是线程不安全的,Java提供了一个线程安全的HashMap,当然也可以通过Collections.synchronizedMap来实现Map线程安全,与List里面提到的方式一样,也是很暴力的直接给每个读取方法加一个synchronized字段,这里不再赘述。我们讲一下Java的线程安全利器ConcurrentHashMap1、类定义public class Concur原创 2020-06-17 16:39:55 · 172 阅读 · 0 评论 -
源码阅读系列——基础篇(HashMap 集合源码分析)
HashMap是一种插入、查询效率都较高的集合,我们看一下他是如何实现的。首先我们以插入数据来看一下源码:1、插入数据// 获取对象的hash值,至于什么hashcode,见注1static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}public V put(K key, V value) { retur原创 2020-05-29 17:34:28 · 182 阅读 · 0 评论