Android源代码分析
文章平均质量分 93
以Android源代码为引,逐步探索系统工作机理,借鉴并提升编码宽度和深度。
CallmeZhe
晨曦微露,正义气奋发!
我用双手,成就妳的梦想!
展开
-
Android应用程序与SurfaceFlinger服务的连接过程分析
前文在描述Android应用程序和SurfaceFlinger服务的关系时提到,每一个有UI的Android应用程序都需要与SurfaceFlinger服务建立一个连接,以便可以通过这个连接来请求SurfaceFlinger服务为它创建和渲染Surface。在本文中,我们将以Android系统的开机动画应用程序为例,详细描述Android应用程序是如何与SurfaceFlinger服务建立连接的。Android系统的开机动画是由应用程序bootanimation来实现的,它位于/system/b...转载 2021-03-23 15:34:08 · 365 阅读 · 0 评论 -
Android应用程序与SurfaceFlinger服务关系概述
SurfaceFlinger服务负责绘制Android应用程序的UI,它的实现相当复杂,要从正面分析它的实现不是一件容易的事。既然不能从正面分析,我们就想办法从侧面分析。说到底,无论SurfaceFlinger服务有多复杂,它都是为Android应用程序服务的,因此,我们就从Android应用程序与SurfaceFlinger服务的关系入手,来概述和制定SurfaceFlinger服务的学习计划。 SurfaceFlinger服务运行在Android系统的System进程中,它负责管理Andr...转载 2021-03-09 14:45:25 · 325 阅读 · 0 评论 -
Android系统Launcher的启动流程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由Syste转载 2020-12-23 09:37:57 · 501 阅读 · 0 评论 -
Android中应用程序安装流程SystemServer->ServerThread->PackageManagerService源码梳理
应用程序包管理服务PackageManagerService安装应用程序的过程,其实就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,例如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务,我们就可以在系统中正常地使用这些应用程序了。应用程序包管理服务PackageManagerService是系统启转载 2020-12-11 18:34:52 · 319 阅读 · 0 评论 -
Android 新建一个APP进程的源代码分析(ActivityManageService->Zygote->ActivityThread)
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的m转载 2020-12-08 11:11:07 · 408 阅读 · 0 评论 -
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 · 771 阅读 · 0 评论 -
Android系统手机开机画面各个阶段代码执行流程分析(Part1)
提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了。Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。本文将详细分析这三个开机画面的显示过程,以便可以开启我们对Android系统UI实现的分析之路。第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面。第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面。无论是哪一个画面,它们都是在一个称转载 2020-12-03 10:41:36 · 1313 阅读 · 0 评论 -
Android四大组件Content Provider的共享数据更新通知机制分析
在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的。关于数据共享的另一个话题便是数据更新通知机制了,即如果一个应用程序对共享数据做了修改,它应该如何通知其它正在使用这些共享数据的应用程序呢?本文将分析Content Provider的共享数据更新通知机制,为读者解答这个问题。Android应用程序组件Content Provider中的数据更新通知机制和Android系统中的广播.转载 2020-11-27 09:00:43 · 467 阅读 · 0 评论 -
Android四大组件Content Provider在应用程序之间共享数据的原理分析
Android应用程序之间不能直接访问对方的数据文件的障碍在于每一个应用程序都有自己的用户ID,而每一个应用程序所创建的文件的读写权限都是只赋予给自己所属的用户,因此,就限制了应用程序之间相互读写数据的操作。我们知道,Binder进程间通信机制可以突破了以应用程序为边界的权限控制来实现在不同应用程序之间传输数据,而Content Provider组件在不同应用程序之间共享数据正是基于Binder进程间通信机制来实现的。虽然Binder进程间通信机制突破了以应用程序为边界的权限控制,但是它是安全可控的,因为.转载 2020-11-26 10:59:34 · 937 阅读 · 0 评论 -
Android四大组件Content Provider的启动过程源代码分析
通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口。Content Provider一般是运行在独立的进程中的,每一个Content Provider在系统中只有一个实例存在,其它应用程序首先要找到这个实例,然后才能访问它的数据。那么,系统中的Content Provider实例是由谁来负责启动的呢?本文将回答这个问题。Content Provider和应用程序组件Activity、Service一样,需要在AndroidM.转载 2020-11-25 09:12:10 · 367 阅读 · 0 评论 -
Android四大组件Content Provider使用实例
本文包含两个应用程序,其中,第一个应用程序命名为ArticlesProvider,它使用了SQLite数据库来维护一个文章信息列表,同时,它定义了访问这个文章信息列表的URI,这样,我们就可以通过一个Content Provider组件来向第三方应用程序提供访问这个文章信息列表的接口;第二个应用程序命名为Article,它提供了管理保存在ArticlesProvider应用程序中的文章信息的界面入口,在这个应用程序中,用户可以添加、删除和修改这些文章信息。接下来我们就分别介绍这两个应用程序的实现。1.转载 2020-11-24 08:57:15 · 709 阅读 · 0 评论 -
Android四大组件Broadcast中发送广播sendBroadcast流程源代码详解
前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来。ActivityManagerService是如何得到广播并把它分发出去的呢?这就是本文要介绍的广播发送过程了。广播的发送过程比广播接收器的注册过程要复杂得多了,不过这个过程仍然是以ActivityManagerService为中心。广播的发送者将广播发送到ActivityManagerService,ActivityManagerSer..转载 2020-11-23 09:39:13 · 1603 阅读 · 0 评论 -
Android四大组件Broadcast中注册广播registerReceiver流程源代码详解
在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。在软件工程中,是非常强转载 2020-11-22 15:19:30 · 660 阅读 · 0 评论 -
Android四大组件Service中bindService过程源代码详解
Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动Service的方法。我们先简单回顾一下这个应用程序实例绑定Service的过程。在这个应用程序的MainActivity的onCreate函数中,会调用bindService来绑定一个计数器服务CounterService,这里绑定的意思其实就是在MainActivity内部获得CounterServi.转载 2020-11-21 12:17:16 · 472 阅读 · 0 评论 -
Android四大组件Service中startService过程源代码详解
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验。Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务。在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的。在主进程调用startService函数时,会通过Binder进程间通信机制来通知Acti.转载 2020-11-20 09:41:23 · 296 阅读 · 0 评论 -
Android应用程序内部启动Activity过程(startActivity)的源代码分析
上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。在应用程序内部启动非默认Activity的过程与在应用程序启动器Launcher中启动另外一个应用程序的默认Activity的过程大体上一致的,因此,这里我们着重关注有差别的地方。我们先来看一下应用程序的配置文件AndroidM.转载 2020-11-19 08:46:37 · 441 阅读 · 0 评论 -
Android应用程序点击Launcher图标启动新进程的源代码分析(二)
接上篇文章继续分析。Step 16.ActivityThread.handlePauseActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:public final class ActivityThread { ...... private final void handlePauseActivity(IBinder token, boolean finished,...转载 2020-11-18 22:02:45 · 457 阅读 · 0 评论 -
Android应用程序点击Launcher图标启动新进程的源代码分析(一)
前文简要介绍了Android应用程序的Activity的启动过程。在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity。这里,我们继续以这个例子为例来说明Andr.转载 2020-11-18 10:42:36 · 881 阅读 · 0 评论 -
Android应用程序的Activity启动过程简要介绍
在分析Activity启动过程之前,觉得有必要简单说一个概念,Android Framework层中,采用的是C/S架构,而Client和Server绝大部分的进程间通信(IPC)方式都是使用的Binder机制,而采用Binder通信方式的一端,Server与Client身份是相对的,是可以互相调换角色的。在Android系统中,有两种操作会引发Activity的启动,一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity;应用程序的默认Activity启动起来后,它又可以转载 2020-11-18 08:38:47 · 376 阅读 · 0 评论 -
Android 高级自定义Toast及源码解析
Toast概述Toast的作用不需要和用户交互的提示框。更多参见官网:https://developer.android.com/guide/topics/ui/notifiers/toasts.htmlToast的简单使用 Toast.makeText(MainActivity.this.getApplicationContext(),"沉迷学习,日渐消瘦",Toast.LENGTH_SHORT).show()自定义Toast Toast customToast =转载 2020-05-12 13:45:20 · 336 阅读 · 0 评论 -
Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析
Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和SurfaceFlinger服务共享它的UI元数据,以便使得SurfaceFlinger服务可以正确地为它创建以及渲染Surface。在本文中,我们将详细地分析这块用来保存UI元数据的匿名共享内存的创建过程。用来保存Android应用程序的UI元数据的匿名共享内存最终是被结构化为一个SharedClient对象来访问的。每一个与UI有关的Android应用程序进程有且仅有一个SharedClient对象,.转载 2021-04-19 18:00:49 · 230 阅读 · 0 评论 -
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 · 491 阅读 · 0 评论 -
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 · 419 阅读 · 0 评论