`
寻梦者
  • 浏览: 638151 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android启动源码研究

 
阅读更多

 记得公司同事也提过这个启动过程,共4个步骤:

1 .init进程启动

2 .Native服务启动

3 .SystemSeverAndroid服务Init2

4 .Home启动

现在我们按照执行顺序挨个来看:

 1 init进程启动

Init.c[1047]:main函数可知,他在解析init.rc/init.%s.rc脚本

/* -----------------init.rc-----------------------------*/

INFO("reading config file\n");parse_config_file("/init.rc");

qemu_init();import_kernel_cmdline(0); get_hardware_name();

 /* -----------------init.%s.rcinit.%s.rc-----------------------------*/

 snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);parse_config_file(tmp);

Init.rc[383]:这是一个Android自定义格式的脚本【详细我将用一片文档类别的日志粘贴上去】有4中类型:Action,Commands,Service,Options

那么他的启动如下:

   Init.c打开rc文件解析服务,存于service_list/*具体怎么解析不做研究*/

简单的解释下:int parse_config_file(const char *fn)

{

    char *data;

    data = read_file(fn, 0);

    if (!data) return -1;

    parse_config(fn, data);

    DUMP();

/* DUMP();它解析内容:struct service *svc;struct action *act;struct command *cmd;struct listnode *node;struct listnode *node2;struct socketinfo *si;

是list_for_each()这个方法进行具体解析的,这里就不作更深的代码黏贴了,读者可以自己去看*/

    int n;

    return 0;

}

那么他是如何开启NativeAndroid的服务的呢?

 Service的启动靠的是serivce_startmain函数启动,在死循环中: 

for(;;) {

        int nr, i, timeout = -1;

        for (i = 0; i < fd_count; i++)

            ufds[i].revents = 0;

        drain_action_queue();

        restart_processes();// 会遍历Servicerestart_service_if_needed,调用serivce_start()

        if (process_needs_restart) {

            timeout = (process_needs_restart - gettime()) * 1000;

            if (timeout < 0)

                timeout = 0;

        }

serivce_start()做的时期就是初始化好srv[service],并调用execve()方法,从而建立Service进程。

//具体代码请作者自己去看,这里就不黏贴了。

启动ZygoteZygote的职责就是产生Activity,(接受ActivityManagerService请求)将单独写文章理解

启动System Server:在ZygoteInit这个类中,他启动了SystemServer进程:

ZygoteInit这个类的main函数中 :有这样一段代码

if (argv[1].equals("true")) {

                startSystemServer();

//Zygote.forkSystemServe->启动了SystemServer进程

            }

至于系统的Native服务和Android服务的启动过程,上一次日志,我们已经写过了,这里就不在缀诉。在每个服务启动后了之后,都会回调相应服务的onSystemReady()来执行回调的代码,同样的ActivityManager也是又这个回调函数:,

  // 如下服务是构建回调ActivityManagerService所要的服务,我们单独列出来

        final BatteryService batteryF = battery;

        final ConnectivityService connectivityF = connectivity;

        final DockObserver dockF = dock;

        final ThrottleService throttleF = throttle;

        final UiModeManagerService uiModeF = uiMode;

        final AppWidgetService appWidgetF = appWidget;

        final WallpaperManagerService wallpaperF = wallpaper;

        final InputMethodManagerService immF = imm;

        final RecognitionManagerService recognitionF = recognition;

        final LocationManagerService locationF = location;

       //我们告诉ActivityManagerService现在可以运行第三方代码了,他们一旦获得状态就会回调我们的CallBack来完成整个初始化过程。原文注释如下:

 

        // We now tell the activity manager it is okay to run third party

        // code.  It will call back into us once it has gotten to the state

        // where third party code can really run (but before it has actually

        // started launching the initial applications), for us to complete our

        // initialization.

        ((ActivityManagerService)ActivityManagerNative.getDefault())

                .systemReady(new Runnable() {

            public void run() {

                if (batteryF != null) batteryF.systemReady();

                if (connectivityF != null) connectivityF.systemReady();

                if (dockF != null) dockF.systemReady();

                if (uiModeF != null) uiModeF.systemReady();

                if (recognitionF != null) recognitionF.systemReady();

                Watchdog.getInstance().start();

                 if (appWidgetF != null) appWidgetF.systemReady(safeMode);

                if (wallpaperF != null) wallpaperF.systemReady();

                if (immF != null) immF.systemReady();

                if (locationF != null) locationF.systemReady();

                if (throttleF != null) throttleF.systemReady();

            }

        });

这样就调用了ActivityManagerServicesystemReady(final Runnable goingCallback)。

ActivityManagerServicesystemReady(),当判断为mSystemReadytrue的时候,便会回调goingCallback.run。这种多线程的代码的组织技巧也是我们应该学习的。我们甚至看到如果主题是CategoryHome,那么系统是不会回收的。

言归正传:在systemReady()里调用这么个方法:resumeTopActivityLocked(null),他引导了Home的启动。

在这个resumeTopActivityLocked (HistoryRecord prev)有这样一个代码

if (next == null) {// HistoryRecord next = topRunningActivityLocked(null);

            // 没有其他Activity,只要启动Home就好

            return startHomeActivityLocked();

        }

付解释代码:

private final HistoryRecord topRunningActivityLocked(HistoryRecord notTop) {

        int i = mHistory.size()-1;

        while (i >= 0) {

            HistoryRecord r = (HistoryRecord)mHistory.get(i);

            if (!r.finishing && r != notTop) {

                return r;

            }

            i--;

        }

        return null;

    }

在这个函数里便启动了HomeActivity     

分享到:
评论

相关推荐

    安卓Android源码——Android Launcher 源码修改可编译.zip

    通过以上知识点,我们可以了解到,解压并研究"安卓Android源码——Android Launcher 源码修改可编译.zip"文件,不仅可以深入了解Android系统的工作机制,还能动手实践,创造出独具特色的Android启动器。

    android程序启动画面源码

    在Android应用开发中,启动画面(Splash Screen)是用户打开应用程序时首先看到的界面,它通常展示品牌...开发者可以通过研究这个源码,理解并掌握自定义启动画面的实现方法,进一步提升自己的Android应用开发能力。

    疯狂Android讲义源码

    通过研究《疯狂Android讲义》的源码,开发者不仅可以深化对Android开发的理解,还能学习到作者在实际开发过程中的经验和技巧。同时,这也有助于提升问题解决能力,为日后的项目开发打下坚实基础。

    Android高级应用源码-Android Launcher 源码修改可编译.zip

    本资料包提供的是一个经过修改,可编译的Android Launcher源码,旨在帮助开发者深入理解Android启动器的工作原理,并进行定制化开发。以下是对这个高级应用源码的详细分析。 一、Android Launcher概述 Android ...

    Android经典源码全集

    通过深入研究《Android经典源码全集》,开发者不仅可以掌握Android开发的基本技能,还能了解到许多高级特性和最佳实践,从而在实际项目中编写出更高效、更稳定、用户体验更好的应用。这是一份宝贵的资源,值得每一个...

    AndroidDriver-master_layers2x3_简单android源码_androidapp源码_android_

    【AndroidDriver-master_layers2x3_简单android源码_androidapp源码_android】是一个与Android应用程序开发相关的项目,从描述来看,这可能是某个人学习或练习Android编程时创建的第一个APP程序。这个项目的名称...

    安卓系统源码 (android 14 rar)

    《安卓系统源码详解——基于Android 14的探索与学习》 Android系统源码是开发者深入了解操作系统工作原理、定制个性化系统以及优化应用性能的重要工具。Android 14的源码,作为Android发展历程中的一个重要版本,为...

    Android应用源码电子书阅读器源码.zip

    此外,源码可能还包括了Intent的使用,它是Android中传递信息的关键机制,用于启动新的Activity或Service。 再者,源码中可能包含对SQLite数据库的运用,用于存储书籍信息和用户的阅读进度。这涉及到Android的数据...

    android2.3.3部分源码

    1. **系统启动流程**:源码中包含了开机启动流程,包括bootloader、kernel以及Android系统的初始化。理解这一过程有助于开发者调试设备启动问题,如了解zygote进程如何启动,系统服务如何加载。 2. **HAL(硬件抽象...

    精通android书本源码

    通过阅读和研究《精通Android》这本书的源码,开发者不仅可以深化对Android平台的理解,还能提高实际开发能力,解决实际问题。这份源码是书本理论知识的实践验证,是每一个Android开发者不可多得的学习资料。

    Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载

    Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目...

    Android应用源码之植物大战僵尸(简单版).zip

    这个源码是植物大战僵尸的简单版本,非常适合初级到中级的Android开发者学习和研究,尤其是对于想要提升Java编程和Android应用开发技能的人来说,这是一个绝佳的学习资源。 首先,我们要明确的是,这个项目是基于...

    android 2.2 源码下载 学习必备

    总之,通过研究Android 2.2源码,开发者不仅可以了解Android系统的架构,还能学习到最佳实践,提高解决问题的能力。同时,这对于那些希望参与系统级定制或开发定制ROM的开发者来说,更是不可或缺的学习资源。因此,...

    Android经典源码全集.zip

    再者,Android的事件分发机制也是源码研究的重点。从Activity到View,事件是如何层层传递并响应的,这在处理复杂的触摸交互时非常关键。理解这个过程,能让我们编写出更灵活、响应更快的应用。 此外,Intent作为...

    android 实例源码 集合

    通过研究这些实例源码,开发者不仅可以加深对Android系统的理解,还能积累实战经验,提高解决问题的能力。在学习过程中,应结合官方文档和其他教程,逐步建立自己的知识体系,成为更优秀的Android开发者。

    android Framework源码最新版

    通过源码,你可以深入研究Android系统的启动过程,从Zygote进程的创建到System Server的初始化,再到用户界面的显示。 11. **编译与构建系统** Android Framework的构建过程涉及Makefile、Gradle等工具,了解这...

    Android应用源码之安卓记账本

    总的来说,通过深入研究这个【Android应用源码之安卓记账本】,开发者可以学习到Android应用开发的多个核心领域,包括UI设计、数据存储、事件处理、权限管理、网络编程以及架构设计。这将对提升个人的Android开发...

    Android应用源码之Android 4.4.2 简单的人品测试.zip

    通过研究这个源码,开发者可以学习到如何在Android平台上构建一个简单的应用,理解Android应用的工作原理,以及如何处理用户交互和数据管理。同时,这也是提升Java编程技能和Android开发经验的好机会。

    android-23源码

    Android 23源码是Google在2015年发布的Android操作系统版本,也被称为Marshmallow(棉花糖)。这个版本带来了许多关键的更新和改进,旨在...通过深入学习和研究这些源码,可以推动Android生态系统的持续创新和发展。

    疯狂android讲义源码

    通过阅读和研究这些源码,开发者不仅可以加深对Android开发的理解,还能提升实际项目中的问题解决能力。同时,PPT说明将帮助理解源码背后的逻辑和设计思路,是学习和提高Android技能的重要参考资料。

Global site tag (gtag.js) - Google Analytics