Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ActivityThread.java
public static void main(String[] args) {
......
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
......
thread.attach(false, startSeq);
......
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
Looper.loop();
......
}
//在创建ActivityThread时创建ApplicationThread 对象
final ApplicationThread mAppThread = new ApplicationThread();
private void attach(boolean system, long startSeq) {
.......
if (!system) {
//非systemserver进程
.......
//将Application转为binder,并注册到VM中
RuntimeInit.setApplicationObject(mAppThread.asBinder());
//获取AMS
final IActivityManager mgr = ActivityManager.getService();
//跨进程通信 Binder
//将进程的Appilication binder对象传递给AMS,这样AMS和app就可以通信
mgr.attachApplication(mAppThread, startSeq);
跨进程调用的AMS的attachApplication方法
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
@Override
public final void attachApplication(IApplicationThread thread, long startSeq) {
if (thread == null) {
throw new SecurityException("Invalid application interface");
}
synchronized (this) {
int callingPid = Binder.getCallingPid();
final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
attachApplicationLocked(thread, callingPid, callingUid, startSeq);
Binder.restoreCallingIdentity(origId);
}
}
@GuardedBy("this")
private void attachApplicationLocked(@NonNull IApplicationThread thread,
int pid, int callingUid, long startSeq) {
......
if (pid != MY_PID && pid >= 0) {
synchronized (mPidsSelfLocked) {
app = mPidsSelfLocked.get(pid);
}
if (app != null && (app.getStartUid() != callingUid || app.getStartSeq() != startSeq)) {
......
//清除之前该pid的Application记录
cleanUpApplicationRecordLocked(app, pid, false, false, -1,
true /*replacingPid*/, false /* fromBinderDied */);
removePidLocked(pid, app);
app = null;
......
}
......
if (app.getThread() != null) {
handleAppDiedLocked(app, pid, true, true, false /* fromBinderDied */);
}
......
final String processName = app.processName;
try {
//创建进程的AppDeathRecipient 对象
//进程有crash 等异常退出回回调
AppDeathRecipient adr = new AppDeathRecipient(
app, pid, thread);
thread.asBinder().linkToDeath(adr, 0);
app.setDeathRecipient(adr);
}
AppDeathRecipient定义在AMS中,实现了IBinder
private final class AppDeathRecipient implements IBinder.DeathRecipient
attachApplicationLocke方法:
//设置进程的一些参数
//adj
synchronized (mProcLock) {
app.mState.setCurAdj(ProcessList.INVALID_ADJ);
app.mState.setSetAdj(ProcessList.INVALID_ADJ);
app.mState.setVerifiedAdj(ProcessList.INVALID_ADJ);
mOomAdjuster.setAttachingSchedGroupLSP(app);
app.mState.setForcingToImportant(null);
clearProcessForegroundLocked(app);
app.mState.setHasShownUi(false);
app.mState.setCached(false);
app.setDebugging(false);
app.setKilledByAm(false);
app.setKilled(false);
// We carefully use the same state that PackageManager uses for
// filtering, since we use this flag to decide if we need to install
// providers when user is unlocked later
app.setUnlocked(StorageManager.isUserKeyUnlocked(app.userId));
}
......
ApplicationInfo appInfo = instr != null ? instr.mTargetInfo : app.info;
......
//调用app ApplicationThread的bindApplication
thread.bindApplication(processName, appInfo,
app.sdkSandboxClientAppVolumeUuid, app.sdkSandboxClientAppPackage,
providerList,
instr2.mClass,
profilerInfo, instr2.mArguments,
instr2.mWatcher,
instr2.mUiAutomationConnection, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.isPersistent(),
new Configuration(app.getWindowProcessController().getConfiguration()),
app.getCompat(), getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial, autofillOptions, contentCaptureOptions,
app.getDisabledCompatChanges(), serializedSystemFontMap,
app.getStartElapsedTime(), app.getStartUptime());
//调用ProcessRecord的makeActive
synchronized (mProcLock) {
app.makeActive(thread, mProcessStats);
}
//更新Lru列表
updateLruProcessLocked(app, false, null);
回到ActivityThread
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ActivityThread.java
private class ApplicationThread extends IApplicationThread.Stub
@Override
public final void bindApplication(....){
......
AppBindData data = new AppBindData();
......
//data数据赋值
......
sendMessage(H.BIND_APPLICATION, data);
}
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case BIND_APPLICATION:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;

@UnsupportedAppUsage
private void handleBindApplication(AppBindData data) {
.......
//设置一个VM的进程包名
VMRuntime.setProcessPackageName(data.appInfo.packageName);
.......
//设置下时区
TimeZone.setDefault(null);
.......
//一大堆属性check
//允许抓取binder信息,用于后面抓取systrace
boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
boolean isAppProfileable = isAppDebuggable || data.appInfo.isProfileable();
Trace.setAppTracingAllowed(isAppProfileable);
if ((isAppProfileable || Build.IS_DEBUGGABLE) && data.enableBinderTracking) {
Binder.enableStackTracking();
}
.......
//创建app的ContextImpl对象
final IActivityManager mgr = ActivityManager.getService();
final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
mConfigurationController.updateLocaleListFromAppContext(appContext);
.......
//Instrumentation 类主要用来监控应用程序与系统交互
// Continue loading instrumentation.
if (ii != null) {
initInstrumentation(ii, data, appContext);
} else {
mInstrumentation = new Instrumentation();
mInstrumentation.basicInit(this);
}
}
.......
//构造Application
Application app;
//通过反射去创建Application
app = data.info.makeApplicationInner(data.restrictedBackupMode, null);
try {
mInstrumentation.onCreate(data.instrumentationArgs);
}
catch (Exception e) {
throw new RuntimeException(
"Exception thrown in onCreate() of "
+ data.instrumentationName + ": " + e.toString(), e);
}
try {
mInstrumentation.callApplicationOnCreate(app);
CheckTime.checkTime(startTime, "handleBindApplication : callApplicationOnCreate");
} catch (Exception e) {
if (!mInstrumentation.onException(app, e)) {
throw new RuntimeException(
"Unable to create application " + app.getClass().getName()
+ ": " + e.toString(), e);
}
}
AppBindData 是ActivityThread的静态内部类
static final class AppBindData {
@UnsupportedAppUsage
AppBindData() {
}
@UnsupportedAppUsage
LoadedApk info;
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\LoadedApk.java
public Application makeApplicationInner(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
return makeApplicationInner(forceDefaultAppClass, instrumentation,
/* allowDuplicateInstances= */ false);
}
private Application makeApplicationInner(boolean forceDefaultAppClass,
Instrumentation instrumentation, boolean allowDuplicateInstances) {
......
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
appContext.setOuterContext(app);
......
instrumentation.callApplicationOnCreate(app);
......
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
回到AMS中
attachApplicationLocked执行完app ApplicationThread的bindApplication
thread.bindApplication
然后继续去创建第一个Activity
finishAttachApplicationInner(startSeq, callingUid, pid);
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
private void finishAttachApplicationInner(long startSeq, int uid, int pid) {
......
//创建Activity流程
if (normalMode) {
try {
didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
}
}
......
//service Broadcast拉起
didSomething |= mServices.attachApplicationLocked(app, processName);
for (BroadcastQueue queue : mBroadcastQueues) {
didSomething |= queue.onApplicationAttachedLocked(app);
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerInternal.java
mAtmInternal是ActivityTaskManagerInternal 对象
/** Called by AM when an application process attaches. */
public abstract boolean attachApplication(WindowProcessController wpc) throws RemoteException;
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.java
LocalService是ActivityTaskManagerService的内部类,继承了ActivityTaskManagerInternal
final class LocalService extends ActivityTaskManagerInternal {
......
@Override
public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
synchronized (mGlobalLockWithoutBoost) {
if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "attachApplication:" + wpc.mName);
}
try {
return mRootWindowContainer.attachApplication(wpc);
} finally {
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
}
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\wm\RootWindowContainer.java
boolean attachApplication(WindowProcessController app) throws RemoteException {
try {
return mAttachApplicationHelper.process(app);
} finally {
mAttachApplicationHelper.reset();
}
}
调用到内部类
private class AttachApplicationHelper implements Consumer<Task>, Predicate<ActivityRecord> {
boolean process(WindowProcessController app) throws RemoteException {
mApp = app;
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
//调用到Task.java
getChildAt(displayNdx).forAllRootTasks(this);
if (mRemoteException != null) {
throw mRemoteException;
}
}
if (!mHasActivityStarted) {
ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
false /* preserveWindows */);
}
return mHasActivityStarted;
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\wm\Task.java
@Override
boolean forAllRootTasks(Predicate<Task> callback, boolean traverseTopToBottom) {
return isRootTask() ? callback.test(this) : false;
}
回调回来AttachApplicationHelper的test方法
@Override
public boolean test(ActivityRecord r) {
......
if (mTaskSupervisor.realStartActivityLocked(r, mApp,
mTop == r && r.getTask().canBeResumed(r) /* andResume */,
true /* checkConfig */)) {
mHasActivityStarted = true;
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\services\core\java\com\android\server\wm\ActivityTaskSupervisor.java
boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
boolean andResume, boolean checkConfig) throws RemoteException {
........
//判断进程是否launcher过Activity
//通过ATMS获取Activity task client对象
final IActivityClientController activityClientController =
proc.hasEverLaunchedActivity() ? null : mService.mActivityClientController;
......
final Configuration procConfig = proc.prepareConfigurationForLaunchingActivity();
......
// Create activity launch transaction.
//创建管理进程一切事物的对象
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.token);
//获取要启动的activity的Intent信息,并加入到clientTransaction对象中
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
.........);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\servertransaction\ClientTransaction.java
public void schedule() throws RemoteException {
if (mClient != null) {
mClient.scheduleTransaction(this);
}
}
/** Target client. */
private IApplicationThread mClient;
回到进程的ActivityThread
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ActivityThread.java
ApplicationThread是ActivityThread的内部类对象
private class ApplicationThread extends IApplicationThread.Stub
@Override
public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
ActivityThread.this.scheduleTransaction(transaction);
}
最终还是调用到了ActivityThread的scheduleTransaction方法
调用到ActivityThread的父类ClientTransactionHandler的scheduleTransaction方法
(以后注意在该类找不到方法的时候,找一下继承的父类,看下是否直接调用了父类的方法)
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ClientTransactionHandler.java
/** Prepare and schedule transaction for execution. */
void scheduleTransaction(ClientTransaction transaction) {
transaction.preExecute(this);
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
//发送Message到主线程,等待中线程处理
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ActivityThread.java
public void handleMessage(Message msg) {
//接收到Message
case EXECUTE_TRANSACTION:
final ClientTransaction transaction = (ClientTransaction) msg.obj;
mTransactionExecutor.execute(transaction);
private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\servertransaction\TransactionExecutor.java
public void execute(ClientTransaction transaction) {
.......
executeCallbacks(transaction);
executeLifecycleState(transaction);
}
public void executeCallbacks(ClientTransaction transaction) {
final int size = callbacks.size();
for (int i = 0; i < size; ++i) {
item.execute(mTransactionHandler, token, mPendingActions);
item.postExecute(mTransactionHandler, token, mPendingActions);
if (r == null) {
// Launch activity request will create an activity record.
r = mTransactionHandler.getActivityClient(token);
}
....}
item.execute 实际上调用的是LaunchActivityItem的execute方法
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\servertransaction\LaunchActivityItem.java
@Override
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
........
client.handleLaunchActivity(r, pendingActions, mDeviceId, null /* customIntent */);
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\ActivityThread.java
回到ActivityThread的handleLaunchActivity方法
ActivityThread类继承自ClientTransactionHandler
public final class ActivityThread extends ClientTransactionHandler
implements ActivityThreadInternal {
@Override
public Activity handleLaunchActivity(ActivityClientRecord r,
PendingTransactionActions pendingActions, int deviceId, Intent customIntent) {
.......
final Activity a = performLaunchActivity(r, customIntent);
}
/** Core implementation of activity launch. */
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
.........
//获取intent携带的信息,要启动的Activity的信息
ComponentName component = r.intent.getComponent();
ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null;
.......
//通过ClassLoader去反射创建要启动的Activity对象
java.lang.ClassLoader cl = appContext.getClassLoader();
long startTime = CheckTime.getTime();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
........
//创建Application对象
Application app = r.packageInfo.makeApplicationInner(false, mInstrumentation);
//调用此Activity的attach方法
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.activityConfigCallback,
r.assistToken, r.shareableActivityToken);
........
//调用Activity的onCreate方法
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
Activity的attach应该做的是window相关的操作
755

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



