自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(148)
  • 资源 (6)
  • 收藏
  • 关注

原创 Systrace系列12 —— CPU Info 解读

本文主要是对 Systrace 中的 CPU 信息区域(Kernel)进行简单介绍,简单介绍了如何在 Systrace 中查看 Kernel 模块输出的 CPU 相关的信息,了解 CPU 频率、调度、锁频、锁核相关的信息。

2023-05-27 13:15:10 1544

原创 Systrace系列11 —— Triple Buffer 解读

Systrace 中可以看到应用的掉帧情况,我们经常看到说主线程超过 16.6 ms 就会掉帧,其实不然,这和我们这一篇文章讲到的 Triple Buffer 和一定的关系,一般来说,Systrace 中我们从 App 端和 SurfaceFlinger 端一起来判断掉帧情况。

2023-05-27 13:08:16 956

原创 Systrace系列10 —— Binder 和锁竞争解读

Android 的大部分进程间通信都使用 Binder,这里对 Binder 不做过多的解释,想对 Binder 的实现有一个比较深入的了解的话,推荐你阅读下面三篇文章理解Android Binder机制1/3:驱动篇理解Android Binder机制2/3:C++层理解Android Binder机制3/3:Java层。

2023-05-27 11:07:23 1228

原创 Systrace系列9 —— MainThread 和 RenderThread 解读

本文是介绍 Android App 中的 MainThread 和 RenderThread,也就是大家熟悉的和。文章会从 Systrace 的角度来看 MainThread 和 RenderThread 的工作流程,以及涉及到的相关知识:卡顿、软件渲染、掉帧计算等。这里以滑动列表为例 ,我们截取主线程和渲染线程的工作流程(每一帧都会遵循这个流程,不过有的帧需要处理的事情多,有的帧需要处理的事情少) ,重点看 “UI Thread ” 和 RenderThread 这两行上面这个流程在。

2023-05-27 11:02:22 1074

原创 Systrace系列8 —— Vsync-App :基于 Choreographer 的渲染机制详解

Choreographer 扮演 Android 渲染链路中承上启下的角色承上:负责接收和处理 App 的各种更新消息和回调,等到 Vsync 到来的时候统一处理。比如集中处理 Input(主要是 Input 事件的处理) 、Animation(动画相关)、Traversal(包括 measure、layout、draw 等操作) ,判断卡顿掉帧情况,记录 CallBack 耗时等启下:负责请求和接收 Vsync 信号。

2023-05-27 10:42:03 1506

原创 Systrace系列7 —— Vsync 解读

本文主要是是介绍 Android 中的 Vsync 机制。文章会从 Systrace 的角度来看 Android 系统如何基于 Vsync 每一帧的展示。Vsync 是 Systrace 中一个非常关键的机制,虽然我们在操作手机的时候看不见,摸不着,但是在 Systrace 中我们可以看到,Android 系统在 Vsync 信号的指引下,有条不紊地进行者每一帧的渲染、合成操作,使我们可以享受稳定帧率的画面。

2023-05-23 21:20:25 931 1

原创 Systrace系列6 —— Input 解读

本文主要是对 Systrace 中的 Input 进行简单介绍,介绍其 Input 的流程;Systrace 中 Input 信息的体现 ,以及如何结合 Input 信息,分析与 Input 相关的问题。在。

2023-05-23 21:15:14 606

原创 Systrace系列5 —— SurfaceFlinger 解读

本文主要是对 SurfaceFlinger 进行简单介绍,介绍了 SurfaceFlinger 中几个比较重要的线程,包括 Vsync 信号的解读、应用的 Buffer 展示、卡顿判定等,由于 Vsync 这一块在和这两篇文章里面已经介绍过,这里就不再做详细的讲解了。这里直接上官方对于—- 引用自那么 Systrace 中,我们关注的重点就是上面这幅图对应的部分。

2023-05-23 21:12:33 639

原创 Systrace系列4 —— SystemServer 解读

本文主要是对 SystemServer 进行简单介绍,介绍了 SystemServer 中几个比较重要的线程,由于 Input 和 Binder 比较重要,所以单独拿出来讲,在这里就没有再涉及到。

2023-05-23 21:04:45 845

原创 Systrace系列3 —— Why 60 fps ?

本文解释一下为何大家总是强调 60 fps。为何我们讲到流畅度,要首先说 60 帧。在理解了上面的基本概念之后,我们再回到 Android 这边,为何 Android 现在的渲染机制,是使用 60 fps 作为标准呢?这主要和屏幕的刷新率有关。

2023-05-21 20:28:09 547

原创 Systrace系列2 —— 预备知识

本文主要是讲解一些分析 Systrace 的预备知识, 主要bao'ku如何查看 Systrace 中的线程状态 , 如何对线程的唤醒信息进行分析, 如何解读信息区的数据, 以及介绍了常用的快捷键. 通过本篇文章的学习, 相信你可以掌握进程和线程相关的一些信息, 也知道如何查看复杂的 Systrace 中包含的关键信息。

2023-05-21 20:18:40 549

原创 Systrace系列1—— 简介

Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。Systrace 的功能包括跟踪系统的 I/O 操作、内核工作队列、CPU 负载以及 Android 各个子系统的运行状况等。内核部分。

2023-05-21 19:43:15 687

原创 Android开发知识体系总章

FlutterFlutter常见插件 用了这个插件后,Flutter开发更简单了!Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashCode方法 ArrayList与LinkList区别与联系 Java反射机制 Java代理模式及三种方式 Java泛型 Synchron

2022-04-05 09:52:31 239

原创 android中的EventLog

调试分析Android时,经常需要查看EventLog,了解当前Activity状态和window的信息等等。本文就列举以下am相关的tags含义。 本文涉及的源码类有EventLog.java、EventLogTags.java,另外tags格式的定义位于文件/system/etc/event-log-tags。如果在终端输入:logcat -b events那么会输出大量类似这样的信息:06-01 13:44:55.518 7361 8289 I am_create...

2022-04-03 19:00:28 1161

原创 Linux 内核空间与用户空间

内核空间和用户空间 对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址

2022-03-27 19:30:43 788

原创 解析ViewRootImpl

一、View 通过 ViewRootImpl 来绘制 ViewRootImpl 是一个视图层次结构的顶部,在上一篇文章中我们知道了 ViewRootImpl 实现了 View 与 WindowManager 之间所需要的协议,作为 WindowManagerGlobal 中大部分的内部实现。这个好理解,在 WindowManagerGlobal 中实现方法中,都可以见到 ViewRootImpl,也就说 WindowManagerGlobal 方法最后还是调用到了 ViewRootIm...

2022-03-19 18:41:27 1443

原创 Java虚拟机(深度)

1. Java 内存区域与内存溢出异常1.1 运行时数据区域 根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。1.1.1 程序计数器内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native...

2022-03-13 20:56:30 140

原创 Linux Signal信号详解

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

2022-03-13 19:45:04 2026

原创 Activity、Window、View 之间的关系

Activity 启动后就可看到我们写的 Layout 布局界面,Activity 从 setContentView() 到显示中间做了什么呢?下面我们就来分析下这个过程。本文主要对于以下问题进行分析:Window 是什么?Activity 与 PhoneWindow 与 DecorView 之间什么关系?

2022-03-13 16:59:58 133

原创 Tombstone文件分析

当一个动态库(native 程序)开始执行时,系统会注册一些连接到debuggerd 的signal handlers,当系统 crash 的时候,会保存一个 tombstone 文件到/data/tombstones目录下(Logcat中也会有相应的信息),文件的确就像墓碑一样记录了死亡了的进程的基本信息(例如进程的进程号,线程号),死亡的地址(在哪个地址上发生了 Crash),死亡时的现场是什么样的(记录了一系列的堆栈调用信息)等等。

2022-03-13 16:42:29 1229

原创 类加载-java.lang.ClassLoader

ClassLoader是什么?Class代表它的作用对象是类,Loader代表它的功能是加载,那么ClassLoader就是把一个以.class结尾的文件以JVM能识别的存储形式加载到内存中。类加载过程一个类在被使用之前,会经历class文件生成—>加载—>连接—>初始化等阶段。这些阶段组合起来为完整的类加载过程,其中加载阶段主要完成三件事:通过类的全限定名来获取定义次类的二进制字节流将该二进制字节流定义的静态数据结构转换成方法区的运行时数据结构在内存中生成一个代表

2022-03-06 20:45:21 144

原创 谈谈ActivityStackSupervisor,ActivityStack,ActivityRecord,TaskRecord的关系

在AMS分析和activity的启动流程时候,经常碰到ActivityStackSupervisor、ActivityStack、ActivityRecord、TaskRecord,现在对它们统一梳理一下。1.简介先来张简单的关系图:

2022-03-06 19:11:05 301

原创 Alpha测试、Beta测试和验收测试的含义与区别

1、Alpha测试 Alpha测试是由用户在开发环境下进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试。开发者坐在用户旁边,这是在开发者受控的环境下进行的测试。由开发者随时记录下错误情况和使用中的问题。2、Beta测试 Beta测试是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,这是在开发者无法控制的环境下进行的测试。由用户记录下遇到的所有问题,定期向开发者报告。beta测试是一模拟真实的使用环境从而发现缺陷的一种测试...

2022-03-06 18:17:54 3758

原创 史上最全依赖注入框架Dagger介绍

一、依赖注入Dagger的作用 我想这是许多人的困惑。为什么不直接new一个对象。 而是通过配置各式各样的注解达到new的目的?看了许许多多的文章,都指向一个观点,一切是为了解耦。 从需求的角度 比如业务类UserService(UserApi api) . 需要构造这个函数。一开始实例化简单,但是随着业务的跟进你需要保存一些用户设置,构造函数加入SharedPreferences。随着构造函数的数量不断增加,就会变得越来越累赘,并且又是多人合作,依赖别人写的对象。改...

2021-10-17 09:12:26 1333

原创 浅谈java接口和抽象类不能实例化原因

首先看看下面这段代码是不是java接口的实例化,代码如下:class MyThread implements Runnable{ ............//此处省略}//另一个类的main方法中:Runnable r = new MyThread();其实很明显,这是父类声明指向子类的引用。具体实例化的是MyThread这个对象。然后进行了思考,针对如下代码:Thread t = new Thread(new Runnable(){ @Override pu.

2021-10-17 08:40:20 818

原创 详解JVM内存空间

java虚拟机基本结构:JVM是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中,因此明白java虚拟机的内存分配非常重要,本部分主要讲解java虚拟机内存分配。本部分会从概念上介绍java虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题。#引入:一个示例下面通过一个简单的示例,来展示java堆、方法区和java栈之间的关系。public class SimpleHeap { private int id;...

2021-10-16 21:20:15 147

原创 什么是jvm虚拟机

最近看了一段时间jdk源码,在看源码的过程中对数据的存储不是很清楚,当时就在想数据到底存在哪里去了?以前只是看博客什么的对jvm有一个大概的了解,但是没有深入研究。经过一段时间的研究<<深入理解java虚拟机后>>,才决定写一些关于jvm的文章,不为别的只为了同为技术的程序员们少走一些弯路,因为这本书第一遍读起来晦涩难懂,我也是查阅了大量的资料才渐渐的理解了什么意思。同时也为了留下自己的脚印,以后几十年后能够看到我在这一年没有荒废时间还在努力的研究技术,估计那时候会欣慰的一笑吧。1

2021-10-16 21:06:25 178

原创 JVM实例和main()方法

别人问了我一个问题假设A和B都继承CA的main方法执行 阻塞B的main方法执行为什么C加载了两次?答案:一个main方法对应一个JVM实例 因此在每个JVM中C只加载了一次-------------------------------------------------------记住:每一个Java应用都唯一对应一个JVM实例,每一个JVM实例唯一对应一个堆。...

2021-10-16 20:58:26 162

原创 堆和栈的区别

堆与栈关于堆和栈的问题,对于熟悉C++的同学来说可能理解的比较清楚,但是由于Java的一切对象都是在堆上,因此有时候可能反而会比较迷惑,比如:为什么要分堆和栈?堆和栈的区别是什么?为什么堆是线程共享的而栈不是?很多懂一点Java的人甚至是懂一点编程的人都知道内存一般分为堆和栈,栈由系统进行关系,而堆由程序员自己管理,...balabala,基本任何一本语言基础书都会提到这些特点,但是你有想过为什么吗?为什么要分堆和栈之所以要区分堆和栈,是由于程序需要两种不同特性的内存形似而确

2021-10-16 20:43:25 92

原创 Java中的enum不能被继承

1、枚举类介绍如果一个类的实例是有限且确定的,那么可以使用枚举类。比如:季节类,只有春夏秋冬四个实例。枚举类使用enum进行创建,其实例必须从”第一行“开始显示写出。enum Season{   SPRING,SUMMER,FALL,WINTER;//默认public static final,这都是Season类的对象。}特点:  1、枚举类的对象默认都是public static final  2、枚举类的构造器都是private,故无法在外部创建其实例,这也决定了枚举类实

2021-10-16 20:34:49 1487

原创 Java接口与实现类的转换

1、接口不能直接实例化对象一开始学习接口就知道它与类的区别:接口不能用于实例化对象。但是可以在 Java 中,使用接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。public interface TestInterface{}TestInterface testInterface = new TestInterface();//这种肯定是不允许的2、实现接口的子类可以通过创建对象赋值给接口接口不能实例化,用接口的实现类可以实例化,将实现类的对象在内存中的地址

2021-06-24 17:00:36 3868

原创 ActivityManagerService的理解

ActivityManagerService的理解

2021-06-17 20:36:53 201

原创 Activity启动流程

1.startActivity()通过Instrumentation向AMS进程发起startActivity()请求2.AMS收到启动请求后,由ActivityStarter处理Flags和Intent信息,然后再由ActivityStackSuper visor和ActivityStack处理Task和Stack流程3.

2021-06-07 15:31:47 155

原创 Framework概略

。所以Android也需要运行环境,需要Linux内核在启动完成后加载Android Framework运行所需要的资源。当Framework完成初始化后才能继续启动相应的APK应用程序。一、Framework启动分析Framework运行的第一个Java虚拟机进程为zygote(对应具体程序为app_process,该程序位于system/bin目录下),zygote是APK应用程序的父进程,此后所有的虚拟机进程都由zygote创建。zygote有两个功能:接受请求创建新的Dalvik进程共享类

2021-06-03 20:57:53 124

原创 面试官:为什么 Activity.finish() 之后 10s 才 onDestroy ?

https://zhuanlan.zhihu.com/p/340362623

2021-01-11 16:20:13 370

原创 taskAffinity 属性详解

taskAffinity 属性详解一、本文目的本篇文章的目的是为了 搞清楚,哪些情况下开启一个 Activity 会在新的 task 运行,哪些情况下会继续在原来的task 运行。二、相关基础知识知识点 1每个 Activity 运行时都有一个其归属的 task栈,我们可以用 activity.getTaskId() 的方法得到当前 activity 的taskId。如果两个 activity 的 taskId 不同,则他们肯定不会属于同一个 task。为了方便,我们在 Application

2020-12-18 10:34:25 937

原创 Handler机制终极梳理

Handler机制终极、彻底的梳理,附源码分析和实例剖析!看完醍醐灌顶、豁然开朗!

2020-12-12 18:51:41 145

原创 域名,网站名,URL,URI,端口

简单区分之前就经常看到URL什么的,一直似懂非懂,今天就来整理下吧,我先以下面这个网址为例,说说它包含了哪些东西。https://www.baidu.com/img/bd_logo1.png1. https://代表协议,不是还有什么http,tcp协议嘛,这里不啰嗦这个,简单知道就行。2. www代表服务器名,一个www服务器,比如还有邮箱服务器mail,可以点下qq邮箱试试。3. baidu.com代表域名,用来定位独一无二的网站4. www.baidu.com代表网站名,由服务器名和域名组

2020-06-25 12:44:21 647

原创 浅析html+css+javascript之间的关系与作用

三者间的关系一个基本的网站包含很多个网页,一个网页由html, css和javascript组成。html是主体,装载各种dom元素;css用来装饰dom元素;javascript控制dom元素。用一扇门比喻三者间的关系是:html是门的门板,css是门上的油漆或花纹,javascript是门的开关;html介绍html是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言(标记标签),总的来说,html使用标记标签来描述网页,本文就用标签来代替标记标签进行说明。标签是指&l

2020-06-25 12:34:03 1373

原创 编程语言、标记语言、脚本语言之间的比较

首先说一下,什么是编程语言,标记语言跟脚本语言:编程语言(programming language):是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 1.需要编译执行; 2.本身具有逻辑性和行为能力;标记语言:是一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。...

2020-06-25 12:25:23 368

MVP模式代码

该代码包采用MVP模式,逻辑清晰、便于理解,对于学习MVP模式有很大帮助!

2018-09-02

即时音视频聊天

完整的音视频聊天代码,有详细说明,完美的帮助你!

2016-01-13

通用指南针

这是一款通用精美的指南针程序,无论菜鸟还是大神都可以拿去学习,下载后直接解压,里面就是源码包,导入Eclipse即可!

2014-08-26

百度定位源码包

这是一款基于百度SDK的定位程序,非常精准!通过百度地图显示出来!下载后解压,里面是源码,一目了然,直接应用!

2014-08-26

日历程序源码包

这是一款简洁实用的日历程序,里面的代码很详细!对相关开发者很有帮助!解压后,里面就是源代码,一目了然!

2014-08-26

图片放大镜

可以放大背景图片上区域。通过PathView和ShaderView来构成放大的View

2014-04-30

空空如也

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

TA关注的人

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