
Android
文章平均质量分 80
~~1112233
这个作者很懒,什么都没留下…
展开
-
Android:View的getLocalVisibleRect()和getGlobalVisibleRect()的区别
代码片段: ImageView rectImage = findViewById(R.id.rect_image); rectImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect loc原创 2021-02-19 18:38:31 · 3167 阅读 · 12 评论 -
KT中代理属性的实现及使用案例分析
普通的delegate代理属性get/set方法,可以看到类中会声明一个数组保存需要代理的所有KProperty字段信息(包含类名,字段名称,字段签名())PS:冷知识map也可以用于委托,只要有get/set方法就可以用作委托,只不过map的key是字段的名称,value才是真正的值,这个有点限制哈哈,但是如果想要自己实现map也可以如果有多个代理属性呢?原创 2023-02-07 15:03:12 · 390 阅读 · 2 评论 -
序列探究之延迟执行的奥秘
序列本质上也是集合,他是集合的封装,为集合提供了延迟执行的能力原创 2023-02-07 14:53:01 · 629 阅读 · 1 评论 -
委托类分析——委托类:Interface by 委托实现类;委托类(属性:委托实现类):Interface by 属性
最近再学习委托的时候有些绕,做个笔记分享一下吧,顺便把kotlin的属性,字段,主从构造还有委托的实现一起从编译后的java代码分析下属性就是带val、var修饰的字段如何理解呢?看下面val,var的分析这次先分析委托类的java代码实现,后续文章在分析委托属性的set/get方法如何进行委托已经编译后的Java代码分析(看了委托的基本原来和实现思路之后相信属性的委托更能看懂)都说组合优于继承,但是java并没有在语音层面直接提供委托的写法,kotlin不一样,语言本身就支持委托。原创 2023-02-02 16:07:57 · 573 阅读 · 3 评论 -
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 · 2058 阅读 · 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 评论 -
分享一波学习方向
什么是“好”的技术,为什么“火”前言:这个是个人观点,技术要用在合适的业务场景中才能体现出它的优势,而不是盲目的去学,去看解决现今开发的技术痛点协程回调地狱,切换线程等功能a()//耗时任务b()当两个方法a,b执行的代码块没有依赖关系时,执行耗时任务采用异步的方式来解决,通过开线程或者通过handler post一个Runnable来执行a方法这个耗时操作,b不需要等待a结束就可以直接运行。但是如果a和b是有依赖关系的,b方法需要用到a方法返回的数据进行处理,但是又为了不影响b之后原创 2022-04-15 00:45:00 · 151 阅读 · 0 评论 -
BaseDexClassLoader那些事
一,BaseDexClassLoader是如何创建DexElements的?makeDexElements的实现细节:1.针对如何创建DexElements的,BaseDexClassLoader这个类有三种构造方法,只分析两个(因为另外一个只不过是其中一个的扩展,对于加载DexElements的方式并没有改变)。首先parent不能少,接下来的属性就是两种创建DexElements的不同方式,其中一个构造方法是传入bytes数组,另外两个是用的dexFilePath(除此之外构造方法还需要很多参数,原创 2022-04-14 00:30:00 · 400 阅读 · 0 评论 -
学习笔记:插件化资源解决
一,资源获取getResource传入R.资源名称,通过资源名称可以找到对应的资源ID(通过R.java文件保证),之后AssetManager通过资源ID找到对应的资源文件名称(通过arsc文件保证)二,资源冲突:插件和宿主使用aapt打包资源,aapt生成R和arsc文件是根据前缀信息(在aapt逻辑中apk默认为0X71)和资源顺序来进行命名的因此会出现同一个资源ID在插件和宿主中都有对应的资源文件系统会出错。因此我们需要修改前缀即可保证,修改哪些前缀信息呢:解决方案概述根据上面的原理原创 2022-03-29 00:00:00 · 643 阅读 · 0 评论 -
学习笔记:插件化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 · 329 阅读 · 0 评论 -
个人学习笔记:事件分发和启动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 · 2472 阅读 · 0 评论 -
记一次优化经历杂谈
基于Android平台的编译优化方案。由于车机芯片,硬件方面等原因..应用启动,运行速度包括性能方面并不是很好达到厂商的要求,于是急需扩展Android原有编译优化策略,增加编译等级优化等措施来优化。原创 2022-03-18 00:22:42 · 3373 阅读 · 11 评论 -
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 评论 -
协程原理再议
协程再议关于协程的一些理解基础框架层源码分析实战分析反编译后代码分析关于协程的一些理解协程挂起让异步代码可以像同步代码一样调用,但其本质还是同步,即协程体中的代码其实是同步。因为协程也只是对线程池的封装,所以需要了解些线程的一些知识。线程本身已经有的协程也会有,但是协程有的线程不一定有编译器会为每一个挂起函数生成一个匿名内部类,其继承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 评论 -
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 评论 -
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 评论 -
Android 产生ANR后的Trace文件的解析
第一个框中第一二行说明了发生ANR的进程ID,名称和时间第三个框中“main” prio=5 tid=1 Native说明了线程名称,线程优先级,线程锁id和线程状态。tid不是线程id,是一个在Java虚拟机中用来实现线程锁的变量,线程状态分为以下几类:状态 值 说明THREAD_ZOMBIE 0 TERMINATED 线程死亡,终止运行THREAD_RUNNING 1 RUNNABLE or runn.原创 2021-08-17 20:39:56 · 4076 阅读 · 0 评论 -
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 · 8365 阅读 · 9 评论 -
关于Signal Catcher线程中对线程的理解
首先简述下Signal Catcher,Signal Catcher线程接受到kernel系统底层的消息进行dump当前虚拟机的信息并且设置每个线程的标志位(check_point)和请求线程状态为挂起,当线程运行过程中进行上下文切换时会检查该标记。等到线程都挂起后,开始遍历Dump每个线程的堆栈和线程数据后再唤醒线程。更多内容在我的其他博客中进行查阅~~,本文重点讲的是在分析Singal Catcher时对线程有了更新的了解。在Android里面只能通过pthread_create去创建一个线程,T原创 2021-07-13 18:34:29 · 2571 阅读 · 1 评论 -
Android ANR分析(trace文件的产生流程)
ANR信息获取(trace文件的产生流程)首先收集需要dump trace的进程并给对应进程发送dump trace的信号接着分析最后一步向收集到的进程发送信号首先收集需要dump trace的进程并给对应进程发送dump trace的信号1.当一些带有超时机制的系统消息(如:Service的创建)判定超时后,会调用系统服务AMS接口,收集ANR相关信息并存档(data/anr/trace, data/system/dropbox)2.进入到AMS中,AppError会先进行筛选(1.当前进程正在进原创 2021-07-13 18:32:38 · 4817 阅读 · 1 评论 -
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
在 Applicaiton中进行初始化崩溃收集器public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); //初始化崩溃收集器 CollectCrashUtils.initColleteCrash(); }}2.收集java层崩溃和native层崩溃public class CollectCra.原创 2021-02-25 16:23:20 · 1753 阅读 · 10 评论 -
Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案
昨天往项目中添加Android自定义异常捕获的工具类时(参考Android自定义捕获Application全局异常)碰到一件很诡异的事情,createNewFile一直报no such file or directory,往前追发现是mkdir失败了(mkdirs也一样fail),网上搜了很多都说是AndroidManifest.xml中没有配置读写sd卡的权限(实际上我已经配置了),最后才定位到是android10之后不能问题。附上我最后解决问题的关键代码段:在AndroidManifest.xml原创 2021-02-25 16:11:12 · 10174 阅读 · 14 评论 -
Android获取状态栏高度
Android获取状态栏高度private int getStatusBarHeight(Context context) {int result = 0;int resourceId = context.getResources().getIdentifier(“status_bar_height”, “dimen”, “android”);if (resourceId > 0) {result = context.getResources().getDimensionPixelSize(原创 2021-02-19 17:19:29 · 913 阅读 · 0 评论