龙电竞官网Framework源码分析(一):ActivityManagerService

2020-02-07 04:34栏目:龙电竞官网
TAG:

开源力量公开课第53期:Android架构与设计精髓启示录 时间:2014-04-29 20:00形式:线上公开课报名地址:课程名称:开源力量公开课第53期-Android架构与设计精髓启示录课程背景:Android取得巨大成功背后的技术架构密码是什么?Android碎片化是弊大于利吗?Android最经典的架构设计模式是什么?这个一手控制了硬体厂商另一只手控制了软体厂商的传奇般的系统的终极力量在哪里?Android现象揭示了IT后背什么样的成长规律?UC迅雷、UCWeb、优酷、酷六、赶集网等公司Android应用客户端背后的核心代码是什么?如何以最佳路线掌握Android系统框架并转化为相当可观的现金?如何以最佳掌握Android应用程序开发并转为令人满意的现金?课程大纲:第1个主题:Android架构揭秘Google是如何通过Android支持、掌控全球的硬件厂商和应用程序开发者的? Android控制力的源泉是什么?技术上如何实现? Android的Linux Kernal、HAL、Libararies、Runtime、Application Framework设计的理念和实现技术; Android平台与硬件、云的微妙关系;第2个主题:HAL揭秘Zygote与SystemServer SystemServer开启Java世界的过程揭秘 Android Service和Native Service是如何关联起来的? Android Service与ServiceManager 如何把自己的服务加入到ServiceManager中?第3个主题:SystemServer与Framework中的ServiceZygote与SystemServer SystemServer开启Java世界的过程揭秘 Android Service和Native Service是如何关联起来的? Android Service与ServiceManager 如何把自己的服务加入到ServiceManager中? 第4个主题:Android应用程序背后的核心代码UC迅雷背后的核心代码是什么? UCWeb背后的核心代码是什么? 优酷、酷六等公司Android应用客户端背后的核心代码是什么? 赶集网等公司Android应用客户端背后的核心代码是什么? 第5个主题:Android学习最佳实践 为什么现在更需要Android开发者? 如何以最佳路线掌握Android系统框架并转化为相当可观的现金? 如何以最佳掌握Android应用程序开发并转为令人满意的现金? 第6个主题:自由问答环节 讲师介绍:王家林,国内最早从事于Android系统移植、软硬整合、框架修改、应用程序软件开发以及Android系统测试和应用软件测试的技术专家和技术创业人员之一。HTML5技术领域的最早实践者之一,成功为多个机构实现多款自定义HTML5浏览器,参与某知名的HTML5浏览器研发;云计算分布式大数据处理的最早实践者之一,Hadoop的狂热爱好者,不断的在实践中用Hadoop解决不同领域的大数据的高效处理和存储。超过10本的IT畅销书作者。

 Android架构设计和软硬整合完整训练

龙电竞官网,从这篇文章开始,我想把自己对于Framework源码的理解详细的进行分析和阐述,当然自己在阅读这些代码的时候也大量的进行了其他资料的阅读和学习。我希望通过我的分享能够带给大家对于Android由浅入深的理解。

 

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

Android架构设计和软硬整合完整训练:HAL&Framework&Native Service&Android Service&Best Practice
如何理解Android架构设计的初心并开发出搭载Android系统并且具备深度定制和软硬整合能力特色产品,是本课程解决的问题。

AMS的内部实现

AMS原理模型

课程以Android的五大核心:HAL、Binder、Native Service、Android Service(并以AMS和WMS为例)、View System为主轴,一次性彻底掌握Android的精髓。

1. ActivityManager

/frameworks/base/core/java/android/app/ActivityManager.java

ActivityManager是客户端用来管理系统中正在运行的所有Activity包括Task、Memory、Service等信息的工具。但是这些这些信息的维护工作却不是又ActivityManager负责的。在ActivityManager中有大量的get()方法,那么也就说明了他只是提供信息给AMS,由AMS去完成交互和调度工作。

之所以是开发Android产品的必修课,缘起于:

2. AMS

/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

AMS是作为管理Android系统组件的核心服务,他在SystemServer执行run()方法的时候被创建,并运行在独立的进程中。具体来说就是SystemServer管理着Android中所有的系统服务,这些系统服务的生命周期回调都由SystemServer去调度负责。

    private void startBootstrapServices() {
        ...
        Installer installer = mSystemServiceManager.startService(Installer.class);

        // Activity manager runs the show.
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        ...
    }

在SystemServer调用run()方法中开启必要的系统服务,并将这些服务注册和添加到管理列表中,并执行这些服务在进程中的生命周期。ActivityManagerService作为一个重要的核心服务就是在这里被初始成功的。

1,     HAL是Android Framework&Application与底层硬件整合的关键技术和必修技术;

AMS与ActivityManager的通信实现

AMS与ActivityManager通信流程

我们知道AMS和ActivityManager之间通信需要利用Binder来完成,那么我们接下来分析一下这个通信机制是如何实现的。
ActivityManagerNative(AMN)中实现的代码是运行在Android应用程序的进程空间内,可直接使用的对象,Intent会由应用程序通过这个类将方法对应的Binder命令发送出去。ActivityManagerNative(AMN)是一个抽象的类,他包含了如下特点:
(1)继承Binder类
(2)实现IActivityManager接口
由于继承了Binder类,他就拥有了远程通信的条件。实现了IActivityManager接口,他能够得到ActivityManager管理关于内存、任务等内部信息。那么AMS作为AMN的子类也就自然享有了这些特性。

我们再回过头来看看ActivityManager中的方法是如何被调用的,举个栗子:

    public List<ActivityManager.AppTask> getAppTasks() {
        ArrayList<AppTask> tasks = new ArrayList<AppTask>();
        List<IAppTask> appTasks;
        try {
            appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        ...
        return tasks;
    }

我们在代码中发现,类似的get()方法的调用逻辑都是先通过ActivityManagerNative.getDefault()来获得ActivityManager的代理接口对象。getDefault()到底做了什么?

    /**
     * Retrieve the system's default/global activity manager.
     */
    static public IActivityManager getDefault() {
        return gDefault.get();
    }

    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;
        }
    };

ServiceManager是系统提供的服务管理类,所有的Service都通过他被注册和管理,并且通过getService()方法能够得到ActivityManager与AMS的远程通信Binder对象。

    /**
     * Cast a Binder object into an activity manager interface, generating
     * a proxy if needed.
     */
    static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }

        return new ActivityManagerProxy(obj);
    }

得到了AMS的Binder对象之后,也就相当于拿到了与ActivityManager远程通信的许可证。接着,在asInterface()这个方法中,这个许可证的使用权利被移交给了ActivityManagerProxy,那么ActivityManagerProxy就成为了ActivityManager与AMS远程通信的代理。

ActivityManagerProxy也实现了IActivityManager接口。当客户端(ActivityManager)发起向服务端(AMS)的远程请求时,客户端提供的数据参数信息被封装打包,然后由ActivityManager的远程通信binder对象通过transact()方法把数据提交,然后再把数据写出返回给binder对象。

    public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
            String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
        data.writeString(callingPackage);
        intent.writeToParcel(data, 0);
        data.writeString(resolvedType);
        data.writeStrongBinder(resultTo);
        data.writeString(resultWho);
        data.writeInt(requestCode);
        data.writeInt(startFlags);
        if (profilerInfo != null) {
            data.writeInt(1);
            profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
        } else {
            data.writeInt(0);
        }
        if (options != null) {
            data.writeInt(1);
            options.writeToParcel(data, 0);
        } else {
            data.writeInt(0);
        }
        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
        reply.readException();
        int result = reply.readInt();
        reply.recycle();
        data.recycle();
        return result;
    }

通过这种方式,AMS在自己的进程中就能获得ActivityManager进程发来的数据信息,从而完成对于Android系统组件生命周期的调度工作。

2,     Native Service 对上层来说代表了硬件,是Android底层真正的精髓;

3,     Android Service是应用程序的控制核心,应用程序的一切行为均有Android Service掌控;

4,     Binder 是Android系统运行的基石,不掌握Binder就永远无法掌握Android;

5,     View系统的差异化对消费者而言是Android产品核心竞争力之一,苹果和三星是这方面成功的经典案例;

通过Android五大核心的洗礼,从而完全具备Android系统二次开发和改造能力,

进而开发出极具特色的Android产品。

 

学员基础

      能看懂C/C++与Java

 

一、课程特色

l  建立360度的Android产品研发能力和解决问题的能力,能够独立开发并深度定制出搭载Android系统的产品;

l  贯通Android软硬整合和HTML5端云整合技术整个体系;

l  全程案例驱动,重在剖析案例代码背后的设计思维和商业密码;

l  彻底掌握Android HAL的背后的密码;

l  彻底掌握Android HAL的实现机制和技术

l  彻底掌握Android Framwork的背后的密码

l  彻底掌握Android Framwork的设计思维和理念

l  揭秘Android系统的运行的基石Binder

版权声明:本文由龙竞技官网发布于龙电竞官网,转载请注明出处:龙电竞官网Framework源码分析(一):ActivityManagerService