android
文章平均质量分 80
三村阿明
没有比人更高的山
没有比脚更远的路
展开
-
LRUCache
LRUCache是Android中实现内存缓存相关的组件类,当缓存满时其使用最近最少使用策略来淘汰相关的元素,以控制缓存大小。本文主要基于LRUCache相关源码分析LRUCache的创建、缓存的添加、获取、删除流程。原创 2024-06-25 17:03:55 · 672 阅读 · 0 评论 -
Activity中Window与View的关系
本文主要记录在Activity中View与Window相互作用关系,以及如何管理Window的展示、删除和更新。原创 2024-06-24 21:16:21 · 191 阅读 · 0 评论 -
Glide系列-Webp如何被解析使用
上周接到leader吩咐,说项目中feed流占用的内存有点大,而且在低端手机上页面渲染很慢,需要排查下。所以大致梳理了下Glide中Webp资源的解析过程。如有不正确的地方,烦请斧正,一起进步。如何通过Glide加载Wepb并展示目前博主所在的项目使用的第三方开源库来加载webp的,所以第一步????添加依赖implementation "com.github.bumptech.glide:glide:4.8.0"implementation "com.github.bumptech.glide:o原创 2021-12-04 18:04:59 · 2080 阅读 · 1 评论 -
如何实现基于OkHttp的网络监控
人一部分的愤怒来自于无法接受想到和做到之间的巨大差距!!!本篇文章主要是介绍如何基于okhttp来实现网络请求的监控,可能很多同学要问,为啥要监控?监控主要的目标就是真实呈现和还原线上用户的使用状况,为应用整体优化提供指标和方向。平常我们在开发环境中普遍网络状况还是很好的,不能很好的反应出线上用户真实的使用情况。而加入监控后,可以从数据中发现用户的真实使用情况,并拆分请求过程中每个阶段的耗时和失败原因,然后再给予相关指标来进行优化(把锅甩出去)。了解OkHttp因为是基于OkHttp来实现监控,..原创 2021-11-20 15:07:24 · 2214 阅读 · 0 评论 -
BlockCanary介绍
BlockCanary是什么BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。取名为BlockCanary则是为了向LeakCanary致敬,顺便本库的UI部分是从LeakCanary改来的。BlockCanary设计原理上图是BlockCanary的工作流程图,整个流程分为三个部分,分别是监控卡顿、捕获现场、保存.原创 2021-11-15 21:51:37 · 3762 阅读 · 0 评论 -
探秘kotlin的语法糖
kotlin是Java最好的语法糖高阶函数函数是对过程的抽象,普通函数有一个限定条件是函数的参数和返回值必须是具体的类型,而高阶函数则去处了这个限定条件,允许函数的参数和返回值是函数类型。 fun build(test: ()-> String){ test() }上述kotlin代码中build方法允许传入一个()->String的函数类型,那么kotlin是怎么实现该功能的呢?反编译为Java方法如下 public final void build(@Not.原创 2021-05-26 08:33:06 · 288 阅读 · 2 评论 -
kotlin中的类型
Kotlin是Java最好的第三方库我们在使用kotlin进行开发的时候,会发现其简化了很多代码细节,使编写代码更加简洁,同时也封装了更多的内在逻辑,如果读者是从java开发转而为kotliin的使用者,那么会发现其实kotlin简介语法的实现底层都是封装的java相关细节,本文尝试从kotlin的使用入手,解读kotlin中类型相关的实现细节kotlin中的类型系统kotlin相对于Java来说,是更纯的面向对象的语言,在Java中除了对象外,还存在int等基本类型,而kotlin中是没有基本.原创 2021-05-23 22:31:47 · 343 阅读 · 7 评论 -
Android-Crash处理和拦截
日常开发过程中,我们肯定有遇到app崩溃的情况,很多少时候,会有系统弹出提示:,那么系统是怎么捕获到App崩溃并弹出提示框的呢?更进一步,如果我想在子线程crash时,app不被杀死,要怎么实现呢?带着这些疑问,我去探究了一下Android的crash处理原理。背景知识做Android开发的小伙伴都知道,Android是基于Java线程+消息队列来实现的。而Java的Crash处理机制也是和线程息息相关的。在Java的Thread类源码中可以看到如下接口:public interface Unca原创 2021-03-14 15:10:52 · 907 阅读 · 2 评论 -
Watchdog-最后的看门狗
Watchdog是什么Watchdog是android framework中一个java类(在线源码), 也可以认为是一种系统检查和处理的机制。比如在Android系统中,SystemServer进程会对应用程序进行卡顿检测和处理(即ANR检测等),那么谁来检测和处理SystemServer进程的服务呢?如果AMS、PMS等核心服务出现了卡死谁来处理呢?答案是Watchdog,在Android中,设计了Watchdog机制来检测和处理系统核心服务是否能正常工作。Watchdog怎么工作Watchdo.原创 2021-02-26 11:56:37 · 809 阅读 · 0 评论 -
Android跨线程消息机制
消息分发和处理是如何工作的?消息处理框架如何创建和启动1.创建消息循环分发对象Looper private Looper(boolean quitAllowed) { //消息储存的队列 mQueue = new MessageQueue(quitAllowed); //创建消息处理框架的线程 mThread = Thr...原创 2020-02-09 19:31:25 · 371 阅读 · 1 评论 -
SharePerenference原理
1.SharePerenference的存储格式2.缓存策略是怎样的3.线程安全的处理方式1.以xml文件存储key-value形式的数据,加载的方式是一次加载整个文件内容到内存中,在内存中的对应方式为,先找到所属包名的缓存ArrayMap,再根据filename找到对应的SharedPreferences的实现对象SharedPreferencesImpl.在业务中调用的api最终都委托给...原创 2019-10-22 09:59:33 · 237 阅读 · 0 评论 -
Android中Context和Resource之间的关系
application的context和activity的context是同一个吗?resource和context resourceManager AssetManger的关系?activiity之间的Resource assetManager是同一个吗?Resource Context contextImpl ResourceImp在什么时候被创建?资源是怎么根据查找的?资源是怎么...原创 2019-10-20 17:36:42 · 1545 阅读 · 0 评论 -
App启动流程
1.涉及到的类介绍:因为Android的框架设计时建立在Client-Server结构上,所以下面分Client和Server两端来介绍相关类Client端:表示一个应用端Activity:Android中活动组件,每一个Activity多对应一个Window,多个Window叠加后被SurfaceFling处理显示ActivityThread:Android应用的入口类,主要用于开启消息...原创 2019-07-01 16:06:38 · 253 阅读 · 0 评论 -
ARouter实现原理解析
相关角色:ARouter:负责提供客户端使用的Api接口,采用了门面模式,实际上内部委托给了_ARouter去处理_ARouter:路由中心控制器,负责控制整个路由的流程,通过Postcard中的信息导航客户端到目标地址(启动某个Activity或者获取某个服务的实现等)LogisticsCenter:后勤中心,负责注册路由信息到Warehouse和根据path或者Postcard到数据仓库...原创 2019-06-02 15:49:45 · 2588 阅读 · 0 评论 -
任务知识总结之绘制相关
在android系统中 canvas主要用于处理显示内容的绘制,自定义View时我们一般都是在View的onDraw中接收到系统传给我们的canvas,然后将我们需要展示的内容绘制到该canvas上,最后系统会渲染该canvas上的内容到屏幕上。那么 canvas是什么:canvas其实是用于绘制的工具,不完全是一个画布,当我们给canvas设置画布的时候(比如bitmap),该bitmap就是一原创 2017-05-28 21:49:33 · 180 阅读 · 0 评论 -
**EventBus初探**
本文主要介绍一下EventBus的基础使用和其对应的源码实现,如有问题,麻烦各位指出,谢谢大家。EventBus简介EventBus是一个用于解偶消息处理者和发送者的第三方库,常用于一些模块化开发中,多个模块或者页面的消息分发和处理,使用该库后能使代码更加简洁,让开发者能主要关注在业务细节上,而且该jar很小(50k内)基本使用在EventBus的github主页上可以看到,其最简单的用法...原创 2018-11-08 13:17:01 · 119 阅读 · 0 评论 -
一次Android权限删除经历
**1.事发经过**近期google play发布了新的政策,其中一部分是限制权限使用,只允许满足条件的使用场景才能申请权限,小编所在的项目被检测出使用了RECEIVE_SMS权限,但是从app下的Androidmanifest文件中并未发现有该权限的注册,所以该权限是哪里来的呢?2.初步定位首先使用android studio查看了打包出来的apk中的Androidmanifest文件...原创 2018-12-27 13:06:17 · 1546 阅读 · 5 评论 -
gitlab搭建之旅
终于,我的leader接受了我使用git进行版本管理的建议;接下来就是实践之后总结的gitlab搭建之旅的详细步骤了安装1.下载安装包我使用的是离线安装(因为公司内网网速不太好),安装包来自于清华大学TUNA开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/还可以去gitlab的官网下载:https://pack...原创 2019-01-07 19:03:35 · 148 阅读 · 0 评论 -
jni小记
读[深入理解Android卷一 全文-第二章]深入理解JNI小记注册方式:静态注册:依赖固定的命名规则(class_methodName),使用时才去寻找指针并保存动态注册:依赖JNI数据结(JNINativeMethod保存java和native之间的关系加载时机:System.loadLibarary(该函数多次重复加载相同的so库不会导致耗时正相关增加)注册时机:System.lo...原创 2019-01-24 15:07:34 · 101 阅读 · 0 评论 -
Android内存优化实践
1.内存模型与分布我们知道android应用大多是使用java语言进行开发的,这就需要我们了解java的内存模型,此外在android中的应用都是基于Dalvik 虚拟机或者ART虚拟机,那么对这些虚拟机的内存分布也应该有所了解。上图是常见的java虚拟机的内存分布图:方法区:主要存储虚拟机加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。内存优化时这一部分主要考虑是不是加载了很...原创 2019-02-19 18:12:55 · 186 阅读 · 0 评论 -
Glide源码小记
Glide源码阅读要点:初始化流程缓存策略实现生命周期管理多线程处理如何支持扩展性代码如何封装源码收获原创 2019-03-26 23:56:11 · 122 阅读 · 0 评论 -
LeakCanary内存泄漏监听原理
大致流程: // Leakcanary的入口函数, public static RefWatcher install(Application application) { return refWatcher(application).listenerServiceClass(DisplayLeakService.class) .excludedRefs(Androi...原创 2019-04-10 19:42:10 · 438 阅读 · 0 评论 -
关于View的焦点
##1.什么是View/ViewGroup的焦点,焦点的作用是什么?从广义上来说,焦点就是用户当前正在或者下一步可能操作的目标,在按键模式下(现在大部分手机都是触摸模式)一般具有焦点的View都会高亮展示,以提示用户当前可以操作的目标。从狭义上来说,焦点就是View中的mPrivateFlags成员字段被添加上了PFLAG_FOCUSED标示。##2.View和ViewGroup中hasFo...原创 2019-03-28 20:23:48 · 1030 阅读 · 0 评论 -
Android的事件分发
Android中的事件分为按键事件,触摸事件,轨迹球事件等,其中按键事件是基于焦点分发的,触摸事件是基于位置分发的,而轨迹球事件是基于焦点和位置组合分发的,关于焦点相关可以看上一篇,这一篇主要介绍触摸事件的相关分发。UI层的事件分发入口在Activity的dispatchTouchEvent方法,如下: public boolean dispatchTouchEvent(MotionEv...原创 2019-04-02 23:28:26 · 100 阅读 · 0 评论 -
view的事件体系1
1. view的位置由其四个定点来确定,即top,left,right,bottom,分别表示相对父容器的坐标,即相对坐标,获取方式;top=getTop;2. 自android3.0(api9)后增加了x,y,translateX,translateY这几个属性,translateX表示view的相对于自身左上角顶点的位移,而x=top+translateX;x指view相对于父容器的左上角...原创 2018-11-07 19:28:00 · 114 阅读 · 0 评论