本文基于Android12 master分支源码分析。
调用链在更新安卓版本后就不一样了,所以没有记住它的必要。所以这篇文章一方面作为记录,另一方面也讲怎样在aosp中找到调用链。
如果你想跟着自己手动在AOSP中查调用链,需要fq访问codesearch网站
我们首先从startActivty开始,在AndroidStudio中不断地向上查调用链,这个过程在AndroidStudio中的源码就能查到,简单省略,最终能看到在Instrumentation.java中地这里,执行了启动方法.
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
...
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getOpPackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
}
调用到ServiceManager.getService方法获取一个IActivityTaskManager 对象执行startActivity方法。
旧版本Android中这个方法获取到的是ActivityManagerService,现已经重构为ActivityTaskManager。
interface IActivityTaskManager {
//包含startActivity方法
int startActivity(in IApplicationThread caller, in String callingPackage,
in String callingFeatureId, in Intent intent, in String resolvedType,
in IBinder resultTo, in String resultWho, int requestCode,
int flags, in ProfilerInfo profilerInfo, in Bundle options);}
------------------------------------------------
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);

本文详细分析了Android 12中Activity启动的源码调用链,从startActivity开始,经过Instrumentation、ActivityTaskManager、IActivityTaskManager接口、ActivityTaskManagerService、ApplicationThread等多个组件,最终到Activity的创建和启动。过程中涉及ServiceManager、Binder通信、反射等关键环节,揭示了Android系统启动Activity的内部机制。
最低0.47元/天 解锁文章
2440

被折叠的 条评论
为什么被折叠?



