Android源码分析-ActivityManagerService(AMS)源码分析

深度解读ActivityManagerService----Android四大组件系统系列 本文采用自述的方式带大家认识ActivityManagerService是啥,它有哪些功能,它的启动过程,它的模块有哪些以及模块的作用是啥。 阅读详情

一,ActivityManagerService简介:

ActivityManagerService(简称AMS)是Android系统中最重要的一个服务,负责管理Android系统中的四大组件以及他们的生命周期;同时,还提供应用进程管理,包括Home进程,以及电池状态查询,最近的task列表查询,WindowManager窗口管理...等诸多功能。

ActivityManagerService     //业内简称AMS, 活动管理服务

二,ActivityManagerService(AMS)系统架构以及相关核心组件:

在Android系统中,许多服务都是采用C/S架构。AMS也一样,AMS是服务端, 应用程序开发者无法直接访问它,而是通过对应的Client端实现AMS的访问,AMS对应的Client端组件是ActivityManagerProxy。

同时,Android系统还提供了ActivityManager来作为Client端对外的组件,为上层应用提供相关API。

简单的架构图如下:

可见,AMS继承自ActivityManagerNative。事实上,从Binder的角度来看,ActivityManagerNative是服务端的Stub,ActivityManagerProxy是Proxy。上层应用通过ActivityManagerProxy代理来达到于服务端的通信。

如下图:

IActivityManager:是一个接口,用于Binder通信的基类。有了IActivityManager,才能够建立起Binder所需要的组件结构;

ActivityManagerNative是服务端组件,继承自IActivityManager。从上面类图中也可可以看出,ActivityManagerNative是抽象类,并不能实例化。真正实例化的是AMS;

ActivityManagerService:真正的服务组件,继承自ActivityManagerNative。

ActivityManagerProxy:是客户端(Client)组件,是服务端的代理。而且,它是ActivityManagerNative的内部类。

三,ActivityManagerService(AMS)的初始化:

和其它核心服务一样,AMS的初始化也是在SystemServer中完成的,而且是在ServerThread这个类中进行的。事实上,ServerThread这个线程才是SystemServer的核心。

代码如下:

//SystemServer.java
class ServerThread extends Thread {
。。。。。。

        @Override
    public void run() {

        Slog.i(TAG, "Activity Manager");
        context = ActivityManagerService.main(factoryTest);
    }
}

接下来,我们从AMS的main方法开始分析。

3.1 ActivityManagerService.main:

这个方法主要做了两件事情:

1. 创建AMS;

2. 为AMS中的一些属性进行赋值;

1)创建AMS: 

    public static final Context main(int factoryTest) {
        AThread thr = new AThread();
        thr.start();

        synchronized (thr) {
            while (thr.mService == null) {
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
        }
......
}

可以预见,在

AThread

线程中进行初始化AMS,直到创建完成(否则,一直wait)。

AThread的实现:

AThread是AMS的一个静态内部类:

static class AThread extends Thread {
        ActivityManagerService mService;
        boolean mReady = false;

        public AThread() {
            super("ActivityManager");
        }

        public void run() {
            Looper.prepare();

            android.os.Process.setThreadPriority(
                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
            android.os.Process.setCanSelfBackground(false);

            ActivityManagerService m = new ActivityManagerService();
......
}

看到了

ActivityManagerService m = new ActivityManagerService();

这样,AMS就初始化好了。AMS是一个单例模式。

AMS的构造函数:

AMS的构造函数中,主要功能如下:

1. 初始化各种队列

2. 创建system文件夹

3.电池对象等服务的赋值

4. 线程对象mProcessStatsThread的创建

创建system文件夹:

        File dataDir = Environment.getDataDirectory();
        File systemDir = new File(dataDir, "system");
        systemDir.mkdirs();

 线程对象mProcessStatsThread的创建:

mProcessStatsThread = new Thread("ProcessStats") {
            public void run() {
                while (true) {
                    try {
                        try {
                            synchronized(this) {
                                final long now = SystemClock.uptimeMillis();
                                long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
                                long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
                                //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
                                //        + ", write delay=" + nextWriteDelay);
                                if (nextWriteDelay < nextCpuDelay) {
                                    nextCpuDelay = nextWriteDelay;
                                }
                                if (nextCpuDelay > 0) {
                                    mProcessStatsMutexFree.set(true);
                                    this.wait(nextCpuDelay);
                                }
                            }
                        } catch (InterruptedException e) {
                        }
                        updateCpuStatsNow();
                    } catch (Exception e) {
                        Slog.e(TAG, "Unexpected exception collecting process stats", e);
                    }
                }
            }
        };
        mProcessStatsThread.start();

在这个线程中,进行CPU的计算及其状态的的更新。 

2)为AMS中的一些属性进行赋值:

在AMS创建完成后,AMS的main还做了如下工作:为AMS中的一些属性进行赋值,

代码如下:

        ActivityManagerService m = thr.mService;
        mSelf = m;
        ActivityThread at = ActivityThread.systemMain(); ////创建ActivityThread
        mSystemThread = at;
        Context context = at.getSystemContext();
        context.setTheme(android.R.style.Theme_Holo);
        m.mContext = context;
        m.mFactoryTest = factoryTest;
        m.mMainStack = new ActivityStack(m, context, true);  //创建ActivityStack
        
        m.mBatteryStatsService.publish(context);
        m.mUsageStatsService.publish(context);
        
        synchronized (thr) {
            thr.mReady = true;
            thr.notifyAll();
        }

即:

在AMS中,

mSelf是AMS的实例;

mSystemThread是ActivityThread的实例;

mMainStack是mSelf的一个数据乘员。

AMS实例对外提供的获取方式是 :静态成员函数self(),如下:

public static ActivityManagerService self() {
        return mSelf;
    }

3) AMS Running:

m.startRunning(null, null, null, null);

m就是AMS类的实例。

至此,AMS就初始化好了。

3.2 AMS的其它属性设置:

我们再回到SystemServer中,有关AMS中被调用的方法如下:

            ActivityManagerService.setSystemProcess();

            ActivityManagerService.installSystemProviders();

            power.init(context, lights, ActivityManagerService.self(), battery);

            ActivityManagerService.self().setWindowManager(wm);

1)setSystemProcess:

在setSystemProcess中,将AMS添加到ServiceManager中,并且进行进程属性的相关设置。

            //AMS的setSystemProcess()方法的实现

            ActivityManagerService m = mSelf;
            
            ServiceManager.addService("activity", m, true);
            ServiceManager.addService("meminfo", new MemBinder(m));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(m));
            ServiceManager.addService("dbinfo", new DbBinder(m));
            if (MONITOR_CPU_USAGE) {
                ServiceManager.addService("cpuinfo", new CpuBinder(m));
            }
            ServiceManager.addService("permission", new PermissionController(m));

            ApplicationInfo info =
                mSelf.mContext.getPackageManager().getApplicationInfo(
                            "android", STOCK_PM_FLAGS);
            mSystemThread.installSystemApplicationInfo(info);

然后,最主要是new了一个ProcessRecord,并设置属性pid,maxAdj,processName等。

代码如下:

            synchronized (mSelf) {
                ProcessRecord app = mSelf.newProcessRecordLocked(
                        mSystemThread.getApplicationThread(), info,
                        info.processName, false);
                app.persistent = true;
                app.pid = MY_PID;
                app.maxAdj = ProcessList.SYSTEM_ADJ;
                mSelf.mProcessNames.put(app.processName, app.uid, app);
                synchronized (mSelf.mPidsSelfLocked) {
                    mSelf.mPidsSelfLocked.put(app.pid, app);
                }
                mSelf.updateLruProcessLocked(app, true, true);
            }

2)installSystemProviders:安装系统需要的provider;

3)power.init:电源服务的初始化;

4)setWindowManager:设置WindowManager。不要忘记了,WindowManager也是SystemThread的一个数据成员。

WindowManagerService mWindowManager;
    public void setWindowManager(WindowManagerService wm) {
        mWindowManager = wm;
    }

 四,ActivityManagerService(AMS)实例的获取与使用:

AMS三个重要的数据成员是:

WindowManagerService mWindowManager;

static ActivityManagerService mSelf; // 即AMS的单例模式
static ActivityThread mSystemThread;

4.1 获取AMS的方式:

    public static ActivityManagerService self() {
        return mSelf;
    }

在app开发时,不能直接通过self来获取AMS,而是通过binder机制,从client端进行获取。

client端:ActivityManager -> ActivityManagerProxy->

调用到server端:ActivityManagerNative  ->ActivityManagerService。

4.2. 通过ActivityManager的getRecentTasks来分析AMS的获取与使用:

ActivityManager的getRecentTasks方法,功能是获取最近的task列表。

其在ActivityManager中的实现如下:

    public List<RecentTaskInfo> getRecentTasks(int maxNum, int flags)
            throws SecurityException {
        try {
            return ActivityManagerNative.getDefault().getRecentTasks(maxNum,
                    flags);
        } catch (RemoteException e) {
            // System dead, we will be dead too soon!
            return null;
        }
    }

通过ActivityManagerNative.getDefault获取到ActivityManagerProxy,代码如下:

在ActivityManagerNative中,gDefault的定义:

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };
static public IActivityManager getDefault() {
        return gDefault.get();
    }

即getDefault获取返回的实际上是ActivityManagerProxy,即AMS在Client端的代理。

然后,通过ActivityManagerProxy取于服务端进行binder通信,即4.3的分析。

4.3 从ActivityManagerProxy到AMS:

既然getDefault返回的是ActivityManagerProxy,那么ActivityManagerProxy必然实现了getRecentTasks方法。就分析一下ActivityManagerProxy的实现,

1)ActivityManagerProxy类的getRecentTasks方法的实现:

代码如下:

通过binder机制中的

mRemote.transact(GET_RECENT_TASKS_TRANSACTION, data, reply, 0);

2)mRemote.transact:

mRemote就是服务端的AMS的实例。继续看一下这个transact的处理:

mRemote数据成员的声明:

private IBinder mRemote;

mRemote是IBinder类型。而AMS又有如下继承关系:

AMS -> ActivityManagerNative -> Binder -> IBinder

再看一下在这个继承体系中的调用序列:

Binder.transact -> AMS.onTransact -> ActivityManagerNative.onTransact

 3)在ActivityManagerNative.onTransact中的处理:

transact传过来的是GET_RECENT_TASKS_TRANSACTION,所以,看这个case:

        case GET_RECENT_TASKS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            int maxNum = data.readInt();
            int fl = data.readInt();
            List<ActivityManager.RecentTaskInfo> list = getRecentTasks(maxNum,
                    fl);
            reply.writeNoException();
            reply.writeTypedList(list);
            return true;
        }

这样就调用到了AMS的对应的方法getRecentTasks中。

4)AMS的getRecentTasks的实现如下:

public List<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum,
            int flags) {

    ......

            IPackageManager pm = AppGlobals.getPackageManager();
            
            final int N = mRecentTasks.size();
            ArrayList<ActivityManager.RecentTaskInfo> res
                    = new ArrayList<ActivityManager.RecentTaskInfo>(
                            maxNum < N ? maxNum : N);
            for (int i=0; i<N && maxNum > 0; i++) {
                TaskRecord tr = mRecentTasks.get(i);
                ......
            }
            
            return res;

}

这样,就完成了Binder通信,也实现了 getRecentTasks的功能。

五,总结:

重要的组件:

ActivityManager

ActivityManagerProxy  //Client端

ActivityManagerNative //  这是一个抽象类

ActivityManagerService //server端

        --ActivityThread


 ActivityManagerService, android中最重要的服务。

Android ActivityManagerService总结(一)AMS启动 ActivityManagerService是Android系统中一个特别重要的系统服务,也是我们上层APP打交道最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作 本文主要介绍一下启动过程 阅读详情

相关推荐

ActivityManagerService启动与基本功能

ActivityManagerService作为Android系统中的重要的系统服务之一,我们有必要来了解下。这篇文章就跟大家一起分析下它的创建、启动过程以及它的基本作用。  如果大家看过前面的《Android App进程创建过程分析》、《Android Activity启动过程分析》两篇文章,想必对ActivityManagerService(后面我们简称AMS)不会陌生,进程创建和Activity启动都有涉及到AMS。但是AMS又不只这些功能,下面我们就来了解下它的创建、启动过程以及它的基本功能。 .

sd_zhuzhipeng的专栏 1858

ActivityManagerService

接着在注释 2 处将它转换成 IActivityManager 类型的对象,这段代码采用的是 AIDL,IActivityManager 类是由 AIDL 工具在编译时自动生成的,IActivityManager.aidl 的文件路径为 /frameworks/base/core/java/android/app/IActivityManager.aidl。首先将传入的参数写入到 Parcel 类型的 data 中。在注释 3 处判断如果用来运行 Service 的应用程序进程存在,则调用注释 4 处的。

xingyu19911016的博客 2212

Android的ActivityManagerService(简称AMS) 源码分析

ApplicationInfo info:AndroidManifest.xml中定义的Application信息boolean isolated:是不是isolated进程int uid:进程uidint userId:这个是android做的多用户系统id,就像windows可以登录很多用户一样,android也希望可以实现类似的多用户String processName:进程名字,默认情况下是包名。

2401_89722408的博客 1145

ActivityManagerService分析

一.概述 ActivityManagerService简称AMS,它是android中很重要的一个服务,它统筹管理着android的四大组件;统一调度各应用进程;AMN由Binder类由Binder类派生,实现了IActivityManager接口,客户端使用ActivityManager类,因为AMS是系统核心服务,很多API不能直接访问,需要通过ActivityManager,Activit...

福锅的专栏 1万+

Android的ActivityManagerService(简称AMS) 源码分析,2021阿里Android笔试总结

} final T service; try { Constructor constructor = serviceClass.getConstructor(Context.class); service = constructor.newInstance(mContext); } catch (InstantiationException ex) { throw new RuntimeException("Failed to create service " + name “: service coul

m0_66264588的博客 1109

ActivityThread源码解析之Application与Activity启动

前言 在看ActivityThread源码的时候,看到有博客提到它承担着整个应用的运转以及生命周期。于是很好奇想一探究竟,跟着跟着大概就把应用启动过程过程了解了一下。这篇文章主要是介绍ActivityThread中有关于应用启动过程以及Activity启动部分。有关Binder的机制或者其他部分内容太多了,以后专门看看。 源码分析 Activity有且只有一个ActivityThr...

知识需要细嚼慢咽 1630

Android的ActivityManagerService(简称AMS)的源码分析

Android的ActivityManagerService(简称AMS)的源码分析 内容太多,建议收藏 AMS简介 ActivityManagerService是Android系统中一个特别重要的系统服务,也是我们上层APP打交道最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应用进程的管理和调度工作,所有的APP应用都需要 与AMS打交道。 Activity Manager的组成主要分为以下几个部分: 服务代理:由Activit

拖鞋王子猪 885

伺服电机开发实战指南

伺服电机作为工业自动化的核心部件,正经历前所未有的技术革新。本文从基础原理出发,详细介绍了伺服电机的分类、工作原理和特性,分析了伺服电机系统组成与核心部件,探讨了企业级开发技术,包括控制算法、通信协议和故障诊断等高级功能,并提供了实战案例分析,从行业应用到具体开发步骤,展示了伺服电机的工程实现。通过深入理解伺服电机的原理、掌握开发技术、学习应用案例,可以实现伺服系统的高性能开发与应用。

全栈 1676

Android的ActivityManagerService(简称AMS) 源码分析(1)

ApplicationInfo info:AndroidManifest.xml中定义的Application信息boolean isolated:是不是isolated进程int uid:进程uidint userId:这个是android做的多用户系统id,就像windows可以登录很多用户一样,android也希望可以实现类似的多用户String processName:进程名字,默认情况下是包名。

2301_82241647的博客 1047

编码约定的自由度:重新思考Hamming码在实际工程中的灵活应用

本文探讨Hamming码在实际工程中的灵活应用,突破标准实现的思维定式。通过分析不同编码约定的优缺点和资源受限环境下的设计权衡,展示如何根据嵌入式系统、通信协议等具体需求定制汉明码实现,优化编解码效率并降低硬件开销。

perl8的博客 178

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 340

Android (AMS)ActivityManagerService源码分析

原址在这篇博客中,给大家带来AMS的技术分享。AMS(ActivityManagerService)是贯穿Android系统组件的核心服务,负责了系统中四大组件的启动、切换、调度以及应用进程管理和调度工作。因此想要了解Android的内部工作机制,就必须先了解�AMS的工作原理。在本文中,我将尽可能用通俗的语言去描述AMS涉及到的知识点帮助大家理解。AMS的内部实现AMS原理模型1. Activi...

Android系统攻城狮 1321

HDRnet——双边滤波和仿射变换的摇身一变

layer层数越多,下采样得到的图越小,low-level features的好处是最后的grid会更coarser,最后的特征图的感受野也越多,非线性更好,表达力更强。所以最终grid是5维的[B,in*out,n,H,W],permute之后是[B,H,W,n,in*out],B是batchsize,n表示对guide的量化级数,in*out表示每个cell的变换系数。这部分的处理对象是低分辨率图,利用CNN进行特征提取(局部和全局),最后fuse得到grid,这里面包含了变换的系数。

zcg1942的博客 1576

Android的ActivityManagerService(简称AMS) 源码分析,2024年最新app架构图怎么做

答应大伙的备战金三银四,大厂面试真题来啦!这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。《960全网最全Android开发笔记》《379页Android开发面试宝典》包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。

2301_82241647的博客 1086

Ultralytics YOLO模块自定义与替换实战技巧

本文详细介绍了在Ultralytics YOLO框架中进行模块自定义与替换的实战技巧。通过从零开始添加全新模块(如注意力模块)到进阶替换现有模块(如增强版卷积),并涵盖模块注册、YAML配置、模型融合及ONNX导出等关键步骤,帮助开发者深度定制YOLO模型,以应对复杂检测任务与部署需求。

numpy6sculptor的博客 930

VS2022如何兼容老项目?.NET Framework 4.0/4.5安装避坑指南

本文提供了在Visual Studio 2022中兼容和维护.NET Framework 4.0/4.5等老旧项目的完整解决方案。针对VS2022无法直接识别旧框架的核心问题,文章详细剖析了原因,并重点推荐通过官方NuGet包安全获取引用程序集的方法,给出了从下载、解压到部署至标准目录的详细步骤。同时,文章还深入探讨了项目文件格式过旧、NuGet包还原失败等进阶问题的排查与解决策略,旨在帮助开发者高效、稳定地在现代开发环境中维护历史代码库。

weixin_27734811的博客 514

Android AMS服务

继续来研究Android Framework层相关的一些东东,这里是以Android8.0版本的源码进行梳理的,关注的还是其核心流程,不是彻底分析,了解了核心流程是为了了期其大概的原理。 Android系统启动: 这里具体就不分析代码了,因为重点是来分析AMS相关的代码,这里以流程图的方式来展现一下整个的启动,毕境对于一个组件的启动得要建立在整个Android系统启动基础之上的,另外这块的具体源...

webor2006的博客 186

手把手实现3D肺结节检测:基于Faster R-CNN的从CT处理、训练到部署的五步代码级实战与避坑指南

亲爱的同学,当你能完整实现“3D Faster R-CNN肺部结节检测系统”,你会发现医学影像AI的毕设课题充满挑战与成就感。我们围绕3D Faster R-CNN模型,从数据处理、模型搭建到实验验证,一步步带你打造一个能精准检测肺部结节的智能系统,让你的毕设既体现技术深度,又能为肺部疾病早期诊断贡献实用价值。是专为3D医学影像设计的目标检测模型,能在三维CT数据中自动定位、识别肺部结节——这一课题兼具“临床价值”和“技术挑战性”,是毕设的优质选择,能充分展现你的工程能力和科研敏感度。

LXY_LOVE36的博客 306

Framework底层服务,AMS|PMS|WMS原理分析

其实所谓的AMS,PMS,以及WMS等都是运行在system_server这个进程中的线程。**Framwork中的主流服务**ActivityManagerService、PackageManagerService、WindowManagerService、AlarmManagerService、JobSchedulerService、ResourceManagerService、InputManagerService等上述几部分大致说明PMS处理APK的主要步骤,可总结如下。.........

嘴巴吃糖了 1358

mapbox进阶,百度地图、高德地图纠偏,使用在线网络地图加载插件

本文详细介绍如何基于mapbox-gl v3.8.0版本百度地图、高德地图纠偏,使用在线网络地图加载插件,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 749

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: C语言字符串函数大全,字符串复制strcpy,字符串比较strcmp,字符串连接strcat,strstr,strncpy,strerror...
下一篇: Android系统中WindowManagerService的初始化流程
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值