自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记录常用的三方库和牛b的资料

https://github.com/tiann/FreeReflection

2021-06-16 11:08:41 467

转载 Android应用程序窗口的绘制过程,即Surface的渲染过程

Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了。不过在绘制这些UI元素之前,我们还需要从上到下地测量它们实际所需要的大小,以及对它们的位置进行合适的安排,即对它们进行合适的布局。在本文中,我们就将详细地分析Android应用程序窗口的测量、布局以及绘制过程。从前面Android应用程序与SurfaceFlinger服务的关系概述和学习计划这一系列的文章可以知道,Android应用程序窗口请求SurfaceFlinger服务创建了一个绘.

2022-06-16 16:21:15 1501

转载 Android应用程序窗口Activity与SurfaceFlinger服务的连接过程,即Surface的创建过程

在前文中,我们分析了应用程序窗口连接到WindowManagerService服务的过程。在这个过程中,WindowManagerService服务会为应用程序窗口创建过一个到SurfaceFlinger服务的连接。有了这个连接之后,WindowManagerService服务就可以为应用程序窗口创建绘图表面了,以便可以用来渲染窗口的UI。在本文中,我们就详细分析应用程序窗口的绘图表面的创建过程。我们知道,每一个在C++层实现的应用程序窗口都需要有一个绘图表面,然后才可以将自己的UI表现出来。这个绘.

2022-04-02 14:24:23 825

转载 Android应用程序窗口与WindowManagerService服务的连接过程,即WindowState的创建过程

Activity组件在其窗口对象和视图对象创建完成之后,就会请求与WindowManagerService建立一个连接,即请求WindowManagerService为其增加一个WindowState对象,用来描述它的窗口状态。在本文中,我们就详细分析Activity组件与WindowManagerService的连接过程。我们从两方面来看Activity组件与WindowManagerService服务之间的连接。一方面是从Activity组件到WindowManagerService服务的连接,.

2021-12-29 10:16:59 779

转载 Android应用程序窗口Activity的视图View的创建过程,即DecorView的创建过程

从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图。应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。在本文中,我们就详细分析应用程序窗口视图的创建过程。应用程序窗口内部所包含的视图对象的实际类型为DecorView。DecorView类继承了View类,是.

2021-11-26 17:22:13 479

转载 Android应用程序窗口(Activity)的窗口对象(Window)创建过程,即PhoneWindow的创建过程

在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它的具体UI实现其实是由其它的一系列对象来实现的。在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow,.

2021-10-21 16:06:44 941

原创 设计模式汇总,对应Android系统源码举例,保你一次看个够

1设计模式的七大原则尽量用最简单的话描述1、开闭原则(Open Closed Principle)对类的扩展是开放,对修改关闭。在程序需要扩展的时候,对于一个类,不要去修改原来的代码,而是通过继承的方式去扩展这个类。目的:降低维护风险。2、单一职责原则(Single Responsiblity Principle)每个类应该且只有一个职责。目的:提高可读性。3、里式替换原则(Liskov Substitution Princi...

2021-09-22 14:10:20 240

转载 Android应用程序窗口Activity的运行上下文Context的创建过程,即创建ContextImpl的创建过程

我们知道,Android应用程序窗口的运行上下文环境是通过ContextImpl类来描述的,即每一个Activity组件都关联有一个ContextImpl对象。ContextImpl类继承了Context类,它与Activity组件的关系如图1所示:图1 ContextImpl类与Activity类的关系图这个类图在设计模式里面就可以称为装饰模式。Activity组件通过其父类ContextThemeWrapper和ContextWrapper的成员变量mBase来引用了一个ContextImp.

2021-08-17 09:29:41 513

原创 安卓性能优化--启动优化(主要根据冷启动过程,从用户操作直观感知与程序代码运行流程两个维度分析)

谈到性能优化这个事情,不像我们开发新需求或者修BUG那样,能很快得到立竿见影的效果,因为涉及到的技术点,代码运行逻辑,产品功能等比较冗杂,反而是充满不确定性。而且优化后的成效也可能只比优化前提高百分之几,所以这也是个细活儿,需要一点一点的扣,要学会抓大放小,优化前认真审视各方面,根据产品周期,做出最适合的优化方案。对于我们研发人员来说,APP的启动速度就是我们的“门面”,这段时间的长短,会被用户深刻感知到,这个第一印象很是重要,会直接影响用户留存和转化等核心数据。优化之前,先要搞清楚整个启动过程中都.

2021-07-14 13:46:34 301

原创 Android性能优化--IO 优化( IO基本知识:应用程序、文件系统和磁盘,三种IO方式及适用场景,多线程阻塞IO和NIO)

目录I/O 的基本知识1. 文件系统2. 磁盘Android I/O1. Android 闪存2. 两个疑问疑问一:文件为什么会损坏?疑问二:I/O 有时候为什么会突然很慢?不同的场景使用不同的I/O方式I/O 的三种方式1. 标准 I/O2. 直接 I/O3. mmap多线程阻塞 I/O 和 NIO1. 多线程阻塞 I/O2. NIO小文件系统常见不良现象1. 主线程 I/O2. 读写 Buffer 过小3. 重复读4

2021-06-24 17:55:59 3872

转载 抖音创始人张一鸣:10年面试2000人,我发现混的好的人,全都有同一个特质

张一鸣 ,今日头条创始人,2013年,他先后入选《福布斯》“中国30位30岁以下的创业者”和《财富》“中国40位40岁以下的商业精英”。

2021-06-05 20:37:31 237

原创 直播与音视频通话有啥不一样?

直播直播是1个主播+N个观众(支持千万级)组成的在线直播。主播将音视频数据上传到推流服务器。 推流服务器和拉流服务器都是处于内网,推流服务器将主播的流传输到拉流服务器。

2021-06-04 11:23:35 772

转载 Android应用程序是如何请求SurfaceFlinger服务渲染一个Surface的?

在前面一篇文章中,我们分析了Android应用程序请求SurfaceFlinger服务创建Surface的过程。有了Surface之后,Android应用程序就可以在上面绘制自己的UI了,接着再请求SurfaceFlinger服务将这个已经绘制好了UI的Surface渲染到设备显示屏上去。在本文中,我们就将详细分析Android应用程序请求SurfaceFlinger服务渲染Surface的过程。Android应用程序在请求SurfaceFlinger服务渲染一个Surface之前,首先要将该Sur...

2021-06-03 10:58:15 380

原创 Android开发重点---差值器和估值器,使用动画的注意事项,Drawable、Canvas、Bitmap关系,Window的内部机制,Activity,Dialog,Toast的Window创建

差值器和估值器差值器一般指时间差值器TimeInterpolator,是设置 属性值 从初始值过渡到结束值 的变化规律,比如匀速,加速,减速等等。可以通过xml属性和java代码设置。系统默认的差值器是AccelerateDecelerateInterpolator,即先加速后减速。//匀速插值器设置android:interpolator="@android:anim/linear_interpolator"或alphaAnimation.setInterpolator(new Lin

2021-05-18 10:03:25 464 1

转载 Android应用程序是如何请求SurfaceFlinger服务创建一个Surface的?

连接上SurfaceFlinger服务之后,Android应用程序就可以请求SurfaceFlinger服务创建Surface。而当有了Surface后,Android应用程序就可以用来渲染自己的UI了。在本文中,我们将详细分析Android应用程序请求SurfaceFlinger服务创建Surface的过程。在讲述Android应用程序请求SurfaceFlinger服务创建Surface之前,我们首先了解一个Surface是由什么组成的。我们可以将Surface理解为一个绘图表面,Androi..

2021-05-10 17:51:09 451

转载 Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析

Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和SurfaceFlinger服务共享它的UI元数据,以便使得SurfaceFlinger服务可以正确地为它创建以及渲染Surface。在本文中,我们将详细地分析这块用来保存UI元数据的匿名共享内存的创建过程。用来保存Android应用程序的UI元数据的匿名共享内存最终是被结构化为一个SharedClient对象来访问的。每一个与UI有关的Android应用程序进程有且仅有一个SharedClient对象,.

2021-04-19 18:00:49 206

转载 Android应用程序与SurfaceFlinger服务的连接过程分析

前文在描述Android应用程序和SurfaceFlinger服务的关系时提到,每一个有UI的Android应用程序都需要与SurfaceFlinger服务建立一个连接,以便可以通过这个连接来请求SurfaceFlinger服务为它创建和渲染Surface。在本文中,我们将以Android系统的开机动画应用程序为例,详细描述Android应用程序是如何与SurfaceFlinger服务建立连接的。Android系统的开机动画是由应用程序bootanimation来实现的,它位于/system/b...

2021-03-23 15:34:08 323

转载 Android应用程序与SurfaceFlinger服务关系概述

SurfaceFlinger服务负责绘制Android应用程序的UI,它的实现相当复杂,要从正面分析它的实现不是一件容易的事。既然不能从正面分析,我们就想办法从侧面分析。说到底,无论SurfaceFlinger服务有多复杂,它都是为Android应用程序服务的,因此,我们就从Android应用程序与SurfaceFlinger服务的关系入手,来概述和制定SurfaceFlinger服务的学习计划。 SurfaceFlinger服务运行在Android系统的System进程中,它负责管理Andr...

2021-03-09 14:45:25 293

原创 Android开发中如何编写高效代码及性能微优化

目录在性能优化工作中,选择正确的算法和数据结构应始终是您的首要任务。始终衡量性能避免创建不必要的对象静态优先于虚拟对常量使用 static final使用增强型 for 循环语法对于私有内部类,考虑使用包访问权限,而非私有访问权限避免使用浮点数了解和使用库谨慎使用原生方法性能误区在性能优化工作中,选择正确的算法和数据结构应始终是您的首要任务。编写高效代码有两个基本规则:不需要做的工作就不要做 如果可以避免,就不要分配内存在微优化 Andro.

2021-03-01 09:38:50 252

原创 Java中类的初始化与实例化总结(类初始化的触发时机,类的实例化触发时机,new一个对象的过程)

全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗? 描述new一个对象的过程,并结合例子说明。 类初始化的触发时机。 多线程进行类的初始化会出问题吗? 类的实例化触发时机。 <clinit>()方法和<init>()方法区别。 在类都没有初始化完毕之前,能直接进行实例化相应的对象吗? 类的初始化过程与类的实例化过程的异同? 一个实例变量在对象初始化的过程中会被赋值几次? 描述new一个...

2021-02-10 08:47:39 1531 1

转载 阿里ARouter全面全面全面解析(使用介绍+源码分析+设计思路)

概述arouter是android实现组件化的路由框架,涉及到的功能有activity、fragment的跳转、跳转带参数、自定义服务、自定义拦截器、拦截下沉、重定向url都是Arouter里面定义的功能,可能用过Arouter的小伙伴们只用过Arouter的跳转以及跳转功能带参数的功能,像它的自定义服务、拦截器、全局降级策略、重定向功能都是很不错的功能,下面我会一一介绍这些功能该怎么使用。使用介绍1.基础依赖1.1.java版本的依赖在需要使用Arouter的module中添加如下

2021-02-06 19:11:34 5329

转载 巧用RecyclerView ItemDecoration 实现炫酷视差效果

目录概述分析实现概述最近项目又开始大刀阔斧的改版迭代,PM也再次开始了其疯狂CX大法。不过对此早已习以为常了,毕竟我们也曾经看懂过这么一本书《RR is PM》。哈哈,有点扯远了,回归正题,先来看看这次要实现的交互效果(CX目标):简单描述下,界面就是一个横向列表,滑动的时候,背景图跟着一起滑动,并且附带视差效果,随着滑动距离增加,背景图一直在循环展示。看到这种效果,列表方案肯定是首选RecyclerView,接着看这背景视差效果,首先想到的就是通过绘制background的方式

2021-02-01 08:36:00 393 1

转载 两年多的 Android SDK 开发经验,分享给大家

前言:偶然看到一篇分享SDK开发的文章,正看的叫好时,顿觉,独享不如众享,便转载过来,输入的同时也输出。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~在公司做了两年多的 SDK 开发,结合自己的所知所学,分享一些 SDK 开发的经验。SDK 是什么相信做 Android 开发的朋友,一定使用过第三方的 SDK,比如推送 SDK、分享 SDK 等。SDK

2021-01-29 15:10:38 675

转载 Android 性能优化“基石”是什么? Fps,Memory,Cpu如何采集?

想要做好性能优化,最主要的就是学会采集性能。1.背景APM(Application perfmance monitor)就是应用性能监控。在移动互联网对人们生活影响越来越大的今天,App的功能越来越全面,随之而来的就是App性能的要求越来越高,不能被动的等待用户异常的发生然后根据线上日志去修复bug,再发补丁版本。主动监控App性能变得越来越重要,分析App的耗电,UI卡顿,网络性能成为了当物之急。2.抛出问题一个性能数据采集系统,你不能成为一个app的负担,不能在采集的时候耽误主线程的渲染

2021-01-24 09:07:03 223

原创 Android开发中UI优化方案整理 (UI渲染背景知识,系统做的优化,工程师优化方案,优化工具)

UI 优化究竟指的是什么呢?所谓的 UI 优化,应该包含两个方面:一个是效率的提升,我们可以非常高效地把 UI 的设计图转化成应用界面,并且保证 UI 界面在不同尺寸和分辨率的手机上都是一致的;另一个是性能的提升,在正确实现复杂、炫酷的 UI 设计的同时,需要保证用户有流畅的体验。UI 渲染的背景知识1. 屏幕与适配屏幕的尺寸从 3 英寸到 10 英寸,分辨率从 320 到 1920 应有尽有,除此之外,材质也是屏幕至关重要的一个评判因素。目前智能手机主流的屏幕可分为两大类:一种是

2021-01-17 08:22:26 873

原创 Android网络优化基础操作攻略(DNS解析,连接复用,Response Cache,数据压缩,弱网,网络安全,监控)

做网络优化,首先我们要这个流程有一定的认识,

2021-01-14 10:35:23 648

转载 带你看看从输入URL到页面显示背后的故事

说一说从在浏览器输入URL到整个页面显示这个过程经历了什么?这个问题应该是目前大厂必问的一个面试题,是一个非常综合性的问题,可以考查我们对如HTTP协议的了解,浏览器相关知识的基础。如对html,css文件解析,浏览器如何渲染等,所以如果我们可以把这一题回答的非常清楚一定是非常加分的,并且作为一个前端,如果可以很深入的了解这些知识对自己的专业能力提升也时常非常大的,我们可以直接应用到自己的工作中,如之前文章中说的性能优化等,这是迈向高级前端非常重要的一步。本文会介绍浏览器从发送请求开始,到接受到服务

2021-01-12 09:47:11 207

原创 解决JSONObject的toString方法中,若数字小数点后为0,自动省略小数点后0的问题

前言:此问题网上多数是围绕FastJson做的应对,而JSONObject这块目前没有找到,特此记录下!业务场景:APP端上传json数据到服务端,服务端用的JSONObject方式解析,当json串中包含类似xx.00的数据时,用toString方法生成的String类型数据时,里面的xx.00被默认置为xx,又由于MD5加密此字符串生成的密钥与客户端传上来的不相等,导致插入数据失败。调查原因:后由调试服务端代码,发现是JSONObject里面就是这么做的:JSONObject.cla

2021-01-05 20:47:25 5196 2

转载 抖音 Android 性能优化系列: Java 内存优化篇

近日看了字节跳动技术团队介绍Android内存优化的文章,决定理解并搬运下,希望可以为做内存优化的朋友提供思路。内存作为计算机程序运行最重要的资源之一,需要运行过程中做到合理的资源分配与回收,不合理的内存占用轻则使得用户应用程序运行卡顿、ANR、黑屏,重则导致用户应用程序发生 OOM(out of memory)崩溃。抖音作为一款用户使用广泛的产品,需要在各种机器资源上保持优秀的流畅性和稳定性,内存优化是必须要重视的环节。本文从抖音 Java OOM 内存优化的治理实践出发,尝试给大家分享一下抖音团

2020-12-30 09:34:47 596

原创 Android开发必知-图片拍照,选择,裁剪,压缩(适配高版本)

ps:这篇文章只是整理偏常规的图片开发知识点。下面走起~拍照在7.0之前,我们设置拍照保存的文件地址的 Uri,都是直接Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径),但是 7.0之后,对用户权限提高了保护,之前那种方式行不通了,所以我们要做7.0的判断,用 FileProvider 获取设置保存的文件 Uri,然后放到Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径)中,代码如下:

2020-12-27 20:57:34 505 1

原创 Android各版本迭代信息整理及适配

Android在版本迭代中,总会进行很多改动,下面我们一起梳理下。Android 4.4发布ART虚拟机,提供开启选项 HttpURLConnection的底层实现替换成OkHttpAndroid 5.0ART成为默认虚拟机,完全替代Dalvik虚拟机 Context.bindService() 方法需要显式 Intent,如果提供隐式 intent,将引发异常。Android 6.0增加运行时权限限制如果你的应用使用到了危险权限,比如在运行时进行检查和请求权限。checkSelf

2020-12-24 21:31:28 487 1

转载 Android系统Launcher的启动流程源代码分析

在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由Syste

2020-12-23 09:37:57 446

转载 Android中应用程序安装流程SystemServer->ServerThread->PackageManagerService源码梳理

应用程序包管理服务PackageManagerService安装应用程序的过程,其实就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,例如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了。应用程序包管理服务PackageManagerService是系统启

2020-12-11 18:34:52 282

转载 Android 新建一个APP进程的源代码分析(ActivityManageService->Zygote->ActivityThread)

Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的m

2020-12-08 11:11:07 353

转载 Android系统手机开机画面各个阶段代码执行流程分析(Part2)

3. 第三个开机画面的显示过程第三个开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,如下所示:service bootanim /system/bin/bootanimation user graphics group graphics disabled oneshot应用程序bootanimation的用户和用户组名称分别被设置为graphics。注意,用来启动应...

2020-12-04 13:39:32 700

转载 Android系统手机开机画面各个阶段代码执行流程分析(Part1)

提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。本文将详细分析这三个开机画面的显示过程,以便可以开启我们对Android系统UI实现的分析之路。第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称

2020-12-03 10:41:36 1207

原创 Android 11新存储行为变更及老版本升级适配

上周开发项目的时候,做了Android11存储方案升级适配,因为之前创建的文件是在外部公有目录下,为了延续老用户的使用习惯,项目组决定继续在外部公有目录下写入、读取文件的方案。为了拿到相应的访问权限,用到了下面这个标签。 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />官方文档上也有介绍,我这里截取了关键部分做了相关编码后,本以为就万事大吉了,哪成想Google P

2020-11-30 11:05:37 1962

原创 深入理解JDK1.8中HashMap,LinkedHashMap源码及设计思路

目录(一)HashMap,LinkedHashMap的关系(二)加载因子的作用和默认的加载因子为什么是0.75f(三)为什么哈希表的容量(数组长度)是2的整数次幂(四)put操作的实现源码及设计思路HashMap中putLinkedHashMap中put(五)get操作的实现源码及设计思路HashMap中getLinkedHashMap中get(六)怎么进行扩容(七)HashMap是怎么解决hash冲突的之前有分析过1.8之前的HashMap源码,今天再来看看

2020-11-28 16:25:41 179

转载 Android四大组件Content Provider的共享数据更新通知机制分析

在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的。关于数据共享的另一个话题便是数据更新通知机制了,即如果一个应用程序对共享数据做了修改,它应该如何通知其它正在使用这些共享数据的应用程序呢?本文将分析Content Provider的共享数据更新通知机制,为读者解答这个问题。Android应用程序组件Content Provider中的数据更新通知机制和Android系统中的广播.

2020-11-27 09:00:43 427

转载 Android四大组件Content Provider在应用程序之间共享数据的原理分析

Android应用程序之间不能直接访问对方的数据文件的障碍在于每一个应用程序都有自己的用户ID,而每一个应用程序所创建的文件的读写权限都是只赋予给自己所属的用户,因此,就限制了应用程序之间相互读写数据的操作。我们知道,Binder进程间通信机制可以突破了以应用程序为边界的权限控制来实现在不同应用程序之间传输数据,而Content Provider组件在不同应用程序之间共享数据正是基于Binder进程间通信机制来实现的。虽然Binder进程间通信机制突破了以应用程序为边界的权限控制,但是它是安全可控的,因为.

2020-11-26 10:59:34 875

空空如也

空空如也

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

TA关注的人

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