下图为安卓从开机到启动APP过程的思维导图:
一、APP启动流程原理
1.\system\core\init.cpp文件中 引用了\system\core\rootdir\ init.rc文件。
init_parse_config_file("/init.rc");
2.init.rc文件中开启了Zygote进程。
import /init.${ro.zygote}.rc
onrestart restart zygote
3.Zygote进程开启SystemServer进程——负责进程间通信;
SystemServer会开发Binder线程池,为管理其他进程会开启SystemServiceManager。
4.这三个——Zygote、SystemServer、SystemServiceManager会开启一些服务——AMS、WMS、PMS…
5.AMS开启桌面应用程序——Launcher。
- 5.1 首先是onCLick 监听页面点击事件
- 5.2 其次执行startActivitySafely方法—>在方法中执行startActivity
- 5.3 在startActivity中执行冷启动(内存中还不存在Activity 相关信息的时候,冷启动通过mInstrumentation与AMS
进行交互,其作用是初始化APP信息/内训数据)和热启动(使用Binder申请冷启动后初始化后的数据) 他们最终都会和AMS进行交互。 - 5.4 如果是冷启动 会走Zygote进程 fork()出一个ActivityThread.java
二、WMS和PMS底层原理
1.怎么开启的zygote进程?
首先开启Linux内核:
BootLoader-----》
Kernel进程
然后是安卓进程:
init进程/文件系统挂载/设备初始化服务-----解析init.rc----解析init.zygote64_32.rc----》
//init进程实际上开启的是app_process进程
// 给app_process改名为zygote
static const char ZYGOTE_NICE_NAME[] = “zygote64”;
niceName = ZYGOTE_NICE_NAME;
…
if (!niceName.isEmpty()) {
runtime.setArgv0(niceName.string(), true);
}
//启动zygote源码
if (zygote) {
runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote);
}
开启zygote进程----fork()----》
开启systemServer进程-----》
启动服务 (ActivityManagerService、PackageManagerService、WindowManagerService、PowerManagerService、AccountManagerService…)
2.为什么zygote进程要使用socket,而不使用binder?
binder不安全
ZygoteServer(boolean isPrimaryZygote) {
mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
if (isPrimaryZygote) {
mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
mUsapPoolSocket =
Zygote.createManagedSocketFromInitSocket(
Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
} else {
mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
mUsapPoolSocket =
Zygote.createManagedSocketFromInitSocket(
Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
}
mUsapPoolSupported = true;
fetchUsapPoolPolicyProps();
3.关于systemServer 和 systemServerManager
3.1systemServer 开启android所有服务;
frameworks/base/services/java/com/android/server/SystemServer.java
/**
411 * The main entry point from zygote.
412 */
413 public static void main(String[] args) {
414 new SystemServer().run();
415 }
private void run() {
...
// Start services.
594 try {
595 t.traceBegin("StartServices");
596 startBootstrapServices(t);//引导服务(AMS等)
597 startCoreServices(t);//核心服务
598 startOtherServices(t);//其他服务
599 } catch (Throwable ex) {
600 Slog.e("System", "******************************************");
601 Slog.e("System", "************ Failure starting system services", ex);
602 throw ex;
603 } finally {
604 t.traceEnd(); // StartServices
605 }
}
//开启AMS服务
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
// Activity manager runs the show.
762 t.traceBegin("StartActivityManager");
763 // TODO: Might need to move after migration to WM.
764 ActivityTaskManagerService atm = mSystemServiceManager.startService(
765 ActivityTaskManagerService.Lifecycle.class).getService();
766 mActivityManagerService = ActivityManagerService.Lifecycle.startService(
767 mSystemServiceManager, atm);
768 mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
769 mActivityManagerService.setInstaller(installer);
770 mWindowManagerGlobalLock = atm.getGlobalLock();
771 t.traceEnd();
//开启PMS服务
t.traceBegin("StartPackageManagerService");
855 try {
856 Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
857 mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
858 mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
859 } finally {
860 Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
861 }
862
863 // Now that the package manager has started, register the dex load reporter to capture any
864 // dex files loaded by system server.
865 // These dex files will be optimized by the BackgroundDexOptService.
866 SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);
867
868 mFirstBoot = mPackageManagerService.isFirstBoot();
869 mPackageManager = mSystemContext.getPackageManager();
870 t.traceEnd();
871 if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
872 FrameworkStatsLog.write(FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED,
873 FrameworkStatsLog
874 .BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__PACKAGE_MANAGER_INIT_READY,
875 SystemClock.elapsedRealtime());
876 }
877 // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename
878 // A/B artifacts after boot, before anything else might touch/need them.
879 // Note: this isn't needed during decryption (we don't have /data anyways).
880 if (!mOnlyCore) {
881 boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
882 false);
883 if (!disableOtaDexopt) {
884 t.traceBegin("StartOtaDexOptService");
885 try {
886 Watchdog.getInstance().pauseWatchingCurrentThread("moveab");
887 OtaDexoptService.main(mSystemContext, mPackageManagerService);
888 } catch (Throwable e) {
889 reportWtf("starting OtaDexOptService", e);
890 } finally {
891 Watchdog.getInstance().resumeWatchingCurrentThread("moveab");
892 t.traceEnd();
893 }
894 }
895 }
3.2 systemServerManager 管理所有服务并通信;
Handler
1.进程通信:
Android中进程间通信采用的是binder
Android中APP间通信采用的是handler
Linux层中zygote和systemService通信采用的是socket