导航:首页 > 源码编译 > ams源码详解

ams源码详解

发布时间:2022-10-18 14:27:35

android N 四大组件的工作原理

本文侧重讲解android N 系统中四大组件的工作原理,不同系统原理略有差别。通过分析四大组件的工作流程加深对Android Framework的理解,也为插件化开发打下基础。

Activity
展示一个界面并和用户交互,它扮演的是一个前台界面的角色。

Service
计算型组件,用于后台执行一系列计算任务,工作在主线程,耗时操作需要另起线程, 分为启动状态和绑定状态。

BroadcastReceiver
消息型组件,主要用于不同组件或者不同应用之间的消息传递,它工作在系统内部,不适合执行耗时操作,操作超过5s,会出现ANR。

ContentProvider
数据共享型组件,用于向其他组件或者应用共享数据,主要执行CURD操作。

我们启动一个activity有两种方法,
第一种(Activity直接启动方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

第二种(Context启动方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);

不同的启动方式Activity的工作流程有点差别。

两种启动都会调用到Instrumentation类中的execStartActivity的方法,系统最终是通过ActivityThread中的performLaunchActivity完成Activity的创建和启动。
performLaunchActivity方法主要完成以下工作:
1、通过ActivityClientRecord对象获取启动activity的组件信息
2、通过mInstrumentation对象的newActivity方法调用classloader完成activity的创建
3、通过r.packageInfo(LoadedApk 对象)的makeApplication方法尝试创建Application对象
4、创建ContextImpl对象并调用Activity的attach方法完成一些数据的初始化
5、调用Activity的onCreate方法

在Activity启动的过程中,App进程会频繁地与AMS进程进行通信:

App进程会委托AMS进程完成Activity生命周期的管理以及任务栈的管理;这个通信过程AMS是Server端,App进程通过持有AMS的client代理IActivityManager完成通信过程;
AMS进程完成生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调;这个通信过程也是通过Binder完成的,App所在server端的Binder对象存在于ActivityThread的内部类ApplicationThread;AMS所在client通过持有IApplicationThread的代理对象完成对于App进程的通信。

Service有两种启动方式,startService()和bindService(),两种状态可以并存:
startService流程

bindService流程

BroadcastReceiver的工作过程主要包括广播的注册、发送和接收:

动态注册过程:

发送过程

静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。

每个进程的入口都是ActivityThead.main(),App的启动流程如下:

源码中可以看出:
应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。

由上图可以看出,在ContentProvider的启动过程中伴随着app进程的启动。

ContentProvider的其他CURD操作如insert,delete,update跟query的流程类似。

linux怎么启动 ams服务

时间:2016-03-23来源:linux网站 作者:meteorite91

最近需要使用rtmp服务器,在red5和AMS之间选择了AMS来搭建,说先说明一下AMS全称是adobe media server,在5.0版本之前名称是FMS(flash media server)。

搭建的环境:64位的centos6.5,PS:AMS只支持64位的系统,不管是windows还是Linux都只有64位,安装之前要安装好64位的Linux环境。

在http://www.adobe.com/support/flashmediaserver/downloads_updaters.html下载5.0.3版本的源码包,在centos切换root权限,解压,进入AMS_5.0.3_r3029目录,运行./installAMS,后面根据提示按enter等键即可,需要注意的是在提示输入IP的时候最好使用自己想用的IP而不是自动检测,默认的端口是1935和1111,其他都可以默认执行。

⑶ 为什么在清华镜像下载的frameworks/base的Android源码中找不到AMS、WMS这些类

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。

⑷ AMS时间详解

AMS规定是在船离开亚洲最后一个港口前24小时,那船公司都会提前一些,比如规定船离开亚洲最后一个港口前48小时

⑸ Android 10.0 ActivityManagerService的启动流程

我们讲完了SystemServer的启动过程,本节主要来讲解ActivityManagerService的启动过程。ActivityManagerService简称AMS,管理Activity行为,控制Activity的生命周期,派发消息事件,内存管理等功能。

ActivityManagerService启动由SystemServer中startBootstrapService启动

ATM启动最终调用的是ActivityTaskManagerService.Lifecycle.onStart()来启动ATM服务的
源码:ActivityTaskManagerService.java#Lifecycle.class

将ActivityTaskManagerInternal添加到本地服务的全局注册表中。
ActivityTaskManagerInternal为抽象类,其实现类为ActivityTaskManagerService#LocalService.class

构造函数初始化主要工作就是初始化一些变量,供之后的service,broadcast,provider的管理和调度

start中做了两件事

AMS的systemReady处理分为三个阶段

同时获取一些配置参数。 需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀死的进程是Java进程。

主要是调用一些关键服务的初始化函数,然后杀死那些没有FLAG_PERSISTENT 却在AMS启动完成前已经存在的进程,同时获取一些配置参数。需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀手的进程是Java进程。

执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady相关的工作,并进行启动服务或应用进程的工作

监控Native的crash,启动WebView,执行一些服务的systemReady和systemRunning方法

启动Home Activity,当启动结束,发送ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落

启动Home Activity

AMS的启动主要经历了如下几个阶段:

⑹ App启动流程

源码标准:API : 29“Android 10.0”
补充知识点:
上一篇讲了 Android开机流程 ,就是Zygote开始fork出SystemServer进程。
在SystemServer中会创建一个socket接口来监听请求以及初始化AMS。
根据请求,Zygote会基于自身,预先加载的虚拟机来创建一个新的虚拟机,创建一个新的进程,来管理新的App进程。

屏幕本质上就是一个程序app,当我们安装好app后就会出现一个图标。

Launcher“桌面” 进程通过 Binder ICP 机制,通知ActivityManagerService“ AMS ”来创建新的进程。
也就是ActivityThread“ UI线程 ”(Activity运行在ActivityThread实例中)。

ActivityThread通过 Binder ICP 机制将Binder对象传递给AMS,彼此进行通信。

当点击app图标。

这里定位到具体的点击holder类。

真是从里寻他千网络,我快进入死循环里出不来了,多少有点费劲。
最后通过 startActivitySafely 方法,在新的Task中启动MainActivity。

⑺ Activity的启动流程

公众号

面试官:说说 startActivity 吧

🤔️:startActivity 主要就是应用进程与 system_server 进程的 AMS 通信,AMS 是实际来管理 Activity 组件的,负责处理启动模式,维护 Activity 栈等工作。startActivity 的大概流程就是由应用进程 IPC 调用到 AMS,AMS 处理完这些工作后再 IPC 回到应用进程,创建 Activity 的实例,回调 Activity 的生命周期。

面试官:通过什么实现跨进程的呢?

🤔️:都是通过 AIDL 接口,App 进程到 systemserver 进程是通过 IActivityServerManager.aidl ,systemserver 到 App 进程通过 IApplicationThread.aidl

面试官:startActivity 时前后 Activity 的生命周期是怎样的?

🤔️:旧 Activity 的 onPause 会先执行,然后新 Activity 依次执行 onCreate、onStart、onResume,随后再执行旧 Activity 的 onStop...

面试官:旧 Activity 的 onPause 一定会先执行吗,为什么?

🤔️:这主要是 AMS 来控制的,它会先后将前一个 Activity 的 onPause 事务和新 Activity 的启动事务发送给 App 进程,而在 App 端由 IApplicationThread.aidl 接受到后,会入队到 ActivityThread.H 的消息队列中,这个也是主线程消息队列,在队列上自然就实现了先后顺序的控制

面试官:了解插件化吗,知道怎么启动一个插件中的 Activity 吗?

🤔️:主要需要解决的问题是 Activity 未在 manifest 中注册的问题,因为在 AMS 中会检查 Activity 是否注册,而这个检查逻辑处于 systemserver 进程,我们是无法 hook 的,可以在 manifest 中提前注册一个占位 Activity,然后 startActivity 时进入到 systemserver 进程之前,hook 把未注册的 Activity 改为占位 Activity,AMS 检测就可以通过,然后再回到 App 进程后,把这个占位 Activity 再换成插件 Activity

1.从本质来看,它不是一个线程,而是一个Java类;
2.需要在主线程的方法中被运行;
3.运行时,首先调用main方法,其中也会调用:OnAttatch,loop方法;
4.AMS--->ActivityManagerService;
5.ActivityManagerService;
5.一个线程中,只有一个Looper对象;

ActivityInfo 也是对Activity信息的描述,如主题,权限,启动方式,任务栈等

– ActivityRecord:可以从它的类命名知道,这个记录Activity信息的类,主要记录一个Activity的所有信息。一个ActivityRecord只能对应一个Activity,但是一个Activity在系统中可以存在多份实例,所以一个Activity可以对应多个ActivityRecord记录
– TaskRecord:TaskRecord由一个或者多个ActivityRecord组成,TaskRecord就是常说的任务栈,用来记录一个task里面的调用Activity的相关信息
– ActivityStack:是用来管理TaskRecord的,一个ActivityStack会包含多个TaskRecord

1、Application的创建。
2、生命周期的管理。
3、启动Activity。

ActivityManagerNative是远程代理对象。通过ActivityManagerNative来操纵ActivityManagerService进行通信。客户端需要和ActivityManagerService进行通信,但是它们在不同的进程中,需要进行跨进程间进行通信,底层是用Binder实现。

H类(Handler类的子类)会处理大量的ActivityManagerServer跨进程发送过来的消息,如启动Activity,暂停Activity等等

Activity的attach方法实现了与Window对象的关联

Activity中的Context对象向外关联了Activity本身

ContextImpl appContext = ContextImpl.createActivityContext(this,r.packageInfo,r.token);

appContext.setOuterContext(activity);

Activity中的Context对象是每个Activity中自己的ContextImpl 类的实例对象,与Application中的Context不是同一个对象

Application 对象创建完成后会通过mInstrumentation调用自己的onCreate生命周期方法

window 给自己这只WindowManager对象

WindowManager 对象通过(WindowManager)context.getSystemService(Context.WINDOW_SERVICE)获得

DecorView 继承自FrameLayout的View

Activity的attach方法源码解读

将Context对象attachBaseContext(context);

setContentView方法源码解析

调用PhoneWindow的setContectView

getWindow().setContentView

instrumentation.callApplicationOnCreate(app);

'app.oncreate()'

Application的真实创建过程

通过反射创建并将ContextImpl attach给自己

Application app = (Application) clazz.newInstance();

app.attach(context);

ContextImpl对象的创建时在makeApplication方法中创建的

通过ActivityThread中的Instrumentation的newApplication方法创建

Application对象并关联了ContextImpl对象

ContextImpl appContext = ContextImpl.createAppContext(mActivityThread,this);

app = mActivityThread.mInstrumentation.newApplication(cl,appClass,appContext)

Application 的创建位置

Application app = r.packageInfo.makeApplication(false,mInstrumentation)

Activity的创建

通过类加载器加载完整的Activity类名反射创建Activity的类实例

cl.loadClass(className).newInstance();

Activity的创建机制是通过Java的反射机制创建的

handleLaunchActivity调用performLaunchActivity方法创建Activity对象

ActivityThread中的handleLaunchActivity方法中就启动、创建第一个Activity的

在Activity的performCreate中调用自己的onCreate方法

mH当中的handleResumeActivity方法处理ActivityManagerService返送的消息

Activity的performResume()方法通过mInstrumentation.callActivityOnResume(this)方法调用到Activity的onResume()方法

WindowManager 接口,继承与ViewManager接口

调用Activity的onResume方法后View并没有立即被显示在屏幕上

而是执行到mWindow.addView(decor)时

WindowManagerImpl是WindowManager的真实实现类

WindowManagerGlobal 类是具体实现对Window的管理

WindowManagerGlobal中创建了ViewRootImpl 对象root

ViewRootImpl是管理每一View的,是负责与远程的ActivityManagerServer进行交互的

ViewRootImpl 对象的创建

root = ViewRootImpl(view.getContext(), display);

W extends IWindow.Stub

W的对象实现了与远程ActivityManagerServer的交互

ViewRootImpl 的setView方法实现与要显示的View进行关联

每个View都有一个Parent,此Parent就是ViewRootImpl,ViewRootImpl负责View的绘制

当Activity的onResume 执行后,程序继续向后执行直到执行了Activity的makeVisible()时View才真正的显示到了屏幕上

mDecor.setVisibility(View.VISIBLE);

通过ActivityManagerNative.getDefault().activityResumed(token);

通知远程的ActivityManagerServer当前Activity为可见状态

destory实际并没有直接销毁掉activity (8.1源码)

通过performDestroyActivity()执行相应的生命周期方法performPauseActivityIfNeeded()、callActivityOnStop()、callActivityOnDestroy和移除它的IBinder

通过WindowManager的实现类WindowManagerImpl调用removeViewImmediate(),拿到activity的实际控制类ViewRootImpl对象将他的父窗口(父布局)的指定分派为null

将activity的content清理

⑻ 亚马逊送达ams下一步是什么

AMS是亚马逊提供给平台供应商的一组营销服务。由于这是一个面向供应商的项目,所以它只能通过亚马逊的Vendor Central(供应商中心)平台提供,卖家不能从Seller Central访问。因此,要使用AMS,你需要收到来自Amazon to Vendor Central的邀请,或者注册Vendor Express项目。《亚马逊ASIN反查供应商(Beta)功能详解》

AMS提供的广告类型

基本上,AMS提供了三种可用的广告类型:

1、Sponsored Procts (有时也被称为关键字广告)

2、Headline Search Ads(标题搜索广告)

3、Proct Display Ads(产品展示广告)

利用Sponsored Proct广告,你可以选择你要进行推广的产品、关键字和每日预算。然后,根据你提供的关键字出价,与其他供应商竞争以赢得广告展示位置。Sponsored Proct会在亚马逊商店的关键字搜索结果中显示,如下图:

⑼ Activity、View、Window的理解一篇文章就够了

要了解这三者之间的关系,我们带着问题通过分析源码一步一步来揭开它们的神秘面纱!
文章有点长,首先要理解Activity、View、Window,我提出了一些问题,这篇文章可以解答如下问题:
1、为什么要设计Activity、View、Window?
2、Activity工作过程是什么样的?(理解Activity)
3、Window是什么?它的职能是什么?
4、View跟Window有什么联系?
5、Activity、View、Window三者如何关联?

用一句话来联系他们之间的关系:

一张图理清所有层级关系:

好了,接下来一步一步的分析,首先从大家最熟悉的Activity开始:

一个应用程序里所有的界面展示都来自于Activity,那Activity是如何工作的呢?
Activity工作过程:
要了解Activity工作过程,首先从启动开始,下面没有贴源码,因为本文章主题是三者之间的关系,而Activity东西太多了,就简单的讲一下。
启动:
从startActivity开始,它会调用到Instrumentation,然后Instrumentation通过Binder向AMS(ActivityManagerService)发请求,通过PIC启动Activity。而这个AIDL操作的方法定义在ApplicationThread中(里面包括了Activity所有的生命周期方法的调用)。然后通过Handle回到主线程启动activity。
因为中间流程太多,详细写出来容易造成“见其树木,而不见其森林”的局面。

启动Activity所执行的操作:
1、从ActivityClientRecord中获取待启动的Activity组件信息
2、通过Instrumentation的newActivity方法使用类加载器创建Activity对象
3、通过LoadedApk的mackApplication方法来尝试创建Application对象(如果Application已经创建,则不会重复创建)
4、创建ContextImpl对象,并通过Activity的attach方法来完成一些重要数据的初始化(包括让Activity跟Window关联)
5、调用Activity的onCreate方法

Activity其他生命周期的调用都是通过Binder向AMS发请求,然后执行的PIC操作,最后从ApplicationThread对生命周期调用。
下面是重点:Activity、View、Window三者的关系。

View如何跟Activity关联起来的?
其实View并不是直接跟Activity关联起来的,而是通过Window这个中间人。如前面所说,View只是窗花,Window才是直接关联到Activity上的。那么:
View如何跟Window关联起来呢?

下面先了解一下Window,就可以理解这个问题了

Window如何跟Activity关联?
每一个Activity都包含了唯一一个PhoneWindow,这个就是Activity根Window(之所以是说根Window是因为在它上面可以增加更多其他的Window,例如:弹出框(dialog))

那么,PhoneWindow如何跟Activity关联起来的呢?
来个最简单的,setContentView其实就让View与Window关联,Window跟Activity关联起来了。

那setContentView不是View跟Activity关联吗?
真相见Activity源码:

明显是将layout设置到Window上了,那这个 getWindow() 返回的Window是谁呢? 是不是前面提及PhoneWindow?

这么说来setContentView其实就是将View设置到Window上,Activity展示的其实是PhoneWindow上的内容。那么其实 setContentView 实际上是调用的 getWindow().setContentView。

PhoneWindow是个什么东西?它作为Activity跟View的中间人,它做了哪些工作?

首先 PhoneWindow 本身就是一个 Window。

从setContentView来分析:

这里的 mContentParent 其实是一个 ViewGroup。这么看来就简单了。PhoneWindow里面包含了一个ViewGroup,setContentView其实就是将layout设置到了这个ViewGroup上了。

我们再看看这张图:

DecorView是啥?
它直接跟PhoneWindow关联起来的,有了mContentParent,为啥还需要DecorView?
如图所见,DecorView它不仅包含了我们自己的布局,它还包含了titleBar。为啥需要?结构上的需要,更好的管理布局。

Window作为中间人,已经关联了Activity跟View了,那么如果处理Activity跟View之间的关系呢?
是时候揭开Window这个神秘面纱了:
之前提的PhoneWindow是继承于Window的,它是连接Activity跟View之间的桥梁。所有对View的一些操作都需要借助这个桥梁。

为了更好的理解Window,我们先从Dialog入手。在Activity中展示一个对话框的流程是怎样的?
为啥从Dialog入手,因为它里面包含了Window,而且可以直接操作Window里面的View,这样就能了解Window是如何控制View的,以及自定义Window怎么展示到Activity上(因为了解Dialog,就知道怎么让自定义的Window与Activity关联了)

我们省去所有的Dialog build的方法。直接从AlertDialog.show()方法开始:

AlertDialog构造方法里面最后执行的是这个构造方法,这里找到了亮点:
1、mWindow是啥?是不是PhoneWindow?
首先AlertDialog是继承Dialog的,mWindow就是Dialog里面初始化的对象,看看是不是PhoneWindow,如果是,那么就可以猜到通过在PhoneWindow添加View就可以在Activity上展示了,因为经过上面分析Activity是跟PhoneWindow有关联的。带着问题继续分析源码:

2、AlertController是啥?

从这两个属性就知道了,设置Title、Message的。用过Dialog的人都知道他们是啥,就不多说了。

既然这样关联起来了,那么Window怎么对View操控的呢?

WindowManager是主角。
在Dialog build之后就将View设置进来了,继续追踪Dialog show()这个方法,这个方法会将View与Window相互联系:

mWindowManager.addView,看到这个方法,可以猜想到WindowManager是个啥玩意了。

总结:
1、为什么要设计Activity、View、Window?
Activity就像工匠,Window就像是窗户,View就像是窗花,LayoutInflater像剪刀,Xml配置像窗花图纸。
Android根据他们不同的职能让他们各斯其活,同时也相互配合展示给我们灵活、精致的界面。为啥这样设计?因为这样的结构更好管理。就像为啥需要使用MVP、MVVM、各种设计模式一样。

2、Activity工作过程是什么样的?
以Activity启动过程为例,Activity启动时是通过Binder向AMS(ActivityManagerService)发请求,通过PIC启动Activity的。

3、Window是什么?它的职能是什么?
Activity要管理View需要通过Window来间接管理的。Window通过addView()、removeView()、updateViewLayout()这三个方法来管理View的。

4、View跟Window有什么联系?
View需要通过Window来展示在Activity上。

5、Activity、View、Window三者如何关联?
Activity包含了一个PhoneWindow,而PhoneWindow就是继承于Window的,Activity通过setContentView将View设置到了PhoneWindow上,而View通过WindowManager的addView()、removeView()、updateViewLayout()对View进行管理。Window的添加过程以及Activity的启动流程都是一次IPC的过程。Activity的启动需要通过AMS完成;Window的添加过程需要通过WindowSession完成。

你竟然看完了,非常感谢你的支持,希望这篇文章对你有帮助~

————2020年3月11日 更新
最近建了微信公众号和微博,由我(卷子)和我的好朋友(樱桃)两只小程序媛经营的。
我们都喜欢程序员这个呆萌的群体,我们希望能给你带来技术上的帮助以及生活上的快乐。嘿嘿~唯一的私心就是 希望你能喜欢我们咯。
大哥,我先敬你一瓶,先干为尽

⑽ ams中编译如何生成目标文件

o文件是不能被执行的, c的源码要经过编译和链接才能生成可执行文件,

阅读全文

与ams源码详解相关的资料

热点内容
给手机加密码忘记了怎么办 浏览:596
单片机运算符 浏览:292
移动端微信商城源码 浏览:442
编程猫下一个背景在哪里 浏览:354
javaclasstype 浏览:234
乐高编程和乐高课的延伸 浏览:354
苹果手机怎么切换app美国账号 浏览:861
编译程序输入一个字符串 浏览:407
圆命令画法 浏览:308
如果给电脑e盘文件加密 浏览:802
javaswing项目 浏览:778
androidsdksetup 浏览:1005
pdf怎么设置中文 浏览:128
安卓手机用什么软件看伦敦金 浏览:966
魅族文件夹无名称 浏览:792
苏黎世无人机算法 浏览:876
核桃编程和小码王的融资 浏览:686
微积分教材pdf 浏览:728
写python给微信好友发消息 浏览:340
蚊帐自营米加密 浏览:422