Android Activity启动过程详解

2024-06-04 4025阅读

 Android系统启动篇

1,《android系统启动流程简介》

2,《android init进程启动流程》

3,《android zygote进程启动流程》

4,《Android SystemServer进程启动流程》

5,《android launcher启动流程》

6,《Android Activity启动过程详解》

Android系统开发准备篇

1,《Android 源码下载和编译》

2,《android 11源码编译和pixel3 刷机》

3,《Android Framework代码IDE加载和调试》

Android系统开发实践篇

1,《android设置默认输入法》

2,《android framework预制APK应用》

3,《Android系统层面限制应用开机自启动详解》

4,《android单独编译framework模块并push》

5,《Android Framework开发系统问题分析》

Android系统开发核心知识储备篇

1,《Android编译系统-envsetup和lunch代码篇》

2,《Android编译系统-概念篇》

3,《android日志系统详解》

4,《Android系统Handler详解》

5,《Android系统Binder详解》

6,《Android中Activity、View和Window关系详解》

7,《android view绘制流程详解》

8,《Android读取系统属性详解》

9,《android 窗口管理机制详解》

10,《初识Android系统》

11,《android中AMS进程通知Zygote进程fork新进程的通信方式》

Android核心功能详解篇

1,《android应用市场点击下载APK安装详解》

2,《Android 手势导航(从下往上滑动进入多任务页面)》

3,《android手势分析(应用界面左往右边滑动退出应用)》

4,《android应用安装流程详解》

5,《android11安装应用触发桌面图标刷新流程》

6,《Android系统多任务Recents详解》

7,《android系统导航栏视图分析》

———————————————————————————————————————————

目录

一,背景介绍

二,Activity启动过程

2.1 调用 ATMS 系统进程

2.1.1 时序图

2.1.2 Launcher 桌面的 App 图标入口

2.1.3 startActivitySafely() 方法

2.1.4 execStartActivity() 方法

2.2 ATMS 向 AMS 发送创建应用进程的过程

2.2.1 时序图

2.2.2 ATMS(ActivityTaskManagerService)

2.2.3 ActivityStartController

2.2.4 ActivityStarter

2.2.5 RootWindowContainer

2.2.6 ActivityStack

2.2.7 ActivityStackSupervisor

2.3 AMS 向 Zygote 进程发送创建应用进程 ActivityThread 的过程

2.3.1 时序图​编辑

2.3.2 ActivityTaskManagerService 启动进程

2.3.3 ActivityManagerService

2.3.4 ProcessList

2.3.5 Process

2.3.6 ZygoteProcess

2.3.7 ZygoteProcess 开启 socket 连接

2.3.8 ZygoteProcess 发送请求参数

2.4  Zygote 进程fork并启动应用进程

2.4.1 时序图

2.4.2 Zygote 进程启动、解析 Socket 传入的参数

2.4.3 ZygoteServer 开启 Loop 循环监听 Socket

2.4.4 ZygoteConnection

2.4.5 Zygote 创建子进程(native 层创建)

2.4.6 ZygoteConnection # handleChildProc() 方法

2.4.7 ZygoteInit # zygoteInit() 方法

2.4.8 RuntimeInit # applicationInit() 方法

2.4.9 RuntimeInit # MethodAndArgsCaller

2.4.10. 小结

2.5 应用进程 ActivityThread 启动 Activity 的过程

2.5.1 时序图

2.5.2 ActivityThread 入口方法

2.5.3 AMS 绑定 ApplicationThread

2.5.4 ActivityThread 创建并绑定 Application

2.5.5 ProcessRecord 保存 ApplicationThread

2.5.6 ATMS 绑定 WindowProcessController、启动根 Activity

2.5.7 RootWindowContainer 绑定 WindowProcessController

2.5.8 获取 ClientTransaction、添加 Callback、设置 LifecycleStateRequest

2.5.9 ClientTransaction 获取、添加事务回调

2.5.10 ClientLifecycleManager 客户端生命周期事务转换管理器

2.5.11 ClientTransaction # schedule() 调度事务

2.5.12 ActivityThread 调度事务

2.5.13 TransactionExecutor 事务转换执行器

2.5.14 LaunchActivityItem 请求启动 Activity

2.5.15 ActivityThread 执行启动 Activity 事务

2.5.16 ActivityThread 执行生命周期事务

2.5.17 TransactionExecutor 执行中间态生命周期请求事务

2.5.18 TransactionExecutorHelper 获取待执行生命周期的状态序列

2.5.19 TransactionExecutor 执行生命周期事务的最终转换

三,总结


一,背景介绍

        Activity启动流程两种类型:一是在activity中通过startActivity(Intent intent)方法启动一个Activity;二是我们在桌面点击应用图标启动一个App然后显示Activity;第二种方式相较于第一种方式流程更加全面和复杂,所以本文会以第二种流程来分析讲解。

        启动流程大致分为下面五个阶段:

1,Launcher进程请求调用ATMS系统进程过程

2,ATMS 向 AMS 发送创建应用进程的过程

3,AMS 向 Zygote 进程发送创建应用进程 ActivityThread 的过程

4,Zygote 进程接收请求 fork 并启动应用进程 ActivityThread 的过程

5,应用进程 ActivityThread 启动 Activity 的过程

二,Activity启动过程

        点击 Launcher 中某一个应用图标到应用第一个 Activity 展示出来的流程,当系统开机后,Launcher 会被 AMS 启动,然后将已经安装的应用程序图标显示到桌面上,所以当我们点击一个应用图标其实就是相当于点击 Activity 中的一个 Button,其相应事件就是 Launcher 进程请求 ATMS 来启动该应用程序。

2.1 调用 ATMS 系统进程

2.1.1 时序图

Android Activity启动过程详解 第1张

2.1.2 Launcher 桌面的 App 图标入口

        Launcher3的manifest.xml定义,路径packages/apps/Launcher3/AndroidManifest.xml

   
            
                
                
                
                
                
            
            
        

        上面定义可知,com.android.launcher3.Launcher.java文件为桌面首页,源码如下:

public class Launcher extends StatefulActivity implements LauncherExterns,Callbacks, InvariantDeviceProfile.OnIDPChangeListener, PluginListener,LauncherOverlayCallbacks {
    @Override
    @TargetApi(Build.VERSION_CODES.S)
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	......
    	// 分析1 -- 加载、展示布局文件
		inflateRootView(R.layout.launcher);
    }
}

        布局文件R.layout.launcher如下,



    
		
        
    




	
	
    




        AllAppsRecyclerView 外层是 LauncherAllAppsContainerView,它是 AllAppsContainerView 的子类。给 AllAppsRecyclerView 设置 Adapter 被封装到了 AllAppsContainerView 里面,看一下代码:

/**
 * The all apps view container.
 */
public class AllAppsContainerView extends SpringRelativeLayout implements DragSource,
        Insettable, OnDeviceProfileChangeListener, OnActivePageChangedListener,
        ScrimView.ScrimDrawingController {
	protected void rebindAdapters(boolean force) {
		......
        if (mUsingTabs) {
            ...... 
            // 这里只分析不使用 Tabs 的情况,感兴趣的童鞋可以继续追源码
        } else {
        	// AllAppsRecyclerView 设置 Adapter 等信息
            mAH[AdapterHolder.MAIN].setup(findViewById(R.id.apps_list_view), null);
            mAH[AdapterHolder.WORK].recyclerView = null;
        }
        ......
    }        
	public class AdapterHolder {
        public static final int MAIN = 0;
        public static final int WORK = 1;
        public final AllAppsGridAdapter adapter;
        final LinearLayoutManager layoutManager;
        final AlphabeticalAppsList appsList;
        AllAppsRecyclerView recyclerView;
        AdapterHolder(boolean isWork) {
            mIsWork = isWork;
            appsList = new AlphabeticalAppsList(mLauncher, mAllAppsStore,
                    isWork ? mWorkManager.getAdapterProvider() : null);
            BaseAdapterProvider[] adapterProviders =
                    isWork ? new BaseAdapterProvider[]{mSearchAdapterProvider,
                            mWorkManager.getAdapterProvider()}
                            : new BaseAdapterProvider[]{mSearchAdapterProvider};
            adapter = new AllAppsGridAdapter(mLauncher, getLayoutInflater(), appsList,
                    adapterProviders);
            appsList.setAdapter(adapter);
            layoutManager = adapter.getLayoutManager();
        }
        void setup(@NonNull View rv, @Nullable ItemInfoMatcher matcher) {
            appsList.updateItemFilter(matcher);
            recyclerView = (AllAppsRecyclerView) rv;
            recyclerView.setEdgeEffectFactory(createEdgeEffectFactory());
            recyclerView.setApps(appsList);
            recyclerView.setLayoutManager(layoutManager);
            // AllAppsRecyclerView 设置 AllAppsGridAdapter
            recyclerView.setAdapter(adapter);
        }
    }
}

         源码中在 AllAppsContainerView 中为 AllAppsRecyclerView 设置了 AllAppsGridAdapter,然后在 AllAppsGridAdapter # onCreateViewHolder() 方法中为子项 itemView 设置点击事件 ItemClickHandler.INSTANCE,点击事件由 launcher.getItemOnClickListener() 方法获取。看一下 ItemClickHandler 是怎么处理点击事件的,代码如下:

/**
 * Class for handling clicks on workspace and all-apps items
 */
public class ItemClickHandler {
    private static final String TAG = ItemClickHandler.class.getSimpleName();
    /**
     * Instance used for click handling on items
     * 单例方式获取点击事件
     */
    public static final OnClickListener INSTANCE = ItemClickHandler::onClick;
    private static void onClick(View v) {
        if (v.getWindowToken() == null) return;
        Launcher launcher = Launcher.getLauncher(v.getContext());
        if (!launcher.getWorkspace().isFinishedSwitchingState()) return;
        Object tag = v.getTag();
        if (tag instanceof WorkspaceItemInfo) {
            onClickAppShortcut(v, (WorkspaceItemInfo) tag, launcher);
        } else if (tag instanceof FolderInfo) {
            if (v instanceof FolderIcon) {
                onClickFolderIcon(v);
            }
        } else if (tag instanceof AppInfo) {
        	// 点击 App 图标
            startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher
            );
        } else if (tag instanceof LauncherAppWidgetInfo) {
            if (v instanceof PendingAppWidgetHostView) {
                onClickPendingWidget((PendingAppWidgetHostView) v, launcher);
            }
        } else if (tag instanceof SearchActionItemInfo) {
            onClickSearchAction(launcher, (SearchActionItemInfo) tag);
        }
    }
    
	private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher) {
        Intent intent;
        if (item instanceof ItemInfoWithIcon
                && (((ItemInfoWithIcon) item).runtimeStatusFlags
                & ItemInfoWithIcon.FLAG_INSTALL_SESSION_ACTIVE) != 0) {
            ItemInfoWithIcon appInfo = (ItemInfoWithIcon) item;
            intent = new PackageManagerHelper(launcher)
                    .getMarketIntent(appInfo.getTargetComponent().getPackageName());
        } else {
            intent = item.getIntent();
        }
        if (intent == null) {
            throw new IllegalArgumentException("Input must have a valid intent");
        }
        if (item instanceof WorkspaceItemInfo) {
            WorkspaceItemInfo si = (WorkspaceItemInfo) item;
            if (si.hasStatusFlag(WorkspaceItemInfo.FLAG_SUPPORTS_WEB_UI)
                    && Intent.ACTION_VIEW.equals(intent.getAction())) {
                intent = new Intent(intent);
                intent.setPackage(null);
            }
            if ((si.options & WorkspaceItemInfo.FLAG_START_FOR_RESULT) != 0) {
                launcher.startActivityForResult(item.getIntent(), 0);
                InstanceId instanceId = new InstanceIdSequence().newInstanceId();
                launcher.logAppLaunch(launcher.getStatsLogManager(), item, instanceId);
                return;
            }
        }
        if (v != null && launcher.supportsAdaptiveIconAnimation(v)) {
            // Preload the icon to reduce latency b/w swapping the floating view with the original.
            FloatingIconView.fetchIcon(launcher, v, item, true /* isOpening */);
        }
        // 调用 Launcher # startActivitySafely() 启动 Activity
        launcher.startActivitySafely(v, intent, item);
    }
}

         回答上面的问题,AllAppsRecyclerView 在 AllAppsContainerView 中设置了 AllAppsGridAdapter,在 AllAppsGridAdapter # onCreateViewHolder() 方法中为子项 itemView 设置点击事件 ItemClickHandler.INSTANCE。

2.1.3 startActivitySafely() 方法

/**
 * Default launcher application.
 */
public class Launcher extends StatefulActivity implements LauncherExterns,
        Callbacks, InvariantDeviceProfile.OnIDPChangeListener, PluginListener,
        LauncherOverlayCallbacks {
    @Override
    public boolean startActivitySafely(View v, Intent intent, ItemInfo item) {
        if (!hasBeenResumed()) {
            addOnResumeCallback(() -> startActivitySafely(v, intent, item));
            if (mOnDeferredActivityLaunchCallback != null) {
                mOnDeferredActivityLaunchCallback.run();
                mOnDeferredActivityLaunchCallback = null;
            }
            return true;
        }
        boolean success = super.startActivitySafely(v, intent, item);
        if (success && v instanceof BubbleTextView) {
            BubbleTextView btv = (BubbleTextView) v;
            btv.setStayPressed(true);
            addOnResumeCallback(() -> btv.setStayPressed(false));
        }
        return success;
    }
}
/**
 * Extension of BaseActivity allowing support for drag-n-drop
 */
@SuppressWarnings("NewApi")
public abstract class BaseDraggingActivity extends BaseActivity
        implements OnColorsChangedListener, DisplayInfoChangeListener {
	 public boolean startActivitySafely(View v, Intent intent, @Nullable ItemInfo item) {
		......
        Bundle optsBundle = (v != null) ? getActivityLaunchOptions(v, item).toBundle() : null;
        UserHandle user = item == null ? null : item.user;
        // Prepare intent
        // 添加 FLAG_ACTIVITY_NEW_TASK,即在新的 Task 中启动 Activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (v != null) {
            intent.setSourceBounds(Utilities.getViewBounds(v));
        }
        try {
            boolean isShortcut = (item instanceof WorkspaceItemInfo)
                    && (item.itemType == Favorites.ITEM_TYPE_SHORTCUT
                    || item.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT)
                    && !((WorkspaceItemInfo) item).isPromise();
            if (isShortcut) {
                // Shortcuts need some special checks due to legacy reasons.
                startShortcutIntentSafely(intent, optsBundle, item);
            } else if (user == null || user.equals(Process.myUserHandle())) {
                // Could be launching some bookkeeping activity
                // 点击 App 图标 启动 App
                startActivity(intent, optsBundle);
            } else {
                getSystemService(LauncherApps.class).startMainActivity(
                        intent.getComponent(), user, intent.getSourceBounds(), optsBundle);
            }
            if (item != null) {
                InstanceId instanceId = new InstanceIdSequence().newInstanceId();
                logAppLaunch(getStatsLogManager(), item, instanceId);
            }
            return true;
        } catch (NullPointerException | ActivityNotFoundException | SecurityException e) {
            ......
        }
        return false;
    }
}

        根 Activity 启动时,添加 FLAG_ACTIVITY_NEW_TASK,即在新的任务栈 Task 中启动 Activity,然后调⽤到 Activity # startActivity() ⽅法,传⼊参数为 intent 和 Bundle。代码如下:

public class Activity extends ContextThemeWrapper
        implements ... {
    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
        	// 通过 startActivityForResult 启动 Activity
            startActivityForResult(intent, -1, options);
        } else {
            startActivityForResult(intent, -1);
        }
    }
	public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        // mParent 表示当前 Activity 的父 Activity,一般情况下 mParent 为空
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            if (ar != null) {
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            }
            if (requestCode >= 0) {
                mStartedActivity = true;
            }
            cancelInputsAndStartExitTransition(options);
        } else {
            if (options != null) {
                mParent.startActivityFromChild(this, intent, requestCode, options);
            } else {
                mParent.startActivityFromChild(this, intent, requestCode);
            }
        }
    }
}

        Activity # startActivity() 方法调用 Activity # startActivityForResult() 方法,Activity # startActivity() 第二个参数为-1表示 Launcher 不需要知道根 Activity 的启动结果。由于 mParent=null(mParent 表示当前 Activity 的父 Activity,一般情况下 mParent 为空),所以我们只需要关注 mParent=null 的情况,此时会调用 Instrumentation # execStartActivity() 方法。

2.1.4 execStartActivity() 方法

        Instrumentation 负责调用 Activity 和 Application 的生命周期,每个 Activity 都持有 Instrumentation 对象的一个引用,但是整个进程只会存在一个 Instrumentation 对象。跟进去看看 Instrumentation # execStartActivity () 方法,代码如下:

@UnsupportedAppUsage
    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        ......
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            // 获取 ActivityTaskManagerService 的代理对象
            int result = ActivityTaskManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

        Instrumentation # execStartActivity() 方法会调用 ActivityTaskManager # getService() 方法来获取 ActivityTaskManagerService 的代理对象,然后调用这个代理对象的 startActivity() 方法。

    public static IActivityTaskManager getService() {
        return IActivityTaskManagerSingleton.get();
    }
    @UnsupportedAppUsage(trackingBug = 129726065)
    private static final Singleton IActivityTaskManagerSingleton =
            new Singleton() {
                @Override
                protected IActivityTaskManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                    return IActivityTaskManager.Stub.asInterface(b);
                }
            };

        在 Singleton 的 create() 方法中,获取 ActivityTaskManagerService 的引用,这是一个 IBinder 类型的引用,且 ActivityTaskManagerService 作为服务端处于 system_server 进程,与当前作为客户端的 Launcher 进程不在同一个进程。 所以这里方法返回的是 IActivityTaskManager.Stub 的代理对象,而 ActivityTaskManagerService 则是对应的实现类,继承了 IActivityTaskManager.Stub 并实现相应的方法,通过代理对象可以跨进程调用服务端 ActivityTaskManagerService 的方法。

2.2 ATMS 向 AMS 发送创建应用进程的过程

        system_server 进程中 startBootstrapServices() 方法启动系统引导服务,引导服务中启动了 ATMS(ActivityTaskManagerServici)、AMS 等服务,其中 ATMS 是 Android 10 中新增的,本来都是 AMS 来管理,Google 考虑到 AMS 职责太多、代码太庞大,所以单独拆出来 ATMS 用于管理 Activity及其容器类,如 Task、Stack、Display 等,分担 AMS 部分职责。

 

2.2.1 时序图

Android Activity启动过程详解 第2张

2.2.2 ATMS(ActivityTaskManagerService)

通过上面的分析,启动过程走到了 ATMS 中,调用 ATMS # startActivity() 方法,代码如下:

    @Override
    public final int startActivity(IApplicationThread caller, String callingPackage,
            String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
            String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
            Bundle bOptions) {
        // UserHandle.getCallingUserId() 方法会获取调用者的 UserId
        return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
                resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }
    
    @Override
    public int startActivityAsUser(IApplicationThread caller, String callingPackage,
            String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
            String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
            Bundle bOptions, int userId) {
        return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
                resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
                true /*validateIncomingUser*/);
    }
    
    private int startActivityAsUser(IApplicationThread caller, String callingPackage,
            @Nullable String callingFeatureId, Intent intent, String resolvedType,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
            ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
        assertPackageMatchesCallingUid(callingPackage);
        // 检查调用者的进程是否隔离,如果 isIsolated 则抛出 SecurityException 异常
        enforceNotIsolatedCaller("startActivityAsUser");
		// 检查调用者权限,ATMS 根据传入的 UserId 来确定调用者的权限
        userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
        // TODO: Switch to user app stacks here.
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setCallingFeatureId(callingFeatureId)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setUserId(userId)
                .execute();
    }
    
    // 获取 ActivityStartController
    ActivityStartController getActivityStartController() {
        return mActivityStartController;
    }

2.2.3 ActivityStartController

    /**
     * @return A starter to configure and execute starting an activity. It is valid until after
     *         {@link ActivityStarter#execute} is invoked. At that point, the starter should be
     *         considered invalid and no longer modified or used.
     */
    ActivityStarter obtainStarter(Intent intent, String reason) {
        return mFactory.obtain().setIntent(intent).setReason(reason);
    }

        获取 ActivityStarter 对象后通过 Builder 模式设置启动所需的各种参数值,然后执行启动 Activity。ActivityStarter 是 Android 7.0 中增加的,用来加载启动 Activity 的控制类。

2.2.4 ActivityStarter

class ActivityStarter {
	@VisibleForTesting
    interface Factory {
        // Sets the {@link ActivityStartController} to be passed to {@link ActivityStarter}.
        void setController(ActivityStartController controller);
        // 生成一个准备处理新启动请求的 ActivityStarter,ActivityStartController 持有这个实例对象
        ActivityStarter obtain();
        // Recycles a starter for reuse.
        void recycle(ActivityStarter starter);
    }
    
    // Default implementation of {@link StarterFactory}.
    static class DefaultFactory implements Factory {
        // 被激活的启动器的最大数
        private final int MAX_STARTER_COUNT = 3;
        private ActivityStartController mController;
        private ActivityTaskManagerService mService;
        private ActivityStackSupervisor mSupervisor;
        private ActivityStartInterceptor mInterceptor;
        private SynchronizedPool mStarterPool =
                new SynchronizedPool(MAX_STARTER_COUNT);
        DefaultFactory(ActivityTaskManagerService service,
                ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
            mService = service;
            mSupervisor = supervisor;
            mInterceptor = interceptor;
        }
        @Override
        public void setController(ActivityStartController controller) {
            mController = controller;
        }
        @Override
        public ActivityStarter obtain() {
            ActivityStarter starter = mStarterPool.acquire();
            if (starter == null) {
                starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
            }
            return starter;
        }
        @Override
        public void recycle(ActivityStarter starter) {
            starter.reset(true /* clearRequest*/);
            mStarterPool.release(starter);
        }
    }
    
    /**
     * Resolve necessary information according the request parameters provided earlier, and execute
     * the request which begin the journey of starting an activity.
     * @return The starter result.
     */
    int execute() {
        try {
            int res;
            synchronized (mService.mGlobalLock) {
                final boolean globalConfigWillChange = mRequest.globalConfig != null
                        && mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
                final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
                if (stack != null) {
                    stack.mConfigWillChange = globalConfigWillChange;
                }
                final long origId = Binder.clearCallingIdentity();
                res = resolveToHeavyWeightSwitcherIfNeeded();
                if (res != START_SUCCESS) {
                    return res;
                }
                // 继续调用 executeRequest() 方法
                res = executeRequest(mRequest);
                Binder.restoreCallingIdentity(origId);
                if (globalConfigWillChange) {
                    ......
                    mService.updateConfigurationLocked(mRequest.globalConfig, null, false);
                }
                // Notify ActivityMetricsLogger that the activity has launched.
                // ActivityMetricsLogger will then wait for the windows to be drawn and populate
                // WaitResult.
                mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,
                        mLastStartActivityRecord);
                return getExternalResult(mRequest.waitResult == null ? res
                        : waitForResult(res, mLastStartActivityRecord));
            }
        } finally {
            onExecutionComplete();
        }
    }
	
	private int executeRequest(Request request) {
		......
		// 创建 ActivityRecord,保存 Activity 的所有信息
	 	final ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
                callingPackage, callingFeatureId, intent, resolvedType, aInfo,
                mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode,
                request.componentSpecified, voiceSession != null, mSupervisor, checkedOptions,
                sourceRecord);
        mLastStartActivityRecord = r;
		......
        final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
        mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
                request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
                restrictedBgActivity, intentGrants);
		......
        return mLastStartActivityResult;
    }
    
    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
                IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
                int startFlags, boolean doResume, ActivityOptions options, Task inTask,
                boolean restrictedBgActivity, NeededUriGrants intentGrants) {
        int result = START_CANCELED;
        try {
            mService.deferWindowLayout();
            result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
        } 
        ......
        return result;
    }
    
    @VisibleForTesting
    int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, Task inTask,
            boolean restrictedBgActivity, NeededUriGrants intentGrants) {
        ......
        if (mDoResume) {
            final ActivityRecord topTaskActivity =
                    mStartActivity.getTask().topRunningActivityLocked();
            if (!mTargetStack.isTopActivityFocusable()
                    || (topTaskActivity != null && topTaskActivity.isTaskOverlay()
                    && mStartActivity != topTaskActivity)) {
				......
                mTargetStack.ensureActivitiesVisible(null /* starting */,
                        0 /* configChanges */, !PRESERVE_WINDOWS);
                // Go ahead and tell window manager to execute app transition for this activity
                // since the app transition will not be triggered through the resume channel.
                mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
            } else {
                ......
                mRootWindowContainer.resumeFocusedStacksTopActivities(
                        mTargetStack, mStartActivity, mOptions);
            }
        }
    }
}

        在上面的第一步中获取 ActivityStartController,调用其 obtainStarter() 方法,通过内部实现的 DefaultFactory 来获取 ActivityStarter,如果在 mStarterPool 中没有获取到,则新创建一个。

        上面介绍了 ActivityStarter 类是用来加载启动 Activity 的控制类,在ActivityStarter # execute() 方法中,会继续调用 ActivityStarter # executeRequest() 方法,这里会处理启动 Activity 的请求,并开始一个 Activity 启动的流程。

        ActivityStarter # executeRequest() 方法会进行初步的检查并且确认权限,并且在这里组装对应 Activity 的 ActivityRecord,其包含了对应 Activity 的所有信息,并储存在任务栈 TaskRecord 中。在 Activity 的启动过程中,Activity 都是通过 ActivityRecord 来表示的。然后继续调用 ActivityStarter # startActivityUnchecked() 方法,接着 ActivityStarter # startActivityUnchecked() 方法会调用 ActivityStarter # startActivityInner() 方法。

        在 ActivityStarter # startActivityInner() 方法中,主要就是处理 Activity 的启动模式有关的逻辑,并且在 ActivityStack 中处理对应 Activity 在任务栈中的相关事宜,包括但不限于将对应的 ActivityRecord 添加到 TaskRecord 栈中、将对应的 ActivityRecord 提到 TaskRecord 栈中最顶部。

        最后调用 RootWindowContainer # resumeFocusedStacksTopActivities() 方法,将启动流程交给 RootWindowContainer 处理。

2.2.5 RootWindowContainer

boolean resumeFocusedStacksTopActivities(
            ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
        ......
        boolean result = false;
        if (targetStack != null && (targetStack.isTopStackInDisplayArea()
                || getTopDisplayFocusedStack() == targetStack)) {
            result = targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
        }
        for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
            boolean resumedOnDisplay = false;
            ......
            if (!resumedOnDisplay) {
                // In cases when there are no valid activities (e.g. device just booted or launcher
                // crashed) it's possible that nothing was resumed on a display. Requesting resume
                // of top activity in focused stack explicitly will make sure that at least home
                // activity is started and resumed, and no recursion occurs.
                final ActivityStack focusedStack = display.getFocusedStack();
                if (focusedStack != null) {
                    result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);
                } else if (targetStack == null) {
                    result |= resumeHomeActivity(null /* prev */, "no-focusable-task",
                            display.getDefaultTaskDisplayArea());
                }
            }
        }
        return result;
    }

        RootWindowContainer 是窗口容器(WindowContainer)的根容器,管理所有的窗口容器,设备上所有的窗口(Window)、显示(Display)都是由它来管理的。

        RootWindowContainer # resumeFocusedStacksTopActivities() 方法会恢复对应任务栈顶部的 Activity,方法中会检查一些可见性相关的属性,后转交给 ActivityStack # resumeTopActivityUncheckedLocked() 方法来继续启动流程。

2.2.6 ActivityStack

    @GuardedBy("mService")
    boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
        if (mInResumeTopActivity) {
            // Don't even start recursing.
            return false;
        }
        boolean result = false;
        try {
            // Protect against recursion.
            mInResumeTopActivity = true;
            result = resumeTopActivityInnerLocked(prev, options);
            // When resuming the top activity, it may be necessary to pause the top activity (for
            // example, returning to the lock screen. We suppress the normal pause logic in
            // {@link #resumeTopActivityUncheckedLocked}, since the top activity is resumed at the
            // end. We call the {@link ActivityStackSupervisor#checkReadyForSleepLocked} again here
            // to ensure any necessary pause logic occurs. In the case where the Activity will be
            // shown regardless of the lock screen, the call to
            // {@link ActivityStackSupervisor#checkReadyForSleepLocked} is skipped.
            final ActivityRecord next = topRunningActivity(true /* focusableOnly */);
            if (next == null || !next.canTurnScreenOn()) {
                checkReadyForSleep();
            }
        } finally {
            mInResumeTopActivity = false;
        }
        return result;
    }
    @GuardedBy("mService")
    private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {
		if (next.attachedToProcess()) {
			......
            ActivityRecord lastResumedActivity =
                    lastFocusedStack == null ? null : lastFocusedStack.mResumedActivity;
            final ActivityState lastState = next.getState();
            next.setState(RESUMED, "resumeTopActivityInnerLocked");
            next.app.updateProcessInfo(false /* updateServiceConnectionActivities */,
                    true /* activityChange */, true /* updateOomAdj */,
                    true /* addPendingTopUid */);
            // From this point on, if something goes wrong there is no way
            // to recover the activity.
            try {
                next.completeResumeLocked();
            } catch (Exception e) {
                ......
                mStackSupervisor.startSpecificActivity(next, true, false);
                return true;
            }
        } else {
            // Whoops, need to restart this activity!
            ......
        }
        return true;
	}

        ActivityStack 是一个管理类,用来管理系统所有 Activity 的各种状态,其内部维护了 TaskRecord 的列表,每个 TaskRecord 又包含了若干个 ActivityRecord,每个 ActivityRecord 对应了一个 Activity。这里 TaskRecord 相当于在启动模式中的“任务栈”,根据启动模式的不同,在启动 Activity 的时候,会对 TaskRecord 进行不同的操作

        由于前一步已经将对应 Activity 的 ActivityRecord 添加到了栈顶,所以 ActivityStack # resumeTopActivityUncheckedLocked() 方法恢复的就是将启动的栈顶 Activity,然后继续调用 ActivityStack # resumeTopActivityInnerLocked() 方法来继续启动流程,该方法中做了一系列判断,确保待启动 Activity 可见性、预定 Activity 的切换动画等。后转交给 ActivityStackSupervisor # startSpecificActivity() 方法来启动栈顶特定的 Activity。

2.2.7 ActivityStackSupervisor

    void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
        // Is this activity's application already running?
        // 获取即将要启动的 Activity 的所在的应用程序进程已经运行了吗?
        final WindowProcessController wpc =
                mService.getProcessController(r.processName, r.info.applicationInfo.uid);
        boolean knownToBeDead = false;
        // wpc.hasThread() 内部通过判断 IApplicationThread 是否被赋值,如果已赋值,即应用进程已运行
        // 启动 Activity 的应用程序进程已经创建运行则走 Activity 的生命周期
		// 即普通 Activity 的启动走 realStartActivityLocked() 方法继续 Activity 的创建
        if (wpc != null && wpc.hasThread()) {
            try {
                realStartActivityLocked(r, wpc, andResume, checkConfig);
                return;
            } catch (RemoteException e) {
                ......
            }
            // If a dead object exception was thrown -- fall through to
            // restart the application.
            knownToBeDead = true;
        }
        r.notifyUnknownVisibilityLaunchedForKeyguardTransition();
        final boolean isTop = andResume && r.isTopRunningActivity();
        // 如果未赋值,即应用进程还不存在,则需要创建应用进程,由于是根 Activity 的启动所以应用进程还未被创建并启动
        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
    }

        ActivityStackSupervisor 是用来辅助 ATMS 对 Activity 和 Task 进行管理的,其中 ActivityStackSupervisor 是对 ActivityStack 进行管理的,用 ActivityStack 对 Acitivity 进行状态管理。

        ActivityStackSupervisor 内部管理了 mHomeStack、mFocusedStack 和 mLastFocusedStack 三个 ActivityStack:

    1,mHomeStack 管理的是 Launcher 相关的 Activity 栈,stackId为0。

    2,mFocusedStack 管理的是当前显示在前台 Activity 的 Activity 栈。

    3,mLastFocusedStack 管理的是上一次显示在前台 Activity 的 Activity 栈。

        ActivityStackSupervisor # startSpecificActivity() 方法中获取 WindowProcessController ,通过 wpc # hasThread() 方法判断应用进程是否已创建并运行中,其内部是通过 IApplicationThread 是否已经被赋值来判断的,如果已被赋值则表示应用进程已创建且运行中,此时进入判断体内部,走 ActivityStackSupervisor # realStartActivityLocked() 方法继续 Activity 的启动流程,即普通 Activity 的启动流程。如果未被赋值,则需要创建应用进程,这里由于是根 Activity 的启动所以应用进程还未被创建并启动。

2.3 AMS 向 Zygote 进程发送创建应用进程 ActivityThread 的过程

2.3.1 时序图
Android Activity启动过程详解 第3张

2.3.2 ActivityTaskManagerService 启动进程

    void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
            String hostingType) {
        try {
            if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
                Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "dispatchingStartProcess:"
                        + activity.processName);
            }
            // Post message to start process to avoid possible deadlock of calling into AMS with the
            // ATMS lock held.
            // 发送 Handler 消息来启动进程,以避免在持有 ATMS 锁的情况下调用 AMS 时可能发生的***锁
            final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
                    mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
                    isTop, hostingType, activity.intent.getComponent());
            mH.sendMessage(m);
        } finally {
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
        }
    }

        方法中需要发送 Handler 消息来启动进程,在获取 Message 消息对象时跟我们平时的使用方式不太一样,这里是用到 PooledLambda # obtainMessage() 函数,代码如下:

    static  Message obtainMessage(
            HexConsumer

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]