android源码学习旅程

下图为安卓从开机到启动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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值