AMS追踪笔记(一)--开机后AMS的启动以及点击桌面图标后的处理流程

---------------------------------------------------些许废话-------------------------------------------------------------------

1.个人笔记用,尽量对其他访客阅读友好

2.UML图不是很熟,各位能看到大概顺序意思就好,见谅

以前一个同事给我们培训Input子系统的时候就说过一句话:对于一个子系统的介绍,你只要给人一张时序图让人家自己追下流程就好了,这就是传承。我很赞同,所以本篇文字基本可以视为给我做复习用,建议各位跟着流程走读遍代码,做到心中有数。

3.代码基于Android O AOSP

4.技术有限,如有贻笑大方地方还请再评论中指正

--------------------------------------------------------------------------------------------------------------------------------

进入正题,开机后驱动内核怎么处理的我不知道,这篇文章也不会涉及到Native层代码分析,各位有兴趣可以找找资料。

开机后会启动zygote,Android是基于linux的,每一个程序一般都是一个进程,除此以外,Android中有两个进程非常重要,一个就是zygote,这是个什么玩意呢,如字面意思,所有的其他进程都是从zygote fork出来的,应该是出于资源复用考虑。另外一个是SystemServer.SystemServer负责启动管理android中各种Service。

看图


SystemServer的run方法都做些什么呢,我个人认为比较重要的有以下几点:

1.初始化SystemClock、SystemProperties的一些属性值

2.调用当前线程的Looper.prepareMainLooper();

3.初始化系统上下文

说时候,这块之前还真没注意到,挺有意思的。

    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

        final Context systemUiContext = activityThread.getSystemUiContext();
        systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
    }

ActivityThread我们后面介绍,大家暂时知道有这么回事就行了。

4.初始化SystemServiceManager

5.调用startBootstrapServices(),startCoreServices(),startOtherServices()启动类似AMS,PMS,PowerManagerService等系统服务

从源码就可以看到SystemServer是通过调用SystemServiceManager的方法来完成启动Service工作的

          traceBeginAndSlog("StartActivityManager");
    mActivityManagerService = mSystemServiceManager.startService(
           ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    traceEnd();

startService有几个重载,比较重要的代码片段如下:

    public <T extends SystemService> T startService(Class<T> serviceClass) {
      ...
      Constructor<T> constructor = serviceClass.getConstructor(Context.class);
      service = constructor.newInstance(mContext);
      ...
      startService(service);
      return service;
  }
    public void startService(@NonNull final SystemService service) {
        ...
        mServices.add(service);  
        service.onStart();
        ...    
    }

可以看到SystemServeiceManager 内部维护了一个mServices的ArrayList,已经启动的Service都会添加进去。

    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>()

另外startService也会调用service的onStart()方法。

前面我们已经看到传给SystemServiceManager的是一个叫Lifecycle的内部类,它的内部持有自己外部Service的对象,对我们现在分析而言,就是AMS了,此时调用它的onStart方法,会调用AMS的start方法

    private final ActivityManagerService mService;
    @Override
    public void onStart() {
        mService.start();
    }

AMS的start方法如下

    private void start() {
        removeAllProcessGroups();
        mProcessCpuThread.start();

        mBatteryStatsService.publish();
        mAppOpsService.publish(mContext);
        Slog.d("AppOps", "AppOpsService published");
        LocalServices.addService(ActivityManagerInternal.class, new LocalService());
        // Wait for the synchronized block started in mProcessCpuThread,
        // so that any other acccess to mProcessCpuTracker from main thread
        // will be blocked during mProcessCpuTracker initialization.
        /// M: ANR Debug Mechanism
        mAnrManager.startAnrManagerService(MY_PID);
        try {
            mProcessCpuInitLatch.await();
        } catch (InterruptedException e) {
            Slog.wtf(TAG, "Interrupted wait during start", e);
            Thread.currentThread().interrupt();
            throw new IllegalStateException("Interrupted wait during start");
        }
    }

至此,AMS已经被启动。

然后我们再看看点击桌面图标后会发生什么。

首先我们要明确,桌面也是一个Apk.不对ROM的Launcher不一样,所以我们以AOSP的桌面Launcher3为例分析。

Launcher3的入口Activity是Launcher.java,追踪代码可以看到它的布局文件是launcher.xml

这个xml包含all_apps.xml,仔细看看,有个叫AllAppsRecyclerView的id为apps_list_view。是不是觉得应该就是它了,去看看。追踪发送桌面的App图标都是一个叫BubbleTextView的控件。返回Launcher.java,从createShortcut方法代码可以看出,图标的点击事件在Launcher的onClick中处理了

    public View createShortcut(ViewGroup parent, ShortcutInfo info) {
        BubbleTextView favorite = (BubbleTextView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.app_icon, parent, false);
        favorite.applyFromShortcutInfo(info);
        favorite.setOnClickListener(this);
        favorite.setOnFocusChangeListener(mFocusHandler);
        return favorite;
    }

从时序图可以看到。实际上最后还是调用了Activity.startActivity方法。另外注意下,此时的Flag是Intent.FLAG_ACTIVITY_NEW_TASK,这也是很合理的。


OK,这篇到此结束,下篇我们追踪Activity的startActivity方法系统内是怎么处理的。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值