Proceso de inicio del sistema Android ----- proceso de inicio de actividad

Prefacio

Para los desarrolladores de aplicaciones de alto nivel, muchas personas solo saben que la actividad comienza desde ActivityThread y no conocen el proceso de llamada específico de los marcos. Hoy lo explicaremos detalladamente empezando por hacer clic en el icono del iniciador.
Insertar descripción de la imagen aquí
actividad:
startActivity–> startActivityForResult–>mParent.startActivityFromChild–>
(ven a Instrumentación) mInstrumentation.execStartActivity–>ActivityManager.getService().startActivity–> (ven a windowmanagerService)
windowmanagerService.startActivity–>

1.frameworks/base/core/java/android/app/Activity.java

Haga clic en el ícono de la aplicación desde luancher y eventualmente llegará a startActivity de la actividad. Después de una serie de llamadas al método: startActivity–> startActivityForResult–>mParent.startActivityFromChild–>mInstrumentation.execStartActivity

2.frameworks/base/core/java/android/app/Instrumentation.java

Instrumentation.execStartActivity obtendrá la clase de proxy de carpeta ServiceManagerProxy de ServiceManager. Esta clase de proxy eventualmente llamará a startActivity en ActivityManagerService. En este punto, pasará del proceso de inicio al proceso system_Server try { intent.migrateExtraStreamToClipData()
; intent.prepareToLeaveProcess ( quién); int resultado = ActivityManager.getService() .startActivity(whoThread, quién.getBasePackageName(), intención, intención.resolveTypeIfNeeded(quién.getContentResolver()), token, objetivo!= nulo? objetivo.mEmbeddedID: nulo, requestCode, 0, nulo, opciones); checkStartActivityResult(resultado, intención); } catch (RemoteException e) { throw new RuntimeException(“Fallo del sistema”, e); }










3.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

ActivityManagerService primero verificará los permisos del usuario y si el proceso donde se encuentra la actividad está creado. De lo contrario, se creará un mensaje de socket para notificar al proceso cigoto que bifurque el proceso.
Después de que la bifurcación sea exitosa, inicie el método ActivityThread–>main del nuevo proceso lanzándolo.

4.frameworks/base/core/java/android/app/ActivityThread.java

En el método principal de ActivityThread, vincule ApplicationThread a ActivityManagerService a través de adjuntoApplication.
final IActivityManager mgr = ActivityManager.getService();
try { mgr.attachApplication(mAppThread); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); }



5.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public final void adjuntarApplication (hilo IApplicationThread) { sincronizado (esto) { int callPid = Binder.getCallingPid(); final long origId = Binder.clearCallingIdentity(); adjuntarApplicationLocked(hilo, llamandoPid); Binder.restoreCallingIdentity(origId); } } ActivityManagerService会调用attachApplicationLocked,改方法会通过thread.bindApplication初始化应用if (app.instr != null) { thread.bindApplication(processName, appInfo, proveedores, app.instr.mClass, perfilerInfo, app.instr.mArguments, app.instr.mWatcher, app.instr.mUiAutomationConnection, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation,















isRestrictedBackupMode || !normalMode, app.persistent,
nueva configuración (getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
} else { thread.bindApplication(processName, appInfo, proveedores, nulo, perfiladorInfo, nulo, nulo, nulo, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent, nueva configuración (getGlobalConfiguration()), app.compat , getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), buildSerial); } if (modo normal) { intentar {











if (mStackSupervisor.attachApplicationLocked(app)) { didSomething = true; } } catch (Exception e) { Slog.wtf(TAG, "Excepción lanzada al iniciar actividades en " + app, e); badApp = true; } } y pasa un Una serie de métodos llaman a mStackSupervisor.attachApplicationLocked–> realStartActivityLocked–>app.thread.scheduleLaunchActivity ScheduleLaunchActivity es para iniciar la actividad y se completa el inicio de la aplicación.









Supongo que te gusta

Origin blog.csdn.net/L779442863/article/details/124884739
Recomendado
Clasificación