App创建后MainActivity加载到界面

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

Q:\SPRO_14_SYS\SPRDROID14_SYS_MAIN_W2x.xx.x\idh.code\frameworks\base\core\java\android\app\Activity.java

Activity的attach应该做的是window相关的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值