Android Framework 分析-程序员宅基地

技术标签: java  runtime  移动开发  

http://raymond1860.spaces.live.com/Blog/cns!BF47B6FD104579C9!797.entry

1.目录树

/framework/base/api 

/framework/base/awt

/framework/base/build

/framework/base/camera

关 于camera的HAL接口库。最终生成native共享库libcamera.so ,编译时根据是否定义USE_CAMERA_STUB来决定系统是否有Camera硬件支持。若没有实际的Camera硬件,则编译时会和虚拟 camera静态库(libcamerastub.a,由camerahardwarestub.cpp,fakecamera生成)链接生成 libcamera.so。

/framework/base/cmds 关于android系统启动时用到的command等

/framework/base/cmds/am

/framework/base/cmds/app_process 

可 执行文件app_process,该文件可以根据输入参数决定是Zygote启动(参考init.rc中的语句 service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server).

该执行程式会链接libandroid_runtime.so去链接android runtime。后面我会在详细分析此部分。

/framework/base/cmds/backup 

可执行程式btool

/framework/base/cmds/bmgr

java可执行程式, backup manager, java库形式分发到目标系统/system/framework/bmgr.jar

/framework/base/cmds/bootanimation

android启动动画效果程式,该程式必须在android runtime启动后运行。

/framework/base/cmds/dumpstate

android系统调试辅助工具,生成可执行程式dumpstate,同时建立两个程式dumpcrash bugreport指向该程式。

/framework/base/cmds/dumpsys

生成可执行程式dumpsys

/framework/base/cmds/ime

java可执行程式 ,IME输入法 input method manager, java库形式分发到目标系统/system/framework/ime.jar

/framework/base/cmds/input

java可执行程式,管理input事件例如key event,text event 等,java库形式分发到目标系统/system/framework/input.jar

/framework/base/cmds/installd

可执行程式installd,install manager,仅在非simulator系统中运行,安装到目标系统/system/bin/installd

/framework/base/cmds/keystore

可执行程式keystore,用途???仅在非simulator系统中运行,安装到目标系统/system/bin/keystore

/framework/base/cmds/pm

java可执行程式,package manager,java库形式分发到目标系统/system/framework/pm.jar

/framework/base/cmds/runtime

runtime可执行程式,仅在simulator中使用

/framework/base/cmds/service

service可执行程式,用来查找,检查,呼叫service,安装到目标系统/system/bin/service

/framework/base/cmds/servicemanager

android系统的service manager,可执行文件,安装到目标系统/system/bin/servicemanager

servicemanager会和kernel的binder driver协作共同完成service的添加、查询、获取、检查等。

/framework/base/cmds/surfaceflinger

surfaceflinger可执行程式,安装到目标系统/system/bin/surfaceflinger,

该程式会初始化surfaceflinger,surfaceflinger::inistantiate(),该程式会链接到libsurfaceflinger.so

/framework/base/cmds/svc


/framework/base/cmds/system_server

system server库libsystem_server.so->system/lib/libsystem_server.so和system_server可执行程式->system/bin/system_server.

该可执行程式不清楚什么用途????

/framework/core/

/framework/core/config

几个简单java常量,(debug标志等)

/framework/core/java/*

framewor

k的核心,此处主要指application framework,java库形式分发到/system/framework/

包括framework.jar,framework-tests.jar sure???

/framework/core/jni

framework所需的JNI接口实现库,分发到/system/lib/lib/libandroid_runtime.so

/framework/core/res

framework所需的资源文件打包,/system/framework/framework-res.apk,

/framework/libs

/framework/libs/audioflinger,

生成libaudioflinger.so,

若无实际硬件和静态库libaudiointerface.a(audio interface虚拟设备)链接。

若有实际硬件和libaudio.so链接,若支持bluetooth,则和liba2dp.so链接

/framework/libs/surfaceflinger

生成libsurfaceflinger.so

/framework/libs/ui

生成libui.so

/framework/libs/utils

生成libutils.so

/framework/services/java/*

system server java可执行程式service.jar,分发到/system/framework/service.jar

/framework/services/jni/*

system server JNI接口实现库,libanroid_servers.so,分发到/system/lib/libanroid_servers.so

 

 

启动 Zygote

-Xzygote /system/bin --zygote --start-system-server

AndroidRuntime->AppRuntime

int main(int argc,const char* const argv[])

{

  AppRuntime runtime;生成AndroidRuntime实例

  ...

  AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);

}

其中AndroidRuntime.Start("com.android.internal.os.ZygoteInit",startSystemServer);

呼叫Android::Start(const char* className,const bool startSystemServer)

/framework/base/core/jni/AndroidRuntime.cpp

该函数的处理内容:

1.处理Jave Virtual Machine的一些参数选项;

2.创建Dalvik Java虚拟机,JNI_CreateJavaVM(&mJavaVM,&env,&initArgs);

3.注册Android Runtime中的JNI接口给虚拟机;

4.呼叫Java类com.android.internal.os.ZygoteInit的main函数


在类com.android.internal.os.ZygoteInit的main函数中,

1.注册Zygote socket用来接收请求;

2.加载preloaded class、resources用来加快启动速度,文件清单在framework.jar中的preloaded-classes,framework-res.apk中的res中;

3.启动System Server;

  fork出独立的进程名称为system-server,呼叫com.android.server.SystemServer类的main函数;

  在HandleSystemServerProcess函数中,RuntimeInit.ZygoteInit调用会呼叫AppRuntime的OnZygoteInit函数

4.RuntimeInit.ZygoteInit函数会呼叫com.android.server.SystemServer类的main函数。

  在此main函数中,系统首先加载android_server共享库libandroid_server.so 源代码位于/framework/base/service/jni

  在该库中有定义JNI_OnLoad函数,所以Dalvik在加载libandroid_server.so 的时候会首先呼叫该JNI_OnLoad函数,该函数将android server注册到Java虚拟机中,包括 KeyInputQueue,HardwareService,AlarmManager,BatteryService,SensorService,SystemServer 等;

  呼叫在libanroid_server.so中注册的native函数init1,该函数位于/frameworks/base/services/jni/com_android_server_SystemServer.cpp中;

  init1函数呼叫libsystem_server中的system_init函数,该函数位于/frameworks/base/cmds /system_server/library/system_init.cpp中,该函数将SurfaceFlinger/AudioFlinger /MediaPlayer/CameraService等组件注册到ServiceManager中

  system_init函数反过来呼叫java类com.android.server.SystemServer的init2函数;

5.在init2函数中,android创建了serverthread,在该thread中android开始注册各种service到service manager中

包括EntropyService,PowerManager,ActivityManager,Telephony,PackageManager,ContentManager,ContentProvider,

BatteryService,HardwareService,AlarmManager等等。

  注意该线程使用Looper来执行thread

至此android system server启动完成。

转载于:https://www.cnblogs.com/sardine/archive/2011/08/01/2124397.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30466421/article/details/97788314

智能推荐

C# List集合 GroupBy分组_c# list groupby-程序员宅基地

文章浏览阅读5.4k次。var grpBalance = listBalance.GroupBy(m => new { m.MerChantId, m.Name}).Distinct().Select(t => new balInfo { MerChantId = t.Key.MerChantId, ..._c# list groupby

【c语言基础】学习笔记+记录_c定义4字节数组-程序员宅基地

文章浏览阅读896次,点赞2次,收藏3次。c语言基础知识记录_c定义4字节数组

Kafka常见面试题-程序员宅基地

文章浏览阅读589次,点赞9次,收藏6次。接收端:对接收到的数据进行备份,定期进行检查对执行失败的数据重新执行;选择手动提交offset,对执行失败的数据不提交offset。零拷贝技术:在cache中未查到数据,从磁盘获取加载到cache中后,不copy到Kafka进程中,而是由操作系统直接发送到网卡。每隔一段时间消费数据,将当前时间与数据产生时间进行对比,小于延迟时间的不提交,并重新进入等待。在消费者端对数据进行幂等校验,禁止一定时间内出现相同含义的数据;页面缓存技术:将数据缓存到系统的cache中,在刷新到磁盘当中。

redis启动失败-程序员宅基地

文章浏览阅读49次。【代码】redis启动失败。

SQL知识点--插入记录_sql插入记录-程序员宅基地

文章浏览阅读6.3k次,点赞14次,收藏16次。INSERT INTO 语句INSERT INTO 语句用于向表中插入新记录,INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可: INSERT INTOtable_name(表名称) VALUES (value1,value2,value3,...); 第二种形式需要指定列名及被插入的值: INSERT INTOtable_name(表名称)(column1,column2,column3,...) VALUES (value..._sql插入记录

端口扫描工具nmap的常用参数_nmap常用的扫描参数-程序员宅基地

文章浏览阅读1.8k次。nmap自学_nmap常用的扫描参数

随便推点

遍历Stream并设置属性值_stream遍历赋值-程序员宅基地

文章浏览阅读1.2w次。// 初始化数据,设置评价等级 List<TblApplyForCleaning> list = (List<TblApplyForCleaning>) tblApplyForCleaningRepository.findAll(); list.stream().forEach(p -> { if (p.getXing() != null)..._stream遍历赋值

Matlab之图片拼接_matlab如何把四张图片合成-程序员宅基地

文章浏览阅读4.6k次,点赞8次,收藏42次。功能:可以自定义行列数拼接图片,拼接同时可以自定义对每张图片进行增(减)白边处理。1.使用Matlab建立.m文件,具体如何建立见文章:Matlab基础之.m文件创建及使用2.我写了两份代码可供参考代码一%图片合并,可以实现将一组图片变为统一规格尺寸(默认第一张图的尺寸)%可以自定义行列数拼合成一整张图片,若图片数不足行列乘积数则用等尺寸白色图片代替%可以设置为每一张图片增加或减少白..._matlab如何把四张图片合成

6-4 Reverse Linked List_write a nonrecursive procedure to reverse a singly-程序员宅基地

文章浏览阅读1k次。6-4 Reverse Linked List (20 分)Write a nonrecursive procedure to reverse a singly linked list in O(N) time using constant extra space.Format of functions:List Reverse( List L );where List is ..._write a nonrecursive procedure to reverse a singly linked list in o(n) time

深度学习 Pytorch Mnist手写数字识别_mnist_train-程序员宅基地

文章浏览阅读606次。mnist手写数字识别_mnist_train

05-黑盒测试用例_反测试用例用写吗-程序员宅基地

文章浏览阅读117次。等价划分法用例问题用例按照测试分类:功能function、界面ui、性能performance、安全security、接口interface测试项:必须是确定的,可写可不写,最好不写身份证号没有字母,数字和罗马数字Ⅹ测试项:一般只写一个测试目的(测试目的必须是明确的,一个反向的(无效的等价类)只要违反一个需求)注意单选复选按钮依赖用例:下游的用例依赖上游的用例(已经存在的用例),用例依赖可以跨越模块(A设计员可能会依赖B设计员的测试用例)测试步骤:表明操作对象和方式,数据测试数据:没有数_反测试用例用写吗

三角平方数-程序员宅基地

文章浏览阅读724次。题目:最近毛哥买来一本数论方面的书《数论概论》,这本书上定义了两个很有趣的数:三角数,平方数。但是书上出了一个难题:当三角数和平方数相等时,叫做三角平方数。问你第n个三角平方数是什么。毛哥想了很久都不会,你能帮他找出第n个三角平方数吗?输入多组数组,输入一个数n(1<=n<=25)输出输出有两个数,第n个三角平方数(分别输出是第几个三角数和第几个平方数,中间用空格隔开)输..._三角平方数

推荐文章

热门文章

相关标签