自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(213)
  • 收藏
  • 关注

原创 Android源码分析 (一) SystemServer 进程启动

最近学习进阶解密 总结SystemService启动Zygote进程启动总结在Android系统中,DVM和ART、应用程序进程以及运行系统的关键服务SystemServer进程都是有Zygote进程来创建的,我们也将它称为孵化器。它通过fork的形式来创建应用程序进程和SystemServer进程,犹豫Zygote进程在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本。Zygote进程启动共做了如下几件.

2021-05-31 21:48:39 1619 8

原创 Android Handler 机制 屏障消息(同步屏障)

一、Handler Message 种类Handler的Message种类分为3种:普通消息 屏障消息 异步消息其中普通消息又称为同步消息,屏障消息又称为同步屏障。我们通常使用的都是普通消息,而屏障消息就是在消息队列中插入一个屏障,在屏障之后的所有普通消息都会被挡着,不能被处理。不过异步消息却例外,屏障不会挡住异步消息,因此可以这样认为:屏障消息就是为了确保异步消息的优先级,设置了屏障后,只能处理其后的异步消息,同步消息会被挡住,除非撤销屏障。...

2021-02-18 14:14:30 1925

原创 OkHttp3连接池复用原理分析

OkHttp3连接池原理:OkHttp3使用ConnectionPool连接池来复用链接,其原理是:当用户发起请求是,首先在链接池中检查是否有符合要求的链接(复用就在这里发生),如果有就用该链接发起网络请求,如果没有就创建一个链接发起请求。这种复用机制可以极大的减少网络延时并加快网络的请求和响应速度。源码分析 // 最多保存 5个 处于空闲状态的连接,连接的默认保活时间为 5分钟 public ConnectionPool() { this(5, 5, TimeUnit

2021-01-21 14:41:49 4794

原创 ViewPager2的源码分析

基于RecyclerView实现。这意味着RecyclerView的优点将会被ViewPager2所继承。2.支持竖直滑动。只需要一个参数就可以改变滑动方向。3.支持关闭用户输入。通过setUserInputEnabled来设置是否禁止用户滑动页面。4.支持通过编程方式滚动。通过fakeDragBy(offsetPx)代码模拟用户滑动页面。5.CompositePageTransformer 支持同时添加多个PageTransformer。

2023-04-15 23:36:15 663

原创 Android ANR原理以及机制

一我们平时遇到的ANR问题大部分是input ANR类型,本文以input ANR为例进行梳理,这块机制并不复杂,受限于篇幅,本文只介绍埋下计时和check超时的代码部分。正常输入事件的分发流程如下findFocusedWindowTargetsLocked这个函数从字面不难猜出其意图: 查找有焦点的window。该函数较长,我们将其拆分开来进行梳理未找到focused的window,也未找到focused的application这种情况下,则drop该事件。

2023-04-09 15:15:25 1425

原创 Android屏幕刷新机制

原因是只有两个 buffer,Back buffer正在被GPU用来处理B帧的数据, Frame buffer的内容用于Display的显示,这样两个buffer都被占用,CPU 则无法准备下一帧的数据。那么,如果再提供一个buffer,CPU、GPU 和显示设备都能使用各自的buffer工作,互不影响。优先级的高低和处理顺序有关,每当收到 VSYNC 信号时,Choreographer 将首先处理 INPUT 类型的任务,然后是 ANIMATION 类型,最后才是 TRAVERSAL 类型。

2022-11-27 21:05:36 912

原创 Kotlin协程

​​​​​​​Kotlin中,有几种方式能够启动协程,如下所示:launch{} CoroutineScope的扩展方法,,不阻塞当前协程,并返回新协程的Job。async{} CoroutineScope的扩展方法,,不阻塞当前协程,返回一个Deffer,除包装了未来的结果外,其余特性与launch{}一致runBlocking{} 是一个裸方法,,并阻塞当前线程,直到协程执行完毕。

2022-11-06 09:48:32 1828

转载 jetpack Compose绘制流程原理

在 Flutter 中,Dart 对如何高效回收频繁创建与销毁的对象进行了专门优化,而 Compose 在 Android 平台的实现方式本质上就是普通的 Kotlin/JVM 代码。如何设计 Compose 让其能够有可靠的性能表现,是一个挺有意思的问题。

2022-09-06 22:46:00 523

原创 app卡顿原因

当 CPU/GPU 的处理时间超过 16ms 时,第一个 VSync 就已经到来,但缓冲区 B 的数据还没有准备好,这样就只能继续显示之前的 A 数据,从而导致丢帧现象,而后面 B 完成后,又因为没有 VSync 信号,所以 CPU/GPU 只能等待下一个 VSync 信号的来临才能继续处理下一个数据,这就导致了中间有一大段时间被浪费掉了。从图中可以看出,当 B 缓冲未准备好数据时,而 VSync 信号又来临了,C 缓冲区会接着处理下一帧数据,从而避免了 CPU/GPU 的浪费。系统是怎么保证的呢?

2022-08-21 16:25:38 696

原创 内存优化二Bitmap优化

一张图片Bitmap所占用的内存 = 图片长度 x 图片宽度 x 一个像素点占用的字节数 而Bitmap.Config,正是指定单位像素占用的字节数的重要参数。 其中,A代表透明度;R代表红色;G代表绿色;B代表蓝色。ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度 ARGB_4444 表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节 ARGB_8888 表示32位ARGB位图,即A=8,R=8

2022-07-09 12:13:07 1288

原创 内存优化(一)

一 内存划分Android中的内存是由谁来管理?答案是JVM虚拟机——内存大管家。从线程的角度来看,JVM在执行Java程序的过程中会将所管理的内存划分为线程私有和线程共有两大类。1.1、线程私有(1)程序计数器:Java是多线程的,既然是多线程就需要线程间切换、通信等操作。如何保证线程间操作时每个线程的执行顺序能按代码的步骤正常执行呢?这时候程序计数器就是关键了,它会帮我们记录当前线程执行到的位置(在字节码中记录的这些位置统称为指令地址)。这个内存区不会出现OOM(2)虚拟机栈:我们常提在嘴上的堆和栈,其

2022-06-04 17:38:08 364

转载 如何成长为一名架构师

本文将从多个方面讲述如何成为一名优秀的架构师,以及一个架构师应该具备什么样的技术要和职业素养。我在这里整理了个脑图,方便系统性的查阅。一、职责在工作中,需要清楚的自己定位,明确自己工作范围和边界,才能更有效的开展工作。一般不限于以下几点:确认需求。当有新的需求新增时,需要能对需求进行拆解,抽象,形成初步的概要设计。系统分解。针对复杂的需求,能理清思路,冷静分析,将大需求拆解成小需求,明确每个小需求的边界范围。技术选型。针对技术选型需要从多个方面进行考量,比如系统复杂度,技术实现成本,不要觉得选择最潮流,最新

2022-06-03 18:58:49 896

转载 架构师成长路线图

正在上传…重新上传取消Danist Soh@Unsplash软件架构师在软件开发团队中扮演着高级的角色,这一角色需要时间和经验的积累,需要跨职能的技能和知识。除了技术方面的挑战,还要求架构师具备良好的社交能力。在开始考虑成为软件架构师的计划之前,我们先来看看典型的软件架构师类型:我们可以进一步扩展这个列表,每个公司可能对某个特定职位有不同的名称。上述给定的软件架构职位的角色和职责可能因公司而异,但本质是相同的。请看下面的图表,以便更好的理解不同架构师角色在技术/业务技能和知识方面的关系。正在上传…重新上传取

2022-06-03 18:47:37 337

原创 Android 源码分析 (十一) ContentProvider 启动

ContentProvider (内容提供者) 属于四大组件之一,可以说它是在四大组件中开发者使用率最少的一个,它的作用就是进程间进行数据交互,底层采用 Binder 机制进行进程间通信。下面我们就以分析 ContentProvider 工作流程为主来进行全面分析。

2022-04-18 21:36:22 2584

原创 Android包体积优化

包大小的重要性已经不需要多说,包大小直接影响用户的下载,留存,甚至部分厂商预装强制要求必须小于一定的值。APK分析使用 ApkTool 反编译工具分析 APK; 使用AS 2.2之后提供的Analyze APK; 使用 nimbledroid 进行 APK 性能分析Proguard混淆之后,默认会在工程目录 app/build/outputs/mapping/release 下生成一个 mapping.txt 文件,这就是 混淆规则;作用: 瘦身:它可以检测并移除未使用到的类、方法、字

2022-04-06 22:34:56 2470

转载 Surface的理解

1Surface創建既然requestLayout内部是通过给主线程Handler发送任务消息并在Vsync同步信号返回后执行Runable。那我们就继续看看Runable内部执行的// ========== android.view.ViewRootImpl ===========void doTraversal() { if (mTraversalScheduled) { mTraversalScheduled = false; //移除同步屏障,.

2022-01-23 11:41:15 856

原创 Android 源码分析 (十) 启动广播的发送和接收过程

广播的发送和接收过程广播的发送和接收分为 2 个阶段来分析,通过应用进程到 AMS SystemServer 进程的调用,然后 AMS 所在的进程通知应用进程的调用,下面我们先来分析应用程序进程到 AMSContextImpl 到 AMS 的调用过程广播发送多种类型的广播,比如 无序、有序、粘性广播,这里以最简单的广播无序广播来讲解,也就是发送一个普通广播,它的实现也是在 ContextWrapper 中直接来看 ContextWrapper 的 sendBroadcast 方法,代码如下:

2022-01-02 12:34:08 2836

原创 Android源码分析 (九) BroadcastReceiver 注册过程

广播的注册过程首先,想要使用广播就得通过 registerReceiver 方法注册一个广播,最终也是在 Activity 的父类 ContextWrapper 中实现,代码如下://ContextWrapper.java /** * 应用调用注册广播的函数 * @param receiver The BroadcastReceiver to handle the broadcast. * @param filter Selects the Intent broa

2022-01-02 11:37:53 1528

原创 Android内存优化工具

整理下Android内存优化常用的几种工具,top命令、adb shell dumpsys meminfo、Memory Profiler、LeakCanary、MAT1. toptop命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。$ adb shell top --helpusage: top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-m LINES] [-d SECONDS] [-p P

2021-12-25 14:57:40 3257

原创 Android 源码分析 (八) bindService 启动

bindService 绑定服务过程我们直接看 ContextWrapper 类中的 bindService 函数//ContextWrapper.javapublic class ContextWrapper extends Context { Context mBase; ... @Override public boolean bindService(Intent service, ServiceConnection conn, int

2021-11-14 19:30:40 2513

原创 Android 源码分析 (七) StartService 启动

startService 启动过程ContextImpl 到 AMS 的调用过程当我们在 Activity 中调用 startActivity 函数的时候,点击 startActivity 看源码实现会发现它是在 ContextWrapper 类中实现的。我们继续看 Context 的 startService 实现,代码如下://Context.javapublic abstract class Context { ... @Nullable public ab

2021-11-14 13:40:52 2310

原创 Android源码分析(六)Window添加

1 系统添加窗口添加的过程这里以我们常用的 Toast 来分析添加到 SystemWindow 中的过程 //Toast public static Toast makeText(@NonNull Context context, @Nullable Looper looper, @NonNull CharSequence text, @Duration int duration) { //1. 实例化 Toast 对象 Toast r..

2021-10-17 19:28:30 1198

原创 Androd的源码分析(五)WindowManager

Window:window 它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理//Window.javapublic abstract class Window { ...}//PhoneWindow.javapublic class PhoneWindow extends Window implements MenuBuilder.Callback { ...}WindowManager 是一个接口类,继承自接口ViewManager,从它...

2021-10-17 10:31:20 746

原创 根Activity启动过程中涉及的进程

在Activity启动过程中间会涉及4个进程 分别是Zygote进程、Launcher进程、AMS所在进程(SystemServer进程)、应用进程。他们关系如下首先Launcher进程向AMS请求请求创建根Activity,AMS 判断根Activity 所需的应用进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序,应用程序进程启动后,AMS会请求创建应用程序进程并启动Activity .步驟2 采用的Socket通信 步骤1 和步骤4 采用的Binder通信 时序图可以总结如下.

2021-08-16 13:33:38 177

原创 Android 源码分析 (四) Activity 启动

Instrumentation 完成对Application和Activity初始化和生命周期调用的工具类。用来监控系统与应用的交互。ActivityThread 管理应用进程的主线程的执行。ApplicationThread 用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService管理应用进程中的Activity时,通过ApplicationThread的代理对象与ActivityThread通...

2021-08-16 12:58:22 318

转载 Bitmap占用内存大小的准确计算公式

一、已经持有了Bitmap对象,怎么知道它占用的内存大小 bitmap类本身 就有这个方法, bitmap.getByteCount()就行。它内部是计算方式:每一行的字节大小 * 总行数(即高度)android.graphics.Bitmap.java 源码 public final int getByteCount() { if (mRecycled) { Log.w(TAG, "Called getByteCount() on a rec...

2021-08-06 09:41:28 2384

原创 setContentView源码分析

我们先来看一下Android中View视图在Activity中的整个层级关系:包含关系:Activity中有个成员变量Window,Window是个抽象类,它的实现类是PhoneWindow,PhoneWindow有一个成员变量DecorView.Phonewindow对象创建的开始入口:ActivityThread#handleLaunchActivity() ->ActivityThread#performLaunchActivity()开始创建PhoneWindow : perf

2021-07-22 09:24:21 244 2

转载 Android卡顿优化 | 基于AndroidPerformanceMonitor源码简析

目录1. 监控周期的 定义2. dump模块 / 关于.log文件3. 采集堆栈周期的 设定4. 框架的 配置存储类 以及 文件系统操作封装5. 文件写入过程(生成.log文件的源码)6. 上传文件7. 设计模式、技巧1. 【监控周期的 定义】blockCanary打印一轮信息的周期,是从主线程一轮阻塞的开始开始,到阻塞的结束结束,为一轮信息;这个周期我们也可以成为BlockCanary的监控周期/监控时间段;2. 【dump模块 / 关于.log文件】这一个周期的信息,除了展

2021-07-18 11:54:09 461

转载 linux进程--进程间通信方式(一)

首先,先来讲一下fork之后,发生了什么事情。由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;也可以调用getppid()来获取父进程的id。(进程id .

2021-07-06 22:19:16 576

原创 Tinker 源码解析-代码修复和资源修复

之前对于热修复的原理了解过,现拿项目中使用的Tinker进行分析,加深理解记忆Tinker 流程图如下Tinker 将 old.apk 和 new.apk 做了 diff,生成一个 patch.dex,然后下发到手机,将 patch.dex 和本机 apk 中的 classes.dex 做了合并,生成新的 classes.dex,然后加载。一Tinker代码修复原理先从ThinkerApplication看public abstract class TinkerAppli.

2021-06-24 15:59:59 689 1

原创 Android 源码分析 (三) 应用程序启动的过程

启动过程启动过程可以分为两步: AMS 发送启动应用程序进程请求 AMS 如果想要启动应用程序进程,就需要向 Zygote 进程发送创建应用程序进程的请求,AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求。 Zygote 接收请求并创建应用程序进程 出处。...

2021-06-11 17:24:14 1404

原创 Flutter的生命周期

生命周期是一个从创建到销毁的过程,Flutter生命周期分为两部分:1.Widget的生命周期2.APP的生命周期

2021-06-10 18:13:00 541

原创 Android的Handler的常见面试问题总结

本文是对常见面试问题的分析,关于Handler的运行机制详细分析见:Android Handler的源码分析常见问题包括:1、Handler是怎么实现切换线程的?2、handler.sendMessage()与handler.post()的区别?3、MessageQueue是怎么增删消息的?4、一个线程可以有几个Handler?几个Looper?几个MessageQueue?5、A Handler发送的消息为什么不会跑到B Handler的handleMessage()方法中?6、简述Th

2021-06-04 21:42:46 1167 2

原创 Android 源码分析 (二) Launcher 启动

在看进阶解密Launcher 启动过程,记录加深后续的理解记忆系统启动的最后一步时启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。...

2021-06-02 22:10:54 543 4

原创 JVM的内存结构及GC机制

JVM结构JVM包含四个部分1 类加载器(ClassLoader):负责将class类加载到JVM中,关于类加载机制2 执行引擎: 负责执行class文件中的字节码指令3本地库接口:主要是调用C或者C++实现的本地方法以及返回的结果4内存区域是运行时数据区,是JVM运行时的内存分配区域,它分为六个区域,如下图1.方法区(Method Area):方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的字段和方法等信息。方法区...

2021-05-28 21:59:03 232

原创 ClassLoader理解和源码分析

java 中的 ClassLoaderBootstrapClassLoader负责加载 JVM 运行时的核心类,比如 JAVA_HOME/lib/rt.jar 等等ExtensionClassLoader负责加载 JVM 的扩展类,比如 JAVA_HOME/lib/ext 下面的 jar 包AppClassLoader负责加载 classpath 里的 jar 包和目录...

2021-05-21 16:13:23 217 1

原创 Android进程间通信方式

一IntentActivity,Service,Receiver 都支持在 Intent 中传递 Bundle 数据,而 Bundle 实现了 Parcelable 接口,可以在不同的进程间进行传输。 Bundle bundle = new Bundle(); bundle.putString("test", "来自A"); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.

2021-05-18 16:27:32 343

转载 什么是RPC?

1. 基本的RPC模型主要介绍RPC是什么,基本的RPC代码,RPC与REST的区别,gRPC的使用1.1 基本概念RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务 本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。 远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数

2021-05-12 17:20:08 108

原创 RecyclerView四级缓存

RecyclerView根据不同的状态可以分为:屏幕内缓存、屏幕外缓存、自定义缓存、缓存池。RecyclerView是通过内部类Recycler来管理缓存 public final class Recycler { final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>(); ArrayList<ViewHolder> mChangedScrap =

2021-05-12 16:35:53 755

原创 AQS 原理解析以及源码分析

什么是AQS?AbstractQueuedSynchronizer,可以叫做抽象队列同步器,可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。AQS 的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些特性的实现,这些实际上是AQS提供出来的模板方法。AQS 是一个抽象类,当我们继承 AQS 去实现自己的同步器时,要做的仅仅是根据自己同步器需要满足的性质实现线程获取

2021-05-11 23:58:17 191 1

空空如也

空空如也

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

TA关注的人

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