ams

从Activity的启动流程理解Binder

一个人想着一个人 提交于 2020-04-25 09:40:41
简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等方面,如果将其看作一个整体,整个启动流程就简单很多。在启动流程中,App和AMS的跨进程调用是其中的重点,理解了这个,会加深对Binder和启动流程的理解认知,也能窥到Framework层的冰山一角。另外我也发现,很多文章在讲启动流程的时候,关于ActivityMangagerService进程如何调用App进程的细节都没有讲清楚,这个问题也是我写这篇文章的初衷。阅读本文前建议了解一下AIDL,对Binder,Stub,Proxy等有一些印象。建议读一下这篇文章 写给 Android 应用工程师的 Binder 原理剖析 Binder简介 对于Binder,初学的人会对里面的概念比较模糊,因为看起来确实有些绕,我在这儿写几点帮助理解。 所谓的“跨进程”能力指的是两个方面:一个是能够作为客户端调用远程服务的能力,一个是能够作为服务端接收客户端进程消息的能力,二者都是跨进程的一部分,分别对应transact和onTransact方法,而这两个方法的实现,分别位于BinderProxy和Binder两个类中,这两个类都在Binder.java这个文件中,读者可以自行阅读。

Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AI

試著忘記壹切 提交于 2020-04-23 14:36:45
###前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程机制的优缺点,接着分析Binder的通信模型和原理,而Binder机制最佳体现就是AIDL,所以在后面会分析AIDL的实现原理,最后简单的提下AMS的Binder体系,整篇文章中间会穿插有IBinder、Binder、Parcel的介绍,整篇文章阅读难度不大,不会涉及到framework层的Binder原理,AIDL部分需要有AIDL的使用基础 ###基础概念 基础概念部分介绍Linux的某些机制,主要想表达Binder驱动的出现的原因,如果对Linux熟悉的可以直接跳过这部分,看第五点即可 一、进程隔离 出于安全考虑,一个进程不能操作另一个进程的数据,进而一个操作系统必须具备进程隔离这个特性。在Linux系统中,虚拟内存机制为每个进程分配了线性连续的内存空间,操作系统将这种虚拟内存空间映射到物理内存空间,每个进程有自己的虚拟内存空间,进而不能操作其他进程的内存空间,每个进程只能操作自己的虚拟内存空间,只有操作系统才有权限操作物理内存空间。 进程隔离保证了每个进程的内存安全,但是在大多数情形下,不同进程间的数据通讯是不可避免的,因此操作系统必须提供跨进程通信机制 二

漫画 | 程序员大战公务员!到底谁猛?

社会主义新天地 提交于 2020-04-12 12:23:34
我是计算机专业毕业,毕业后就做了程序员,很多同学也都做了程序员。 刚毕业时,大部分同学都认为考公务员很没劲,收入低没挑战!但工作几年后,同学中一些程序员转行做了公务员,但我却没见过有公务员的同学,转行去回来做程序员! 程序员的普遍的标签多为高工资、高挑战、加班、青春饭;公务员则是 普通工资 、福利好、安逸、铁饭碗! 标签是存在,但实际上,所谓的标签也因人而不同 , 比如: 扶贫一线的公务员,忙起来完全不亚于程序员;而真正实力强悍的程序员,不但不会因年龄大而退居二线,反而大多担当着中流砥柱的作用! 那么,程序员VS公务员,到底哪个职业更好呢?这个问题,不同的人心里一定会有不同的答案!在我看来,两个职业没有更好,只有更合适!只要这份职业,是你心中所爱,那它就是最好的职业! 加油!程序员! 加油!公务员! 加油!各行各业努力的人们! 本文原创公众号: 不会笑青年,授权转载请联系微信(laughyouth369) < END > 作者:不会笑青年 漫画师:鹦鹉 友情提示:关注后不会笑青年后,公号内回复 666 ,抽奖 1888 元 点赞 收藏 分享 文章举报 微笑很纯洁 博客专家 发布了291 篇原创文章 · 获赞 6785 · 访问量 205万+ 他的留言板 关注 来源: oschina 链接: https://my.oschina.net/u/4406280/blog/3230738

老白学编程- “autotools” 的碎片记忆

我怕爱的太早我们不能终老 提交于 2020-04-06 02:56:16
Autotools 碎片记忆 大部分程序猿包括我都曾经下载并编译过开源的软件,通常有如下步骤: 1. 下载 2. 解压 3. ./configure 4. make 5. make install 但其实我并不清楚,这套路是什么,这个configure怎么来的,这个install要去哪; 研究了GNU build system,由于年龄太大,整理一下碎片以用来记忆,以后好深入学习。 基本概念 makefile 我刚学习完, 但是如果新建工程,很大很大的那种, 手写make还是比较痛苦的,最好是有工具可以搞定。 对于入门的我来说,一张白纸,只知道autotool和cmake,由于许多GNU的库都是autotools,那就开始研究autotools吧。 GNU build system 背景不多说了,自行阅读。 GNU build system 目标 打包,主要是打出可移植的包 定义各种宏变量,通过 #if/#else 在程序中判断,采取不同的套路。 统一的编译,自动配置 目前,configure 脚本是GNU package 必带的脚本,他用来探测系统的库,工具,然后生成 config.h ,其中包括了各种 #defines; makefile 中的 target 通常来说,GNU 的 makefile中,有一些标准的targets make all : 与 make 一样 make

Activity的启动流程分析

匆匆过客 提交于 2020-04-03 10:31:40
Activity是Android应用程序的四大组件之中的一个,负责管理Android应用程序的用户界面,一般一个应用程序中包括非常多个Activity,他们可能执行在一个进程中。也可能执行在不同的进程中。 我们主要通过启动在不同进程中的Activity,来分析Activity的启动流程及AMS对Activity的管理逻辑。 有两个应用程序App1和App2。在App1的Activity A中点击button 启动 App2中的Activity B。 通过分析以上ActivityB的启动过程来了解AMS对Activity的管理逻辑。 步骤1:Activity A告诉AMS服务准备启动Activity B 步骤2:AMS服务处理并通知Activity A所在的进程pause Activity A,Activity A所在的进程处理完毕之后。通知AMS服务Activity A已经完毕pause工作。 步骤3:Activity B所在的进程没有启动,AMS服务首先启动一个新的进程。新的进程启动完毕之后。通知AMS服务进程启动完毕。 步骤4:AMS服务通知新的进程来启动Activity B。新的进程启动Activity B完毕之后。通知AMS服务Activity B启动完毕。 在分析Activity启动流程之前我们先简介下应用进程和AMS服务通信方法。AMS服务和应用进程间属于不同的进程

AMS的startActivity分析

≯℡__Kan透↙ 提交于 2020-03-28 06:26:53
AMS的startActivity最终是调用的 startActivityAndWait 来处理启动请求的: 1 @Override 2 public final WaitResult startActivityAndWait( 3 IApplicationThread caller, //在多数情况下,一个Activity是由一个应用进程发起的,IApplicationThread是应用进程和AMS交互的通道,也可算是调用进程的标识 4 String callingPackage,//调用的包名,即发起启动请求的包名 5 Intent intent, 6 String resolvedType, 7 IBinder resultTo, //用于接收startActivityForResult的结果 8 String resultWho, 9 int requestCode,//这个是调用者来定义其意义,若值大于等于0,则AMS内部保存该值并通过onActivityResult返回调用者 10 int startFlags, 11 ProfilerInfo profilerInfo,//性能统计相关 12 Bundle options, 13 int userId//用户id 14 ) { 15 enforceNotIsolatedCaller(

Android Framework 初探

别来无恙 提交于 2020-03-28 05:13:40
最近工作任务不忙,学习一下Android Framework方面的知识。 一、介绍,是什么 Android的Framework是直接应用之下的一层,叫做应用程序框架层。这一层是核心应用程序所使用的API框架,为应用层提供各种API,提供各种组件和服务来支持我们的Android开发,包括ActivityManager,WindowManager,ViewSystem等。下面贴一张学习Android时常见的Android系统架构图: 二、有什么 Android Framework框架包含了3个主要部分:服务端、客户端、Linux驱动。 首先介绍一下服务端都有哪些重要的东西: ActivityManagerService(Ams):负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManagerService是管理和掌控所有的Activity. WindowManagerService(Wms):控制窗口的显示、隐藏以及窗口的层序,简单来说,它就是管理窗口的,大多数和View有关系的都要和它打交道。 KeyQ类:它是Wms的一个内部类,一旦创建就会启动一个新线程,这个线程会不断地接收和读取用户的UI操作消息,并把这些消息放到消息队列QueueEvent中。

Acticity 启动 AMS

旧时模样 提交于 2020-03-04 03:33:15
工作流程 AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的 startActivityXXX() 系列方法。所以可见,工作流程又包括Client端和Server端两个。 Client端流程 Launcher主线程捕获 onClick() 点击事件后,调用 Launcher.startActivitySafely() 方法。 Launcher.startActivitySafely() 内部调用了Launcher.startActivity()方法, Launcher.startActivity() 内部调用了Launcher的父类Activity的 startActivity() 方法。 Activity.startActivity() 调用 Activity.startActivityForResult() 方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行 Launcher.onActivityResult() 方法处理返回结果。 启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用

深入理解Android-Activity的启动过程

匆匆过客 提交于 2020-03-01 11:28:29
一、准备工作 1、准备好阅读源码的工具。 2、主要类的功能介绍 ActivityManagerServices 简称AMS,服务端对象,是Android中最核心的服务,主要负责系统中四大组件的启动、切换和调度及应用进程的管理和调度工作。负责系统中所有Activity的生命周期.(深入理解Android 卷II 对此有进行深入的讲解 http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html )。 ActivityThread ,APP的真正入口。当开启APP后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI或者叫主线程,与AMS配合使用,一起完成Activity 的管理工作。 Instrumentation ,每一个应用程序只有一个Instrumentation对象,每个activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建和暂停某个activity时,都需要通过Instrumentation来进行具体的操作。 ApplicationThread 用来实现AMS 与 ActivityThread 之间的交互。在AMS需要管理相关Application中的Activity的生命周期时

从源码角度看Android_O_AMS新特性

て烟熏妆下的殇ゞ 提交于 2020-03-01 10:34:19
简介 Android O上以后对AMS的广播与服务做了严格的限制,静态注册的广播不再能够无所欲为的接收隐式的广播,后台的应用进程也不再能够调用startService了。Android 作出这样的限制主要是为了限制住不自觉的开发者,不让他们随意的浪费系统资源。 这篇文章里,我将从源码的角度分析Android O是如何限制静态广播与后台服务的,相关的广播和服务源码背景知识大家可以看我以前的文章。分析的后面会列出Android O上广播和服务的适配指南。谷歌推荐使用的JobScheduler原理大家可以看我的上一篇文章。 文章的最后是我的一些对这些限制的自问自答,也欢迎大家提出问题~ BroadcastReceiver 没有权限的前提下, 发出的隐式Intent,静态的接收者不能收到广播 查看大图 [frameworks/base/services/core/java/com/android/server/am/BroadcastQueue#processNextBroadcast] if (!skip) { final int allowed = mService.getAppStartModeLocked( info.activityInfo.applicationInfo.uid, info.activityInfo.packageName, info.activityInfo