自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Perfetto详细解析

Perfetto 是一个生产级的开源堆栈,用于提高性能 仪器和痕量分析。与 Systrace 不同,它提供数据源超集,可以用 protobuf 编码的二进制流形式记录任意长度的跟踪记录。可以将Perfetto理解为systrace的升级版,用在更新的平台、新图表展示更多的信息。

2024-06-30 02:35:47 1995

原创 JSON详解

JSON() 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。从他的定义看(),它是一种数据交换的文本格式,而不是一种编程语言。

2024-06-29 16:30:18 884

原创 JVM知识梳理

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方便的多。所以要深入理解JVM必须理解内存虚拟化的概念。在JVM中,JVM 内存主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈等。同时按照与线程的关系也可以这么划分区域:线程私有区域:一个线程拥有单独的一份内存区域。线程共享区域:被所有线程共享,且只有一份。

2024-06-14 00:21:43 798

原创 Android Webview 详解

Android去调用JS的代码JS去调用Android的代码二者沟通的桥梁是WebView通过WebView的loadUrl()通过WebView的evaluateJavascript()通过WebView的addJavascriptInterface()进行对象映射通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url。

2024-06-07 22:39:00 4420

原创 Java注解使用与自定义

使用@interface标识是一个注解,表示扩展自然后需要指定注解的作用域与生命周期,使用元注解@Target和@Retention来注解上面表示注解只能作用于方法上,并且其所携带的元数据会保留到运行时。没有携带元数据,意义不大,下面给注解添加参数(元数据)注解中每一个方法就是声明了一个配置参数,方法的名称就是参数的名称,返回值类型就是参数的类型。使用default定义参数默认值。注解参数的可支持数据类型。

2024-06-06 02:07:22 1085

原创 Java 语言高级特性--泛型

之前关于类的学习中我们知道,一个类中可以定义它的属性以及方法,在那里我们定义类的属性时不同的属性我们采用的是不同的数据类型,这就要求我们对每一个数据的类型进行声明操作。但是我们想到这样一个问题,如果这个类有无数个属性的时候我们怎么对这个类的属性进行定义呢?显然,将这个类的所有属性进行枚举型的定义是不现实的,因此这就要求我们找到属性定义的共同特性。

2024-06-06 00:45:36 595

原创 Android Activity/Window/View 的background设置

Activity/Window/View 的background,平时接触最多的就是View的background,Activity的background次之,最后用的较少的是Window的background,这三者有什么关联、区别呢?

2024-06-05 01:05:49 1222

原创 View绘制Draw过程

我们知道 Android 视图的绘制流程分为:Measure,Layout 和 Draw,之前我们已经分析了:Measure 和 Layout,他们最主要的任务是:确定 View/ViewGroup 可绘制的矩形区域。接下来我们分析 Draw 是如何在这给定的区域内绘制想要的图形。ViewGroup 与 View然而 ViewGroup 并没有约定其内部的子 View 是如何布局的,是叠加在一起呢?还是横向摆放、纵向摆放等。

2024-06-05 00:43:33 631

原创 WMS-理解ViewRootImpl

ViewRootImpl 是一个视图层次结构的顶部,可以理解为一个 Window 中所有 View 的根 View 的管理者(但 ViewRootImpl 不是 View,只是实现了 ViewParent 接口),实现了 View 和 WindowManager 之间的通信协议,实现的具体细节在 WindowManagerGlobal 这个类中。

2024-06-04 23:42:28 622

原创 View自定义属性相关:Style/Theme/Attr/Styleable/TypedArray

attrs相比我们刚开始声明的属性而言,增加了“declare-styleable”标签,意思是将若干个属性声明归结到MyStyleable里,这些属性声明属于"同一组"。declare-styleable 的name默认提示与自定义View的类名一致,但不是必须的。再来看看如何解析这些属性。//R.styleable.MyStyleable 指的是想要解析的属性//count 表示解析出来的个数i < count;i++) {//通过属性index找到属性值break;

2024-06-04 01:52:47 981

原创 Java crash处理流程

App crash(全称Application crash), 对于Crash可分为native crash和framework crash(包含app crash在内),对于crash相信很多app开发者都会遇到,那么上层什么时候会出现crash呢,系统又是如何处理crash的呢。例如,在app大家经常使用try…catch语句,那么如果没有有效catch exception,就是导致应用crash,发生没有catch exception,系统便会来进行捕获,并进入crash流程。

2024-06-02 15:37:02 927

原创 Android中ANR的分析和解决

2、ANR的类型(1)KeyDispatchTimeout(常见)input事件在5S内没有处理完成发生了ANR。logcat日志关键字:Input event dispatching timed out前台Broadcast:onReceiver在10S内没有处理完成发生ANR。后台Broadcast:onReceiver在60s内没有处理完成发生ANR。logcat日志关键字:Timeout of broadcast BroadcastRecord。

2024-06-02 15:17:16 1028

原创 ANR-Java进程的Trace文件解析

Android 系统采用 ART 虚拟机,所有的 Java 进程都运行在 ART 之上,当应用发生 ANR,其中最终的一个环节便是向目标进程发送信号 SIGNAL_QUIT,传统的 linux 则是终止程序并输出 core;而对于 Android 进程来说当收到 SIGQUIT 时,Java 层面的进程都是跑在虚拟机之上的,ART 虚拟机会捕获该信号,并输出相应的 traces 信息保存到目录 /data/anr/traces.txt。adb shell kill -3 888 //可指定进程pid。

2024-06-02 14:46:01 1068

原创 ANR的信息收集过程

触发 ANR 时系统会输出关键信息:(这个较耗时,可能会有10s)1.将 am_anr 信息,输出到 EventLog (ANR 开始起点看 EventLog)2.获取重要进程 trace 信息,保存到 /data/anr/traces.txt (会先删除老的文件)Java 进程的 tracesNative 进程的 traces3.ANR reason 以及 CPU 使用情况信息,输出到 main log。

2024-06-02 14:05:51 779

原创 ANR触发原理

ANR (Application Not responding),是指应用程序未响应,Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成 ANR。一般地,这时往往会弹出一个提示框,告知用户当前 xxx 未响应,用户可选择继续等待或者Force Close。那么哪些场景会造成 ANR 呢?Service Timeout:前台服务在 20s 内未执行完成BroadcastQueue Timeout:前台广播在 10s 内未执行完成。

2024-06-02 13:31:52 970

原创 关于WindowInsets理解

WindowInsets源码解释为Window Content的一系列插值集合,可以理解为可以将其理解为不同的窗口装饰区域类型,比如一个Activity相对于手机屏幕需要空出的地方以腾给StatusBar、Ime、NavigationBar等系统窗口,具体表现为该区域需要的上下左右的宽高。WindowInsets包括三类:SystemWindowInsets、StableInsets、WIndowDecorInsets。

2024-05-30 02:19:10 899

原创 LiveData是如何感知Room数据变化的

至此,RoomTrackingLiveData完美实现了数据库发生变化时,会主动将新的数据上报给开发者的功能。由上可知,room配合livedata使用时,之所以livedata能够自动感知数据库数据变化,是由。这里讨论的LiveData的创建是特指Dao定义的方法的返回类型,而不是所有的LiveData。如果有两个进程同时关联了同一个数据库,如果一个进程对此数据库的数据进行改变,那么另一个进程的。方法会在调用数据库的增删改方法时触发,另一个方法。至此,room框架完成了一次完美的跨进程通讯。

2024-05-30 00:39:53 932

原创 Jetpack MVVM - Android架构探索!

我们先来理解开发架构的本质是什么,维基百科对软件架构的描述如下:拆分开来就是三条:为啥要做开发架构设计呢?架构模式最终都是 服务于开发者。如果代码职责和逻辑混乱,维护成本就会相应地上升。宏观上来说,开发架构是一种思想,每个领域都有一些成熟的架构模式,选择适合自己项目即可。具体到Android开发中,开发架构就是描述 视图层、逻辑层、数据层 三者之间的关系和实施:正常的开发流程中,开始写代码之前 都会有架构设计这一过程。这就需要你选择使用何种架构模式了。我的Android开发之路完整地经过了 MVC、MVP、

2024-05-29 23:49:03 1234

原创 Jetpack ViewModel 完全掌握!

ViewModel是Jetpack AAC的重要组件,同时也有一个同名抽象类。ViewModel,意为 视图模型,即为界面准备数据的模型。简单理解就是,ViewModel为UI层提供数据。官方文档定义如下:ViewModel 以注重生命周期的方式存储和管理界面相关的数据。(作用)ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。(特点)到这里,你可能还是不清楚ViewModel到底是干啥的,别急,往下看。

2024-05-28 01:08:52 813

原创 Jetpack LiveData 完全掌握!

本文先介绍了LiveData的概念——使用观察者并可以感知生命周期,然后是使用方式、自定义LivaData、高级用法Transformations。最后详细分析了LiveData源码及原理。并且可以看到Lifecycle如何在LiveData中发挥作用,理解了观察者模式在其中的重要运用。LiveData是我们后续建立MVVM架构的核心。LiveData同样是我们必须掌握和理解的部分。

2024-05-28 00:40:53 841

原创 Android四大组件系列 Application创建流程

system_server 进程和 app 进程都运行着一个或多个 app,每个 app 都会有一个对应的 Application 对象(该对象跟 LoadedApk 一一对应)。system_server 进程app 进程system_server 进程其 application 创建过程都创建对象有 ActivityThread,Instrumentation,ContextImpl,LoadedApk,Application。app 进程。

2024-05-27 01:40:12 1031

原创 Android四大组件 ContentProvider原理

ContentProvider 用于提供数据的统一访问格式,封装底层的具体实现。对于数据使用者来说,无需知晓数据的来源是数据库、文件,或者网络,只需简单地使用 ContentProvider 提供的数据操作接口:增(insert)、删(delete)、改(update)、查(query) 即可,非常方便。

2024-05-27 01:13:17 973

原创 Android窗口管理

1.创建 Window,将 View 和 ViewRootImpl 同 Window 绑定。2.WindowManager 的 addView()、updateViewLayout() 和 removeView() 方法操作 Window。3.将 WindowManager 这些操作方法转移给 WindowManagerGobal 来调用。4.调用与 Window 绑定的 ViewRootImpl 的 setView() 方法。

2024-05-26 03:19:29 908

原创 setContentView 流程分析

常用的Activity有Activity和AppCompatActivity,分别梳理一下这两个类的setContentView()流程。

2024-05-26 02:01:54 712

原创 Android四大组件系列 Broadcast广播机制(下)

LocalBroadcast是APP内部维护的一套广播机制,有很高的安全性和高效性。所以如果有APP内部发送、接收广播的需要应该使用LocalBroadcast。Receiver只允许动态注册,不允许在Manifest中注册。LocalBroadcastManager所发送的广播action,只能与注册到LocalBroadcastManager中BroadcastReceiver产生互动。

2024-05-25 22:44:44 741

原创 Android四大组件 Broadcast广播机制

广播 (Broadcast) 机制用于进程或线程间通信,广播分为广播发送和广播接收两个过程,其中广播接收者 BroadcastReceiver 是 Android 四大组件之一。静态广播接收者:通过 AndroidManifest.xml 的标签来声明的 BroadcastReceiver动态广播接收者:通过 AMS.registerReceiver() 方式注册的 BroadcastReceiver,动态注册更为灵活,可在不需要时动态取消注册。

2024-05-25 22:10:25 882

原创 Service启动流程

Service 的启动流程还是比较简单的,不像 Activity 那么复杂,相关联的类和方法也少了很多,不像 Activity 启动流程里面走着走着就会迷失方向,在之前两篇文章我们主要分析了 Activity 的启动流程,今天我们主要来探索 Service 的启动过程。Service 是 Android 四大组件,地位仅次于 Activity,Activity 位于前台向用户展示界面;Service 位于后台不可见,但是它承担了大部分的的数据处理工作,主要为其他组件提供后台服务,监控其他组件的运行状态。

2024-05-25 15:37:18 1136

原创 源码理解Fragment机制

我们从Activity下手, 从getFragmentManager来看,我们是去从FragmentController中获取的FragmentManager。/***/// 在这里实现FragmentHostCallback所无法实现的那些功能,列如activituy跳转的数据结果等...从FragmentController的源码可以看到,构造方法的参数为: FragmentHostCallback且,这是唯一的变量。

2024-05-22 02:27:20 1041

原创 Activity销毁流程

Activity 在以下几种情况下由于正常的应用操作会被销毁,例如:当用户按下后退键或者是 Activity 本身调用了 finish() 方法。此外,如果你的 Activity 生命周期处于 stop 状态而且一段时间内都没有被调用或者是处于前台的 Activity 需要更多的资源而系统资源紧张的时候,系统也会销毁你的 Activity,杀掉后台进程给前台进程留出足够的内存。下面我们来分析 Activity 的销毁流程。

2024-05-22 00:18:03 1098

原创 深入理解 ClientLifecycleManager 机制

ClientLifecycleManager 是管理 Activity 生命周期的,在 ActivityTaskManagerService 里面提供 getLifecycleManager 来获取此对象,其中 mLifecycleManager 是在 ActivityTaskManagerService 的构造方法里面初始化的。............//mLifecycleManager初始化......//获取mLifecycleManager对象......

2024-05-17 00:37:46 890

原创 Activity启动流程(下)

本篇文章接上一篇文章Android四大组件系列2 Activity启动流程(上)继续分析。上一篇文章我们分析了startActivity阶段pause阶段和新进程创建阶段,这篇文章我们分析剩下的函数阶段。五 总结本文从 startActivity 开始,详细分析了 Activity 的启动过程,以桌面点击应用图标为例大致流程如下。

2024-05-17 00:23:34 906

原创 Activity启动流程

每个 App 在启动前必须先创建一个进程,该进程是由 zygote fork 出来的,进程具有独立的资源空间,用于承载 App 上运行的各种 Activity,Service 等组件。进程对于上层应用来说是完全透明的,这也是谷歌有意为之,让 App 程序都运行在 Android Runtime 上。大多数情况一个 App 就运行在一个进程中,除非在 AndroidManifest.xml 中配置 Android:process 属性,或通过 native 代码 fork 进程。

2024-05-16 01:50:52 1302

原创 AMS相关数据结构

图中的方框可以理解为一个中包含关系:譬如一个TaskRecord中包含多个ActivityRecord;图中的连接线可以理解为等价关系,譬如同一个ActivityRecord会被TaskRecord和ProcessRecord引用,两者是从不同维度来管理ActivityRecord。

2024-05-14 02:22:46 957 2

原创 AMS启动流程:AMS、ATMS、SystemServer、SystemServvice、SystemServiceManger、ServiceManager?

从 Android10 的代码变更看,谷歌最终的目的是把 activity 和 window 融合,目前发布的版本虽然做了大量的代码变更,但和 P 之前的版本的流程变化不大,目前只是简单的把代码整理到一起了,还属于中间状态,按 android 文档介绍,完全融合在 M 甚至更靠后的版本才能完成。需要注意的是,由于只有 Java 进程才会向 AMS 注册,而一般的 Native 进程不会向 AMS 注册,因此此处杀死的进程是 Java 进程。此时,系统先创建它,再通过它创建其它组件。

2024-05-10 01:14:14 1281

原创 Android View绘制onMeasure流程

onMeasure()方法的作用就是测量View需要多大的空间,就是宽和高。大家可能会有这样的疑问。就是我在xml文件中已经指定好了某个View宽高尺寸了,那么自定义View时不就没有必要再次获取宽高并设置宽高吗?onMeasure方法不就没有了吗?其实不然,我们就知道,在xml布局文件中,我们的layout_width和layout_height参数可以不用写具体的尺寸,而是wrap_content或者是match_parent。

2024-05-06 00:50:05 884

原创 Handler消息机制

(1)MessageQueue就像履带。它上面装载着一个个Message(2)Thread就像传送带的动力,对应到程序就是我们通信都是基于线程而来的。(3)传送带的滚动需要一个开关给电机通电,那么就相当于我们的Looper的loop函数,而这个loop里面的for循环就会带着传送带不断的滚动,去轮询messageQueue上面装载的每一个Message(4)Message就是 我们的货物了。②其二,从设计思想的角度其实构成了线程模型中的经典问题 生产者-消费者模型。

2024-04-29 02:40:22 852 1

原创 View的事件分发及冲突处理

事件分发处理和事件冲突

2024-04-27 22:38:22 762

原创 AMS中最重要的数据结构-TaskRecord(任务栈)

1.在 Android 中,每一件事可以被看作是一个 Task,一个 Task 又可以被细分成多个子步骤,每个子步骤可以被看作是一个 Activity。任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中。堆栈中的 Activity 永远不会重新排列,只会被送入和退出,在当前 Activity 启动时被送入堆栈,在用户使用返回按钮离开时从堆栈中退出。因此,返回堆栈按照“后进先出”的对象结构运作,所以也叫。

2024-04-24 03:37:03 1202

原创 客户端通过 Binder访问服务端bindService流程

上篇文章客户端是如何通过Binder与服务端通信的,后记中遗留客户端是如何通过bindservice获取服务端的BinderProxy对象的?本篇文章将从进程的角度出发来分析 bindService 流程,在 bindService 的流程中将要涉及到三个主要的进程,分别是客户端进程(bindService 发起端进程)system_server 进程(AMS在system_server 进程中)服务端 Service 进程。

2024-04-22 01:57:44 1178

原创 客户端是如何通过Binder与服务端通信的

binder基于AIDL的通信流程图如下:Client端: ClientActivity;Server端: RemoteService;Service的对外aidl接口如上面代码所示,ClientActivity已经通过BindService拿到了RemoteService的IBinder对象AIDL通信的基本步骤如下:1. Client通过获取到Server的Binder,并且封装成一个Proxy。2.通过Proxy来同步调用IPC。

2024-04-21 19:47:33 925 1

空空如也

空空如也

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

TA关注的人

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