卜大爷
鹅厂客户端开发负责人,T11级,鹅厂通道评委
展开
-
Android 文件或目录监听使用及底层原理详解(FileObserver)
Android 系统 API 提供了 FileObserver 抽象类( Linux 的 INotify 机制)来监听系统 /sdcard 中的文件或文件夹。它可以实现监视文件(使用 inotify )在文件被设备上的任何进程(包括本文)访问或更改后触发事件。原创 2023-03-16 19:03:52 · 2155 阅读 · 1 评论 -
从源码分析 Application、Activity、Service 中 Context 的关系和区别
从源码分析 Application、Activity、Service 中 Context 的关系和区别我们来简单回顾一下 Context 是什么?Context 被翻译成上下文,是应用程序环境的全局信息接口,它是一个抽象类,其实现由 Android 系统提供的 ContextImpl 类。我们通过 Context 可以非常方便的访问应用程序的资源和类,以及可以进行应用程序级的各种操作,比如启动 Activity 和 Service、注册和发送广播、权限操作、主题操作、存储对象操作等等。它简直是一个万能原创 2021-02-08 15:42:02 · 22136 阅读 · 4 评论 -
从 Context 家谱来聊一聊 Context 家族使用的设计模式?
ContextContext 被翻译成上下文,是应用程序环境的全局信息接口,它是一个抽象类,其实现由 Android 系统提供的 ContextImpl 类。我们通过 Context 可以非常方便的访问应用程序的资源和类,以及可以进行应用程序级的各种操作,比如启动 Activity 和 Service、注册和发送广播、权限操作、主题操作、存储对象操作等等。它简直是一个万能类!难怪我们需要经常用到它。Context 家族Context 是一个抽象类,它的具体实现是在子类中进行的,它们共同构成了 Con原创 2021-02-08 15:39:47 · 22436 阅读 · 0 评论 -
ContentProvider query操作过程源码分析(Android Q)
ContentProvider query调用过程源码分析(Android Q)ContentProvider 是 Android 的四大组件之一,可以很方便的跨进程查询数据,那么 Android 系统是如何实现 ContentProvider 的查询等操作的呢?ContentProvider 的使用示例我们首先来看一个 ContentProvider 调用示例: public void readData(String selection) { Cursor cursor =原创 2021-02-06 18:09:25 · 22055 阅读 · 0 评论 -
Android ContentProvider 的使用&源码分析(Android Q)
本文详细讲解了 ContentProvider 从安装包中解析,ContentProvider 的创建、注册、发布等各个过程。以及介绍了 ContentProvider 的简单使用。原创 2020-12-27 15:47:33 · 23712 阅读 · 0 评论 -
源码分析 merge 标签减少布局层级的秘密(Android Q)
本文从源码的角度分析 merge 标签减少布局层级的秘密(Android Q)原创 2020-12-21 20:10:37 · 23499 阅读 · 0 评论 -
View 的 requestLayout 发起的重绘流程源码分析(Android Q)
View 的 requestLayout 发起的重绘流程源码分析(Android Q)我们平时经常会调用 View 类的 requestLayout 方法更新视图,那么它又是如何发起的重绘逻辑呢?View 的 requestLayout 方法: public void requestLayout() { …… if (mParent != null && !mParent.isLayoutRequested()) { //原创 2020-12-10 18:13:27 · 23440 阅读 · 2 评论 -
View 的 post 消息处理,原理解析(Android Q)
View 的 post 消息处理,原理解析在开发中,我们经常会使用某个视图组件(View 的实例)的 post 方法或 postDelayed 方法,用于将操作发送给主线程执行,或者延迟执行某项任务。这种方式非常的方便,那么这么高频的操作,你知道它的执行原理吗?接下来我们来分析它的运行机制。View 的 post 方法和 postDelayed 方法首先我们来看 View 的 post 方法和 postDelayed 方法: public boolean post(Runnable acti原创 2020-11-27 17:44:00 · 25732 阅读 · 3 评论 -
View的显示过程原理详解(Android Q)
View显示过程原理详解在前文《Activity对象创建及窗口显示过程源码详解(Android Q)》中,我们已经分析了 Activity 启动时,根视图的创建及添加到窗口的过程。接下来我们来分析,视图是如何执行渲染逻辑的。Activity 创建过程中的视图显示前文我们已经知道,ViewRootImpl 对象负责了 Activity 与 WMS 服务之间的通信。ViewRootImpl 承接着 DecoreView 等客户端视图与服务端 WMS 的联系,处理各类事件的回调,并且控制了 View 的测原创 2020-11-27 16:03:40 · 23895 阅读 · 0 评论 -
应用程序Activity窗口与WMS、AMS的通信分析(Android Q)
应用程序Activity窗口与WMS、AMS的通信分析Activity 组件在其窗口创建完成后,就会请求与 WindowManagerService(WMS)建立连接,WMS 会为其新增一个 WindowState 对象,用来描述它的窗口状态。Activity 到 WMS 连接:当应用程序启动第一个 Activity 时,应用程序进程从 WMS 获取一个实现了 IWindowSession 接口的 Session 代理对象,使用该对象来访问 WMS。这个连接是以进程为单位的。从 WMS 到原创 2020-11-19 16:56:29 · 23965 阅读 · 2 评论 -
Activity对象创建及窗口显示过程源码详解(Android Q)
Activity 启动、直到视图显示在屏幕上,经历了很复杂的过程。本章我们将分析 Activity 窗口显示过程。原创 2020-11-19 16:50:33 · 24256 阅读 · 0 评论 -
Activity启动过程详解(Android P)
本章我们来分析Activity的启动过程,我们先从熟悉的startActivity方法来开始分析。startActivity的实现要启动一个Activity,无论是从Lanuch启动,还是App内部启动,都需要调用startActivity()方法来实现。startActivity定义startAcrtivity方法是在Context中定义的: public abstract vo......原创 2020-04-22 18:20:44 · 24477 阅读 · 0 评论 -
从源码分析Choreographer是如何实现VSYNC信号的请求及帧的刷新处理?(Android Q)
本文将从源码分析Choreographer是如何实现VSYNC信号的请求及帧的刷新处理?原创 2020-11-11 16:32:02 · 25016 阅读 · 2 评论 -
pthread_create创建线程失败的OOM详解
pthread_create创建线程失败的OOM详解问题描述在Android运行时,常遇到的一类OOM问题就是线程创建时的OOM了,堆栈如下:java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again at java.lang.Thread.nativeCreate(Thread.java) at java.lang.Thread.start(Thread.java:733) at java.util.原创 2020-10-28 20:31:48 · 25735 阅读 · 0 评论 -
Android中线程(Thread)的创建及内存分配过程分析
本文详细分析Android中,线程的创建过程以及线程创建时,内存的分配。原创 2020-10-28 14:17:34 · 26309 阅读 · 0 评论 -
Java、Android的异常处理原理&Android Crash捕获、分发及处理原理+实战详解
本文将介绍Java异常及异常处理,以及Android的异常处理原理。Android中异常(Crash)处理和捕获。Android系统中Crash的处理、分发逻辑。Crash优化建议。原创 2020-06-30 11:16:48 · 27217 阅读 · 2 评论 -
Android Q LayoutInflater布局生成View源码详解
LayoutInflater是Android系统的一个服务,我们可以通过它,把布局文件动态生成View,实现View视图的动态添加。本文将介绍Android Q中LayoutInflater的源码实现,以及inflate的使用注意事项。原创 2020-05-29 10:35:39 · 23808 阅读 · 2 评论 -
HandlerThread原理分析、实战、最佳实践!
本文我们将学习HandlerThread的实现原理,以及开发时,如何正确的使用它来实现我们的开发任务。HandlerThread源码分析设想这样一个场景:我们要在一个线程A中处理业务逻辑,在另一个线程B中,监听A的执行,并进行结果处理。这时我们使用HandlerThread就可以非常简单的实现该功能了。通常我们的线程交互场景,都是UI线程中启动子线程,并且由子线程完成工作任务,最终结果交给UI线程。现在我们的使用场景是,在子线程中监控其他线程的执行结果(这里的其他线程可以是另一个子线程,也可以是UI原创 2020-05-25 11:43:37 · 24142 阅读 · 0 评论 -
Android消息循环的同步屏障机制及UI渲染性能的提升(Android Q)
我们在 Handler线程通信机制:实战、原理、性能优化! 中已经知道了Handler的消息同步机制,在MessageQueue的next方法中,有一段逻辑是处理同步屏障的,我们在本章中将分析同步屏障是什么?原理?以及它在Android中的使用。同步屏障机制的原理在Handler的介绍中,我们已经了解了同步屏障,但当时这块不是重点介绍的内容,我们来复习一下它的实现原理。MessageQueue的next方法: Message next() { …… for (原创 2020-05-22 16:09:57 · 24498 阅读 · 1 评论 -
Android Q消息循环:休眠、唤醒的底层原理及native层源码分析
本文将分析Handler消息机制的内核层实现,以及Handler机制native层源码分析。我们将讨论消息循环的休眠、唤醒的实现原理,以及它们依赖的epoll机制的使用介绍等内容。原创 2020-05-20 17:43:37 · 24935 阅读 · 0 评论 -
Handler线程通信机制:实战、原理、性能优化!
本文从实战、原理以及性能优化三个方面,详细且全面的介绍了Hander通信机制的使用、低层原理的实现,以及Handler内存泄漏的原因及解决方案的实现。原创 2020-05-18 17:29:05 · 24733 阅读 · 0 评论 -
AsyncTask你真的会用吗?实战、原理、最佳实践!(Android Q)
AsyncTaskAsyncTask可以非常方便、简单的在UI线程中使用,它帮助我们在不使用Thread和Handler的情况下,在后台执行一个后台(异步)任务,并且把执行结果通知到UI线程中。也就是说,使用AsyncTask可以极大的简化我们进行后台任务的操作,使用它,我们不必关心工作线程是如何启动的,也不必关心,工作线程和UI线程之间的通信问题,这些都被AsyncTask通过内部封装实现了,我们只需要按接口规范使用它即可。AsyncTask适用于短时的后台(异步)任务(最多几秒钟),它并不适合时间原创 2020-05-13 19:35:28 · 24514 阅读 · 0 评论 -
数据存储之——SharedPreferences不要再误用了!(Android Q)
SharedPreferences(简称sp)Android平台上一个轻量级的存储辅助类,它提供了key-value键值对的接口,用来保存应用的一些常用配置,在应用中通常做一些简单数据的持久化缓存。本文将详细的分析SharedPreferences的实现方式、存储机制、如何正确使用它以及sp的性能问题等方面。SharedPreferences实现详解我们在Android开发中,如果想要保存一个相对较小的键值对集合,则应使用SharedPreferences API。SharedPreferences对原创 2020-05-12 22:18:29 · 66853 阅读 · 0 评论 -
数据存储之——Android Q数据存储的正确打开方式
Android Q之——分区存储为了让用户更好地管理自己的文件并减少混乱,并且增强文件的安全性,以Android 10(API 级别 29)及更高版本为目标平台的应用在默认情况下被赋予了对外部存储设备的分区访问权限(即分区存储)。此类应用只能看到本应用专有的目录(通过Context.getExternalFilesDir()访问)以及特定类型的媒体。除非您的应用需要访问存放在应用的专有目录以及 MediaStore之外的文件,否则最好使用分区存储。分区存储对文件访问的影响文件位置所需权限原创 2020-05-11 21:55:47 · 24759 阅读 · 0 评论 -
数据存储之——Android内、外存储分区&常用存储目录详解(Android Q)
本文将以实用的角度来讲解Android中文件操作的常用方式。存储的”内“和“外”所有Android设备都有两个文件存储区域:内部存储空间(internal Storage)和外部存储空间(external Storage)。这些名称是在Android早期确定的,那时候大部分设备都提供内置的非易失性内存(内部存储空间)以及可移动存储媒介(如,Micro SD卡,提供外部存储空间)。现在,很多设备将永久性存储空间划分为单独的“内部”和“外部”分区。因此,即使没有可移动存储媒介,这两种存储空间也始终存在,并且原创 2020-05-10 15:39:05 · 29604 阅读 · 0 评论 -
数据存储之——Android文件存储系统及文件系统(Android Q)
Android存储系统及存储的挂载Android是基于Linux内核开发的,所以它的文件系统也是跟Linux文件系统类似。首先我们来看Android存储的分类。内部存储和外部存储、内置SD卡和外置SD卡一般的Android手机都有2个存储卡,一个内置到手机里的,不可更换,叫做内置存储卡;另外一个可以通过扩展卡槽添加一个SD卡,叫做外置SD卡。内置存储卡和外置SD卡,它们是从物理上来进行区分的,一个内置到设备,另一个是添加的扩展卡。对于Android系统来说,存储只分为内部存储和外部存储两类。内部原创 2020-05-09 10:41:02 · 28520 阅读 · 0 评论 -
Android Service的跨进程通信实战&Service/AIDL远程调用过程解析(Android Q)
Service的跨进程通信实战设想这么一个场景,我们有2个APP(或者2个进程,均可),其中一个APP需要提供一个Person相关的服务(该服务有一个名为eat的接口),我们叫它PersonServer;另一个APP需要访问PersonServer提供的服务,我们叫它Client。也就是现在有2个APP,一个作为Server端,提供服务,另一个作为Client端,使用服务。我们来看如何在An......原创 2020-05-08 16:38:39 · 25300 阅读 · 0 评论 -
AIDL使用规范及调用过程解析(Android Q)
AIDL使用介绍AIDL的全称是Android Interface definition language,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口,用处当然就是用来进程间的通信和方法调用了。其实AIDL是Binder的一个上层实现,它简化了Binder的使用,在编译时,由编译器帮助我们完成了大量工作(例如,生成AIDL文件所对应的.ja......原创 2020-05-06 17:51:04 · 25089 阅读 · 0 评论 -
Binder IPC的理解&系统Server调用过程分析(Android Q)
Android作为一个移动端的操作系统,就必须提供一种可靠的跨进程通信方案。我们来想想,移动端有哪些特性,IPC跨进程通信需要满足哪些特性?SystemServer是Zygote进程fork的第一个进程,它是Android系统的核心之一,大多数的服务都运行在这个进程中。应用层想要访问设备的资源,都要通过SystemServer进程来代理访问。SystemServer进程在Zygote中被创建,最后会调用caller.run来运行SystemServer的main方法。...原创 2020-04-27 12:27:28 · 23475 阅读 · 0 评论 -
Service启动过程源码分析(Android Q)
Service的启动概述本章我们来分析Service的启动过程。Service生命周期先来看下Service的生命周期: startService和bindService启动的服务生命周期略有不同。Service启动方式我们启动一个Serivce服务的时候,可以通过3种方式来启动:startService()方法,启动一个Service。bindService()方法,使用bi......原创 2020-04-24 11:41:00 · 23689 阅读 · 0 评论 -
App进程的Application创建、启动过程源码解析(Android P)
在用户手机上,一个App的启动通常是由用户点击Launcher上的图标来启动的。App启动时的起点在哪里?Application对象又是如何创建的呢?接下来我们通过Android P的源码来分析具体实现过程,解开我们的疑问。进程的启动过程及Application对象的创建过程分析一个App系统发起启动命令,一直到启动起来,它的第一步就是要启动一个App所对应的进程,该进程承载了我们将要运行的......原创 2020-04-21 11:51:04 · 24281 阅读 · 0 评论 -
Android8.1 Bitmap对象的内存分配解析
在Android3.0以下版本的系统中,Bitmap对象的内存都是在native层分配的,它不会占用Java堆内存的空间。Android3.0之后,Bitmap内存的分配统一交给了Java堆进行分配,方便了内存的管理。而Android 8.0(Android O)之后的版本中,Bitmap内存分配又回到了native层,它是在native堆空间进行分配的。我们接下来分析下Android8.1上的......原创 2019-08-30 17:33:56 · 25391 阅读 · 0 评论 -
ART对象内存分配过程解析(上)——内存分配的准备阶段(Android 8.1)
注:本文基于Android 8.1进行分析。ART对象分配过程解析——内存分配的准备阶段本章我们将分析Android 8.1中ART虚拟机的对象创建时内存分配过程的分析。本节将介绍内存分配相关的环境准备及各种跳转逻辑。我们首先从Thread类开始分析。Thread类Thread类的Init()方法会进行线程相关的所有初始化工作,例如,初始化Cpu信息,成员函数InitTlsEntryPo......原创 2019-08-17 13:59:22 · 24115 阅读 · 0 评论 -
ART对象内存分配过程解析(下)——内存分配阶段(Android 8.1)
经过内存分配过程的准备阶段,我们分析到了Heap的AllocObjectWithAllocator()方法。接下来我们将具体分析对象内存分配的过程。ART对象分配过程解析——内存分配阶段AllocObjectWithAllocator方法首先我们来看Heap的AllocObjectWithAllocator()方法(位置:/art/runtime/gc/heap-inl.h):templ......原创 2019-08-20 15:30:02 · 24512 阅读 · 0 评论 -
ART堆大小设置及动态调整过程分析(Android 8.1)
ART虚拟机中,堆(Heap)空间负责进行对象内存的分配。堆的大小也决定了一个应用可使用的内存大小。当应用内存量超过了Android系统给定的最大堆内存限制时,就会产生OOM。我们接下来逐步分析,决定堆内存大小的因素;以及伴随GC过程中的堆大小的状态变化。堆的初始设定手机出厂时,会设置堆内存相关的几个系统参数(每个厂商和机型的设定可能不同):# Provides overrides to ......原创 2019-08-23 18:33:42 · 26591 阅读 · 0 评论 -
Zygote进程的创建过程(Android 8.1)
本篇文章的内容中,我将要给大家介绍Android开发中最长见到的一个底层进程——Zygote进程,它是我们开发的所有APP进程的父进程。可以说,Android中所有的Java进程都是由Zygote进程fork出来的。那面Zygote进程又是如何启动的呢?它的启动过程从init进程启动开始,到Zygote进程真正运行起来,并且进行相关初始化完成为止。我们来详细分析下Zygote进程的启动过程...原创 2019-08-13 16:10:29 · 23864 阅读 · 0 评论