Processus de démarrage du système Android ----- processus de démarrage de l'activité

Préface

Pour les développeurs d'applications de haut niveau, de nombreuses personnes savent uniquement que l'activité commence à partir d'ActivityThread et ne connaissent pas le processus d'appel spécifique des frameworks. Aujourd'hui, nous allons l'expliquer en détail en commençant par cliquer sur l'icône du lanceur.
Insérer la description de l'image ici
activité :
startActivity–> startActivityForResult–>mParent.startActivityFromChild–>
(accéder à Instrumentation) mInstrumentation.execStartActivity–>ActivityManager.getService().startActivity–> (accéder à windowmanagerService)
windowmanagerService.startActivity–>

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

Cliquez sur l'icône de l'application depuis Luancher et vous arriverez éventuellement au startActivity de l'activité. Après une série d'appels de méthode : startActivity–> startActivityForResult–>mParent.startActivityFromChild–>mInstrumentation.execStartActivity

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

Instrumentation.execStartActivity obtiendra la classe proxy de classeur ServiceManagerProxy de ServiceManager. Cette classe proxy appellera éventuellement startActivity dans ActivityManagerService. À ce stade, elle viendra du processus de lancement vers le processus system_Server try { intent.migrateExtraStreamToClipData()
; intent.prepareToLeaveProcess ( who); int résultat = ActivityManager.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("Échec du système", e); }










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

ActivityManagerService vérifiera d'abord les autorisations de l'utilisateur et si le processus dans lequel se trouve l'activité est créé. Sinon, un message de socket sera créé pour informer le processus zygote de bifurquer le processus.
Une fois le fork réussi, démarrez la méthode ActivityThread -> main du nouveau processus en le lançant.

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

Dans la méthode principale d'activityThread, liez ApplicationThread à ActivityManagerService via attachApplication.
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 attachApplication (thread IApplicationThread) { synchronisé (this) { int callingPid = Binder.getCallingPid (); final long origId = Binder.clearCallingIdentity(); attachApplicationLocked (thread, appelantPid); Binder.restoreCallingIdentity(origId); } } ActivityManagerService avec attachApplicationLocked et thread.bindApplication avec if (app.instr ! = null) { thread.bindApplication (processName, appInfo, fournisseurs, app.instr.mClass, profilerInfo, app.instr.mArguments, app.instr.mWatcher, app.instr.mUiAutomationConnection, testMode, mBinderTransactionTrackingEnabled, activateTrackAllocation,















isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
} else { thread.bindApplication (processName, appInfo, fournisseurs, null, profilerInfo, null, null, null, testMode, mBinderTransactionTrackingEnabled, activateTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent, new Configuration(getGlobalConfiguration()), app.compat , getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), buildSerial); } if (normalMode) { essayer {











if (mStackSupervisor.attachApplicationLocked(app)) { didSomething = true; } } catch (Exception e) { Slog.wtf(TAG, "Exception throwing launching Activities in " + app, e); badApp = true; } } et transmettez un Une série de méthodes appellent mStackSupervisor.attachApplicationLocked–> realStartActivityLocked–>app.thread.scheduleLaunchActivity planningLaunchActivity consiste à démarrer l'activité et le démarrage de l'application est terminé.









Je suppose que tu aimes

Origine blog.csdn.net/L779442863/article/details/124884739
conseillé
Classement