Android笔记

1、安卓系统分为四层,分别是Linux内核层、Libraries层、FrameWork层,以及Applications层;

Linux内核层包含了Linux内核和各种驱动;

Libraries层包含各种类库(动态库(也叫共享库)、android运行时库、Dalvik虚拟机),编程语言主要为C或C++

FrameWork层大部分使用java语言编写,是android平台上Java世界的基石

Applications层是应用层,我们在这一层进行开发,使用java语言编写

2、Dalvik VM和传统JVM的区别:

(1)JVM虚拟机运行的是Java字节码(通常是.class文件),但Dalvik运行的是其专有的dex(Dalvik Executable)文件。

(2)JVM直接从.class文件或JAR包中加载字节码然后运行,而Dalvik则需要通过DX工具将应用程序的所有.class文件编译成.dex文件,然后再运行该.dex文件

(3)专有的.dex文件减少了.class文件中的冗余信息,而且会把所有.class文件整合到一个文件中,从而提高运行性能;而且DX工具还会对.dex文件进行一些性能的优化。

(4)基于寄存器实现。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。一般来说,基于寄存器的虚拟机具有更好的性能表现,但在硬件通用上略差。

传统JVM:.java -> .class -> 打包成.jar

Dalvik VM: .java -> .class -> 打包成.dex -> 打包成 .apk 

3、FrameWork层    -------     JAVA世界

           Libraries层         -------     Native世界

           Linux层               -------     Linux OS         

                Java世界和Native世界间的通信是通过JNI层(Java Native Interface,它提供了若干的API实现了Java和其他语言的通

          信(主要是C&C++))

          JNI层和Native世界都可以直接调用系统底层

android系统的启动

/system/core/init/Init.h
/system/core/init/Init.cpp
/system/core/init/Init_parser.h
/system/core/rootdir/Init.rc
/system/core/init/Init_parser.cpp
/system/core/init/Signal_handler.h
/system/core/init/Signal_handler.cpp
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
/frameworks/base/core/services/java/com/android/server/SystemServer.java
/frameworks/base/core/java/com/android/internal/os/Zygote.java
/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
/frameworks/base/cmds/app_process/App_main.cpp (内含AppRuntime类)
/frameworks/base/core/jni/AndroidRuntime.cpp
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/LoadedApk.java
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/com/android/server/LocalServices.java
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
frameworks/base/services/core/java/com/android/server/ServiceThread.java
frameworks/base/services/core/java/com/android/server/pm/Installer.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

1、BootLoader加载

---加电后,CPU先执行bootloader引导程序,正常启动系统,加载boot.img到RAM,然后执行,boot.img中包含内核

2、Kernel加载

---由bootloader加载kernel,kernel经自解压、初始化、载入built-in驱动程序,完成启动

3、启动init进程:——安卓世界第一个被启动的进程

       加载的init.rc配置文件,并开启系统的守护进程(守护media、孵化器zygote、调试桥的守护进程)

①、多媒体的装载:onrestart  restart  media

②、Java世界的开启:onrestart  restart  zygote

③、adbd守护也被开启起来了,即调试桥(adb[Android Debug Bridge])的守护进程(adbd[Android Debug Bridge Daemon])        也被开启起来了 

4、Zygote进程(app_main.cpp)启动,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,它是整个JAVA世界的基础----native层

---在 zygote 的 main() 函数中主要做了下面几件事

  • 初始化AppRuntime
  • 设置进程名为 “zygote”
  • AndroidRuntime.start() 启动 ZygoteInit 类,进入 Java 世界(AppRuntime 是 AndroidRuntime 的子类)

这里重点是最后一步,start() 函数里几个重要的步骤是:

  • startVm() 启动虚拟机,配置各种虚拟机的参数
  • startReg() 注册大量JNI 函数
  • JNIEvn->CallStaticVoidMethod() 调用 ZygoteInit 类的 main() 函数

5、.ZygoteInit(ZygoteInit.java) 初始化---java层

  • 创建 ZygoteServer,并建立 Socket 监听,用来和ActivityManagerService等通讯
  • preload(),预加载大量的类和资源文件
  • startSystemServer(),通过一次 fork 启动 system_server 进程
  • 通过 ZygoteServer.runSelectLoop() 处理客户端发起的 Socket 连接
  • startSystemServer() 中 fork 出 system_server 进程之后,调用 handleSystemServerProcess()

6、SystemServer.java代码中有两个方法,init1()启动Native世界,init2()启动Android的Framework世界(这是旧版本的)

startSystemServer() 函数的关键代码有三处。

(1)定义了一个String[]数组,数组中包含了要启动的进程的相关信息,其中最后一项指定新进程启动后装载的第一个Java类,此处即为com.android.server.SystemServer类;

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

 (2)调用forkSystemServer()从当前的zygote进程孵化出新的进程。该函数是一个native函数,其作用与folkAndSpecilize()相似;

 (3)第三处,新进程启动后。在handleSystemServerProcess()函数中主要完成两件事情,第一是关闭Socket服务端,第二是抛出异常MethodAndArgsCaller,通过捕捉异常来调用caller.run(),最终通过反射来启动com.android.server.SystemServer的main 方法。这样做可以清除进程的堆栈,减少内存占用。

PS:抛出异常后,如果异常没有在当前的函数中捕获,那么当前的函数执行就会异常的退出,从应用程序的栈弹出,并将这个异常传递给上一个函数,直到异常被捕获处理,否则,就会引起程序的崩溃。这里通过抛异常的方式启动主要是清理应用程序栈中ZygoteInit.main以上的函数栈帧,以实现当相应的main函数退出时,能直接退出整个应用程序。 当当前的main退出后,就会退回到MethodAndArgsCaller.run而这个函数直接就退回到ZygoteInit.main函数,而ZygoteInit.main也无其他的操作,直接退出了函数,这样整个应用程序将会完全退出

SystemServer.main()

  • new SystemServer().run();
  • Looper.prepareMainLooper();   //准备主线程循环
  • createSystemContext();

         ---ActivityThread.systemMain() ->ActivityThread.attach(true)

         ---这里的boolean参数是为了用来区分是否是系统进程,普通应用进程启动时会调用

         ---ActivityThread.main() -> ActivityThread.attach(false)

  • startBootstrapServices();   //启动服务
  • startCoreServices();
  • startOtherServices();

        ---system_server进程中的服务启动方式有两种,分别是SystemServiceManager的startService()

            和ServiceManager的addService()

        ---startService() 用于启动继承于SystemService的服务

        ---addService() 用于初始化继承于IBinder的服务

  • Looper.loop();  //启动线性循环,等待消息处理

PS:SystemServer和Zygote共存亡,当SystemServer死亡,Zygote就会自杀

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值