- 浏览: 261348 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
第四章android的底层库和程序
知识点:
Android.mk的书写规则
在android中增加可执行程序、动态库、和静态库的方法
Init.rc启动角本的使用方法
Binder机制的工作原理
使用binder在程序中构建IPC的方法
Android的系统进程
底层库和程序的结构
1增加本地程序和库的方法
要增加的库和程序跟路径没有关系,只和它们的android.mk文件有关系
Android.mk和makefile有所不同,android.mk主要包含一些系统公共有宏
android.mk中选项的路径
Build/core/config.mk
各个选项的默认值
Build/core/base_rulles.mk
编译程序
1在android.mk中编译一个可执行程序的模板
#TestExe
LOCAL_PATH:=${callmy-dir}
Include${CLEAR_VARS}
LOCALL_SRC_FILES:=\main.c源文件(相对于当前的目录)
LOCAL_MODULE:=test_exe最终生成可执行文件的名称
#LOCAL_MODULE:=模块最终的名称
#LOCAL_C_INCLUDES:=需要包含的头文件路径
#LOCAL_STATIC_LIBRARIES:=需要连接的静态库(*.a)
#LOCLA_SHARED_LIBRARIES:=需要连接的动态库(*.so)
Include${BUILD_EXECUTABLE}以一个可执行程序的方式进行编译
2编译一个静态库(归档文件)的模版
#TestStaticlib
LOCAL_PATH=${callmy-dir}
Include${CLEAR_VARS}
LOCAL_SRC_FILES:=\helloworld.c
LOCAL_MODULE:=libtest_static最终生成静态库的名称是libtest_static.a
#LOCAL_C_INCLUDES:=
#LOCAL_STATIC_LIBRARIES:=
#LOCAL_SHARED_LIBRAIES:=
Include${BUILD_STATIC_LIBRARY}编议一个静态库
3android.mk中编译一个动态库(共享库)的模版
#Testsharedlib
LOCAL_PATH:=${calmy-dir}
Include${CLEAR_VARS}
LOCAL_SRC_FILES:=\helloworld.c
LOCAL_MODULE:=libtest_shared最终生成动态库文件的名称是libtest_shared.so
TARGET_PRELINK_MODULE:=false
#LOCAL_C_INCLUDES:=
#LOCAL_STATIC_LIBRARIED:=
#LOCAL_SHARED_LIBRARIES:=
Include${BUILD_SHARED_LIBRARY}编译动态库
注:android.mk中不需要对c源文件和c++源文件进行区分,统一加入LOCAL_SRC_FILES中即可
可执行程序、静态库和动态库生成的编译结果分别存放在以下的目录中:
Out/target/produce/generic/obj/EXECUTABLE
Out/target/product/generic/obj/STATIC_LIBRARY
Out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:{xxx}_intermediates
静态库:{xxx}_static_intermediates
动态库:{xxx}_shared_intermediates
{xxx}为模块中LOCAL_MODULE中所定义的名称,可执行程序和动态库,一般在LINK子目录中是带有符号的库(没有经过符号剥离)
编译过程中,可以编译目标机的内容,也可以编译主机的内容
.以下是编译目标机内容
以下是编译主机的内容
Android.mk中可以指定最后的目标安装路径
LOCAL_MODULE_PATH目标路径
LOCAL_UNSTRIPPED_PATH没有经过符号剥离的目标路径
安装到不同的系统路径的方式:
LOCAL_MODULE_PATH:={TARGET_ROOT_OUT}
LOCAL_UNSTRIPPED_PATH:=${TARGET_ROOT_OUT_UNSTRIPPED}
TARGET_ROOT_OUT根文件系统
TARGET_OUTsystem文件系统(默认)如果不使用local_module_path指定路径
TARGET_OUT_DATA:data文件系统
安装程序
Android.mk中,进行目录和安装程序的示例
LOCAL_PATH:=${callmy-dir}
Include${CLEAR_VARS}
Copy_from:=\A.txt\B.txt将当前目录下的a和b复制到system/text下
Copy_to:=${addprefix${TRAGET_OUT}/txt,${copy_from}}
${copy_to}:PRIVATE_MODULE:=txt
${copy_to}:${TARGET_OUT}/txt/%:${LOCAL_PATH}/%|${ACP}
${transform-prebuilt-to-target}
ALL_PREBUILT=${copy_to}
DIRS:=${addprefix$(TARGET_OUT)/,\txt\}在system目录下创建txt目录
${DIRS}:
@echoDirectory:$@
@mkdir-p$@
标准c/c++库bionic
源码和头文件在以下的目录中:bionic/
Bionic支持标准c/c++库的绝大部分功能,支持数学库和NPTL线程库,实现了自已的Linker和loader,用于动态库的创建和加载
加入了log的底层支持,还实现了一套property系统,是android全局变量的存储区域,是用共享内存的方式来实现
C语言工具库libcutils--本地最基础的库
工具库头文件的路径是:system/core/include/cutils
工具库源文件的路径:system/core/libcutils
工具库编译的结果:libcutils.so
工具库中主要头文件如下:
Ashmem.h匿名共享内存的接口
Atomic.h原子操作接口
Array.h定义一个可以动态改变大小的数组
Threads.h线程接口,定义线程和相关的互斥量
Sockets.handroid的套接字接口
Properties.handroid属性系统接口
Log.hlog的信息接口定义了logvlogdlogilogwloge
Mq.h消息对列接口
Hashmap.h定义哈希表的工具
数组功能分配内存来实现/dev/ashmem的驱动来实现
套接字linux标准的Socket来实现
线程调用标准的Posix线程pthread来实现
Log输出调用并连接liblog库
Init可执行程序
Init进程是android启动后,系统执行的第一个程序,以守护进程的方式运行
功能:
设备管理
解析启动脚本init.rc
执行启动脚本的基本功能
执行启动脚本中的各种服务
Init进程的代码路径为:system/core/init
Init处理完一系列操作后,将进入一个循环(进行设备处理)parse_config_file("/init.rc")
Log的输出首先调用load_565rle_image()打开"/initlogo.rle"文件,通过写调用写framebuffer驱动程序的方式,输出到屏幕上
如果要使用开机画面,就需要构造一个“/initlogo.rle”文件,这是一个RGB565格式的纯数据文件.
设备管理的内容在device.*中定义,分为初始化阶段和运行阶段两部分,基本的处理过程是通过读取Linux的uevent事件,从而获取linux内核中发生的事件,然后进行创建设备节点
Device_init()的返回值在main函数中使用,进行pull操作,用于动态创建设备节点、删除设备节点
Make_device()用于动态创建文件系统中驱动的设备节点,主要调用mknod()函数
程序启动后将调用handle_device_event()函数,然后调用make_device()用于创建各个设备
Graphics子系统用于创建Framebuffer的设备节点,默认情况下是在/dev下.在android中
更改到/dev/graphics目录中
系统支持的设备在devperms数组中定义,这个数组的类型是perms
如果在系统中需要增加新的驱动程序,并且设备节点需要自动创建,则需要在devperms
数组中增加内容
启动脚本init.rc
在系统初始化过程中进行一些简单的初始化操作
启动脚步本的路径:system/core/rootdir/init.rc
语法:
Commands:命令
Action动作
Triggers触发条件
Service服务
Service服务名称s可执行程序
Socket
User
Group
Oneshot表示该服务只启动一次,如果没有这个可执行程序会一直存在如果
可执行程序被杀死,则会得新启动
Options选项
Properties属性
Shell工具
Android中shell界面供开发调试使用,需要启动一个名称为console的服务.
Console可执行程序的路径为console
Shell的功能是由sh程序(控制台)和工具箱(具体的命令)两部分组成
Sh程序作为守护进程运行即android的shell终端
Sh代码的路径:system/core/sh
入口文件是main.c执行后调用cmdloop()函数进入命令的循环中
Builtin.h定义类内建命令的格式
Builtin.c定义了内建命令的数组(命令名称对应函数指针)
builtincmd内建命令数组
Splbltincmd分割功能的内建命令数组
Sh程序使用系统的第一个终端(ttty0)作为输入输出设备(不支持tab键自动补全)
命令工具箱
Toolbox提供了在shell界面下执行的各个命令行命令
Toolbox的代码路径为:system/core/toolbox
入口文件为:toolbox.c
如果要增加新命令只需要增加一个文件,实现类似形式的函数,并在当前目录的
Android.mk中加入命令的名称,(toobox的android.mk自动找到源文件加入编译,并且自动生成tools.h头文件)
C++工具库libutils
Libutils头文件的路径:frameworks/base/include/utils
Libutils源文件的路径:frameworks/base/libs/utils
编译的结果是:libutils.so
Libutils中基本的主要头文件包括:
Error.h:定义表示错误码代码的宏
Endian.h:定义表示大小端的宏?
Misc.h:字符串和文件相关的功能函数
TextOutput.h:定义文本输入的基类
bufferedTextOutput.h:是一个textOutput的实现
Pipe.h:定义管道类pipe;
Buffer.h:定义内存缓冲区域的类
List.h:定义链表的模版类
SharedBuffer.h:定义类SharedBuffer表示共享内存
String16.h:定义表示双字节字符串的类String16
String8.h:定义表示单字节字符串的类String8
VectorImpl.h:定义表示向量的类VectorImpl:
Vector.h:定义继承Vector.定义继承vectorImpl类模版
SortedVector.h:定义排序向量的模版
keyedVector.h:定义使用关键字的向量模版
Threads.h:定义线程相关的类
Socket.h:定义套接字相关的类
Timers.h:定义时间相关的函数和定时器
ZipEntry.h:与zip功能相关的类
Binder(libbinder.so)
用于进程间的通信(IPC),类似于openBinder(传统的IPC机制还有Socket和pipe
D-BUS)
Native部分的binder实现
Binder基本架构
1.驱动层dev/binder
2驱动适配层IPCThreakState.cpp和ProcessState.cpp,
3Binder核心框架层IBinder(IPC传输介质)两个子类BBinder和BpBinder
IInterface表示需要使用ipc的一个接口
4Binder框架层
5Binder服务和客户端实现层
Binder服务器端和客户端
Binder的实现基础是运行与kernel空间的binder驱动
路径为frameworks/base/include/binder
Frameworks/base/libs/binder
在native层中,其实也就是实现第四层和第五层主要使用的头文件是IInterface.h
IInterface中有两个宏,DECLARE_META_INTERFACE()
为类自动声明asInterface()和getInterfaceDescriptor()两个函数
IMPLEMENT_META_INTERFACE()
使用这两个宏可以为继承IInterface的类节省很多代码
BnInterface是一个类模版
Binder系统的使用,需继承IInterface和BnInterface(在IInterface中)两个类,实现进程间
的通信
/fremework/base/libs/IpermissionController.h
IPermissionController.cpp
Libutils中的其他内容
Imemory.h中定义了:ImemoryHeap表示一块堆上的内存
Imemory表示一块任意使用的内存
MemoryHeapBase是IMemoryHeap接口的一个实现
MemoryBase是IMemory接口的一个实现
Android的系统进程
可以通过adbshellps进行查看
几个重要系统进程/init/system/bin/servicemanager/system/bin/mediaserver
System_server和zygote
Servicemanager:是Binder的服务管理器守护进程,所有binder机制的核心,所有Binder服务都通过他进行注册他是一个本地应用
路径是:frameworks/base/cmds/servicemanager
运行流程:打开binder驱动---->成为服务器管理进程------>进入binder_loop等待请求
服务的实现
以mediaPlay为例ImediaPlayService
框架部分
frameworks/base/include/media/IMediaPlayerService.h
/frameworks/base/media/libmedia/IMediaPlayService.cpp
服务器部分
/frameworks/base/media/libmediaplayerservice/MediaPlayService.h
/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
客户端调用者
/frameworks/base/media/libmediaplayerservice/
建立服务的守护进程media_server
/frameworks/base/media/mediaserver/main_mediaserver.cpp
在进程中增加服务是和servicemanager有关系的
守护进程,有名称的服务,使用binder框架架构的接口三者之间的关系是
Zygote
通过init进程启动,是android运行时非常核心的部分,zygote首先启动system_server这是大多数服务的守护进程,之后所有的Android应用程序也是由它创建
第五章android的java虚拟机和java环境
Dalvik是android的虚拟机,内容在android中是一个独立的代码路径dalvik/,其中包含了目标机和主机的内容
Dex工具库和虚拟的实现(纯c语言写的实现库)
Dex工具库的目录是dalvik/dex最终生成静态库libdex.a
虚拟机的实现库dalvik/vm最终生成libdvm.so(dalvik虚拟机)
虚拟机的可执行程序dalvik/dalvikvn
核心库
Libcore的主要编译结果:
Libjavacore.a生成java核心静态库
Core.jar最终放置在文件系统的/system/framework目录中
目录结构如下:
Classes.dex为主体的dalvik可执行格式的字节码,java和org目录下分别是java和org这两个包中某些类包含的一些属性
Mativehelper库
是一个工具库,用于注册java本地调用的函数.(在其他代码需要使用jni从本地层向java层提供功能时使用该库)
代码路径为:dalvik/libnativehelper
Nativehelper库的头文件路径为
libnativehelper/include/nativehelper/jni.h基于jni标准的头文件
Libnativehelper/include/nativehelper/JNIHelp.h提供注册功能的头文件
Android的java的程序环境(核心包目录frameworks/base/core/java)
Java类的代码主要在frameworks/base中
主体部分将生成frameworks.jar包最终放置在目标文件系统的system/framework中
Java框架部分的内容
frameworks/base/graphics/java图形部分
frameworks/base/media/java媒体部分
frameworks/base/opengl/javaopenGL部分
frameworks/base/wifi/javaWiFi部分
基中资源文件frameworks/base/core/res也被生成一个jar包,framework-res.apk
Android系统API(框架层和应用层的接口)
API的描述文件包含在frameworks/base/api目录中,主要是current.xml
例
Android.app包中的类Activity其代码路径为android/app/Activity.java
对应current.xml的描述如下:
<packagename="android.app">//包内容
<classname="Activity"//类内容
extends="android.view.ContextThemeWrapper"
abstract="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
<implementsname="android.content.ComponentCallbacks">//类实现的内容
</implements>
<implementsname="android.view.KeyEvent.Callback">
</implements>
<implementsname="android.view.LayoutInflater.Factory">
</implements>
<implementsname="android.view.View.OnCreateContextMenuListener">
</implements>
<implementsname="android.view.Window.Callback">
</implements>
<constructorname="Activity"//构造函数的内容
type="android.app.Activity"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
</constructor>
<methodname="addContentView"//方法
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
<parametername="view"type="android.view.View">//参数
</parameter>
<parametername="params"type="android.view.ViewGroup.LayoutParams">
</parameter>
</method>
<methodname="closeContextMenu"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
</method>
<methodname="closeOptionsMenu"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
</method>
<methodname="createPendingResult"
return="android.app.PendingIntent"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
<parametername="requestCode"type="int">
</parameter>
<parametername="data"type="android.content.Intent">
</parameter>
<parametername="flags"type="int">
</parameter>
</method>
<methodname="dismissDialog"
return="void"
abstract="false"
native="false"
synchronized="false"
static="false"
final="true"
deprecated="notdeprecated"
visibility="public"
>
<parametername="id"type="int">
</parameter>
</method>
<methodname="dispatchKeyEvent"
return="boolean"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
<parametername="event"type="android.view.KeyEvent">
</parameter>
</method>
<methodname="dispatchPopulateAccessibilityEvent"
return="boolean"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="notdeprecated"
visibility="public"
>
<parametername="event"type="android.view.accessibility.AccessibilityEvent">
</parameter>
</method>
........................
<fieldname="DEFAULT_KEYS_DIALER"//常量
type="int"
transient="false"
volatile="false"
value="1"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="DEFAULT_KEYS_DISABLE"
type="int"
transient="false"
volatile="false"
value="0"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="DEFAULT_KEYS_SEARCH_GLOBAL"
type="int"
transient="false"
volatile="false"
value="4"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="DEFAULT_KEYS_SEARCH_LOCAL"
type="int"
transient="false"
volatile="false"
value="3"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="DEFAULT_KEYS_SHORTCUT"
type="int"
transient="false"
volatile="false"
value="2"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="FOCUSED_STATE_SET"
type="int[]"
transient="false"
volatile="false"
value="null"
static="true"
final="true"
deprecated="notdeprecated"
visibility="protected"
>
</field>
<fieldname="RESULT_CANCELED"
type="int"
transient="false"
volatile="false"
value="0"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="RESULT_FIRST_USER"
type="int"
transient="false"
volatile="false"
value="1"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<fieldname="RESULT_OK"
type="int"
transient="false"
volatile="false"
value="-1"
static="true"
final="true"
deprecated="notdeprecated"
visibility="public"
>
</field>
<interfacename="View.OnClickListener"//接口
abstract="true"
static="true"
final="false"
deprecated="notdeprecated"
visibility="public"
>
在编译时,如果源代码和current.xml不一致时,可以使用以下命令更新:
Makeupdate-api
Jni的使用(javanativeinterface)----java本地接口
JNI的架构
Android中主要JNI代码在以下路径中:framework/base/core/jni最终编译生成库
System/lib/Libandroid_runtime.so
媒体部分的jni在目录frameworks/base/media/jni中,编译成:libmedia_jni.so
在android中实现JNI库,需要动态连接libnativehelper.so
JNI实现方式
JNI的核心是JNINativeMethod结构体,在jni.h中定义
在框架层使用JNI
android.util.Log的情况:
publicfinalclassLog{
publicstaticnativebooleanisLoggable(Stringtag,intlevel);
}
android_util_Log.cpp的方法列表
staticJNINativeMethodgMethods[]={
/*name,signature,funcPtr*/
{"isLoggable","(Ljava/lang/String;I)Z",(void*)android_util_Log_isLoggable},
{"println_native","(IILjava/lang/String;Ljava/lang/String;)I",(void*)android_util_Log_println_native},
};
intregister_android_util_Log(JNIEnv*env)
{
jclassclazz=env->FindClass("android/util/Log");
if(clazz==NULL){
LOGE("Can'tfindandroid/util/Log");
return-1;
}
levels.verbose=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"VERBOSE","I"));
levels.debug=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"DEBUG","I"));
levels.info=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"INFO","I"));
levels.warn=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"WARN","I"));
levels.error=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"ERROR","I"));
levels.assert=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"ASSERT","I"));
returnAndroidRuntime::registerNativeMethods(env,"android/util/Log",gMethods,NELEM(gMethods));
}
};
在apk中实现JNI
Jni示例程序的路径为:
Development/samples/SimpleJNI
系统服务的java部分
Binder
Java层同样提供了一套Binder的相关函数,实现在:
/frameworks/base/core/java/android/os
/frameworks/base/core/java/com/android/internal/os
/frameworks/base/core/jni
Java层的核心是binder---->IBinder----->binderProxy这样一个三角关系
Native中BBinder--->IBinder---->BpBinder
Java层中aidl工具来辅助实现Binder,只需要定义接口XXX.aidl编译器就会生成
IXXX. 客户端IXXX.stuv.Proxy和服务器端IXXX.Stub
ServiceManager(服务管理的服务器端)
主要分析java框架中serviceManager客户端的实现,也就是IServiceManager接口的java实现
serviceManagerNative.java
serviceManager.java
serviceManager.java
IServiceManager.java
ServiceManager的方法
publicfinalclassServiceManager{
privatestaticfinalStringTAG="ServiceManager";
privatestaticIServiceManagersServiceManager;
privatestaticHashMap<String,IBinder>sCache=newHashMap<String,IBinder>();
privatestaticIServiceManagergetIServiceManager(){}
publicstaticIBindergetService(Stringname){}
publicstaticvoidaddService(Stringname,IBinderservice){}
publicstaticIBindercheckService(Stringname){}
publicstaticString[]listServices()throwsRemoteException{}
publicstaticvoidinitServiceCache(Map<String,IBinder>cache){}
}
例如:
1.armManagerService的调用者
代码路径为:/frameworks/base/core/java/android/app
packageandroid.app;
importandroid.app.PendingIntent;
/**
*SystemprivateAPIfortalkingwiththealarmmanagerservice.
*
*{@hide}
*/
interfaceIAlarmManager{
voidset(inttype,longtriggerAtTime,inPendingIntentoperation);
voidsetRepeating(inttype,longtriggerAtTime,longinterval,inPendingIntentoperation);
voidsetInexactRepeating(inttype,longtriggerAtTime,longinterval,inPendingIntentoperation);
voidsetTime(longmillis);
voidsetTimeZone(Stringzone);
voidremove(inPendingIntentoperation);
}
2.Service库中alarmManagerService
publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){}
publicvoidsetRepeating(inttype,longtriggerAtTime,longinterval,
PendingIntentoperation){}
publicvoidsetInexactRepeating(inttype,longtriggerAtTime,longinterval,
PendingIntentoperation){}
publicvoidsetTime(longmillis){}
publicvoidsetTimeZone(Stringtz){}
publicvoidremove(PendingIntentoperation){}
publicvoidremoveLocked(PendingIntentoperation){}
privatevoidremoveLocked(ArrayList<Alarm>alarmList,
PendingIntentoperation){}
3.增加服务
在/frameworks/base/services/java/com/android/server/SystemServer.java中
Slog.i(TAG,"AlarmManager");
AlarmManagerServicealarm=newAlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE,alarm);
4.得到接口
在/frameworks/base/core/java/android/app中
privateAlarmManagergetAlarmManager(){
synchronized(sSync){
if(sAlarmManager==null){
IBinderb=ServiceManager.getService(ALARM_SERVICE);
IAlarmManagerservice=IAlarmManager.Stub.asInterface(b);
sAlarmManager=newAlarmManager(service);
}
}
returnsAlarmManager;
}
系统进程
主要是对zygote的分析,它是通进init进程读取init.rc启动的
servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-server
socketzygotestream666
onrestartwrite/sys/android_power/request_statewake
onrestartwrite/sys/power/stateon
onrestartrestartmedia
对应的可执行文件
/frameworks/base/cmds/app_process/app_main.c通过runtime:start开启整个初始化流程
首先是开启java虚拟机app_process联接一个名为libandroid_runtime.so的动态库,再连接
Libdvm.so由它调用虚拟机
/frameworks/base/core/java/com/android/internal/os/ZygoteInit完成初始化操作
ZygoteInit.main()会完成一次分裂,这个分裂出来的线程(system_server)继续进行java框架的初始化工作,通过startSystemServer()方法来完成,继续调用handleSystemServerProcess(parsedArgs) 传递参数com.android.server.SystemServer通过RuntimeInin.zygooteInit--->systemServer.main----->systemServer.init1----->systemServer.init2
代码如下:
privatestaticbooleanstartSystemServer()
throwsMethodAndArgsCaller,RuntimeException{
/*Hardcodedcommandlinetostartthesystemserver*/
Stringargs[]={
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",
"--capabilities=130104352,130104352",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
};
ZygoteConnection.ArgumentsparsedArgs=null;
intpid;
try{
parsedArgs=newZygoteConnection.Arguments(args);
/*
*Enabledebuggingofthesystemprocessif*either*thecommandlineflags
*indicateitshouldbedebuggableorthero.debuggablesystemproperty
*issetto"1"
*/
intdebugFlags=parsedArgs.debugFlags;
if("1".equals(SystemProperties.get("ro.debuggable")))
debugFlags|=Zygote.DEBUG_ENABLE_DEBUGGER;
/*Requesttoforkthesystemserverprocess*/
pid=Zygote.forkSystemServer(
parsedArgs.uid,parsedArgs.gid,
parsedArgs.gids,debugFlags,null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
}catch(IllegalArgumentExceptionex){
thrownewRuntimeException(ex);
}
/*Forchildprocess*/
if(pid==0){
handleSystemServerProcess(parsedArgs);
}
returntrue;
}
发表评论
-
android系统学习笔记一
2012-09-03 15:01 9081.android的系统架构(linux2.6内核) Lin ... -
android系统学习笔记二
2012-09-03 15:03 914android的linux内核和驱动程序 Androidr专 ... -
android系统学习笔记四
2012-09-03 15:07 1134Android的GUI系统 AndroidGUI系统综 ... -
android系统学习笔记五
2012-09-03 15:12 2200android中的audio系统 Audo系统主要分如下几 ... -
android系统学习笔记六
2012-09-03 15:16 2221android的多媒体系统 ... -
android系统学习笔记七
2012-09-03 15:18 739Android电话部分综述 主 ... -
android系统学习八
2012-09-03 15:19 755Android的联接部分 Wifi部分 Wif ... -
android系统学习笔记九
2012-09-03 15:21 737蓝牙部分 蓝牙协议栈1.11.22.02.13.0 异步数 ... -
android系统学习笔记十一
2012-09-03 15:22 1502Gps(globalPositionSystem全球定位系统) ... -
android系统学习笔记十二
2012-09-03 15:23 1019Android的传感器系统 ... -
Android编译系统详解(一)
2012-09-10 13:45 829+++++++++++++++++++++++++++++ ... -
android----ServiceManager
2012-09-18 00:33 4319serviceManager 在c++层如何使用servi ... -
android 自定义核心服务
2012-09-18 23:27 797native service zygote 服务 kern ... -
android系统移植学习笔记一
2012-09-21 16:08 627系统框架 applicationjava应用程序 ...
相关推荐
Android学习笔记是Android开发者的必读书籍,书中涵盖了Android系统架构、Activity、Intent、资源管理等多方面的知识。本笔记对应的学习资源《第一行代码》是Android开发者的入门必读书籍,书中系统地介绍了Android...
Android基础学习笔记主要涵盖了一系列关于Android开发的基本概念和关键组件,以下是这些知识点的详细解析: 1. **Activity**: 是Android应用程序的基本单元,它代表用户在屏幕上看到的一个界面。每个Activity都必须...
这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的基本操作。 首先,让我们了解一下Android Studio的核心功能。它基于IntelliJ IDEA,具备代码自动补全、重构、调试等强大的开发特性。...
Android Activity学习笔记 Android Activity是Android系统中最基本的组件之一,它负责处理用户交互和显示用户界面。本文将深入讲解Activity的生命周期、Activity之间的数据交互、Activity启动模式、Task和BackStack...
- Android系统基于Linux系统开发,拥有开放源码。 - Android系统框架由多个组件构成,其中包括Activity、Intent、Service、ContentProvider、View和BroadcastReceiver。 - Activity作为组件容器,主要负责用户...
根据给定的信息,我们可以从Java和Android学习笔记中提取出一系列重要的知识点,下面将逐一进行详细解释。 ### Java基础知识 #### 1. 命令行基础操作 - **`javacmd`**: 这个命令是Java命令行工具的一部分,用于...
### Android学习笔记知识点详解 #### 一、简介与背景 Android作为全球最受欢迎的移动操作系统之一,自2007年谷歌发布以来,迅速占领市场并持续引领移动技术的发展。随着移动互联网的兴起和发展,Android应用开发...
### Android学习笔记——从HelloWorld开始 #### 一、Google的Android SDK介绍 自从Google发布了Android SDK以来,这款开源移动操作系统迅速吸引了众多开发者的关注。Android SDK为开发者提供了丰富的工具和API,...
Android全程学习笔记旨在提供一个详尽且全面的指南,涵盖了Android开发中的关键技术点和实践案例。以下是关于Android开发的一些核心知识点: 1. **第一个Android应用**:开发Android应用的起点通常是从创建并运行你...
这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 首先,Android是Google开发的一款开源操作系统,...
这篇学习笔记主要涵盖了关于布局的一些基本概念,特别是`fill_parent`和`wrap_content`这两种尺寸指定方式,以及如何通过XML布局文件来精确控制组件的位置。 首先,`fill_parent`和`wrap_content`是Android布局中的...
在Android系统相关学习笔记中,我们可以深入探讨这个广泛而复杂的移动操作系统的核心概念和技术。Android以其开源性和灵活性,吸引了大量的开发者和爱好者。以下是一些关键的知识点: 1. **Android架构**:Android...
【Android学习笔记详解】 在移动应用开发领域,Android操作系统占据着重要的地位,为开发者提供了...通过系统学习并实践其中的内容,你将能够逐步掌握Android开发的核心技能,为你的Android开发者之路打下坚实的基础。
这篇学习笔记将深入探讨PreferenceActivity的使用方法、功能以及与源码相关的知识。 首先,PreferenceActivity是Android SDK提供的一种特殊类型的Activity,它允许开发者快速构建具有可配置选项的界面,类似于系统...
### Android开发学习笔记知识点梳理 #### 一、Android概述与架构 - **定义与发布**:Android是由Google在2007年11月5日宣布的基于Linux平台的开源手机操作系统。它不仅用于智能手机,还广泛应用于平板电脑、可穿戴...