首页 > 其他分享 >Android Framework层——App启动过程浅析

Android Framework层——App启动过程浅析

时间:2023-06-19 15:00:48浏览次数:57  
标签:App args server Framework 进程 AMS 浅析 ApplicationThread


1. 关于Android系统的启动

系统的启动过程非常复杂,这里只是简单的了解。 先上谷歌提供的架构分层图⬇

Android Framework层——App启动过程浅析_程序人生

** 引导程序BootLoader进行初始化Linux内核->启动init进程->init进程fork出zygote进程(处于c++ framework层)->zygote进程fork出system_server进程(处于java framework层) **

  • system_server进程负责启动和管理整个java framwork层包含ActivityManagerService、PackageManagerService、WindowManagerService等服务
    service的本质是Binder我们可以看ActivityManagerService的实现,是继承了Binder的子类Stub
public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {}
  • Zygote进程fork出的APP层的第一个进程是Launch进程,就是用户看到的桌面
  • 所有的app进程都是由zygote进程fork的

2. APP的启动过程

  • 当点击桌面app时,launch进程中的startActvity方法通过binder通信调用system_server进程管理的AMS中的startActivity,而AMS又继续调用ATMS(# ActivityTaskManagerService)的StartActivity方法进行真正的启动.
  • system_server进程收到消息后向Zygote进程发送创建进程的请求(通过socket通信)
  • Zygote进程fork出app进程,并执行ActivityThread的main方法
源码基于android API 31
public static void main(String[] args) {
    //安装sysCall Native与Kernel之间有一层系统调用(SysCall)层
    AndroidOs.install();
    CloseGuard.setEnabled(false);
    Environment.initForCurrentUser();
    //获取用户空间的配置文件
    final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
    TrustedCertificateStore.setDefaultUserDirectory(configDir);
    //初始化每个进程(MediaServiceManager,TelphoneServiceManager) 
    initializeMainlineModules();
    //初始化主线程looper
    Looper.prepareMainLooper();

    long startSeq = 0;
    if (args != null) {
        for (int i = args.length - 1; i >= 0; --i) {
            if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                startSeq = Long.parseLong(
                        args[i].substring(PROC_START_SEQ_IDENT.length()));
            }
        }
    }
    //真正的主角
    ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);

    if (sMainThreadHandler == null) {
        sMainThreadHandler = thread.getHandler();
    }

    if (false) {
        Looper.myLooper().setMessageLogging(new
                LogPrinter(Log.DEBUG, "ActivityThread"));
    }
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}
  • 从main方法中可以看到创建ActivityThread之后调用了thread.attach(false, startSeq)方法,并同时初始化ApplicationThread用于和AMS通信
  • App进程,通过Binder向sytem_server进程发起attachApplication请求,这里实际上就是APP进程通过Binder调用sytem_server进程中AMS的attachApplication方法,AMS的attachApplication方法的作用是将ApplicationThread对象与AMS绑定
  • system_server进程在收到attachApplication的请求,进行一些准备工作后,再通过binder IPC向App进程发送handleBindApplication请求(初始化Application并调用onCreate方法)和scheduleLaunchActivity请求(创建启动Activity)
  • App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送BIND_APPLICATION和LAUNCH_ACTIVITY消息,这里注意的是AMS和主线程并不直接通信,而是AMS和主线程的内部类ApplicationThread通过Binder通信,ApplicationThread再和主线程通过Handler消息交互。
  • 主线程在收到Message后,创建Application并调用onCreate方法,再通过反射机制创建目标Activity,并回调Activity.onCreate()等方法
  • 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染后显示APP主界面


标签:App,args,server,Framework,进程,AMS,浅析,ApplicationThread
From: https://blog.51cto.com/u_16163442/6513910

相关文章

  • app直播源代码,JS生成随机数,生成指定位数的随机数
    app直播源代码,JS生成随机数,生成指定位数的随机数<html><script> //获取指定位数的随机数 functiongetRandom(num){  letrandom=Math.floor((Math.random()+Math.floor(Math.random()*9+1))*Math.pow(10,num-1)); } //调用随机数函数生成10位数的随机......
  • uniapp封装接口
    1.创建一个config文件夹,在里面创建app.jslethttpApi=''//接口公共部分module.exports={//要传的请求头token等HTTP_REQUEST_URL:httpApi,HEADER:{Headers,Authorization:'token','i-branch':'zh'},//......
  • Android开发卷吗?卷;怎么破?从Framework提升自己——字节总监
    前言现在客户端卷的风起云涌,很多安卓开发者都是抱怨连天。内卷之下,相比本来就堪忧的发量,前途未卜的迷茫带来的精神折磨更是雪上加霜。其实平心而论,很多开发者对现有知识都掌握的不够扎实,例如Framework。对于大部分的开发者来说,AndroidFrameWork都无法做到精通,更别提触类旁通了。想......
  • 陪玩圈子系统APP小程序H5,内容了解。
    服务器配置为2G4核带宽2M,此配置为腾讯新客户低价配置。价格便宜,多数用户起步阶段均购买此配置。点击咨询完整陪玩系统ab-n100-c10100并发访问10次我想用小程序访问可以不?答:UNIAPP可以打包成小程序,但小程序个人就不要考虑了。无法审核和申请类目。3、我想用公众号就是H5来......
  • 2023-06-19 uniapp云打包报错:app-plus.distribute.icons.android.hdpi 文件不存在
    详细报错:[HBuilder]11:02:51.408Manifest.json文件以下节点配置错误,请检查修复[HBuilder]11:02:51.408app-plus.distribute.icons.android.hdpi 文件不存在[HBuilder]11:02:51.408app-plus.distribute.icons.android.xxhdpi 文件不存在[HBuilder]11:02:51.408ap......
  • 大厂技术总监总结的Android Framework开发笔记火了!知乎已1.7k赞!不吃透都对不起他
    为什么要学AndroidFramework?想要成为一名优秀的Android开发,就需要有一个完备的知识体系,AndroidFramework的知识是很重要的一个组成部分,他广泛的应用在各个领域。像掉帧监控,函数插装,慢函数检测,ANR监控,启动监控,都需要对Framework有比较深入的了解。只有这样才能知道怎么去做监......
  • 得到、微信、美团、爱奇艺APP组件化架构实践
    一、背景随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍?改了一行代码或只调了一点UI,就要run整个项目,再忍受一次10分钟?合代码经常发生冲突?很烦?被人偷偷改了自己模块的代......
  • 我快被Framework源码烦死了
    前言这段时间,忙到没时间学新东西,都有点心有余而力不足,想着抽空补补课,于是重读了Framework源码。因为Framework源码太重要了,像掉帧监控、函数插装、慢函数检测、ANR监控、启动监控等,都需要对Framework有比较深入的了解,才能知道怎么去做监控,利用什么机制去监控,函数插桩插到哪里,反......
  • Welcome To Learn Dapper
    WelcomeToLearnDapperThissiteisfordeveloperswhowanttolearnhowtouseDapper-ThemicroORMcreatedbythepeoplebehind StackOverflow.WhatisDapper? Dapperisanopen-sourceobject-relationalmapping(ORM)libraryfor.NETand.NETCore......
  • Appium的三种等待机制
    appium三种等待方式:  (1)强制等待  (2)隐式等待  (3)显式等待 三种等待方式之间的区别: 1、强制等待使用方式:time.sleep()强制执行对应的等待时间后,才能执行下面的操作语句,影响脚本运行的速度,一般不推荐 2、隐式等待使用方式:driver.imolicitly_wait()相对于强制......