Android Framework实战视频--SystemServer启动篇

Android高工必备:说说从手机开机到APP启动FrameWork层的整体执行流程 Android系统中的窗体是屏幕上的一块用于绘制各种UI元素并能够响应应用户输入的一个矩形区域,从原理上来讲,窗体的概念是独自占有一个Surface实例的显示区域,比如Dialog、Activity的界面、壁纸、状态栏以及Toast等都是窗体;从点击应用图标到Activity创建成功先看流程图://然后点击应用图标后,先检查要打卡的Activity是否存在//然后获取AMS的代理AMP–> new ActivityRecord对象,获取ActivityStack。 阅读详情
AI摘要

本文详细剖析了Android系统Server(SystemServer)的启动过程,从Zygote进程forkSystemServer开始,讲解了包括PathClassLoader的创建、ZygoteInit的zygoteInit方法调用、SystemServer的main方法执行,以及启动引导服务、核心服务和其它服务的流程。重点关注了ActivityManagerService的启动,并展示了SystemServer如何逐步初始化各个关键服务,为Android系统的运行奠定基础。

课程答疑和新课信息:QQ交流群:422901085进行课程讨论
FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298
FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275
专题博客系列:
Android 8.1 zygote 启动过程源码
Android Framework实战视频–Zygote的fork进程篇
Android Framework实战视频–SystemServer启动篇
Android Framework实战视频–SystemServer启动FallbackHome篇
Android Framework实战视频–FallbackHome进程启动及Activity启动篇
Android Framework实战视频–FallbackHome结束启动Launcher篇

SystemServer启动篇

上一讲已经讲了systemserver进程被fork出来了
代码在ZygoteInit的main方法中的:

Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

进入forkSystemServer方法后已经分析到:

   pid = Zygote.forkSystemServer

即在Zygote中又调用了forkSystemServer方法一直到native层才调用了真正的linux的 fork()
在Zygote.forkSystemServer返回后看代码如下:

 if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

由于SystemServer是复制Zygote的进程,因此也会包含Zygote的zygoteServer,对于SystemServer没有其他作用,需要先将其关闭;通过调用handleSystemServerProcess:

 private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {
     //省略。。
        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
        //省略。。

        if (parsedArgs.invokeWith != null) {
         //省略。。
        } else {
            ClassLoader cl = null;
            if (systemServerClasspath != null) {
             //创建PathClassLoader
                cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);

                Thread.currentThread().setContextClassLoader(cl);
            }

            /*
             * Pass the remaining arguments to SystemServer.
             */
            return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
        }

        /* should never reach here */
    }

这里创建PathClassLoader然后又调用ZygoteInit.zygoteInit

 public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
//省略
        RuntimeInit.commonInit();
        //启动一下binder线程池
        ZygoteInit.nativeZygoteInit();
        return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    }

这里先调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调到app_main.cpp的onZygoteInit,来启动binder线程池:

 virtual void onZygoteInit()
    {
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        proc->startThreadPool();
    }

接下来调用RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);

 protected static Runnable applicationInit(int targetSdkVersion, String[] argv,
            ClassLoader classLoader) {
       //省略
        return findStaticMain(args.startClass, args.startArgs, classLoader);
    }

applicationInit主要就是实现寻找startClass中的main方法,然后构造一个Runable,对应的run方法就是调用main方法:

private static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
      //省略
            cl = Class.forName(className, true, classLoader);
        //省略
            m = cl.getMethod("main", new Class[] { String[].class });
         //省略
        return new MethodAndArgsCaller(m, argv);
    }

其中MethodAndArgsCaller:

 static class MethodAndArgsCaller implements Runnable {
       //省略
        public void run() {
           //省略
                mMethod.invoke(null, new Object[] { mArgs });
            //省略
        }
    }

所以这里就是关键确定startClass是谁
这里又得回到开始ZygoteInit类的forkSystemServer:
有如下参数:

  String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "com.android.server.SystemServer",
        };

其实这里的statClass就是最后一个参数: “com.android.server.SystemServer”

以上过程完成了从Zygote经过RuntimeInit最后完成SystemServer的main方法的运行。下面重点分析SystemServer的main方法:

public static void main(String[] args) {
        new SystemServer().run();
    }

直接调用run方法:

private void run() {
        	//创建Looper对象
            Looper.prepareMainLooper();
            // 加载系统android_servers的库
            System.loadLibrary("android_servers");
            //创建系统的Context
            createSystemContext()
			mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
	 		//省略。。
            //启动引导服务
            startBootstrapServices();
            //启动核心服务
            startCoreServices();
            //启动其他服务
            startOtherServices();
           //省略。。
           Looper.loop();     
}

run方法中内容也比较多,这里分析几个重要部分既可以:
Looper.prepareMainLooper();主要目的就是创建好Looper对象,因为system server的主线程和普通app主线程一样是一个Loop管理的消息循环

createSystemContext()表示创建一个systemContext,Context不仅仅在普通app中非常重要,在system server中也一样,需要通过Context这个纽带来,获取一些进程的信息环境。

mSystemServiceManager = new SystemServiceManager(mSystemContext);这里创建了一个SystemServiceManager的类对象,而且放入了LocalServices中,其实这里的SystemServiceManager和常见binder中的ServiceManager还是不一样的,SystemServiceManager只是System Server中一个普通的类,他负责保存了各个SystemService的全局变量角色,本身不涉及跨进程,而ServiceManager可以与binder跨进除等是强关联

再接下来就是重点中重点:
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();

system server把系统的所有服务分了3类进行启动
第一个:startBootstrapServices();
这一部分看注释可以大概得出,系统服务之间存在着非常复杂的依赖关系,所以需要把一些重要的系统服务进行第一位启动

 /**
     * Starts the small tangle of critical services that are needed to get
     * the system off the ground.  These services have complex mutual dependencies
     * which is why we initialize them all in one place here.  Unless your service
     * is also entwined in these dependencies, it should be initialized in one of
     * the other functions.
     */
    private void startBootstrapServices() {
      //省略。。
        Installer installer = mSystemServiceManager.startService(Installer.class);
        //省略。。
        mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
        //省略。。
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        //省略。。
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        //省略。。
        mActivityManagerService.initPowerManagement();
        //省略。。
        if (!SystemProperties.getBoolean("config.disable_noncore", false)) {
            traceBeginAndSlog("StartRecoverySystemService");
            mSystemServiceManager.startService(RecoverySystemService.class);
            traceEnd();
        }

       //省略。。
        mSystemServiceManager.startService(LightsService.class);
        //省略。。
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
       //省略。。
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
       //省略。。
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();
        //省略。。
           OtaDexoptService.main(mSystemContext, mPackageManagerService);
         //省略。。
        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
      //省略。。
        mActivityManagerService.setSystemProcess();
       //省略。。
        mDisplayManagerService.setupSchedulerPolicies();

      //省略。。
        mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
		 //省略。。
            startSensorService();
         //省略。。
        }, START_SENSOR_SERVICE);
    }

这个里面代码主要就是启动一些服务,这些服务需要放在第一位进行启动,因为很可能后面服务对这些都是有依赖关系。
这里只对ActivityManagerService的启动进行一个例子分析,其他的服务就大概思路一样,不再单独分析:

 mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();

接下来分析 mSystemServiceManager.startService方法:

 public <T extends SystemService> T startService(Class<T> serviceClass) {
         //省略
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
         //省略
            startService(service);//调用自己的startService
            return service;
    //省略
    }
    
    public void startService(@NonNull final SystemService service) {
        // Register it.
        mServices.add(service);
      //省略
            service.onStart();
        //省略
    }

最后分析其实师调用了serviceClass的onStart方法,这里的serviceClass是 ActivityManagerService.Lifecycle.class

 public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityManagerService(context);
        }

        @Override
        public void onStart() {
            mService.start();
        }

        @Override
        public void onCleanupUser(int userId) {
            mService.mBatteryStatsService.onCleanupUser(userId);
        }

        public ActivityManagerService getService() {
            return mService;
        }
    }

这里看到构造时候 mService = new ActivityManagerService(context);把ActivityManagerService构造了,getService()也是直接返回的ActivityManagerService对象,onStart也是调用了ActivityManagerService的start方法

其他的另外两个也是和第一个类是启动服务,只是构造service方法上有细微差别,这里就不挨个具体分析了
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();

这里最后一步的startOtherServices不仅仅只启动了一些Service,在启动完了各个Service后,它还会调用各个Service的systemReady方法:

// It is now time to start up the app processes...
  vibrator.systemReady();
  lockSettings.systemReady();
  wm.systemReady();
  mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
  mPackageManagerService.systemReady();
  mDisplayManagerService.systemReady(safeMode, mOnlyCore);
   mActivityManagerService.systemReady(..)

这里只列出了主要的几个systemReady方法

探索Android FrameWork底层开发视频全套 1.初探Android 2.Android开发环境搭建与编译 3.Android编译过程分析 4.android.mk初识 5.Android.mk学习1 6.Android.mk学习2 7.Android.mk学习3 8.Android启动课程大纲 9.Android启动模式 10.init启动分析 11.走入init启动脚本 12.init脚本解析分析 13.init脚本执行和进程守护(1) 14.init脚本执行和进程守护(2) 15.android服务介绍与davlink启动 16.Zygote剖析与system_server启动 17.Zygote创建APP分析 18.zygote_load系统资源分析及优化 19.开机界面分析 20.systemserver服务分析 21.ServiceManager服务分析 22.packageMangerService服务分析 23.AndroidSensor简介 24.Android_Sensor框架 25.SensorManger分析 26.SensorService分析 27.SensorHal分析 28.Android_inpu 立即下载

相关推荐

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1343

Android Framework实战开发篇

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。学完本课程能让你学会如下知识点:-学习对BootAnimation的启动源码分析-学习对BootAnimation的opengl绘制源码分析-学习对BootAnimation的zip方式绘制源码分析-学习制作一个带有时间的显示的BootAnimation的动画-深入理解zip方式定制BootAnimation-学习android native层的posix线程实现-学习android native层封装的Threads类源码及使用-学习zygote的启动源码分析-学习zygote的进程创建过程源码分析-学习zygote启动systemserver过程分析-学习systemserver的启动分析-学习systemserver的HomeActivity的启动源码分析-学习systemserver与zygote进行socket通信创建进程源码分析-学习systemserver启动FallbackHome的Activtiy-学习FallbackHome结束及跳转Launcher源码分析-学习native c/c++层的堆栈打印

Kali Linux下John the Ripper实战:从识别yescrypt哈希到破解zip压缩包(保姆级避坑指南)

本文详细介绍了在Kali Linux中使用John the Ripper工具从识别yescrypt哈希到破解zip压缩包的全过程。针对常见的'No password hashes loaded'报错,提供了两种解决方案,并扩展讲解了哈希识别、zip文件破解及性能优化技巧,是安全测试人员的实用指南。

weixin_29323365的博客 236

深入Android Framework开发(入门篇)

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。 学完本课程能让你学会如下知识点: -学习Framework背景及它的巨大作用-Android源码环境搭建及让自己系统第一次跑起来-学习Frameowork开发的一些必要基础知识-学习怎么进行Android源码定位分析,实例:Activity启动流程源码分析-实战开发Frameowork项目--去除第三方应用入口广告页

【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机(ubantu18.04@Intel 82545EM

如果之前添加了网卡,这里就可以看见有3个网卡(没添加的现在再加也行),* Active *为Linux内核正在使用的网卡,另外两张是未启用的网卡(注:未启用的网卡在终端中使用ifconfig命令是查不到的,需要先使用ip addr找出网卡,再激活,此时网卡会变为* Active *状态。

lingshengxiyou的博客 2130

Sony SLVS-EC接口实战:如何用Xilinx K7 FPGA接收IMX421传感器数据(附电气特性匹配技巧)

本文详细介绍了在Xilinx Kintex-7 FPGA平台上实现Sony IMX421图像传感器SLVS-EC接口数据接收的完整实战方案。内容涵盖从硬件选型、PCB布局的电气特性匹配技巧,到FPGA内部GTX收发器配置、多通道绑定以及SLVS-EC协议数据解析与图像重组的关键步骤,为高速视觉系统开发提供了宝贵的调试经验和系统集成指导。

efc12345678的博客 264

android framework实战体验课

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。

树莓派视觉小车实战:OpenCV驱动的智能物体追踪系统

本文详细介绍了如何从零开始构建一个基于树莓派的智能视觉小车,实现物体跟踪功能。通过OpenCV进行图像处理,结合颜色与轮廓识别算法,让小车能够实时锁定并追踪特定目标。内容涵盖硬件搭建、软件环境配置、核心代码解析及运动控制逻辑,为创客和开发者提供了完整的实战指南。

weixin_29047545的博客 143

Android Framework实战视频--Zygote的启动

Android 8.1 zygote 启动过程源码 1、Zygote 简单介绍 在Android系统中,普通应用程序进程以及运行系统的服务system_server 进程都是由Zygote进程来fork的。也叫做孵化器。它通过linux中的fork形式创建应用程序进程和system_server 。由于zygote进程在启动的时候会创建java虚拟机环境,因此通过fork而创建的应用程序进程或者system_server进程可以在内部获得java虚拟机环境,不需要单独为每一个进程创建java虚拟机环境。 2

learnframework的博客 4593

属性基加密(Attribute-based Encryption, ABE)

KP-ABE中,用户的密钥定义了访问策略,密文的属性与策略进行匹配。CP-ABE中,密文定义了访问策略,用户的属性与策略进行匹配。

2201_75392924的博客 1830

玩转 Milvus(二):在 Ubuntu 22.04(WSL2)上安装 Milvus

本文详细介绍了在Ubuntu 22.04(WSL2)环境下安装Milvus向量数据库的两种单机模式:Milvus Lite和Milvus Standalone。Milvus Lite作为轻量级Python库,适合快速学习和小规模实验,只需通过pip安装即可使用。Milvus Standalone则支持Docker和Docker Compose两种部署方式,适合开发测试或小规模生产环境。文章对比了不同安装方式的优缺点,并提供了验证案例和常见问题解答,帮助开发者快速上手,实现简单的语义搜索功能。

企业级后端与 AI 应用开发双线探索 2507

Android Framework实战视频--系统SystemServer启动篇

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频–SystemServer启动

liaosongmao1的专栏 250

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

Android Framework实战视频--SystemServer启动FallbackHome篇

Android Framework实战视频–SystemServer启动FallbackHome篇 Android 8.1代码分析FallbackHome的启动: 前面已经讲解到了在startOtherService里面不仅仅会start系统服务,等系统服务都启动完成后,还会调用各个Service的systemReady方法,这里需要分析首个Ativity的启动,即常见的“Launcher”,当然是从ActivityManagerService开始分析: public void systemReady(fi

learnframework的博客 3950

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

学习Android Framework可以做什么?

其实很多新的学员都会问学习Framework后到底在企业里面干什么?具体哪些工作是需要Framework层面进行修改的,市场需求量大不大。 这个其实在我的课程第一节就有讲到相关的内容,即为什么要学习framework,具体可以看我的免费试看视频 这次我们重点介绍是哪些工作是需要学习 Framework知识,这里主要分为2大块与大家分享: 1、市场上所有智能设备终端厂商 即入职公司就是一个卖android设备的公司,安卓系统的设备目前有哪些呢 2、国内顶级互联网App开发厂商 主要业务范围:分析研究Frame

learnframework的博客 2361

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android Framework实战视频系列

hi,广大android爱好者们好: 自从去年业余时间发布了Android Framework实战开发入门篇的视频后,大家一直期待的千里马进行新的视频更新,哈哈,首先在这里和大家说一下抱歉哈,因为本人不是专业的讲师培训机构,是一个地道的实战Android 程序员,经验比较丰富些,在学习framework的路上走了很多的弯路,所以才打算出个视频让大家学习framework更加轻松,助力大家更加方便学习framework,不过我这里同时也告诉大家一个好消息,那就是,我们新的一期实战视频马上要与大家见面了。 大家

learnframework的博客 1858

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android Framework实战视频--Zygote的fork进程篇

Zygote的fork进程篇 1、实战体验linux的fork 直接上代码体验fork桌面创建新的子进程 //fork.c #include <unistd.h> #include <stdio.h> int main(void) { int pid; int count2=0; printf("main current process pid == %d \n",getpid()); pid=fork(); if (pid == 0) {

learnframework的博客 2839

Framework学习实战高级视频--SystemServer启动FallbackHome篇

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频–SystemServer启动

liaosongmao1的专栏 224

Android系统 Framework源码分析实战学习视频系列

hi,广大android爱好者们好: 自从去年业余时间发布了Android Framework实战开发入门篇的视频后,大家一直期待的千里马进行新的视频更新,哈哈,首先在这里和大家说一下抱歉哈,因为本人不是专业的讲师培训机构,是一个地道的实战Android 程序员,经验比较丰富些,在学习framework的路上走了很多的弯路,所以才打算出个视频让大家学习framework更加轻松,助力大家更加方便学习framework,不过我这里同时也告诉大家一个好消息,那就是,我们新的一期实战视频马上要与大家见面了。 大家

liaosongmao1的专栏 306

Android Framework学习笔记(三)SystemServer进程启动过程(1)

愿你有一天,真爱自己,善待自己。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pckzzy117的博客 1101

Android Framework实战视频--系统init到init.rc的Zygote的启动

Android 8.1 zygote 启动过程源码 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Fr

liaosongmao1的专栏 402

Framework面试二:说说Android系统的启动流程

目录 参考文章: 这道题想考察什么? Android有哪些主要的系统进程?这些进程各自有什么作用? zygote是怎么启动的? SystemServer是怎么启动的? 系统服务是怎么启动的? 系统服务怎么发布,让应用程序可见? 系统服务跑在什么线程? 课堂作业: 怎么解决系统服务之间的互相依赖? 桌面的启动: 总结: 参考文章: Android系统架构与系统源码目录...

songzi1228的博客 1500

Framework学习高级视频--android系统init到Zygote的fork进程篇

Zygote的fork进程篇 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频

liaosongmao1的专栏 202

【Android 系统开发】Android Framework 系统开发学习路线图(1~6 个月)

保证你从应用层一路下潜到 Framework、Native、HAL、驱动,最终可以独立完成系统定制和服务开发。每月将你的学习内容,录制成视频,发布到B站,抖音,公众号,视频号等。下面这段提示词你直接复制给 ChatGPT/Claude,就能自动让它帮你写 Framework 代码。面试的时候可以将自己的学习录制视屏,放到简历上,面试技术看到,说不定还会高看你一眼。✔ 让 Framework 可以控制你定制的硬件。✔ 新增一个 IMyManager 系统服务。✔ 新增 Framework API 模板。

weixin_44442642的博客 1971
上一篇: Android Framework实战视频--Zygote的fork进程篇
下一篇: Android Framework实战视频--SystemServer启动FallbackHome篇
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值